{"version":3,"file":"vis-graph3d.cjs","sources":["../../lib/graph3d/Point3d.js","../../lib/graph3d/Point2d.js","../../lib/graph3d/Slider.js","../../lib/graph3d/StepNumber.js","../../lib/graph3d/Camera.js","../../lib/graph3d/Settings.js","../../lib/graph3d/options.js","../../lib/graph3d/Range.js","../../lib/graph3d/Filter.js","../../lib/graph3d/DataGroup.js","../../lib/graph3d/Graph3d.js"],"sourcesContent":["/**\n * @param {number} [x]\n * @param {number} [y]\n * @param {number} [z]\n */\nfunction Point3d(x, y, z) {\n  this.x = x !== undefined ? x : 0;\n  this.y = y !== undefined ? y : 0;\n  this.z = z !== undefined ? z : 0;\n}\n\n/**\n * Subtract the two provided points, returns a-b\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} a-b\n */\nPoint3d.subtract = function (a, b) {\n  const sub = new Point3d();\n  sub.x = a.x - b.x;\n  sub.y = a.y - b.y;\n  sub.z = a.z - b.z;\n  return sub;\n};\n\n/**\n * Add the two provided points, returns a+b\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} a+b\n */\nPoint3d.add = function (a, b) {\n  const sum = new Point3d();\n  sum.x = a.x + b.x;\n  sum.y = a.y + b.y;\n  sum.z = a.z + b.z;\n  return sum;\n};\n\n/**\n * Calculate the average of two 3d points\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} The average, (a+b)/2\n */\nPoint3d.avg = function (a, b) {\n  return new Point3d((a.x + b.x) / 2, (a.y + b.y) / 2, (a.z + b.z) / 2);\n};\n\n/**\n * Scale the provided point by a scalar, returns p*c\n * @param {Point3d} p\n * @param {number} c\n * @returns {Point3d} p*c\n */\nPoint3d.scalarProduct = function (p, c) {\n  return new Point3d(p.x * c, p.y * c, p.z * c);\n};\n\n/**\n * Calculate the dot product of the two provided points, returns a.b\n * Documentation: http://en.wikipedia.org/wiki/Dot_product\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} dot product a.b\n */\nPoint3d.dotProduct = function (a, b) {\n  return a.x * b.x + a.y * b.y + a.z * b.z;\n};\n\n/**\n * Calculate the cross product of the two provided points, returns axb\n * Documentation: http://en.wikipedia.org/wiki/Cross_product\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} cross product axb\n */\nPoint3d.crossProduct = function (a, b) {\n  const crossproduct = new Point3d();\n\n  crossproduct.x = a.y * b.z - a.z * b.y;\n  crossproduct.y = a.z * b.x - a.x * b.z;\n  crossproduct.z = a.x * b.y - a.y * b.x;\n\n  return crossproduct;\n};\n\n/**\n * Retrieve the length of the vector (or the distance from this point to the origin\n * @returns {number}  length\n */\nPoint3d.prototype.length = function () {\n  return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n};\n\n/**\n * Return a normalized vector pointing in the same direction.\n * @returns {Point3d}  normalized\n */\nPoint3d.prototype.normalize = function () {\n  return Point3d.scalarProduct(this, 1 / this.length());\n};\n\nexport default Point3d;\n","/**\n * @param {number} [x]\n * @param {number} [y]\n */\nfunction Point2d(x, y) {\n  this.x = x !== undefined ? x : 0;\n  this.y = y !== undefined ? y : 0;\n}\n\nexport default Point2d;\n","import * as util from \"vis-util/esnext\";\n\n/**\n * An html slider control with start/stop/prev/next buttons\n * @function Object() { [native code] } Slider\n * @param {Element} container  The element where the slider will be created\n * @param {object} options   Available options:\n *                 {boolean} visible   If true (default) the\n *                           slider is visible.\n */\nfunction Slider(container, options) {\n  if (container === undefined) {\n    throw new Error(\"No container element defined\");\n  }\n  this.container = container;\n  this.visible =\n    options && options.visible != undefined ? options.visible : true;\n\n  if (this.visible) {\n    this.frame = document.createElement(\"DIV\");\n    //this.frame.style.backgroundColor = '#E5E5E5';\n    this.frame.style.width = \"100%\";\n    this.frame.style.position = \"relative\";\n    this.container.appendChild(this.frame);\n\n    this.frame.prev = document.createElement(\"INPUT\");\n    this.frame.prev.type = \"BUTTON\";\n    this.frame.prev.value = \"Prev\";\n    this.frame.appendChild(this.frame.prev);\n\n    this.frame.play = document.createElement(\"INPUT\");\n    this.frame.play.type = \"BUTTON\";\n    this.frame.play.value = \"Play\";\n    this.frame.appendChild(this.frame.play);\n\n    this.frame.next = document.createElement(\"INPUT\");\n    this.frame.next.type = \"BUTTON\";\n    this.frame.next.value = \"Next\";\n    this.frame.appendChild(this.frame.next);\n\n    this.frame.bar = document.createElement(\"INPUT\");\n    this.frame.bar.type = \"BUTTON\";\n    this.frame.bar.style.position = \"absolute\";\n    this.frame.bar.style.border = \"1px solid red\";\n    this.frame.bar.style.width = \"100px\";\n    this.frame.bar.style.height = \"6px\";\n    this.frame.bar.style.borderRadius = \"2px\";\n    this.frame.bar.style.MozBorderRadius = \"2px\";\n    this.frame.bar.style.border = \"1px solid #7F7F7F\";\n    this.frame.bar.style.backgroundColor = \"#E5E5E5\";\n    this.frame.appendChild(this.frame.bar);\n\n    this.frame.slide = document.createElement(\"INPUT\");\n    this.frame.slide.type = \"BUTTON\";\n    this.frame.slide.style.margin = \"0px\";\n    this.frame.slide.value = \" \";\n    this.frame.slide.style.position = \"relative\";\n    this.frame.slide.style.left = \"-100px\";\n    this.frame.appendChild(this.frame.slide);\n\n    // create events\n    const me = this;\n    this.frame.slide.onmousedown = function (event) {\n      me._onMouseDown(event);\n    };\n    this.frame.prev.onclick = function (event) {\n      me.prev(event);\n    };\n    this.frame.play.onclick = function (event) {\n      me.togglePlay(event);\n    };\n    this.frame.next.onclick = function (event) {\n      me.next(event);\n    };\n  }\n\n  this.onChangeCallback = undefined;\n\n  this.values = [];\n  this.index = undefined;\n\n  this.playTimeout = undefined;\n  this.playInterval = 1000; // milliseconds\n  this.playLoop = true;\n}\n\n/**\n * Select the previous index\n */\nSlider.prototype.prev = function () {\n  let index = this.getIndex();\n  if (index > 0) {\n    index--;\n    this.setIndex(index);\n  }\n};\n\n/**\n * Select the next index\n */\nSlider.prototype.next = function () {\n  let index = this.getIndex();\n  if (index < this.values.length - 1) {\n    index++;\n    this.setIndex(index);\n  }\n};\n\n/**\n * Select the next index\n */\nSlider.prototype.playNext = function () {\n  const start = new Date();\n\n  let index = this.getIndex();\n  if (index < this.values.length - 1) {\n    index++;\n    this.setIndex(index);\n  } else if (this.playLoop) {\n    // jump to the start\n    index = 0;\n    this.setIndex(index);\n  }\n\n  const end = new Date();\n  const diff = end - start;\n\n  // calculate how much time it to to set the index and to execute the callback\n  // function.\n  const interval = Math.max(this.playInterval - diff, 0);\n  // document.title = diff // TODO: cleanup\n\n  const me = this;\n  this.playTimeout = setTimeout(function () {\n    me.playNext();\n  }, interval);\n};\n\n/**\n * Toggle start or stop playing\n */\nSlider.prototype.togglePlay = function () {\n  if (this.playTimeout === undefined) {\n    this.play();\n  } else {\n    this.stop();\n  }\n};\n\n/**\n * Start playing\n */\nSlider.prototype.play = function () {\n  // Test whether already playing\n  if (this.playTimeout) return;\n\n  this.playNext();\n\n  if (this.frame) {\n    this.frame.play.value = \"Stop\";\n  }\n};\n\n/**\n * Stop playing\n */\nSlider.prototype.stop = function () {\n  clearInterval(this.playTimeout);\n  this.playTimeout = undefined;\n\n  if (this.frame) {\n    this.frame.play.value = \"Play\";\n  }\n};\n\n/**\n * Set a callback function which will be triggered when the value of the\n * slider bar has changed.\n * @param {Function} callback\n */\nSlider.prototype.setOnChangeCallback = function (callback) {\n  this.onChangeCallback = callback;\n};\n\n/**\n * Set the interval for playing the list\n * @param {number} interval   The interval in milliseconds\n */\nSlider.prototype.setPlayInterval = function (interval) {\n  this.playInterval = interval;\n};\n\n/**\n * Retrieve the current play interval\n * @returns {number} interval   The interval in milliseconds\n */\nSlider.prototype.getPlayInterval = function () {\n  return this.playInterval;\n};\n\n/**\n * Set looping on or off\n * @param {boolean} doLoop  If true, the slider will jump to the start when\n *               the end is passed, and will jump to the end\n *               when the start is passed.\n */\nSlider.prototype.setPlayLoop = function (doLoop) {\n  this.playLoop = doLoop;\n};\n\n/**\n * Execute the onchange callback function\n */\nSlider.prototype.onChange = function () {\n  if (this.onChangeCallback !== undefined) {\n    this.onChangeCallback();\n  }\n};\n\n/**\n * redraw the slider on the correct place\n */\nSlider.prototype.redraw = function () {\n  if (this.frame) {\n    // resize the bar\n    this.frame.bar.style.top =\n      this.frame.clientHeight / 2 - this.frame.bar.offsetHeight / 2 + \"px\";\n    this.frame.bar.style.width =\n      this.frame.clientWidth -\n      this.frame.prev.clientWidth -\n      this.frame.play.clientWidth -\n      this.frame.next.clientWidth -\n      30 +\n      \"px\";\n\n    // position the slider button\n    const left = this.indexToLeft(this.index);\n    this.frame.slide.style.left = left + \"px\";\n  }\n};\n\n/**\n * Set the list with values for the slider\n * @param {Array} values   A javascript array with values (any type)\n */\nSlider.prototype.setValues = function (values) {\n  this.values = values;\n\n  if (this.values.length > 0) this.setIndex(0);\n  else this.index = undefined;\n};\n\n/**\n * Select a value by its index\n * @param {number} index\n */\nSlider.prototype.setIndex = function (index) {\n  if (index < this.values.length) {\n    this.index = index;\n\n    this.redraw();\n    this.onChange();\n  } else {\n    throw new Error(\"Index out of range\");\n  }\n};\n\n/**\n * retrieve the index of the currently selected vaue\n * @returns {number} index\n */\nSlider.prototype.getIndex = function () {\n  return this.index;\n};\n\n/**\n * retrieve the currently selected value\n * @returns {*} value\n */\nSlider.prototype.get = function () {\n  return this.values[this.index];\n};\n\nSlider.prototype._onMouseDown = function (event) {\n  // only react on left mouse button down\n  const leftButtonDown = event.which ? event.which === 1 : event.button === 1;\n  if (!leftButtonDown) return;\n\n  this.startClientX = event.clientX;\n  this.startSlideX = parseFloat(this.frame.slide.style.left);\n\n  this.frame.style.cursor = \"move\";\n\n  // add event listeners to handle moving the contents\n  // we store the function onmousemove and onmouseup in the graph, so we can\n  // remove the eventlisteners lateron in the function mouseUp()\n  const me = this;\n  this.onmousemove = function (event) {\n    me._onMouseMove(event);\n  };\n  this.onmouseup = function (event) {\n    me._onMouseUp(event);\n  };\n  document.addEventListener(\"mousemove\", this.onmousemove);\n  document.addEventListener(\"mouseup\", this.onmouseup);\n  util.preventDefault(event);\n};\n\nSlider.prototype.leftToIndex = function (left) {\n  const width =\n    parseFloat(this.frame.bar.style.width) - this.frame.slide.clientWidth - 10;\n  const x = left - 3;\n\n  let index = Math.round((x / width) * (this.values.length - 1));\n  if (index < 0) index = 0;\n  if (index > this.values.length - 1) index = this.values.length - 1;\n\n  return index;\n};\n\nSlider.prototype.indexToLeft = function (index) {\n  const width =\n    parseFloat(this.frame.bar.style.width) - this.frame.slide.clientWidth - 10;\n\n  const x = (index / (this.values.length - 1)) * width;\n  const left = x + 3;\n\n  return left;\n};\n\nSlider.prototype._onMouseMove = function (event) {\n  const diff = event.clientX - this.startClientX;\n  const x = this.startSlideX + diff;\n\n  const index = this.leftToIndex(x);\n\n  this.setIndex(index);\n\n  util.preventDefault();\n};\n\nSlider.prototype._onMouseUp = function () {\n  this.frame.style.cursor = \"auto\";\n\n  // remove event listeners\n  document.removeEventListener(\"mousemove\", this.onmousemove);\n  document.removeEventListener(\"mouseup\", this.onmouseup);\n\n  util.preventDefault();\n};\n\nexport default Slider;\n","/**\n * The class StepNumber is an iterator for Numbers. You provide a start and end\n * value, and a best step size. StepNumber itself rounds to fixed values and\n * a finds the step that best fits the provided step.\n *\n * If prettyStep is true, the step size is chosen as close as possible to the\n * provided step, but being a round value like 1, 2, 5, 10, 20, 50, ....\n *\n * Example usage:\n *   var step = new StepNumber(0, 10, 2.5, true);\n *   step.start();\n *   while (!step.end()) {\n *   alert(step.getCurrent());\n *   step.next();\n *   }\n *\n * Version: 1.0\n * @param {number} start     The start value\n * @param {number} end     The end value\n * @param {number} step    Optional. Step size. Must be a positive value.\n * @param {boolean} prettyStep Optional. If true, the step size is rounded\n *               To a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nfunction StepNumber(start, end, step, prettyStep) {\n  // set default values\n  this._start = 0;\n  this._end = 0;\n  this._step = 1;\n  this.prettyStep = true;\n  this.precision = 5;\n\n  this._current = 0;\n  this.setRange(start, end, step, prettyStep);\n}\n\n/**\n * Check for input values, to prevent disasters from happening\n *\n * Source: http://stackoverflow.com/a/1830844\n * @param {string} n\n * @returns {boolean}\n */\nStepNumber.prototype.isNumeric = function (n) {\n  return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\n/**\n * Set a new range: start, end and step.\n * @param {number} start     The start value\n * @param {number} end     The end value\n * @param {number} step    Optional. Step size. Must be a positive value.\n * @param {boolean} prettyStep Optional. If true, the step size is rounded\n *               To a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nStepNumber.prototype.setRange = function (start, end, step, prettyStep) {\n  if (!this.isNumeric(start)) {\n    throw new Error(\"Parameter 'start' is not numeric; value: \" + start);\n  }\n  if (!this.isNumeric(end)) {\n    throw new Error(\"Parameter 'end' is not numeric; value: \" + start);\n  }\n  if (!this.isNumeric(step)) {\n    throw new Error(\"Parameter 'step' is not numeric; value: \" + start);\n  }\n\n  this._start = start ? start : 0;\n  this._end = end ? end : 0;\n\n  this.setStep(step, prettyStep);\n};\n\n/**\n * Set a new step size\n * @param {number} step    New step size. Must be a positive value\n * @param {boolean} prettyStep Optional. If true, the provided step is rounded\n *               to a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nStepNumber.prototype.setStep = function (step, prettyStep) {\n  if (step === undefined || step <= 0) return;\n\n  if (prettyStep !== undefined) this.prettyStep = prettyStep;\n\n  if (this.prettyStep === true)\n    this._step = StepNumber.calculatePrettyStep(step);\n  else this._step = step;\n};\n\n/**\n * Calculate a nice step size, closest to the desired step size.\n * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an\n * integer Number. For example 1, 2, 5, 10, 20, 50, etc...\n * @param {number}  step  Desired step size\n * @returns {number}     Nice step size\n */\nStepNumber.calculatePrettyStep = function (step) {\n  const log10 = function (x) {\n    return Math.log(x) / Math.LN10;\n  };\n\n  // try three steps (multiple of 1, 2, or 5\n  const step1 = Math.pow(10, Math.round(log10(step))),\n    step2 = 2 * Math.pow(10, Math.round(log10(step / 2))),\n    step5 = 5 * Math.pow(10, Math.round(log10(step / 5)));\n\n  // choose the best step (closest to minimum step)\n  let prettyStep = step1;\n  if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2;\n  if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5;\n\n  // for safety\n  if (prettyStep <= 0) {\n    prettyStep = 1;\n  }\n\n  return prettyStep;\n};\n\n/**\n * returns the current value of the step\n * @returns {number} current value\n */\nStepNumber.prototype.getCurrent = function () {\n  return parseFloat(this._current.toPrecision(this.precision));\n};\n\n/**\n * returns the current step size\n * @returns {number} current step size\n */\nStepNumber.prototype.getStep = function () {\n  return this._step;\n};\n\n/**\n * Set the current to its starting value.\n *\n * By default, this will be the largest value smaller than start, which\n * is a multiple of the step size.\n *\n * Parameters checkFirst is optional, default false.\n * If set to true, move the current value one step if smaller than start.\n * @param {boolean} [checkFirst]\n */\nStepNumber.prototype.start = function (checkFirst) {\n  if (checkFirst === undefined) {\n    checkFirst = false;\n  }\n\n  this._current = this._start - (this._start % this._step);\n\n  if (checkFirst) {\n    if (this.getCurrent() < this._start) {\n      this.next();\n    }\n  }\n};\n\n/**\n * Do a step, add the step size to the current value\n */\nStepNumber.prototype.next = function () {\n  this._current += this._step;\n};\n\n/**\n * Returns true whether the end is reached\n * @returns {boolean}  True if the current value has passed the end value.\n */\nStepNumber.prototype.end = function () {\n  return this._current > this._end;\n};\n\nexport default StepNumber;\n","import Point3d from \"./Point3d.js\";\n\n/**\n * The camera is mounted on a (virtual) camera arm. The camera arm can rotate\n * The camera is always looking in the direction of the origin of the arm.\n * This way, the camera always rotates around one fixed point, the location\n * of the camera arm.\n *\n * Documentation:\n * http://en.wikipedia.org/wiki/3D_projection\n * @class Camera\n */\nfunction Camera() {\n  this.armLocation = new Point3d();\n  this.armRotation = {};\n  this.armRotation.horizontal = 0;\n  this.armRotation.vertical = 0;\n  this.armLength = 1.7;\n  this.cameraOffset = new Point3d();\n  this.offsetMultiplier = 0.6;\n\n  this.cameraLocation = new Point3d();\n  this.cameraRotation = new Point3d(0.5 * Math.PI, 0, 0);\n\n  this.calculateCameraOrientation();\n}\n\n/**\n * Set offset camera in camera coordinates\n * @param {number} x offset by camera horisontal\n * @param {number} y offset by camera vertical\n */\nCamera.prototype.setOffset = function (x, y) {\n  const abs = Math.abs,\n    sign = Math.sign,\n    mul = this.offsetMultiplier,\n    border = this.armLength * mul;\n\n  if (abs(x) > border) {\n    x = sign(x) * border;\n  }\n  if (abs(y) > border) {\n    y = sign(y) * border;\n  }\n  this.cameraOffset.x = x;\n  this.cameraOffset.y = y;\n  this.calculateCameraOrientation();\n};\n\n/**\n * Get camera offset by horizontal and vertical\n * @returns {number}\n */\nCamera.prototype.getOffset = function () {\n  return this.cameraOffset;\n};\n\n/**\n * Set the location (origin) of the arm\n * @param {number} x  Normalized value of x\n * @param {number} y  Normalized value of y\n * @param {number} z  Normalized value of z\n */\nCamera.prototype.setArmLocation = function (x, y, z) {\n  this.armLocation.x = x;\n  this.armLocation.y = y;\n  this.armLocation.z = z;\n\n  this.calculateCameraOrientation();\n};\n\n/**\n * Set the rotation of the camera arm\n * @param {number} horizontal   The horizontal rotation, between 0 and 2*PI.\n *                Optional, can be left undefined.\n * @param {number} vertical   The vertical rotation, between 0 and 0.5*PI\n *                if vertical=0.5*PI, the graph is shown from the\n *                top. Optional, can be left undefined.\n */\nCamera.prototype.setArmRotation = function (horizontal, vertical) {\n  if (horizontal !== undefined) {\n    this.armRotation.horizontal = horizontal;\n  }\n\n  if (vertical !== undefined) {\n    this.armRotation.vertical = vertical;\n    if (this.armRotation.vertical < 0) this.armRotation.vertical = 0;\n    if (this.armRotation.vertical > 0.5 * Math.PI)\n      this.armRotation.vertical = 0.5 * Math.PI;\n  }\n\n  if (horizontal !== undefined || vertical !== undefined) {\n    this.calculateCameraOrientation();\n  }\n};\n\n/**\n * Retrieve the current arm rotation\n * @returns {object}   An object with parameters horizontal and vertical\n */\nCamera.prototype.getArmRotation = function () {\n  const rot = {};\n  rot.horizontal = this.armRotation.horizontal;\n  rot.vertical = this.armRotation.vertical;\n\n  return rot;\n};\n\n/**\n * Set the (normalized) length of the camera arm.\n * @param {number} length A length between 0.71 and 5.0\n */\nCamera.prototype.setArmLength = function (length) {\n  if (length === undefined) return;\n\n  this.armLength = length;\n\n  // Radius must be larger than the corner of the graph,\n  // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the\n  // graph\n  if (this.armLength < 0.71) this.armLength = 0.71;\n  if (this.armLength > 5.0) this.armLength = 5.0;\n\n  this.setOffset(this.cameraOffset.x, this.cameraOffset.y);\n  this.calculateCameraOrientation();\n};\n\n/**\n * Retrieve the arm length\n * @returns {number} length\n */\nCamera.prototype.getArmLength = function () {\n  return this.armLength;\n};\n\n/**\n * Retrieve the camera location\n * @returns {Point3d} cameraLocation\n */\nCamera.prototype.getCameraLocation = function () {\n  return this.cameraLocation;\n};\n\n/**\n * Retrieve the camera rotation\n * @returns {Point3d} cameraRotation\n */\nCamera.prototype.getCameraRotation = function () {\n  return this.cameraRotation;\n};\n\n/**\n * Calculate the location and rotation of the camera based on the\n * position and orientation of the camera arm\n */\nCamera.prototype.calculateCameraOrientation = function () {\n  // calculate location of the camera\n  this.cameraLocation.x =\n    this.armLocation.x -\n    this.armLength *\n      Math.sin(this.armRotation.horizontal) *\n      Math.cos(this.armRotation.vertical);\n  this.cameraLocation.y =\n    this.armLocation.y -\n    this.armLength *\n      Math.cos(this.armRotation.horizontal) *\n      Math.cos(this.armRotation.vertical);\n  this.cameraLocation.z =\n    this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical);\n\n  // calculate rotation of the camera\n  this.cameraRotation.x = Math.PI / 2 - this.armRotation.vertical;\n  this.cameraRotation.y = 0;\n  this.cameraRotation.z = -this.armRotation.horizontal;\n\n  const xa = this.cameraRotation.x;\n  const za = this.cameraRotation.z;\n  const dx = this.cameraOffset.x;\n  const dy = this.cameraOffset.y;\n  const sin = Math.sin,\n    cos = Math.cos;\n\n  this.cameraLocation.x =\n    this.cameraLocation.x + dx * cos(za) + dy * -sin(za) * cos(xa);\n  this.cameraLocation.y =\n    this.cameraLocation.y + dx * sin(za) + dy * cos(za) * cos(xa);\n  this.cameraLocation.z = this.cameraLocation.z + dy * sin(xa);\n};\n\nexport default Camera;\n","////////////////////////////////////////////////////////////////////////////////\n// This modules handles the options for Graph3d.\n//\n////////////////////////////////////////////////////////////////////////////////\nimport * as util from \"vis-util/esnext\";\nimport Camera from \"./Camera.js\";\nimport Point3d from \"./Point3d.js\";\n\n// enumerate the available styles\nconst STYLE = {\n  BAR: 0,\n  BARCOLOR: 1,\n  BARSIZE: 2,\n  DOT: 3,\n  DOTLINE: 4,\n  DOTCOLOR: 5,\n  DOTSIZE: 6,\n  GRID: 7,\n  LINE: 8,\n  SURFACE: 9,\n};\n\n// The string representations of the styles\nconst STYLENAME = {\n  dot: STYLE.DOT,\n  \"dot-line\": STYLE.DOTLINE,\n  \"dot-color\": STYLE.DOTCOLOR,\n  \"dot-size\": STYLE.DOTSIZE,\n  line: STYLE.LINE,\n  grid: STYLE.GRID,\n  surface: STYLE.SURFACE,\n  bar: STYLE.BAR,\n  \"bar-color\": STYLE.BARCOLOR,\n  \"bar-size\": STYLE.BARSIZE,\n};\n\n/**\n * Field names in the options hash which are of relevance to the user.\n *\n * Specifically, these are the fields which require no special handling,\n * and can be directly copied over.\n */\nconst OPTIONKEYS = [\n  \"width\",\n  \"height\",\n  \"filterLabel\",\n  \"legendLabel\",\n  \"xLabel\",\n  \"yLabel\",\n  \"zLabel\",\n  \"xValueLabel\",\n  \"yValueLabel\",\n  \"zValueLabel\",\n  \"showXAxis\",\n  \"showYAxis\",\n  \"showZAxis\",\n  \"showGrayBottom\",\n  \"showGrid\",\n  \"showPerspective\",\n  \"showShadow\",\n  \"showSurfaceGrid\",\n  \"keepAspectRatio\",\n  \"rotateAxisLabels\",\n  \"verticalRatio\",\n  \"dotSizeRatio\",\n  \"dotSizeMinFraction\",\n  \"dotSizeMaxFraction\",\n  \"showAnimationControls\",\n  \"animationInterval\",\n  \"animationPreload\",\n  \"animationAutoStart\",\n  \"axisColor\",\n  \"axisFontSize\",\n  \"axisFontType\",\n  \"gridColor\",\n  \"xCenter\",\n  \"yCenter\",\n  \"zoomable\",\n  \"tooltipDelay\",\n  \"ctrlToZoom\",\n];\n\n/**\n * Field names in the options hash which are of relevance to the user.\n *\n * Same as OPTIONKEYS, but internally these fields are stored with\n * prefix 'default' in the name.\n */\nconst PREFIXEDOPTIONKEYS = [\n  \"xBarWidth\",\n  \"yBarWidth\",\n  \"valueMin\",\n  \"valueMax\",\n  \"xMin\",\n  \"xMax\",\n  \"xStep\",\n  \"yMin\",\n  \"yMax\",\n  \"yStep\",\n  \"zMin\",\n  \"zMax\",\n  \"zStep\",\n];\n\n// Placeholder for DEFAULTS reference\nlet DEFAULTS = undefined;\n\n/**\n * Check if given hash is empty.\n *\n * Source: http://stackoverflow.com/a/679937\n * @param {object} obj\n * @returns {boolean}\n */\nfunction isEmpty(obj) {\n  for (const prop in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, prop)) return false;\n  }\n\n  return true;\n}\n\n/**\n * Make first letter of parameter upper case.\n *\n * Source: http://stackoverflow.com/a/1026087\n * @param {string} str\n * @returns {string}\n */\nfunction capitalize(str) {\n  if (str === undefined || str === \"\" || typeof str != \"string\") {\n    return str;\n  }\n\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Add a prefix to a field name, taking style guide into account\n * @param {string} prefix\n * @param {string} fieldName\n * @returns {string}\n */\nfunction prefixFieldName(prefix, fieldName) {\n  if (prefix === undefined || prefix === \"\") {\n    return fieldName;\n  }\n\n  return prefix + capitalize(fieldName);\n}\n\n/**\n * Forcibly copy fields from src to dst in a controlled manner.\n *\n * A given field in dst will always be overwitten. If this field\n * is undefined or not present in src, the field in dst will\n * be explicitly set to undefined.\n *\n * The intention here is to be able to reset all option fields.\n *\n * Only the fields mentioned in array 'fields' will be handled.\n * @param {object} src\n * @param {object} dst\n * @param {Array<string>} fields array with names of fields to copy\n * @param {string} [prefix] prefix to use for the target fields.\n */\nfunction forceCopy(src, dst, fields, prefix) {\n  let srcKey;\n  let dstKey;\n\n  for (let i = 0; i < fields.length; ++i) {\n    srcKey = fields[i];\n    dstKey = prefixFieldName(prefix, srcKey);\n\n    dst[dstKey] = src[srcKey];\n  }\n}\n\n/**\n * Copy fields from src to dst in a safe and controlled manner.\n *\n * Only the fields mentioned in array 'fields' will be copied over,\n * and only if these are actually defined.\n * @param {object} src\n * @param {object} dst\n * @param {Array<string>} fields array with names of fields to copy\n * @param {string} [prefix] prefix to use for the target fields.\n */\nfunction safeCopy(src, dst, fields, prefix) {\n  let srcKey;\n  let dstKey;\n\n  for (let i = 0; i < fields.length; ++i) {\n    srcKey = fields[i];\n    if (src[srcKey] === undefined) continue;\n\n    dstKey = prefixFieldName(prefix, srcKey);\n\n    dst[dstKey] = src[srcKey];\n  }\n}\n\n/**\n * Initialize dst with the values in src.\n *\n * src is the hash with the default values.\n * A reference DEFAULTS to this hash is stored locally for\n * further handling.\n *\n * For now, dst is assumed to be a Graph3d instance.\n * @param {object} src\n * @param {object} dst\n */\nfunction setDefaults(src, dst) {\n  if (src === undefined || isEmpty(src)) {\n    throw new Error(\"No DEFAULTS passed\");\n  }\n  if (dst === undefined) {\n    throw new Error(\"No dst passed\");\n  }\n\n  // Remember defaults for future reference\n  DEFAULTS = src;\n\n  // Handle the defaults which can be simply copied over\n  forceCopy(src, dst, OPTIONKEYS);\n  forceCopy(src, dst, PREFIXEDOPTIONKEYS, \"default\");\n\n  // Handle the more complex ('special') fields\n  setSpecialSettings(src, dst);\n\n  // Following are internal fields, not part of the user settings\n  dst.margin = 10; // px\n  dst.showTooltip = false;\n  dst.onclick_callback = null;\n  dst.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window?\n}\n\n/**\n *\n * @param {object} options\n * @param {object} dst\n */\nfunction setOptions(options, dst) {\n  if (options === undefined) {\n    return;\n  }\n  if (dst === undefined) {\n    throw new Error(\"No dst passed\");\n  }\n\n  if (DEFAULTS === undefined || isEmpty(DEFAULTS)) {\n    throw new Error(\"DEFAULTS not set for module Settings\");\n  }\n\n  // Handle the parameters which can be simply copied over\n  safeCopy(options, dst, OPTIONKEYS);\n  safeCopy(options, dst, PREFIXEDOPTIONKEYS, \"default\");\n\n  // Handle the more complex ('special') fields\n  setSpecialSettings(options, dst);\n}\n\n/**\n * Special handling for certain parameters\n *\n * 'Special' here means: setting requires more than a simple copy\n * @param {object} src\n * @param {object} dst\n */\nfunction setSpecialSettings(src, dst) {\n  if (src.backgroundColor !== undefined) {\n    setBackgroundColor(src.backgroundColor, dst);\n  }\n\n  setDataColor(src.dataColor, dst);\n  setStyle(src.style, dst);\n  if (src.surfaceColors !== undefined) {\n    console.warn(\n      \"`options.surfaceColors` is deprecated and may be removed in a future \" +\n        \"version. Please use `options.colormap` instead. Note that the `colormap` \" +\n        \"option uses the inverse array ordering (running from vMin to vMax).\",\n    );\n    if (src.colormap !== undefined) {\n      throw new Error(\n        \"The `colormap` and `surfaceColors` options are mutually exclusive.\",\n      );\n    }\n    if (dst.style !== \"surface\") {\n      console.warn(\n        \"Ignoring `surfaceColors` in graph style `\" +\n          dst.style +\n          \"` for \" +\n          \"backward compatibility (only effective in `surface` plots).\",\n      );\n    } else {\n      setSurfaceColor(src.surfaceColors, dst);\n    }\n  } else {\n    setColormap(src.colormap, dst);\n  }\n  setShowLegend(src.showLegend, dst);\n  setCameraPosition(src.cameraPosition, dst);\n\n  // As special fields go, this is an easy one; just a translation of the name.\n  // Can't use this.tooltip directly, because that field exists internally\n  if (src.tooltip !== undefined) {\n    dst.showTooltip = src.tooltip;\n  }\n  if (src.onclick != undefined) {\n    dst.onclick_callback = src.onclick;\n    console.warn(\n      \"`options.onclick` is deprecated and may be removed in a future version.\" +\n        \" Please use `Graph3d.on('click', handler)` instead.\",\n    );\n  }\n\n  if (src.tooltipStyle !== undefined) {\n    util.selectiveDeepExtend([\"tooltipStyle\"], dst, src);\n  }\n}\n\n/**\n * Set the value of setting 'showLegend'\n *\n * This depends on the value of the style fields, so it must be called\n * after the style field has been initialized.\n * @param {boolean} showLegend\n * @param {object} dst\n */\nfunction setShowLegend(showLegend, dst) {\n  if (showLegend === undefined) {\n    // If the default was auto, make a choice for this field\n    const isAutoByDefault = DEFAULTS.showLegend === undefined;\n\n    if (isAutoByDefault) {\n      // these styles default to having legends\n      const isLegendGraphStyle =\n        dst.style === STYLE.DOTCOLOR || dst.style === STYLE.DOTSIZE;\n\n      dst.showLegend = isLegendGraphStyle;\n    } else {\n      // Leave current value as is\n    }\n  } else {\n    dst.showLegend = showLegend;\n  }\n}\n\n/**\n * Retrieve the style index from given styleName\n * @param {string} styleName  Style name such as 'dot', 'grid', 'dot-line'\n * @returns {number} styleNumber Enumeration value representing the style, or -1\n *                when not found\n */\nfunction getStyleNumberByName(styleName) {\n  const number = STYLENAME[styleName];\n\n  if (number === undefined) {\n    return -1;\n  }\n\n  return number;\n}\n\n/**\n * Check if given number is a valid style number.\n * @param {string | number} style\n * @returns {boolean} true if valid, false otherwise\n */\nfunction checkStyleNumber(style) {\n  let valid = false;\n\n  for (const n in STYLE) {\n    if (STYLE[n] === style) {\n      valid = true;\n      break;\n    }\n  }\n\n  return valid;\n}\n\n/**\n *\n * @param {string | number} style\n * @param {object} dst\n */\nfunction setStyle(style, dst) {\n  if (style === undefined) {\n    return; // Nothing to do\n  }\n\n  let styleNumber;\n\n  if (typeof style === \"string\") {\n    styleNumber = getStyleNumberByName(style);\n\n    if (styleNumber === -1) {\n      throw new Error(\"Style '\" + style + \"' is invalid\");\n    }\n  } else {\n    // Do a pedantic check on style number value\n    if (!checkStyleNumber(style)) {\n      throw new Error(\"Style '\" + style + \"' is invalid\");\n    }\n\n    styleNumber = style;\n  }\n\n  dst.style = styleNumber;\n}\n\n/**\n * Set the background styling for the graph\n * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor\n * @param {object} dst\n */\nfunction setBackgroundColor(backgroundColor, dst) {\n  let fill = \"white\";\n  let stroke = \"gray\";\n  let strokeWidth = 1;\n\n  if (typeof backgroundColor === \"string\") {\n    fill = backgroundColor;\n    stroke = \"none\";\n    strokeWidth = 0;\n  } else if (typeof backgroundColor === \"object\") {\n    if (backgroundColor.fill !== undefined) fill = backgroundColor.fill;\n    if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke;\n    if (backgroundColor.strokeWidth !== undefined)\n      strokeWidth = backgroundColor.strokeWidth;\n  } else {\n    throw new Error(\"Unsupported type of backgroundColor\");\n  }\n\n  dst.frame.style.backgroundColor = fill;\n  dst.frame.style.borderColor = stroke;\n  dst.frame.style.borderWidth = strokeWidth + \"px\";\n  dst.frame.style.borderStyle = \"solid\";\n}\n\n/**\n *\n * @param {string | object} dataColor\n * @param {object} dst\n */\nfunction setDataColor(dataColor, dst) {\n  if (dataColor === undefined) {\n    return; // Nothing to do\n  }\n\n  if (dst.dataColor === undefined) {\n    dst.dataColor = {};\n  }\n\n  if (typeof dataColor === \"string\") {\n    dst.dataColor.fill = dataColor;\n    dst.dataColor.stroke = dataColor;\n  } else {\n    if (dataColor.fill) {\n      dst.dataColor.fill = dataColor.fill;\n    }\n    if (dataColor.stroke) {\n      dst.dataColor.stroke = dataColor.stroke;\n    }\n    if (dataColor.strokeWidth !== undefined) {\n      dst.dataColor.strokeWidth = dataColor.strokeWidth;\n    }\n  }\n}\n\n/**\n *\n * @param {object | Array<string>} surfaceColors Either an object that describes the HUE, or an array of HTML hex color codes\n * @param {object} dst\n */\nfunction setSurfaceColor(surfaceColors, dst) {\n  if (surfaceColors === undefined || surfaceColors === true) {\n    return; // Nothing to do\n  }\n  if (surfaceColors === false) {\n    dst.surfaceColors = undefined;\n    return;\n  }\n\n  if (dst.surfaceColors === undefined) {\n    dst.surfaceColors = {};\n  }\n\n  let rgbColors;\n  if (Array.isArray(surfaceColors)) {\n    rgbColors = parseColorArray(surfaceColors);\n  } else if (typeof surfaceColors === \"object\") {\n    rgbColors = parseColorObject(surfaceColors.hue);\n  } else {\n    throw new Error(\"Unsupported type of surfaceColors\");\n  }\n  // for some reason surfaceColors goes from vMax to vMin:\n  rgbColors.reverse();\n  dst.colormap = rgbColors;\n}\n\n/**\n *\n * @param {object | Array<string>} colormap Either an object that describes the HUE, or an array of HTML hex color codes\n * @param {object} dst\n */\nfunction setColormap(colormap, dst) {\n  if (colormap === undefined) {\n    return;\n  }\n\n  let rgbColors;\n  if (Array.isArray(colormap)) {\n    rgbColors = parseColorArray(colormap);\n  } else if (typeof colormap === \"object\") {\n    rgbColors = parseColorObject(colormap.hue);\n  } else if (typeof colormap === \"function\") {\n    rgbColors = colormap;\n  } else {\n    throw new Error(\"Unsupported type of colormap\");\n  }\n  dst.colormap = rgbColors;\n}\n\n/**\n *\n * @param {Array} colormap\n */\nfunction parseColorArray(colormap) {\n  if (colormap.length < 2) {\n    throw new Error(\"Colormap array length must be 2 or above.\");\n  }\n  return colormap.map(function (colorCode) {\n    if (!util.isValidHex(colorCode)) {\n      throw new Error(`Invalid hex color code supplied to colormap.`);\n    }\n    return util.hexToRGB(colorCode);\n  });\n}\n\n/**\n * Converts an object to a certain amount of hex color stops. At which point:\n * the HTML hex color codes is converted into an RGB color object.\n * @param {object} hues\n */\nfunction parseColorObject(hues) {\n  if (hues === undefined) {\n    throw new Error(\"Unsupported type of colormap\");\n  }\n  if (!(hues.saturation >= 0 && hues.saturation <= 100)) {\n    throw new Error(\"Saturation is out of bounds. Expected range is 0-100.\");\n  }\n  if (!(hues.brightness >= 0 && hues.brightness <= 100)) {\n    throw new Error(\"Brightness is out of bounds. Expected range is 0-100.\");\n  }\n  if (!(hues.colorStops >= 2)) {\n    throw new Error(\"colorStops is out of bounds. Expected 2 or above.\");\n  }\n\n  const hueStep = (hues.end - hues.start) / (hues.colorStops - 1);\n\n  const rgbColors = [];\n  for (let i = 0; i < hues.colorStops; ++i) {\n    const hue = ((hues.start + hueStep * i) % 360) / 360;\n    rgbColors.push(\n      util.HSVToRGB(\n        hue < 0 ? hue + 1 : hue,\n        hues.saturation / 100,\n        hues.brightness / 100,\n      ),\n    );\n  }\n  return rgbColors;\n}\n\n/**\n *\n * @param {object} cameraPosition\n * @param {object} dst\n */\nfunction setCameraPosition(cameraPosition, dst) {\n  const camPos = cameraPosition;\n  if (camPos === undefined) {\n    return;\n  }\n\n  if (dst.camera === undefined) {\n    dst.camera = new Camera();\n  }\n\n  dst.camera.setArmRotation(camPos.horizontal, camPos.vertical);\n  dst.camera.setArmLength(camPos.distance);\n}\n\nexport { STYLE, setCameraPosition, setDefaults, setOptions };\n","/**\n * This object contains all possible options. It will check if the types are correct, if required if the option is one\n * of the allowed values.\n *\n * __any__ means that the name of the property does not matter.\n * __type__ is a required field for all objects and contains the allowed types of all objects\n */\nconst string = \"string\";\nconst bool = \"boolean\";\nconst number = \"number\";\nconst object = \"object\"; // should only be in a __type__ property\nconst array = \"array\";\n// Following not used here, but useful for reference\n//let dom      = 'dom';\n//let any      = 'any';\n\nconst colorOptions = {\n  fill: { string },\n  stroke: { string },\n  strokeWidth: { number },\n  __type__: { string, object, undefined: \"undefined\" },\n};\n\nconst surfaceColorsOptions = {\n  hue: {\n    start: { number },\n    end: { number },\n    saturation: { number },\n    brightness: { number },\n    colorStops: { number },\n    __type__: { object },\n  },\n  __type__: { boolean: bool, array, object, undefined: \"undefined\" },\n};\n\nconst colormapOptions = {\n  hue: {\n    start: { number },\n    end: { number },\n    saturation: { number },\n    brightness: { number },\n    colorStops: { number },\n    __type__: { object },\n  },\n  __type__: { array, object, function: \"function\", undefined: \"undefined\" },\n};\n\n/**\n * Order attempted to be alphabetical.\n *   - x/y/z-prefixes ignored in sorting\n *   - __type__ always at end\n *   - globals at end\n */\nconst allOptions = {\n  animationAutoStart: { boolean: bool, undefined: \"undefined\" },\n  animationInterval: { number },\n  animationPreload: { boolean: bool },\n  axisColor: { string },\n  axisFontSize: { number: number },\n  axisFontType: { string: string },\n  backgroundColor: colorOptions,\n  xBarWidth: { number, undefined: \"undefined\" },\n  yBarWidth: { number, undefined: \"undefined\" },\n  cameraPosition: {\n    distance: { number },\n    horizontal: { number },\n    vertical: { number },\n    __type__: { object },\n  },\n  zoomable: { boolean: bool },\n  ctrlToZoom: { boolean: bool },\n  xCenter: { string },\n  yCenter: { string },\n  colormap: colormapOptions,\n  dataColor: colorOptions,\n  dotSizeMinFraction: { number },\n  dotSizeMaxFraction: { number },\n  dotSizeRatio: { number },\n  filterLabel: { string },\n  gridColor: { string },\n  onclick: { function: \"function\" },\n  keepAspectRatio: { boolean: bool },\n  xLabel: { string },\n  yLabel: { string },\n  zLabel: { string },\n  legendLabel: { string },\n  xMin: { number, undefined: \"undefined\" },\n  yMin: { number, undefined: \"undefined\" },\n  zMin: { number, undefined: \"undefined\" },\n  xMax: { number, undefined: \"undefined\" },\n  yMax: { number, undefined: \"undefined\" },\n  zMax: { number, undefined: \"undefined\" },\n  showAnimationControls: { boolean: bool, undefined: \"undefined\" },\n  showGrayBottom: { boolean: bool },\n  showGrid: { boolean: bool },\n  showLegend: { boolean: bool, undefined: \"undefined\" },\n  showPerspective: { boolean: bool },\n  showShadow: { boolean: bool },\n  showSurfaceGrid: { boolean: bool },\n  showXAxis: { boolean: bool },\n  showYAxis: { boolean: bool },\n  showZAxis: { boolean: bool },\n  rotateAxisLabels: { boolean: bool },\n  surfaceColors: surfaceColorsOptions,\n  xStep: { number, undefined: \"undefined\" },\n  yStep: { number, undefined: \"undefined\" },\n  zStep: { number, undefined: \"undefined\" },\n  style: {\n    number, // TODO: either Graph3d.DEFAULT has string, or number allowed in documentation\n    string: [\n      \"bar\",\n      \"bar-color\",\n      \"bar-size\",\n      \"dot\",\n      \"dot-line\",\n      \"dot-color\",\n      \"dot-size\",\n      \"line\",\n      \"grid\",\n      \"surface\",\n    ],\n  },\n  tooltip: { boolean: bool, function: \"function\" },\n  tooltipDelay: { number: number },\n  tooltipStyle: {\n    content: {\n      color: { string },\n      background: { string },\n      border: { string },\n      borderRadius: { string },\n      boxShadow: { string },\n      padding: { string },\n      __type__: { object },\n    },\n    line: {\n      borderLeft: { string },\n      height: { string },\n      width: { string },\n      pointerEvents: { string },\n      __type__: { object },\n    },\n    dot: {\n      border: { string },\n      borderRadius: { string },\n      height: { string },\n      width: { string },\n      pointerEvents: { string },\n      __type__: { object },\n    },\n    __type__: { object },\n  },\n  xValueLabel: { function: \"function\" },\n  yValueLabel: { function: \"function\" },\n  zValueLabel: { function: \"function\" },\n  valueMax: { number, undefined: \"undefined\" },\n  valueMin: { number, undefined: \"undefined\" },\n  verticalRatio: { number },\n\n  //globals :\n  height: { string },\n  width: { string },\n  __type__: { object },\n};\n\nexport { allOptions };\n","/**\n * Helper class to make working with related min and max values easier.\n *\n * The range is inclusive; a given value is considered part of the range if:\n *\n *    this.min <= value <= this.max\n */\nfunction Range() {\n  this.min = undefined;\n  this.max = undefined;\n}\n\n/**\n * Adjust the range so that the passed value fits in it.\n *\n * If the value is outside of the current extremes, adjust\n * the min or max so that the value is within the range.\n * @param {number} value Numeric value to fit in range\n */\nRange.prototype.adjust = function (value) {\n  if (value === undefined) return;\n\n  if (this.min === undefined || this.min > value) {\n    this.min = value;\n  }\n\n  if (this.max === undefined || this.max < value) {\n    this.max = value;\n  }\n};\n\n/**\n * Adjust the current range so that the passed range fits in it.\n * @param {Range} range Range instance to fit in current instance\n */\nRange.prototype.combine = function (range) {\n  this.add(range.min);\n  this.add(range.max);\n};\n\n/**\n * Expand the range by the given value\n *\n * min will be lowered by given value;\n * max will be raised by given value\n *\n * Shrinking by passing a negative value is allowed.\n * @param {number} val Amount by which to expand or shrink current range with\n */\nRange.prototype.expand = function (val) {\n  if (val === undefined) {\n    return;\n  }\n\n  const newMin = this.min - val;\n  const newMax = this.max + val;\n\n  // Note that following allows newMin === newMax.\n  // This should be OK, since method expand() allows this also.\n  if (newMin > newMax) {\n    throw new Error(\"Passed expansion value makes range invalid\");\n  }\n\n  this.min = newMin;\n  this.max = newMax;\n};\n\n/**\n * Determine the full range width of current instance.\n * @returns {num} The calculated width of this range\n */\nRange.prototype.range = function () {\n  return this.max - this.min;\n};\n\n/**\n * Determine the central point of current instance.\n * @returns {number} the value in the middle of min and max\n */\nRange.prototype.center = function () {\n  return (this.min + this.max) / 2;\n};\n\nexport default Range;\n","import { DataView } from \"vis-data/esnext\";\n\n/**\n * @class Filter\n * @param {DataGroup} dataGroup the data group\n * @param {number}  column             The index of the column to be filtered\n * @param {Graph3d} graph              The graph\n */\nfunction Filter(dataGroup, column, graph) {\n  this.dataGroup = dataGroup;\n  this.column = column;\n  this.graph = graph; // the parent graph\n\n  this.index = undefined;\n  this.value = undefined;\n\n  // read all distinct values and select the first one\n  this.values = dataGroup.getDistinctValues(this.column);\n\n  if (this.values.length > 0) {\n    this.selectValue(0);\n  }\n\n  // create an array with the filtered datapoints. this will be loaded afterwards\n  this.dataPoints = [];\n\n  this.loaded = false;\n  this.onLoadCallback = undefined;\n\n  if (graph.animationPreload) {\n    this.loaded = false;\n    this.loadInBackground();\n  } else {\n    this.loaded = true;\n  }\n}\n\n/**\n * Return the label\n * @returns {string} label\n */\nFilter.prototype.isLoaded = function () {\n  return this.loaded;\n};\n\n/**\n * Return the loaded progress\n * @returns {number} percentage between 0 and 100\n */\nFilter.prototype.getLoadedProgress = function () {\n  const len = this.values.length;\n\n  let i = 0;\n  while (this.dataPoints[i]) {\n    i++;\n  }\n\n  return Math.round((i / len) * 100);\n};\n\n/**\n * Return the label\n * @returns {string} label\n */\nFilter.prototype.getLabel = function () {\n  return this.graph.filterLabel;\n};\n\n/**\n * Return the columnIndex of the filter\n * @returns {number} columnIndex\n */\nFilter.prototype.getColumn = function () {\n  return this.column;\n};\n\n/**\n * Return the currently selected value. Returns undefined if there is no selection\n * @returns {*} value\n */\nFilter.prototype.getSelectedValue = function () {\n  if (this.index === undefined) return undefined;\n\n  return this.values[this.index];\n};\n\n/**\n * Retrieve all values of the filter\n * @returns {Array} values\n */\nFilter.prototype.getValues = function () {\n  return this.values;\n};\n\n/**\n * Retrieve one value of the filter\n * @param {number}  index\n * @returns {*} value\n */\nFilter.prototype.getValue = function (index) {\n  if (index >= this.values.length) throw new Error(\"Index out of range\");\n\n  return this.values[index];\n};\n\n/**\n * Retrieve the (filtered) dataPoints for the currently selected filter index\n * @param {number} [index] (optional)\n * @returns {Array} dataPoints\n */\nFilter.prototype._getDataPoints = function (index) {\n  if (index === undefined) index = this.index;\n\n  if (index === undefined) return [];\n\n  let dataPoints;\n  if (this.dataPoints[index]) {\n    dataPoints = this.dataPoints[index];\n  } else {\n    const f = {};\n    f.column = this.column;\n    f.value = this.values[index];\n\n    const dataView = new DataView(this.dataGroup.getDataSet(), {\n      filter: function (item) {\n        return item[f.column] == f.value;\n      },\n    }).get();\n    dataPoints = this.dataGroup._getDataPoints(dataView);\n\n    this.dataPoints[index] = dataPoints;\n  }\n\n  return dataPoints;\n};\n\n/**\n * Set a callback function when the filter is fully loaded.\n * @param {Function} callback\n */\nFilter.prototype.setOnLoadCallback = function (callback) {\n  this.onLoadCallback = callback;\n};\n\n/**\n * Add a value to the list with available values for this filter\n * No double entries will be created.\n * @param {number} index\n */\nFilter.prototype.selectValue = function (index) {\n  if (index >= this.values.length) throw new Error(\"Index out of range\");\n\n  this.index = index;\n  this.value = this.values[index];\n};\n\n/**\n * Load all filtered rows in the background one by one\n * Start this method without providing an index!\n * @param {number} [index]\n */\nFilter.prototype.loadInBackground = function (index) {\n  if (index === undefined) index = 0;\n\n  const frame = this.graph.frame;\n\n  if (index < this.values.length) {\n    // create a progress box\n    if (frame.progress === undefined) {\n      frame.progress = document.createElement(\"DIV\");\n      frame.progress.style.position = \"absolute\";\n      frame.progress.style.color = \"gray\";\n      frame.appendChild(frame.progress);\n    }\n    const progress = this.getLoadedProgress();\n    frame.progress.innerHTML = \"Loading animation... \" + progress + \"%\";\n    // TODO: this is no nice solution...\n    frame.progress.style.bottom = 60 + \"px\"; // TODO: use height of slider\n    frame.progress.style.left = 10 + \"px\";\n\n    const me = this;\n    setTimeout(function () {\n      me.loadInBackground(index + 1);\n    }, 10);\n    this.loaded = false;\n  } else {\n    this.loaded = true;\n\n    // remove the progress box\n    if (frame.progress !== undefined) {\n      frame.removeChild(frame.progress);\n      frame.progress = undefined;\n    }\n\n    if (this.onLoadCallback) this.onLoadCallback();\n  }\n};\n\nexport default Filter;\n","import { DataSet } from \"vis-data/esnext\";\nimport { DataView } from \"vis-data/esnext\";\nimport Range from \"./Range.js\";\nimport Filter from \"./Filter.js\";\nimport { STYLE } from \"./Settings.js\";\nimport Point3d from \"./Point3d.js\";\n\n/**\n * Creates a container for all data of one specific 3D-graph.\n *\n * On construction, the container is totally empty; the data\n * needs to be initialized with method initializeData().\n * Failure to do so will result in the following exception begin thrown\n * on instantiation of Graph3D:\n *\n * Error: Array, DataSet, or DataView expected\n * @function Object() { [native code] } DataGroup\n */\nfunction DataGroup() {\n  this.dataTable = null; // The original data table\n}\n\n/**\n * Initializes the instance from the passed data.\n *\n * Calculates minimum and maximum values and column index values.\n *\n * The graph3d instance is used internally to access the settings for\n * the given instance.\n * TODO: Pass settings only instead.\n * @param {vis.Graph3d}  graph3d Reference to the calling Graph3D instance.\n * @param {Array | DataSet | DataView} rawData The data containing the items for\n *                                             the Graph.\n * @param {number}   style   Style Number\n * @returns {Array.<object>}\n */\nDataGroup.prototype.initializeData = function (graph3d, rawData, style) {\n  if (rawData === undefined) return;\n\n  if (Array.isArray(rawData)) {\n    rawData = new DataSet(rawData);\n  }\n\n  let data;\n  if (rawData instanceof DataSet || rawData instanceof DataView) {\n    data = rawData.get();\n  } else {\n    throw new Error(\"Array, DataSet, or DataView expected\");\n  }\n\n  if (data.length == 0) return;\n\n  this.style = style;\n\n  // unsubscribe from the dataTable\n  if (this.dataSet) {\n    this.dataSet.off(\"*\", this._onChange);\n  }\n\n  this.dataSet = rawData;\n  this.dataTable = data;\n\n  // subscribe to changes in the dataset\n  const me = this;\n  this._onChange = function () {\n    graph3d.setData(me.dataSet);\n  };\n  this.dataSet.on(\"*\", this._onChange);\n\n  // determine the location of x,y,z,value,filter columns\n  this.colX = \"x\";\n  this.colY = \"y\";\n  this.colZ = \"z\";\n\n  const withBars = graph3d.hasBars(style);\n\n  // determine barWidth from data\n  if (withBars) {\n    if (graph3d.defaultXBarWidth !== undefined) {\n      this.xBarWidth = graph3d.defaultXBarWidth;\n    } else {\n      this.xBarWidth = this.getSmallestDifference(data, this.colX) || 1;\n    }\n\n    if (graph3d.defaultYBarWidth !== undefined) {\n      this.yBarWidth = graph3d.defaultYBarWidth;\n    } else {\n      this.yBarWidth = this.getSmallestDifference(data, this.colY) || 1;\n    }\n  }\n\n  // calculate minima and maxima\n  this._initializeRange(data, this.colX, graph3d, withBars);\n  this._initializeRange(data, this.colY, graph3d, withBars);\n  this._initializeRange(data, this.colZ, graph3d, false);\n\n  if (Object.prototype.hasOwnProperty.call(data[0], \"style\")) {\n    this.colValue = \"style\";\n    const valueRange = this.getColumnRange(data, this.colValue);\n    this._setRangeDefaults(\n      valueRange,\n      graph3d.defaultValueMin,\n      graph3d.defaultValueMax,\n    );\n    this.valueRange = valueRange;\n  } else {\n    this.colValue = \"z\";\n    this.valueRange = this.zRange;\n  }\n\n  // Initialize data filter if a filter column is provided\n  const table = this.getDataTable();\n  if (Object.prototype.hasOwnProperty.call(table[0], \"filter\")) {\n    if (this.dataFilter === undefined) {\n      this.dataFilter = new Filter(this, \"filter\", graph3d);\n      this.dataFilter.setOnLoadCallback(function () {\n        graph3d.redraw();\n      });\n    }\n  }\n\n  let dataPoints;\n  if (this.dataFilter) {\n    // apply filtering\n    dataPoints = this.dataFilter._getDataPoints();\n  } else {\n    // no filtering. load all data\n    dataPoints = this._getDataPoints(this.getDataTable());\n  }\n  return dataPoints;\n};\n\n/**\n * Collect the range settings for the given data column.\n *\n * This internal method is intended to make the range\n * initalization more generic.\n *\n * TODO: if/when combined settings per axis defined, get rid of this.\n * @private\n * @param {'x'|'y'|'z'} column  The data column to process\n * @param {vis.Graph3d} graph3d Reference to the calling Graph3D instance;\n *                              required for access to settings\n * @returns {object}\n */\nDataGroup.prototype._collectRangeSettings = function (column, graph3d) {\n  const index = [\"x\", \"y\", \"z\"].indexOf(column);\n\n  if (index == -1) {\n    throw new Error(\"Column '\" + column + \"' invalid\");\n  }\n\n  const upper = column.toUpperCase();\n\n  return {\n    barWidth: this[column + \"BarWidth\"],\n    min: graph3d[\"default\" + upper + \"Min\"],\n    max: graph3d[\"default\" + upper + \"Max\"],\n    step: graph3d[\"default\" + upper + \"Step\"],\n    range_label: column + \"Range\", // Name of instance field to write to\n    step_label: column + \"Step\", // Name of instance field to write to\n  };\n};\n\n/**\n * Initializes the settings per given column.\n *\n * TODO: if/when combined settings per axis defined, rewrite this.\n * @private\n * @param {DataSet | DataView} data     The data containing the items for the Graph\n * @param {'x'|'y'|'z'}        column   The data column to process\n * @param {vis.Graph3d}        graph3d  Reference to the calling Graph3D instance;\n *                                      required for access to settings\n * @param {boolean}            withBars True if initializing for bar graph\n */\nDataGroup.prototype._initializeRange = function (\n  data,\n  column,\n  graph3d,\n  withBars,\n) {\n  const NUMSTEPS = 5;\n  const settings = this._collectRangeSettings(column, graph3d);\n\n  const range = this.getColumnRange(data, column);\n  if (withBars && column != \"z\") {\n    // Safeguard for 'z'; it doesn't have a bar width\n    range.expand(settings.barWidth / 2);\n  }\n\n  this._setRangeDefaults(range, settings.min, settings.max);\n  this[settings.range_label] = range;\n  this[settings.step_label] =\n    settings.step !== undefined ? settings.step : range.range() / NUMSTEPS;\n};\n\n/**\n * Creates a list with all the different values in the data for the given column.\n *\n * If no data passed, use the internal data of this instance.\n * @param {'x'|'y'|'z'}                column The data column to process\n * @param {DataSet|DataView|undefined} data   The data containing the items for the Graph\n * @returns {Array} All distinct values in the given column data, sorted ascending.\n */\nDataGroup.prototype.getDistinctValues = function (column, data) {\n  if (data === undefined) {\n    data = this.dataTable;\n  }\n\n  const values = [];\n\n  for (let i = 0; i < data.length; i++) {\n    const value = data[i][column] || 0;\n    if (values.indexOf(value) === -1) {\n      values.push(value);\n    }\n  }\n\n  return values.sort(function (a, b) {\n    return a - b;\n  });\n};\n\n/**\n * Determine the smallest difference between the values for given\n * column in the passed data set.\n * @param {DataSet|DataView|undefined} data   The data containing the items for the Graph\n * @param {'x'|'y'|'z'}                column The data column to process\n * @returns {number|null} Smallest difference value or\n *                        null, if it can't be determined.\n */\nDataGroup.prototype.getSmallestDifference = function (data, column) {\n  const values = this.getDistinctValues(data, column);\n\n  // Get all the distinct diffs\n  // Array values is assumed to be sorted here\n  let smallest_diff = null;\n\n  for (let i = 1; i < values.length; i++) {\n    const diff = values[i] - values[i - 1];\n\n    if (smallest_diff == null || smallest_diff > diff) {\n      smallest_diff = diff;\n    }\n  }\n\n  return smallest_diff;\n};\n\n/**\n * Get the absolute min/max values for the passed data column.\n * @param {DataSet|DataView|undefined} data   The data containing the items for the Graph\n * @param {'x'|'y'|'z'}                column The data column to process\n * @returns {Range} A Range instance with min/max members properly set.\n */\nDataGroup.prototype.getColumnRange = function (data, column) {\n  const range = new Range();\n\n  // Adjust the range so that it covers all values in the passed data elements.\n  for (let i = 0; i < data.length; i++) {\n    const item = data[i][column];\n    range.adjust(item);\n  }\n\n  return range;\n};\n\n/**\n * Determines the number of rows in the current data.\n * @returns {number}\n */\nDataGroup.prototype.getNumberOfRows = function () {\n  return this.dataTable.length;\n};\n\n/**\n * Set default values for range\n *\n * The default values override the range values, if defined.\n *\n * Because it's possible that only defaultMin or defaultMax is set, it's better\n * to pass in a range already set with the min/max set from the data. Otherwise,\n * it's quite hard to process the min/max properly.\n * @param {vis.Range} range\n * @param {number} [defaultMin]\n * @param {number} [defaultMax]\n * @private\n */\nDataGroup.prototype._setRangeDefaults = function (\n  range,\n  defaultMin,\n  defaultMax,\n) {\n  if (defaultMin !== undefined) {\n    range.min = defaultMin;\n  }\n\n  if (defaultMax !== undefined) {\n    range.max = defaultMax;\n  }\n\n  // This is the original way that the default min/max values were adjusted.\n  // TODO: Perhaps it's better if an error is thrown if the values do not agree.\n  //       But this will change the behaviour.\n  if (range.max <= range.min) range.max = range.min + 1;\n};\n\nDataGroup.prototype.getDataTable = function () {\n  return this.dataTable;\n};\n\nDataGroup.prototype.getDataSet = function () {\n  return this.dataSet;\n};\n\n/**\n * Return all data values as a list of Point3d objects\n * @param {Array.<object>} data\n * @returns {Array.<object>}\n */\nDataGroup.prototype.getDataPoints = function (data) {\n  const dataPoints = [];\n\n  for (let i = 0; i < data.length; i++) {\n    const point = new Point3d();\n    point.x = data[i][this.colX] || 0;\n    point.y = data[i][this.colY] || 0;\n    point.z = data[i][this.colZ] || 0;\n    point.data = data[i];\n    point.value = data[i][this.colValue] || 0;\n\n    const obj = {};\n    obj.point = point;\n    obj.bottom = new Point3d(point.x, point.y, this.zRange.min);\n    obj.trans = undefined;\n    obj.screen = undefined;\n\n    dataPoints.push(obj);\n  }\n\n  return dataPoints;\n};\n\n/**\n * Copy all values from the data table to a matrix.\n *\n * The provided values are supposed to form a grid of (x,y) positions.\n * @param {Array.<object>} data\n * @returns {Array.<object>}\n * @private\n */\nDataGroup.prototype.initDataAsMatrix = function (data) {\n  // TODO: store the created matrix dataPoints in the filters instead of\n  //       reloading each time.\n  let x, y, i, obj;\n\n  // create two lists with all present x and y values\n  const dataX = this.getDistinctValues(this.colX, data);\n  const dataY = this.getDistinctValues(this.colY, data);\n\n  const dataPoints = this.getDataPoints(data);\n\n  // create a grid, a 2d matrix, with all values.\n  const dataMatrix = []; // temporary data matrix\n  for (i = 0; i < dataPoints.length; i++) {\n    obj = dataPoints[i];\n\n    // TODO: implement Array().indexOf() for Internet Explorer\n    const xIndex = dataX.indexOf(obj.point.x);\n    const yIndex = dataY.indexOf(obj.point.y);\n\n    if (dataMatrix[xIndex] === undefined) {\n      dataMatrix[xIndex] = [];\n    }\n\n    dataMatrix[xIndex][yIndex] = obj;\n  }\n\n  // fill in the pointers to the neighbors.\n  for (x = 0; x < dataMatrix.length; x++) {\n    for (y = 0; y < dataMatrix[x].length; y++) {\n      if (dataMatrix[x][y]) {\n        dataMatrix[x][y].pointRight =\n          x < dataMatrix.length - 1 ? dataMatrix[x + 1][y] : undefined;\n        dataMatrix[x][y].pointTop =\n          y < dataMatrix[x].length - 1 ? dataMatrix[x][y + 1] : undefined;\n        dataMatrix[x][y].pointCross =\n          x < dataMatrix.length - 1 && y < dataMatrix[x].length - 1\n            ? dataMatrix[x + 1][y + 1]\n            : undefined;\n      }\n    }\n  }\n\n  return dataPoints;\n};\n\n/**\n * Return common information, if present\n * @returns {string}\n */\nDataGroup.prototype.getInfo = function () {\n  const dataFilter = this.dataFilter;\n  if (!dataFilter) return undefined;\n\n  return dataFilter.getLabel() + \": \" + dataFilter.getSelectedValue();\n};\n\n/**\n * Reload the data\n */\nDataGroup.prototype.reload = function () {\n  if (this.dataTable) {\n    this.setData(this.dataTable);\n  }\n};\n\n/**\n * Filter the data based on the current filter\n * @param   {Array} data\n * @returns {Array} dataPoints Array with point objects which can be drawn on\n *                             screen\n */\nDataGroup.prototype._getDataPoints = function (data) {\n  let dataPoints = [];\n\n  if (this.style === STYLE.GRID || this.style === STYLE.SURFACE) {\n    dataPoints = this.initDataAsMatrix(data);\n  } else {\n    // 'dot', 'dot-line', etc.\n    dataPoints = this.getDataPoints(data);\n\n    if (this.style === STYLE.LINE) {\n      // Add next member points for line drawing\n      for (let i = 0; i < dataPoints.length; i++) {\n        if (i > 0) {\n          dataPoints[i - 1].pointNext = dataPoints[i];\n        }\n      }\n    }\n  }\n\n  return dataPoints;\n};\n\nexport default DataGroup;\n","import Emitter from \"component-emitter\";\nimport * as util from \"vis-util/esnext\";\nimport Point3d from \"./Point3d.js\";\nimport Point2d from \"./Point2d.js\";\nimport Slider from \"./Slider.js\";\nimport StepNumber from \"./StepNumber.js\";\nimport {\n  STYLE,\n  setCameraPosition,\n  setDefaults,\n  setOptions,\n} from \"./Settings.js\";\nimport { VALIDATOR_PRINT_STYLE, Validator } from \"vis-util/esnext\";\nimport { allOptions } from \"./options.js\";\nimport DataGroup from \"./DataGroup.js\";\n\n/// enumerate the available styles\nGraph3d.STYLE = STYLE;\n\n/**\n * Following label is used in the settings to describe values which should be\n * determined by the code while running, from the current data and graph style.\n *\n * Using 'undefined' directly achieves the same thing, but this is more\n * descriptive by describing the intent.\n */\nconst autoByDefault = undefined;\n\n/**\n * Default values for option settings.\n *\n * These are the values used when a Graph3d instance is initialized without\n * custom settings.\n *\n * If a field is not in this list, a default value of 'autoByDefault' is assumed,\n * which is just an alias for 'undefined'.\n */\nGraph3d.DEFAULTS = {\n  width: \"400px\",\n  height: \"400px\",\n  filterLabel: \"time\",\n  legendLabel: \"value\",\n  xLabel: \"x\",\n  yLabel: \"y\",\n  zLabel: \"z\",\n  xValueLabel: function (v) {\n    return v;\n  },\n  yValueLabel: function (v) {\n    return v;\n  },\n  zValueLabel: function (v) {\n    return v;\n  },\n  showXAxis: true,\n  showYAxis: true,\n  showZAxis: true,\n  showGrayBottom: false,\n  showGrid: true,\n  showPerspective: true,\n  showShadow: false,\n  showSurfaceGrid: true,\n  keepAspectRatio: true,\n  rotateAxisLabels: true,\n  verticalRatio: 0.5, // 0.1 to 1.0, where 1.0 results in a 'cube'\n\n  dotSizeRatio: 0.02, // size of the dots as a fraction of the graph width\n  dotSizeMinFraction: 0.5, // size of min-value dot as a fraction of dotSizeRatio\n  dotSizeMaxFraction: 2.5, // size of max-value dot as a fraction of dotSizeRatio\n\n  showAnimationControls: autoByDefault,\n  animationInterval: 1000, // milliseconds\n  animationPreload: false,\n  animationAutoStart: autoByDefault,\n\n  axisFontSize: 14,\n  axisFontType: \"arial\",\n  axisColor: \"#4D4D4D\",\n  gridColor: \"#D3D3D3\",\n  xCenter: \"55%\",\n  yCenter: \"50%\",\n\n  style: Graph3d.STYLE.DOT,\n  tooltip: false,\n  tooltipDelay: 300, // milliseconds\n\n  tooltipStyle: {\n    content: {\n      padding: \"10px\",\n      border: \"1px solid #4d4d4d\",\n      color: \"#1a1a1a\",\n      background: \"rgba(255,255,255,0.7)\",\n      borderRadius: \"2px\",\n      boxShadow: \"5px 5px 10px rgba(128,128,128,0.5)\",\n    },\n    line: {\n      height: \"40px\",\n      width: \"0\",\n      borderLeft: \"1px solid #4d4d4d\",\n      pointerEvents: \"none\",\n    },\n    dot: {\n      height: \"0\",\n      width: \"0\",\n      border: \"5px solid #4d4d4d\",\n      borderRadius: \"5px\",\n      pointerEvents: \"none\",\n    },\n  },\n\n  dataColor: {\n    fill: \"#7DC1FF\",\n    stroke: \"#3267D2\",\n    strokeWidth: 1, // px\n  },\n\n  surfaceColors: autoByDefault,\n  colormap: autoByDefault,\n\n  cameraPosition: {\n    horizontal: 1.0,\n    vertical: 0.5,\n    distance: 1.7,\n  },\n\n  zoomable: true,\n  ctrlToZoom: false,\n\n  /*\n  The following fields are 'auto by default', see above.\n */\n  showLegend: autoByDefault, // determined by graph style\n  backgroundColor: autoByDefault,\n\n  xBarWidth: autoByDefault,\n  yBarWidth: autoByDefault,\n  valueMin: autoByDefault,\n  valueMax: autoByDefault,\n  xMin: autoByDefault,\n  xMax: autoByDefault,\n  xStep: autoByDefault,\n  yMin: autoByDefault,\n  yMax: autoByDefault,\n  yStep: autoByDefault,\n  zMin: autoByDefault,\n  zMax: autoByDefault,\n  zStep: autoByDefault,\n};\n\n// -----------------------------------------------------------------------------\n// Class Graph3d\n// -----------------------------------------------------------------------------\n\n/**\n * Graph3d displays data in 3d.\n *\n * Graph3d is developed in javascript as a Google Visualization Chart.\n * @function Object() { [native code] } Graph3d\n * @param {Element} container   The DOM element in which the Graph3d will\n *                              be created. Normally a div element.\n * @param {DataSet | DataView | Array} [data]\n * @param {object} [options]\n */\nfunction Graph3d(container, data, options) {\n  if (!(this instanceof Graph3d)) {\n    throw new SyntaxError(\"Constructor must be called with the new operator\");\n  }\n\n  // create variables and set default values\n  this.containerElement = container;\n\n  this.dataGroup = new DataGroup();\n  this.dataPoints = null; // The table with point objects\n\n  // create a frame and canvas\n  this.create();\n\n  setDefaults(Graph3d.DEFAULTS, this);\n\n  // the column indexes\n  this.colX = undefined;\n  this.colY = undefined;\n  this.colZ = undefined;\n  this.colValue = undefined;\n\n  // TODO: customize axis range\n\n  // apply options (also when undefined)\n  this.setOptions(options);\n\n  // apply data\n  this.setData(data);\n}\n\n// Extend Graph3d with an Emitter mixin\nEmitter(Graph3d.prototype);\n\n/**\n * Calculate the scaling values, dependent on the range in x, y, and z direction\n */\nGraph3d.prototype._setScale = function () {\n  this.scale = new Point3d(\n    1 / this.xRange.range(),\n    1 / this.yRange.range(),\n    1 / this.zRange.range(),\n  );\n\n  // keep aspect ration between x and y scale if desired\n  if (this.keepAspectRatio) {\n    if (this.scale.x < this.scale.y) {\n      //noinspection JSSuspiciousNameCombination\n      this.scale.y = this.scale.x;\n    } else {\n      //noinspection JSSuspiciousNameCombination\n      this.scale.x = this.scale.y;\n    }\n  }\n\n  // scale the vertical axis\n  this.scale.z *= this.verticalRatio;\n  // TODO: can this be automated? verticalRatio?\n\n  // determine scale for (optional) value\n  if (this.valueRange !== undefined) {\n    this.scale.value = 1 / this.valueRange.range();\n  }\n\n  // position the camera arm\n  const xCenter = this.xRange.center() * this.scale.x;\n  const yCenter = this.yRange.center() * this.scale.y;\n  const zCenter = this.zRange.center() * this.scale.z;\n  this.camera.setArmLocation(xCenter, yCenter, zCenter);\n};\n\n/**\n * Convert a 3D location to a 2D location on screen\n * Source: ttp://en.wikipedia.org/wiki/3D_projection\n * @param   {Point3d} point3d  A 3D point with parameters x, y, z\n * @returns {Point2d} point2d  A 2D point with parameters x, y\n */\nGraph3d.prototype._convert3Dto2D = function (point3d) {\n  const translation = this._convertPointToTranslation(point3d);\n  return this._convertTranslationToScreen(translation);\n};\n\n/**\n * Convert a 3D location its translation seen from the camera\n * Source: http://en.wikipedia.org/wiki/3D_projection\n * @param   {Point3d} point3d     A 3D point with parameters x, y, z\n * @returns {Point3d} translation A 3D point with parameters x, y, z This is\n *                                the translation of the point, seen from the\n *                                camera.\n */\nGraph3d.prototype._convertPointToTranslation = function (point3d) {\n  const cameraLocation = this.camera.getCameraLocation(),\n    cameraRotation = this.camera.getCameraRotation(),\n    ax = point3d.x * this.scale.x,\n    ay = point3d.y * this.scale.y,\n    az = point3d.z * this.scale.z,\n    cx = cameraLocation.x,\n    cy = cameraLocation.y,\n    cz = cameraLocation.z,\n    // calculate angles\n    sinTx = Math.sin(cameraRotation.x),\n    cosTx = Math.cos(cameraRotation.x),\n    sinTy = Math.sin(cameraRotation.y),\n    cosTy = Math.cos(cameraRotation.y),\n    sinTz = Math.sin(cameraRotation.z),\n    cosTz = Math.cos(cameraRotation.z),\n    // calculate translation\n    dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz),\n    dy =\n      sinTx *\n        (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) +\n      cosTx * (cosTz * (ay - cy) - sinTz * (ax - cx)),\n    dz =\n      cosTx *\n        (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) -\n      sinTx * (cosTz * (ay - cy) - sinTz * (ax - cx));\n\n  return new Point3d(dx, dy, dz);\n};\n\n/**\n * Convert a translation point to a point on the screen\n * @param   {Point3d} translation A 3D point with parameters x, y, z This is\n *                                the translation of the point, seen from the\n *                                camera.\n * @returns {Point2d} point2d     A 2D point with parameters x, y\n */\nGraph3d.prototype._convertTranslationToScreen = function (translation) {\n  const ex = this.eye.x,\n    ey = this.eye.y,\n    ez = this.eye.z,\n    dx = translation.x,\n    dy = translation.y,\n    dz = translation.z;\n\n  // calculate position on screen from translation\n  let bx;\n  let by;\n  if (this.showPerspective) {\n    bx = (dx - ex) * (ez / dz);\n    by = (dy - ey) * (ez / dz);\n  } else {\n    bx = dx * -(ez / this.camera.getArmLength());\n    by = dy * -(ez / this.camera.getArmLength());\n  }\n\n  // shift and scale the point to the center of the screen\n  // use the width of the graph to scale both horizontally and vertically.\n  return new Point2d(\n    this.currentXCenter + bx * this.frame.canvas.clientWidth,\n    this.currentYCenter - by * this.frame.canvas.clientWidth,\n  );\n};\n\n/**\n * Calculate the translations and screen positions of all points\n * @param {Array.<Point3d>} points\n * @private\n */\nGraph3d.prototype._calcTranslations = function (points) {\n  for (let i = 0; i < points.length; i++) {\n    const point = points[i];\n    point.trans = this._convertPointToTranslation(point.point);\n    point.screen = this._convertTranslationToScreen(point.trans);\n\n    // calculate the translation of the point at the bottom (needed for sorting)\n    const transBottom = this._convertPointToTranslation(point.bottom);\n    point.dist = this.showPerspective ? transBottom.length() : -transBottom.z;\n  }\n\n  // sort the points on depth of their (x,y) position (not on z)\n  const sortDepth = function (a, b) {\n    return b.dist - a.dist;\n  };\n  points.sort(sortDepth);\n};\n\n/**\n * Transfer min/max values to the Graph3d instance.\n */\nGraph3d.prototype._initializeRanges = function () {\n  // TODO: later on, all min/maxes of all datagroups will be combined here\n  const dg = this.dataGroup;\n  this.xRange = dg.xRange;\n  this.yRange = dg.yRange;\n  this.zRange = dg.zRange;\n  this.valueRange = dg.valueRange;\n\n  // Values currently needed but which need to be sorted out for\n  // the multiple graph case.\n  this.xStep = dg.xStep;\n  this.yStep = dg.yStep;\n  this.zStep = dg.zStep;\n  this.xBarWidth = dg.xBarWidth;\n  this.yBarWidth = dg.yBarWidth;\n  this.colX = dg.colX;\n  this.colY = dg.colY;\n  this.colZ = dg.colZ;\n  this.colValue = dg.colValue;\n\n  // set the scale dependent on the ranges.\n  this._setScale();\n};\n\n/**\n * Return all data values as a list of Point3d objects\n * @param {vis.DataSet} data\n * @returns {Array.<object>}\n */\nGraph3d.prototype.getDataPoints = function (data) {\n  const dataPoints = [];\n\n  for (let i = 0; i < data.length; i++) {\n    const point = new Point3d();\n    point.x = data[i][this.colX] || 0;\n    point.y = data[i][this.colY] || 0;\n    point.z = data[i][this.colZ] || 0;\n    point.data = data[i];\n    point.value = data[i][this.colValue] || 0;\n\n    const obj = {};\n    obj.point = point;\n    obj.bottom = new Point3d(point.x, point.y, this.zRange.min);\n    obj.trans = undefined;\n    obj.screen = undefined;\n\n    dataPoints.push(obj);\n  }\n\n  return dataPoints;\n};\n\n/**\n * Filter the data based on the current filter\n * @param   {Array} data\n * @returns {Array} dataPoints Array with point objects which can be drawn on\n *                             screen\n */\nGraph3d.prototype._getDataPoints = function (data) {\n  // TODO: store the created matrix dataPoints in the filters instead of\n  //       reloading each time.\n  let x, y, i, obj;\n\n  let dataPoints = [];\n\n  if (\n    this.style === Graph3d.STYLE.GRID ||\n    this.style === Graph3d.STYLE.SURFACE\n  ) {\n    // copy all values from the data table to a matrix\n    // the provided values are supposed to form a grid of (x,y) positions\n\n    // create two lists with all present x and y values\n    const dataX = this.dataGroup.getDistinctValues(this.colX, data);\n    const dataY = this.dataGroup.getDistinctValues(this.colY, data);\n\n    dataPoints = this.getDataPoints(data);\n\n    // create a grid, a 2d matrix, with all values.\n    const dataMatrix = []; // temporary data matrix\n    for (i = 0; i < dataPoints.length; i++) {\n      obj = dataPoints[i];\n\n      // TODO: implement Array().indexOf() for Internet Explorer\n      const xIndex = dataX.indexOf(obj.point.x);\n      const yIndex = dataY.indexOf(obj.point.y);\n\n      if (dataMatrix[xIndex] === undefined) {\n        dataMatrix[xIndex] = [];\n      }\n\n      dataMatrix[xIndex][yIndex] = obj;\n    }\n\n    // fill in the pointers to the neighbors.\n    for (x = 0; x < dataMatrix.length; x++) {\n      for (y = 0; y < dataMatrix[x].length; y++) {\n        if (dataMatrix[x][y]) {\n          dataMatrix[x][y].pointRight =\n            x < dataMatrix.length - 1 ? dataMatrix[x + 1][y] : undefined;\n          dataMatrix[x][y].pointTop =\n            y < dataMatrix[x].length - 1 ? dataMatrix[x][y + 1] : undefined;\n          dataMatrix[x][y].pointCross =\n            x < dataMatrix.length - 1 && y < dataMatrix[x].length - 1\n              ? dataMatrix[x + 1][y + 1]\n              : undefined;\n        }\n      }\n    }\n  } else {\n    // 'dot', 'dot-line', etc.\n    dataPoints = this.getDataPoints(data);\n\n    if (this.style === Graph3d.STYLE.LINE) {\n      // Add next member points for line drawing\n      for (i = 0; i < dataPoints.length; i++) {\n        if (i > 0) {\n          dataPoints[i - 1].pointNext = dataPoints[i];\n        }\n      }\n    }\n  }\n\n  return dataPoints;\n};\n\n/**\n * Create the main frame for the Graph3d.\n *\n * This function is executed once when a Graph3d object is created. The frame\n * contains a canvas, and this canvas contains all objects like the axis and\n * nodes.\n */\nGraph3d.prototype.create = function () {\n  // remove all elements from the container element.\n  while (this.containerElement.hasChildNodes()) {\n    this.containerElement.removeChild(this.containerElement.firstChild);\n  }\n\n  this.frame = document.createElement(\"div\");\n  this.frame.style.position = \"relative\";\n  this.frame.style.overflow = \"hidden\";\n\n  // create the graph canvas (HTML canvas element)\n  this.frame.canvas = document.createElement(\"canvas\");\n  this.frame.canvas.style.position = \"relative\";\n  this.frame.appendChild(this.frame.canvas);\n  //if (!this.frame.canvas.getContext) {\n  {\n    const noCanvas = document.createElement(\"DIV\");\n    noCanvas.style.color = \"red\";\n    noCanvas.style.fontWeight = \"bold\";\n    noCanvas.style.padding = \"10px\";\n    noCanvas.innerHTML = \"Error: your browser does not support HTML canvas\";\n    this.frame.canvas.appendChild(noCanvas);\n  }\n\n  this.frame.filter = document.createElement(\"div\");\n  this.frame.filter.style.position = \"absolute\";\n  this.frame.filter.style.bottom = \"0px\";\n  this.frame.filter.style.left = \"0px\";\n  this.frame.filter.style.width = \"100%\";\n  this.frame.appendChild(this.frame.filter);\n\n  // add event listeners to handle moving and zooming the contents\n  const me = this;\n  const onmousedown = function (event) {\n    me._onMouseDown(event);\n  };\n  const ontouchstart = function (event) {\n    me._onTouchStart(event);\n  };\n  const onmousewheel = function (event) {\n    me._onWheel(event);\n  };\n  const ontooltip = function (event) {\n    me._onTooltip(event);\n  };\n  const onclick = function (event) {\n    me._onClick(event);\n  };\n  // TODO: these events are never cleaned up... can give a 'memory leakage'\n\n  this.frame.canvas.addEventListener(\"mousedown\", onmousedown);\n  this.frame.canvas.addEventListener(\"touchstart\", ontouchstart);\n  this.frame.canvas.addEventListener(\"mousewheel\", onmousewheel);\n  this.frame.canvas.addEventListener(\"mousemove\", ontooltip);\n  this.frame.canvas.addEventListener(\"click\", onclick);\n\n  // add the new graph to the container element\n  this.containerElement.appendChild(this.frame);\n};\n\n/**\n * Set a new size for the graph\n * @param {number} width\n * @param {number} height\n * @private\n */\nGraph3d.prototype._setSize = function (width, height) {\n  this.frame.style.width = width;\n  this.frame.style.height = height;\n\n  this._resizeCanvas();\n};\n\n/**\n * Resize the canvas to the current size of the frame\n */\nGraph3d.prototype._resizeCanvas = function () {\n  this.frame.canvas.style.width = \"100%\";\n  this.frame.canvas.style.height = \"100%\";\n\n  this.frame.canvas.width = this.frame.canvas.clientWidth;\n  this.frame.canvas.height = this.frame.canvas.clientHeight;\n\n  // adjust with for margin\n  this.frame.filter.style.width = this.frame.canvas.clientWidth - 2 * 10 + \"px\";\n};\n\n/**\n * Start playing the animation, if requested and filter present. Only applicable\n * when animation data is available.\n */\nGraph3d.prototype.animationStart = function () {\n  // start animation when option is true\n  if (!this.animationAutoStart || !this.dataGroup.dataFilter) return;\n\n  if (!this.frame.filter || !this.frame.filter.slider)\n    throw new Error(\"No animation available\");\n\n  this.frame.filter.slider.play();\n};\n\n/**\n * Stop animation\n */\nGraph3d.prototype.animationStop = function () {\n  if (!this.frame.filter || !this.frame.filter.slider) return;\n\n  this.frame.filter.slider.stop();\n};\n\n/**\n * Resize the center position based on the current values in this.xCenter\n * and this.yCenter (which are strings with a percentage or a value\n * in pixels). The center positions are the variables this.currentXCenter\n * and this.currentYCenter\n */\nGraph3d.prototype._resizeCenter = function () {\n  // calculate the horizontal center position\n  if (this.xCenter.charAt(this.xCenter.length - 1) === \"%\") {\n    this.currentXCenter =\n      (parseFloat(this.xCenter) / 100) * this.frame.canvas.clientWidth;\n  } else {\n    this.currentXCenter = parseFloat(this.xCenter); // supposed to be in px\n  }\n\n  // calculate the vertical center position\n  if (this.yCenter.charAt(this.yCenter.length - 1) === \"%\") {\n    this.currentYCenter =\n      (parseFloat(this.yCenter) / 100) *\n      (this.frame.canvas.clientHeight - this.frame.filter.clientHeight);\n  } else {\n    this.currentYCenter = parseFloat(this.yCenter); // supposed to be in px\n  }\n};\n\n/**\n * Retrieve the current camera rotation\n * @returns {object} An object with parameters horizontal, vertical, and\n *                   distance\n */\nGraph3d.prototype.getCameraPosition = function () {\n  const pos = this.camera.getArmRotation();\n  pos.distance = this.camera.getArmLength();\n  return pos;\n};\n\n/**\n * Load data into the 3D Graph\n * @param {vis.DataSet} data\n * @private\n */\nGraph3d.prototype._readData = function (data) {\n  // read the data\n  this.dataPoints = this.dataGroup.initializeData(this, data, this.style);\n\n  this._initializeRanges();\n  this._redrawFilter();\n};\n\n/**\n * Replace the dataset of the Graph3d\n * @param {Array | DataSet | DataView} data\n */\nGraph3d.prototype.setData = function (data) {\n  if (data === undefined || data === null) return;\n\n  this._readData(data);\n  this.redraw();\n  this.animationStart();\n};\n\n/**\n * Update the options. Options will be merged with current options\n * @param {object} options\n */\nGraph3d.prototype.setOptions = function (options) {\n  if (options === undefined) return;\n\n  const errorFound = Validator.validate(options, allOptions);\n  if (errorFound === true) {\n    console.error(\n      \"%cErrors have been found in the supplied options object.\",\n      VALIDATOR_PRINT_STYLE,\n    );\n  }\n\n  this.animationStop();\n\n  setOptions(options, this);\n  this.setPointDrawingMethod();\n  this._setSize(this.width, this.height);\n  this.setAxisLabelMethod();\n\n  this.setData(this.dataGroup.getDataTable());\n  this.animationStart();\n};\n\n/**\n * Determine which point drawing method to use for the current graph style.\n */\nGraph3d.prototype.setPointDrawingMethod = function () {\n  let method = undefined;\n\n  switch (this.style) {\n    case Graph3d.STYLE.BAR:\n      method = this._redrawBarGraphPoint;\n      break;\n    case Graph3d.STYLE.BARCOLOR:\n      method = this._redrawBarColorGraphPoint;\n      break;\n    case Graph3d.STYLE.BARSIZE:\n      method = this._redrawBarSizeGraphPoint;\n      break;\n    case Graph3d.STYLE.DOT:\n      method = this._redrawDotGraphPoint;\n      break;\n    case Graph3d.STYLE.DOTLINE:\n      method = this._redrawDotLineGraphPoint;\n      break;\n    case Graph3d.STYLE.DOTCOLOR:\n      method = this._redrawDotColorGraphPoint;\n      break;\n    case Graph3d.STYLE.DOTSIZE:\n      method = this._redrawDotSizeGraphPoint;\n      break;\n    case Graph3d.STYLE.SURFACE:\n      method = this._redrawSurfaceGraphPoint;\n      break;\n    case Graph3d.STYLE.GRID:\n      method = this._redrawGridGraphPoint;\n      break;\n    case Graph3d.STYLE.LINE:\n      method = this._redrawLineGraphPoint;\n      break;\n    default:\n      throw new Error(\n        \"Can not determine point drawing method \" +\n          \"for graph style '\" +\n          this.style +\n          \"'\",\n      );\n  }\n\n  this._pointDrawingMethod = method;\n};\n\n/**\n * Determine which functions to use to draw axis labels.\n */\nGraph3d.prototype.setAxisLabelMethod = function () {\n  if (this.rotateAxisLabels) {\n    this._drawAxisLabelX = this.drawAxisLabelXRotate;\n    this._drawAxisLabelY = this.drawAxisLabelYRotate;\n    this._drawAxisLabelZ = this.drawAxisLabelZRotate;\n  } else {\n    this._drawAxisLabelX = this.drawAxisLabelX;\n    this._drawAxisLabelY = this.drawAxisLabelY;\n    this._drawAxisLabelZ = this.drawAxisLabelZ;\n  }\n};\n\n/**\n * Redraw the Graph.\n */\nGraph3d.prototype.redraw = function () {\n  if (this.dataPoints === undefined) {\n    throw new Error(\"Graph data not initialized\");\n  }\n\n  this._resizeCanvas();\n  this._resizeCenter();\n  this._redrawSlider();\n  this._redrawClear();\n  this._redrawAxis();\n\n  this._redrawDataGraph();\n\n  this._redrawInfo();\n  this._redrawLegend();\n};\n\n/**\n * Get drawing context without exposing canvas\n * @returns {CanvasRenderingContext2D}\n * @private\n */\nGraph3d.prototype._getContext = function () {\n  const canvas = this.frame.canvas;\n  const ctx = canvas.getContext(\"2d\");\n\n  ctx.lineJoin = \"round\";\n  ctx.lineCap = \"round\";\n\n  return ctx;\n};\n\n/**\n * Clear the canvas before redrawing\n */\nGraph3d.prototype._redrawClear = function () {\n  const canvas = this.frame.canvas;\n  const ctx = canvas.getContext(\"2d\");\n\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n};\n\nGraph3d.prototype._dotSize = function () {\n  return this.frame.clientWidth * this.dotSizeRatio;\n};\n\n/**\n * Get legend width\n * @returns {*}\n * @private\n */\nGraph3d.prototype._getLegendWidth = function () {\n  let width;\n\n  if (this.style === Graph3d.STYLE.DOTSIZE) {\n    const dotSize = this._dotSize();\n    //width =  dotSize / 2 + dotSize * 2;\n    width = dotSize * this.dotSizeMaxFraction;\n  } else if (this.style === Graph3d.STYLE.BARSIZE) {\n    width = this.xBarWidth;\n  } else {\n    width = 20;\n  }\n  return width;\n};\n\n/**\n * Redraw the legend based on size, dot color, or surface height\n */\nGraph3d.prototype._redrawLegend = function () {\n  //Return without drawing anything, if no legend is specified\n  if (this.showLegend !== true) {\n    return;\n  }\n\n  // Do not draw legend when graph style does not support\n  if (\n    this.style === Graph3d.STYLE.LINE ||\n    this.style === Graph3d.STYLE.BARSIZE //TODO add legend support for BARSIZE\n  ) {\n    return;\n  }\n\n  // Legend types - size and color. Determine if size legend.\n  const isSizeLegend =\n    this.style === Graph3d.STYLE.BARSIZE ||\n    this.style === Graph3d.STYLE.DOTSIZE;\n\n  // Legend is either tracking z values or style values. This flag if false means use z values.\n  const isValueLegend =\n    this.style === Graph3d.STYLE.DOTSIZE ||\n    this.style === Graph3d.STYLE.DOTCOLOR ||\n    this.style === Graph3d.STYLE.SURFACE ||\n    this.style === Graph3d.STYLE.BARCOLOR;\n\n  const height = Math.max(this.frame.clientHeight * 0.25, 100);\n  const top = this.margin;\n  const width = this._getLegendWidth(); // px - overwritten by size legend\n  const right = this.frame.clientWidth - this.margin;\n  const left = right - width;\n  const bottom = top + height;\n\n  const ctx = this._getContext();\n  ctx.lineWidth = 1;\n  ctx.font = \"14px arial\"; // TODO: put in options\n\n  if (isSizeLegend === false) {\n    // draw the color bar\n    const ymin = 0;\n    const ymax = height; // Todo: make height customizable\n    let y;\n\n    for (y = ymin; y < ymax; y++) {\n      // Need (1 - x) because y runs from top to bottom:\n      const f = 1 - (y - ymin) / (ymax - ymin);\n      const color = this._colormap(f, 1);\n\n      ctx.strokeStyle = color;\n      ctx.beginPath();\n      ctx.moveTo(left, top + y);\n      ctx.lineTo(right, top + y);\n      ctx.stroke();\n    }\n    ctx.strokeStyle = this.axisColor;\n    ctx.strokeRect(left, top, width, height);\n  } else {\n    // draw the size legend box\n    let widthMin;\n    if (this.style === Graph3d.STYLE.DOTSIZE) {\n      // Get the proportion to max and min right\n      widthMin = width * (this.dotSizeMinFraction / this.dotSizeMaxFraction);\n    } else if (this.style === Graph3d.STYLE.BARSIZE) {\n      //widthMin = this.xBarWidth * 0.2 this is wrong - barwidth measures in terms of xvalues\n    }\n    ctx.strokeStyle = this.axisColor;\n    ctx.fillStyle = this.dataColor.fill;\n    ctx.beginPath();\n    ctx.moveTo(left, top);\n    ctx.lineTo(right, top);\n    ctx.lineTo(left + widthMin, bottom);\n    ctx.lineTo(left, bottom);\n    ctx.closePath();\n    ctx.fill();\n    ctx.stroke();\n  }\n\n  // print value text along the legend edge\n  const gridLineLen = 5; // px\n\n  const legendMin = isValueLegend ? this.valueRange.min : this.zRange.min;\n  const legendMax = isValueLegend ? this.valueRange.max : this.zRange.max;\n  const step = new StepNumber(\n    legendMin,\n    legendMax,\n    (legendMax - legendMin) / 5,\n    true,\n  );\n  step.start(true);\n\n  while (!step.end()) {\n    const y =\n      bottom -\n      ((step.getCurrent() - legendMin) / (legendMax - legendMin)) * height;\n    const from = new Point2d(left - gridLineLen, y);\n    const to = new Point2d(left, y);\n    this._line(ctx, from, to);\n\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y);\n\n    step.next();\n  }\n\n  ctx.textAlign = \"right\";\n  ctx.textBaseline = \"top\";\n  const label = this.legendLabel;\n  ctx.fillText(label, right, bottom + this.margin);\n};\n\n/**\n * Redraw the filter\n */\nGraph3d.prototype._redrawFilter = function () {\n  const dataFilter = this.dataGroup.dataFilter;\n  const filter = this.frame.filter;\n  filter.innerHTML = \"\";\n\n  if (!dataFilter) {\n    filter.slider = undefined;\n    return;\n  }\n\n  const options = {\n    visible: this.showAnimationControls,\n  };\n  const slider = new Slider(filter, options);\n  filter.slider = slider;\n\n  // TODO: css here is not nice here...\n  filter.style.padding = \"10px\";\n  //this.frame.filter.style.backgroundColor = '#EFEFEF';\n\n  slider.setValues(dataFilter.values);\n  slider.setPlayInterval(this.animationInterval);\n\n  // create an event handler\n  const me = this;\n  const onchange = function () {\n    const dataFilter = me.dataGroup.dataFilter;\n    const index = slider.getIndex();\n\n    dataFilter.selectValue(index);\n    me.dataPoints = dataFilter._getDataPoints();\n\n    me.redraw();\n  };\n\n  slider.setOnChangeCallback(onchange);\n};\n\n/**\n * Redraw the slider\n */\nGraph3d.prototype._redrawSlider = function () {\n  if (this.frame.filter.slider !== undefined) {\n    this.frame.filter.slider.redraw();\n  }\n};\n\n/**\n * Redraw common information\n */\nGraph3d.prototype._redrawInfo = function () {\n  const info = this.dataGroup.getInfo();\n  if (info === undefined) return;\n\n  const ctx = this._getContext();\n\n  ctx.font = \"14px arial\"; // TODO: put in options\n  ctx.lineStyle = \"gray\";\n  ctx.fillStyle = \"gray\";\n  ctx.textAlign = \"left\";\n  ctx.textBaseline = \"top\";\n\n  const x = this.margin;\n  const y = this.margin;\n  ctx.fillText(info, x, y);\n};\n\n/**\n * Draw a line between 2d points 'from' and 'to'.\n *\n * If stroke style specified, set that as well.\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point2d} from\n * @param {vis.Point2d} to\n * @param {string} [strokeStyle]\n * @private\n */\nGraph3d.prototype._line = function (ctx, from, to, strokeStyle) {\n  if (strokeStyle !== undefined) {\n    ctx.strokeStyle = strokeStyle;\n  }\n\n  ctx.beginPath();\n  ctx.moveTo(from.x, from.y);\n  ctx.lineTo(to.x, to.y);\n  ctx.stroke();\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelX = function (\n  ctx,\n  point3d,\n  text,\n  armAngle,\n  yMargin,\n) {\n  if (yMargin === undefined) {\n    yMargin = 0;\n  }\n\n  const point2d = this._convert3Dto2D(point3d);\n\n  if (Math.cos(armAngle * 2) > 0) {\n    ctx.textAlign = \"center\";\n    ctx.textBaseline = \"top\";\n    point2d.y += yMargin;\n  } else if (Math.sin(armAngle * 2) < 0) {\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n  } else {\n    ctx.textAlign = \"left\";\n    ctx.textBaseline = \"middle\";\n  }\n\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x, point2d.y);\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelY = function (\n  ctx,\n  point3d,\n  text,\n  armAngle,\n  yMargin,\n) {\n  if (yMargin === undefined) {\n    yMargin = 0;\n  }\n\n  const point2d = this._convert3Dto2D(point3d);\n\n  if (Math.cos(armAngle * 2) < 0) {\n    ctx.textAlign = \"center\";\n    ctx.textBaseline = \"top\";\n    point2d.y += yMargin;\n  } else if (Math.sin(armAngle * 2) > 0) {\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n  } else {\n    ctx.textAlign = \"left\";\n    ctx.textBaseline = \"middle\";\n  }\n\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x, point2d.y);\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} [offset]\n */\nGraph3d.prototype.drawAxisLabelZ = function (ctx, point3d, text, offset) {\n  if (offset === undefined) {\n    offset = 0;\n  }\n\n  const point2d = this._convert3Dto2D(point3d);\n  ctx.textAlign = \"right\";\n  ctx.textBaseline = \"middle\";\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x - offset, point2d.y);\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelXRotate = function (\n  ctx,\n  point3d,\n  text,\n  armAngle,\n  yMargin,\n) {\n  if (yMargin === undefined) {\n    yMargin = 0;\n  }\n\n  const point2d = this._convert3Dto2D(point3d);\n  if (Math.cos(armAngle * 2) > 0) {\n    ctx.save();\n    ctx.translate(point2d.x, point2d.y);\n    ctx.rotate(-Math.PI / 2);\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(text, 0, 0);\n    ctx.restore();\n  } else if (Math.sin(armAngle * 2) < 0) {\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(text, point2d.x, point2d.y);\n  } else {\n    ctx.textAlign = \"left\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(text, point2d.x, point2d.y);\n  }\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelYRotate = function (\n  ctx,\n  point3d,\n  text,\n  armAngle,\n  yMargin,\n) {\n  if (yMargin === undefined) {\n    yMargin = 0;\n  }\n\n  const point2d = this._convert3Dto2D(point3d);\n  if (Math.cos(armAngle * 2) < 0) {\n    ctx.save();\n    ctx.translate(point2d.x, point2d.y);\n    ctx.rotate(-Math.PI / 2);\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(text, 0, 0);\n    ctx.restore();\n  } else if (Math.sin(armAngle * 2) > 0) {\n    ctx.textAlign = \"right\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(text, point2d.x, point2d.y);\n  } else {\n    ctx.textAlign = \"left\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(text, point2d.x, point2d.y);\n  }\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} [offset]\n */\nGraph3d.prototype.drawAxisLabelZRotate = function (ctx, point3d, text, offset) {\n  if (offset === undefined) {\n    offset = 0;\n  }\n\n  const point2d = this._convert3Dto2D(point3d);\n  ctx.textAlign = \"right\";\n  ctx.textBaseline = \"middle\";\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x - offset, point2d.y);\n};\n\n/**\n \n \n /**\n Draw a line between 2d points 'from' and 'to'.\n \n If stroke style specified, set that as well.\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point2d} from\n * @param {vis.Point2d} to\n * @param {string} [strokeStyle]\n * @private\n */\nGraph3d.prototype._line3d = function (ctx, from, to, strokeStyle) {\n  const from2d = this._convert3Dto2D(from);\n  const to2d = this._convert3Dto2D(to);\n\n  this._line(ctx, from2d, to2d, strokeStyle);\n};\n\n/**\n * Redraw the axis\n */\nGraph3d.prototype._redrawAxis = function () {\n  const ctx = this._getContext();\n  let from,\n    to,\n    step,\n    prettyStep,\n    text,\n    xText,\n    yText,\n    zText,\n    offset,\n    xOffset,\n    yOffset;\n\n  // TODO: get the actual rendered style of the containerElement\n  //ctx.font = this.containerElement.style.font;\n  //ctx.font = 24 / this.camera.getArmLength() + 'px arial';\n  ctx.font =\n    this.axisFontSize / this.camera.getArmLength() + \"px \" + this.axisFontType;\n\n  // calculate the length for the short grid lines\n  const gridLenX = 0.025 / this.scale.x;\n  const gridLenY = 0.025 / this.scale.y;\n  const textMargin = 5 / this.camera.getArmLength(); // px\n  const armAngle = this.camera.getArmRotation().horizontal;\n  const armVector = new Point2d(Math.cos(armAngle), Math.sin(armAngle));\n\n  const xRange = this.xRange;\n  const yRange = this.yRange;\n  const zRange = this.zRange;\n  let point3d;\n\n  // draw x-grid lines\n  ctx.lineWidth = 1;\n  prettyStep = this.defaultXStep === undefined;\n  step = new StepNumber(xRange.min, xRange.max, this.xStep, prettyStep);\n  step.start(true);\n\n  while (!step.end()) {\n    const x = step.getCurrent();\n\n    if (this.showGrid) {\n      from = new Point3d(x, yRange.min, zRange.min);\n      to = new Point3d(x, yRange.max, zRange.min);\n      this._line3d(ctx, from, to, this.gridColor);\n    } else if (this.showXAxis) {\n      from = new Point3d(x, yRange.min, zRange.min);\n      to = new Point3d(x, yRange.min + gridLenX, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n\n      from = new Point3d(x, yRange.max, zRange.min);\n      to = new Point3d(x, yRange.max - gridLenX, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n    }\n\n    if (this.showXAxis) {\n      yText = armVector.x > 0 ? yRange.min : yRange.max;\n      point3d = new Point3d(x, yText, zRange.min);\n      const msg = \"  \" + this.xValueLabel(x) + \"  \";\n      this._drawAxisLabelX.call(this, ctx, point3d, msg, armAngle, textMargin);\n    }\n\n    step.next();\n  }\n\n  // draw y-grid lines\n  ctx.lineWidth = 1;\n  prettyStep = this.defaultYStep === undefined;\n  step = new StepNumber(yRange.min, yRange.max, this.yStep, prettyStep);\n  step.start(true);\n\n  while (!step.end()) {\n    const y = step.getCurrent();\n\n    if (this.showGrid) {\n      from = new Point3d(xRange.min, y, zRange.min);\n      to = new Point3d(xRange.max, y, zRange.min);\n      this._line3d(ctx, from, to, this.gridColor);\n    } else if (this.showYAxis) {\n      from = new Point3d(xRange.min, y, zRange.min);\n      to = new Point3d(xRange.min + gridLenY, y, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n\n      from = new Point3d(xRange.max, y, zRange.min);\n      to = new Point3d(xRange.max - gridLenY, y, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n    }\n\n    if (this.showYAxis) {\n      xText = armVector.y > 0 ? xRange.min : xRange.max;\n      point3d = new Point3d(xText, y, zRange.min);\n      const msg = \"  \" + this.yValueLabel(y) + \"  \";\n      this._drawAxisLabelY.call(this, ctx, point3d, msg, armAngle, textMargin);\n    }\n\n    step.next();\n  }\n\n  // draw z-grid lines and axis\n  if (this.showZAxis) {\n    ctx.lineWidth = 1;\n    prettyStep = this.defaultZStep === undefined;\n    step = new StepNumber(zRange.min, zRange.max, this.zStep, prettyStep);\n    step.start(true);\n\n    xText = armVector.x > 0 ? xRange.min : xRange.max;\n    yText = armVector.y < 0 ? yRange.min : yRange.max;\n\n    while (!step.end()) {\n      const z = step.getCurrent();\n\n      // TODO: make z-grid lines really 3d?\n      const from3d = new Point3d(xText, yText, z);\n      const from2d = this._convert3Dto2D(from3d);\n      to = new Point2d(from2d.x - textMargin, from2d.y);\n      this._line(ctx, from2d, to, this.axisColor);\n\n      const msg = this.zValueLabel(z) + \" \";\n      this._drawAxisLabelZ.call(this, ctx, from3d, msg, 5);\n\n      step.next();\n    }\n\n    ctx.lineWidth = 1;\n    from = new Point3d(xText, yText, zRange.min);\n    to = new Point3d(xText, yText, zRange.max);\n    this._line3d(ctx, from, to, this.axisColor);\n  }\n\n  // draw x-axis\n  if (this.showXAxis) {\n    let xMin2d;\n    let xMax2d;\n    ctx.lineWidth = 1;\n\n    // line at yMin\n    xMin2d = new Point3d(xRange.min, yRange.min, zRange.min);\n    xMax2d = new Point3d(xRange.max, yRange.min, zRange.min);\n    this._line3d(ctx, xMin2d, xMax2d, this.axisColor);\n    // line at ymax\n    xMin2d = new Point3d(xRange.min, yRange.max, zRange.min);\n    xMax2d = new Point3d(xRange.max, yRange.max, zRange.min);\n    this._line3d(ctx, xMin2d, xMax2d, this.axisColor);\n  }\n\n  // draw y-axis\n  if (this.showYAxis) {\n    ctx.lineWidth = 1;\n    // line at xMin\n    from = new Point3d(xRange.min, yRange.min, zRange.min);\n    to = new Point3d(xRange.min, yRange.max, zRange.min);\n    this._line3d(ctx, from, to, this.axisColor);\n    // line at xMax\n    from = new Point3d(xRange.max, yRange.min, zRange.min);\n    to = new Point3d(xRange.max, yRange.max, zRange.min);\n    this._line3d(ctx, from, to, this.axisColor);\n  }\n\n  // draw x-label\n  const xLabel = this.xLabel;\n  if (xLabel.length > 0 && this.showXAxis) {\n    yOffset = 0.1 / this.scale.y;\n    xText = (xRange.max + 3 * xRange.min) / 4;\n    yText = armVector.x > 0 ? yRange.min - yOffset : yRange.max + yOffset;\n    text = new Point3d(xText, yText, zRange.min);\n    this.drawAxisLabelX(ctx, text, xLabel, armAngle);\n  }\n\n  // draw y-label\n  const yLabel = this.yLabel;\n  if (yLabel.length > 0 && this.showYAxis) {\n    xOffset = 0.1 / this.scale.x;\n    xText = armVector.y > 0 ? xRange.min - xOffset : xRange.max + xOffset;\n    yText = (yRange.max + 3 * yRange.min) / 4;\n    text = new Point3d(xText, yText, zRange.min);\n\n    this.drawAxisLabelY(ctx, text, yLabel, armAngle);\n  }\n\n  // draw z-label\n  const zLabel = this.zLabel;\n  if (zLabel.length > 0 && this.showZAxis) {\n    offset = 30; // pixels.  // TODO: relate to the max width of the values on the z axis?\n    xText = armVector.x > 0 ? xRange.min : xRange.max;\n    yText = armVector.y < 0 ? yRange.min : yRange.max;\n    zText = (zRange.max + 3 * zRange.min) / 4;\n    text = new Point3d(xText, yText, zText);\n\n    this.drawAxisLabelZ(ctx, text, zLabel, offset);\n  }\n};\n\n/**\n *\n * @param {vis.Point3d} point\n * @returns {*}\n * @private\n */\nGraph3d.prototype._getStrokeWidth = function (point) {\n  if (point !== undefined) {\n    if (this.showPerspective) {\n      return (1 / -point.trans.z) * this.dataColor.strokeWidth;\n    } else {\n      return (\n        -(this.eye.z / this.camera.getArmLength()) * this.dataColor.strokeWidth\n      );\n    }\n  }\n\n  return this.dataColor.strokeWidth;\n};\n\n// -----------------------------------------------------------------------------\n// Drawing primitives for the graphs\n// -----------------------------------------------------------------------------\n\n/**\n * Draw a bar element in the view with the given properties.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @param {number} xWidth\n * @param {number} yWidth\n * @param {string} color\n * @param {string} borderColor\n * @private\n */\nGraph3d.prototype._redrawBar = function (\n  ctx,\n  point,\n  xWidth,\n  yWidth,\n  color,\n  borderColor,\n) {\n  let surface;\n\n  // calculate all corner points\n  const me = this;\n  const point3d = point.point;\n  const zMin = this.zRange.min;\n  const top = [\n    { point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z) },\n    { point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z) },\n    { point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z) },\n    { point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z) },\n  ];\n  const bottom = [\n    { point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, zMin) },\n    { point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, zMin) },\n    { point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, zMin) },\n    { point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, zMin) },\n  ];\n\n  // calculate screen location of the points\n  top.forEach(function (obj) {\n    obj.screen = me._convert3Dto2D(obj.point);\n  });\n  bottom.forEach(function (obj) {\n    obj.screen = me._convert3Dto2D(obj.point);\n  });\n\n  // create five sides, calculate both corner points and center points\n  const surfaces = [\n    { corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point) },\n    {\n      corners: [top[0], top[1], bottom[1], bottom[0]],\n      center: Point3d.avg(bottom[1].point, bottom[0].point),\n    },\n    {\n      corners: [top[1], top[2], bottom[2], bottom[1]],\n      center: Point3d.avg(bottom[2].point, bottom[1].point),\n    },\n    {\n      corners: [top[2], top[3], bottom[3], bottom[2]],\n      center: Point3d.avg(bottom[3].point, bottom[2].point),\n    },\n    {\n      corners: [top[3], top[0], bottom[0], bottom[3]],\n      center: Point3d.avg(bottom[0].point, bottom[3].point),\n    },\n  ];\n  point.surfaces = surfaces;\n\n  // calculate the distance of each of the surface centers to the camera\n  for (let j = 0; j < surfaces.length; j++) {\n    surface = surfaces[j];\n    const transCenter = this._convertPointToTranslation(surface.center);\n    surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z;\n    // TODO: this dept calculation doesn't work 100% of the cases due to perspective,\n    //     but the current solution is fast/simple and works in 99.9% of all cases\n    //     the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9})\n  }\n\n  // order the surfaces by their (translated) depth\n  surfaces.sort(function (a, b) {\n    const diff = b.dist - a.dist;\n    if (diff) return diff;\n\n    // if equal depth, sort the top surface last\n    if (a.corners === top) return 1;\n    if (b.corners === top) return -1;\n\n    // both are equal\n    return 0;\n  });\n\n  // draw the ordered surfaces\n  ctx.lineWidth = this._getStrokeWidth(point);\n  ctx.strokeStyle = borderColor;\n  ctx.fillStyle = color;\n  // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside\n  for (let j = 2; j < surfaces.length; j++) {\n    surface = surfaces[j];\n    this._polygon(ctx, surface.corners);\n  }\n};\n\n/**\n * Draw a polygon using the passed points and fill it with the passed style and stroke.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array.<vis.Point3d>} points      an array of points.\n * @param {string} [fillStyle] the fill style to set\n * @param {string} [strokeStyle] the stroke style to set\n */\nGraph3d.prototype._polygon = function (ctx, points, fillStyle, strokeStyle) {\n  if (points.length < 2) {\n    return;\n  }\n\n  if (fillStyle !== undefined) {\n    ctx.fillStyle = fillStyle;\n  }\n  if (strokeStyle !== undefined) {\n    ctx.strokeStyle = strokeStyle;\n  }\n  ctx.beginPath();\n  ctx.moveTo(points[0].screen.x, points[0].screen.y);\n\n  for (let i = 1; i < points.length; ++i) {\n    const point = points[i];\n    ctx.lineTo(point.screen.x, point.screen.y);\n  }\n\n  ctx.closePath();\n  ctx.fill();\n  ctx.stroke(); // TODO: only draw stroke when strokeWidth > 0\n};\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @param {string} color\n * @param {string} borderColor\n * @param {number} [size]\n * @private\n */\nGraph3d.prototype._drawCircle = function (\n  ctx,\n  point,\n  color,\n  borderColor,\n  size,\n) {\n  const radius = this._calcRadius(point, size);\n\n  ctx.lineWidth = this._getStrokeWidth(point);\n  ctx.strokeStyle = borderColor;\n  ctx.fillStyle = color;\n  ctx.beginPath();\n  ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI * 2, true);\n  ctx.fill();\n  ctx.stroke();\n};\n\n/**\n * Determine the colors for the 'regular' graph styles.\n * @param {object} point\n * @returns {{fill, border}}\n * @private\n */\nGraph3d.prototype._getColorsRegular = function (point) {\n  const f = (point.point.value - this.valueRange.min) * this.scale.value;\n  const color = this._colormap(f, 1);\n  const borderColor = this._colormap(f, 0.8);\n  return {\n    fill: color,\n    border: borderColor,\n  };\n};\n\n/**\n * Get the colors for the 'color' graph styles.\n * These styles are currently: 'bar-color' and 'dot-color'\n * Color may be set as a string representation of HTML color, like #ff00ff,\n * or calculated from a number, for example, distance from this point\n * The first option is useful when we have some pre-given legend, to which we have to adjust ourselves\n * The second option is useful when we are interested in automatically setting the color, from some value,\n * using some color scale\n * @param {object} point\n * @returns {{fill: *, border: *}}\n * @private\n */\nGraph3d.prototype._getColorsColor = function (point) {\n  // calculate the color based on the value\n  let color, borderColor, pointStyle;\n  if (point && point.point && point.point.data && point.point.data.style) {\n    pointStyle = point.point.data.style;\n  }\n  if (\n    pointStyle &&\n    typeof pointStyle === \"object\" &&\n    pointStyle.fill &&\n    pointStyle.stroke\n  ) {\n    return {\n      fill: pointStyle.fill,\n      border: pointStyle.stroke,\n    };\n  }\n\n  if (typeof point.point.value === \"string\") {\n    color = point.point.value;\n    borderColor = point.point.value;\n  } else {\n    const f = (point.point.value - this.valueRange.min) * this.scale.value;\n    color = this._colormap(f, 1);\n    borderColor = this._colormap(f, 0.8);\n  }\n  return {\n    fill: color,\n    border: borderColor,\n  };\n};\n\n/**\n * Get the colors for the 'size' graph styles.\n * These styles are currently: 'bar-size' and 'dot-size'\n * @returns {{fill: *, border: (string|colorOptions.stroke|{string, undefined}|string|colorOptions.stroke|{string}|*)}}\n * @private\n */\nGraph3d.prototype._getColorsSize = function () {\n  return {\n    fill: this.dataColor.fill,\n    border: this.dataColor.stroke,\n  };\n};\n\n/**\n * Determine the color corresponding to a given value on the color scale.\n * @param {number} [x] the data value to be mapped running from 0 to 1\n * @param {number} [v] scale factor between 0 and 1 for the color brightness\n * @returns {string}\n * @private\n */\nGraph3d.prototype._colormap = function (x, v = 1) {\n  let r, g, b, a;\n  const colormap = this.colormap;\n  if (Array.isArray(colormap)) {\n    const maxIndex = colormap.length - 1;\n    const startIndex = Math.max(Math.floor(x * maxIndex), 0);\n    const endIndex = Math.min(startIndex + 1, maxIndex);\n    const innerRatio = x * maxIndex - startIndex;\n    const min = colormap[startIndex];\n    const max = colormap[endIndex];\n    r = min.r + innerRatio * (max.r - min.r);\n    g = min.g + innerRatio * (max.g - min.g);\n    b = min.b + innerRatio * (max.b - min.b);\n  } else if (typeof colormap === \"function\") {\n    ({ r, g, b, a } = colormap(x));\n  } else {\n    const hue = (1 - x) * 240;\n    ({ r, g, b } = util.HSVToRGB(hue / 360, 1, 1));\n  }\n  if (typeof a === \"number\" && !Number.isNaN(a)) {\n    return `RGBA(${Math.round(r * v)}, ${Math.round(g * v)}, ${Math.round(\n      b * v,\n    )}, ${a})`;\n  } else {\n    return `RGB(${Math.round(r * v)}, ${Math.round(g * v)}, ${Math.round(\n      b * v,\n    )})`;\n  }\n};\n\n/**\n * Determine the size of a point on-screen, as determined by the\n * distance to the camera.\n * @param {object} point\n * @param {number} [size] the size that needs to be translated to screen coordinates.\n *             optional; if not passed, use the default point size.\n * @returns {number}\n * @private\n */\nGraph3d.prototype._calcRadius = function (point, size) {\n  if (size === undefined) {\n    size = this._dotSize();\n  }\n\n  let radius;\n  if (this.showPerspective) {\n    radius = size / -point.trans.z;\n  } else {\n    radius = size * -(this.eye.z / this.camera.getArmLength());\n  }\n  if (radius < 0) {\n    radius = 0;\n  }\n\n  return radius;\n};\n\n// -----------------------------------------------------------------------------\n// Methods for drawing points per graph style.\n// -----------------------------------------------------------------------------\n\n/**\n * Draw single datapoint for graph style 'bar'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawBarGraphPoint = function (ctx, point) {\n  const xWidth = this.xBarWidth / 2;\n  const yWidth = this.yBarWidth / 2;\n  const colors = this._getColorsRegular(point);\n\n  this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'bar-color'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawBarColorGraphPoint = function (ctx, point) {\n  const xWidth = this.xBarWidth / 2;\n  const yWidth = this.yBarWidth / 2;\n  const colors = this._getColorsColor(point);\n\n  this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'bar-size'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawBarSizeGraphPoint = function (ctx, point) {\n  // calculate size for the bar\n  const fraction =\n    (point.point.value - this.valueRange.min) / this.valueRange.range();\n  const xWidth = (this.xBarWidth / 2) * (fraction * 0.8 + 0.2);\n  const yWidth = (this.yBarWidth / 2) * (fraction * 0.8 + 0.2);\n\n  const colors = this._getColorsSize();\n\n  this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'dot'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotGraphPoint = function (ctx, point) {\n  const colors = this._getColorsRegular(point);\n\n  this._drawCircle(ctx, point, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'dot-line'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotLineGraphPoint = function (ctx, point) {\n  // draw a vertical line from the XY-plane to the graph value\n  const from = this._convert3Dto2D(point.bottom);\n  ctx.lineWidth = 1;\n  this._line(ctx, from, point.screen, this.gridColor);\n\n  this._redrawDotGraphPoint(ctx, point);\n};\n\n/**\n * Draw single datapoint for graph style 'dot-color'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotColorGraphPoint = function (ctx, point) {\n  const colors = this._getColorsColor(point);\n\n  this._drawCircle(ctx, point, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'dot-size'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotSizeGraphPoint = function (ctx, point) {\n  const dotSize = this._dotSize();\n  const fraction =\n    (point.point.value - this.valueRange.min) / this.valueRange.range();\n\n  const sizeMin = dotSize * this.dotSizeMinFraction;\n  const sizeRange = dotSize * this.dotSizeMaxFraction - sizeMin;\n  const size = sizeMin + sizeRange * fraction;\n\n  const colors = this._getColorsSize();\n\n  this._drawCircle(ctx, point, colors.fill, colors.border, size);\n};\n\n/**\n * Draw single datapoint for graph style 'surface'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawSurfaceGraphPoint = function (ctx, point) {\n  const right = point.pointRight;\n  const top = point.pointTop;\n  const cross = point.pointCross;\n\n  if (\n    point === undefined ||\n    right === undefined ||\n    top === undefined ||\n    cross === undefined\n  ) {\n    return;\n  }\n\n  let topSideVisible = true;\n  let fillStyle;\n  let strokeStyle;\n  let cosViewAngle;\n\n  if (this.showGrayBottom || this.showShadow) {\n    // calculate the cross product of the two vectors from center\n    // to left and right, in order to know whether we are looking at the\n    // bottom or at the top side. We can also use the cross product\n    // for calculating light intensity\n    const aDiff = Point3d.subtract(cross.trans, point.trans);\n    const bDiff = Point3d.subtract(top.trans, right.trans);\n    const surfaceNormal = Point3d.crossProduct(aDiff, bDiff);\n\n    if (this.showPerspective) {\n      const surfacePosition = Point3d.avg(\n        Point3d.avg(point.trans, cross.trans),\n        Point3d.avg(right.trans, top.trans),\n      );\n      // This corresponds to diffuse lighting with light source at (0, 0, 0).\n      // More generally, we would need `surfacePosition - lightPosition`:\n      cosViewAngle = -Point3d.dotProduct(\n        surfaceNormal.normalize(),\n        surfacePosition.normalize(),\n      );\n    } else {\n      cosViewAngle = surfaceNormal.z / surfaceNormal.length();\n    }\n    topSideVisible = cosViewAngle > 0;\n  }\n\n  if (topSideVisible || !this.showGrayBottom) {\n    const vAvg =\n      (point.point.value +\n        right.point.value +\n        top.point.value +\n        cross.point.value) /\n      4;\n    const ratio = (vAvg - this.valueRange.min) * this.scale.value;\n    // lighting factor. TODO: let user specify lighting model as function(?)\n    const v = this.showShadow ? (1 + cosViewAngle) / 2 : 1;\n    fillStyle = this._colormap(ratio, v);\n  } else {\n    fillStyle = \"gray\";\n  }\n\n  if (this.showSurfaceGrid) {\n    strokeStyle = this.axisColor; // TODO: should be customizable\n  } else {\n    strokeStyle = fillStyle;\n  }\n\n  ctx.lineWidth = this._getStrokeWidth(point);\n  // TODO: only draw stroke when strokeWidth > 0\n\n  const points = [point, right, cross, top];\n  this._polygon(ctx, points, fillStyle, strokeStyle);\n};\n\n/**\n * Helper method for _redrawGridGraphPoint()\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} from\n * @param {object} to\n * @private\n */\nGraph3d.prototype._drawGridLine = function (ctx, from, to) {\n  if (from === undefined || to === undefined) {\n    return;\n  }\n\n  const vAvg = (from.point.value + to.point.value) / 2;\n  const f = (vAvg - this.valueRange.min) * this.scale.value;\n\n  ctx.lineWidth = this._getStrokeWidth(from) * 2;\n  ctx.strokeStyle = this._colormap(f, 1);\n  this._line(ctx, from.screen, to.screen);\n};\n\n/**\n * Draw single datapoint for graph style 'Grid'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawGridGraphPoint = function (ctx, point) {\n  this._drawGridLine(ctx, point, point.pointRight);\n  this._drawGridLine(ctx, point, point.pointTop);\n};\n\n/**\n * Draw single datapoint for graph style 'line'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawLineGraphPoint = function (ctx, point) {\n  if (point.pointNext === undefined) {\n    return;\n  }\n\n  ctx.lineWidth = this._getStrokeWidth(point);\n  ctx.strokeStyle = this.dataColor.stroke;\n\n  this._line(ctx, point.screen, point.pointNext.screen);\n};\n\n/**\n * Draw all datapoints for currently selected graph style.\n *\n */\nGraph3d.prototype._redrawDataGraph = function () {\n  const ctx = this._getContext();\n  let i;\n\n  if (this.dataPoints === undefined || this.dataPoints.length <= 0) return; // TODO: throw exception?\n\n  this._calcTranslations(this.dataPoints);\n\n  for (i = 0; i < this.dataPoints.length; i++) {\n    const point = this.dataPoints[i];\n\n    // Using call() ensures that the correct context is used\n    this._pointDrawingMethod.call(this, ctx, point);\n  }\n};\n\n// -----------------------------------------------------------------------------\n// End methods for drawing points per graph style.\n// -----------------------------------------------------------------------------\n\n/**\n * Store startX, startY and startOffset for mouse operations\n * @param {Event}     event     The event that occurred\n */\nGraph3d.prototype._storeMousePosition = function (event) {\n  // get mouse position (different code for IE and all other browsers)\n  this.startMouseX = getMouseX(event);\n  this.startMouseY = getMouseY(event);\n\n  this._startCameraOffset = this.camera.getOffset();\n};\n\n/**\n * Start a moving operation inside the provided parent element\n * @param {Event}     event     The event that occurred (required for\n *                  retrieving the  mouse position)\n */\nGraph3d.prototype._onMouseDown = function (event) {\n  event = event || window.event;\n\n  // check if mouse is still down (may be up when focus is lost for example\n  // in an iframe)\n  if (this.leftButtonDown) {\n    this._onMouseUp(event);\n  }\n\n  // only react on left mouse button down\n  this.leftButtonDown = event.which ? event.which === 1 : event.button === 1;\n  if (!this.leftButtonDown && !this.touchDown) return;\n\n  this._storeMousePosition(event);\n\n  this.startStart = new Date(this.start);\n  this.startEnd = new Date(this.end);\n  this.startArmRotation = this.camera.getArmRotation();\n\n  this.frame.style.cursor = \"move\";\n\n  // add event listeners to handle moving the contents\n  // we store the function onmousemove and onmouseup in the graph, so we can\n  // remove the eventlisteners lateron in the function mouseUp()\n  const me = this;\n  this.onmousemove = function (event) {\n    me._onMouseMove(event);\n  };\n  this.onmouseup = function (event) {\n    me._onMouseUp(event);\n  };\n  document.addEventListener(\"mousemove\", me.onmousemove);\n  document.addEventListener(\"mouseup\", me.onmouseup);\n  util.preventDefault(event);\n};\n\n/**\n * Perform moving operating.\n * This function activated from within the funcion Graph.mouseDown().\n * @param {Event}   event  Well, eehh, the event\n */\nGraph3d.prototype._onMouseMove = function (event) {\n  this.moving = true;\n  event = event || window.event;\n\n  // calculate change in mouse position\n  const diffX = parseFloat(getMouseX(event)) - this.startMouseX;\n  const diffY = parseFloat(getMouseY(event)) - this.startMouseY;\n\n  // move with ctrl or rotate by other\n  if (event && event.ctrlKey === true) {\n    // calculate change in mouse position\n    const scaleX = this.frame.clientWidth * 0.5;\n    const scaleY = this.frame.clientHeight * 0.5;\n\n    const offXNew =\n      (this._startCameraOffset.x || 0) -\n      (diffX / scaleX) * this.camera.armLength * 0.8;\n    const offYNew =\n      (this._startCameraOffset.y || 0) +\n      (diffY / scaleY) * this.camera.armLength * 0.8;\n\n    this.camera.setOffset(offXNew, offYNew);\n    this._storeMousePosition(event);\n  } else {\n    let horizontalNew = this.startArmRotation.horizontal + diffX / 200;\n    let verticalNew = this.startArmRotation.vertical + diffY / 200;\n\n    const snapAngle = 4; // degrees\n    const snapValue = Math.sin((snapAngle / 360) * 2 * Math.PI);\n\n    // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc...\n    // the -0.001 is to take care that the vertical axis is always drawn at the left front corner\n    if (Math.abs(Math.sin(horizontalNew)) < snapValue) {\n      horizontalNew = Math.round(horizontalNew / Math.PI) * Math.PI - 0.001;\n    }\n    if (Math.abs(Math.cos(horizontalNew)) < snapValue) {\n      horizontalNew =\n        (Math.round(horizontalNew / Math.PI - 0.5) + 0.5) * Math.PI - 0.001;\n    }\n\n    // snap vertically to nice angles\n    if (Math.abs(Math.sin(verticalNew)) < snapValue) {\n      verticalNew = Math.round(verticalNew / Math.PI) * Math.PI;\n    }\n    if (Math.abs(Math.cos(verticalNew)) < snapValue) {\n      verticalNew = (Math.round(verticalNew / Math.PI - 0.5) + 0.5) * Math.PI;\n    }\n    this.camera.setArmRotation(horizontalNew, verticalNew);\n  }\n\n  this.redraw();\n\n  // fire a cameraPositionChange event\n  const parameters = this.getCameraPosition();\n  this.emit(\"cameraPositionChange\", parameters);\n\n  util.preventDefault(event);\n};\n\n/**\n * Stop moving operating.\n * This function activated from within the funcion Graph.mouseDown().\n * @param {Event}  event   The event\n */\nGraph3d.prototype._onMouseUp = function (event) {\n  this.frame.style.cursor = \"auto\";\n  this.leftButtonDown = false;\n\n  // remove event listeners here\n  document.removeEventListener(\"mousemove\", this.onmousemove);\n  document.removeEventListener(\"mouseup\", this.onmouseup);\n\n  util.preventDefault(event);\n};\n\n/**\n * @param {Event}  event   The event\n */\nGraph3d.prototype._onClick = function (event) {\n  // NOTE: onclick_callback is deprecated and may be removed in a future version.\n  if (!this.onclick_callback && !this.hasListeners(\"click\")) return;\n  if (!this.moving) {\n    const boundingRect = this.frame.getBoundingClientRect();\n    const mouseX = getMouseX(event) - boundingRect.left;\n    const mouseY = getMouseY(event) - boundingRect.top;\n    const dataPoint = this._dataPointFromXY(mouseX, mouseY);\n    if (dataPoint) {\n      if (this.onclick_callback) this.onclick_callback(dataPoint.point.data);\n      this.emit(\"click\", dataPoint.point.data);\n    }\n  } else {\n    // disable onclick callback, if it came immediately after rotate/pan\n    this.moving = false;\n  }\n  util.preventDefault(event);\n};\n\n/**\n * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point\n * @param {Event}  event   A mouse move event\n */\nGraph3d.prototype._onTooltip = function (event) {\n  const delay = this.tooltipDelay; // ms\n  const boundingRect = this.frame.getBoundingClientRect();\n  const mouseX = getMouseX(event) - boundingRect.left;\n  const mouseY = getMouseY(event) - boundingRect.top;\n\n  if (!this.showTooltip) {\n    return;\n  }\n\n  if (this.tooltipTimeout) {\n    clearTimeout(this.tooltipTimeout);\n  }\n\n  // (delayed) display of a tooltip only if no mouse button is down\n  if (this.leftButtonDown) {\n    this._hideTooltip();\n    return;\n  }\n\n  if (this.tooltip && this.tooltip.dataPoint) {\n    // tooltip is currently visible\n    const dataPoint = this._dataPointFromXY(mouseX, mouseY);\n    if (dataPoint !== this.tooltip.dataPoint) {\n      // datapoint changed\n      if (dataPoint) {\n        this._showTooltip(dataPoint);\n      } else {\n        this._hideTooltip();\n      }\n    }\n  } else {\n    // tooltip is currently not visible\n    const me = this;\n    this.tooltipTimeout = setTimeout(function () {\n      me.tooltipTimeout = null;\n\n      // show a tooltip if we have a data point\n      const dataPoint = me._dataPointFromXY(mouseX, mouseY);\n      if (dataPoint) {\n        me._showTooltip(dataPoint);\n      }\n    }, delay);\n  }\n};\n\n/**\n * Event handler for touchstart event on mobile devices\n * @param {Event}  event   The event\n */\nGraph3d.prototype._onTouchStart = function (event) {\n  this.touchDown = true;\n\n  const me = this;\n  this.ontouchmove = function (event) {\n    me._onTouchMove(event);\n  };\n  this.ontouchend = function (event) {\n    me._onTouchEnd(event);\n  };\n  document.addEventListener(\"touchmove\", me.ontouchmove);\n  document.addEventListener(\"touchend\", me.ontouchend);\n\n  this._onMouseDown(event);\n};\n\n/**\n * Event handler for touchmove event on mobile devices\n * @param {Event}  event   The event\n */\nGraph3d.prototype._onTouchMove = function (event) {\n  this._onMouseMove(event);\n};\n\n/**\n * Event handler for touchend event on mobile devices\n * @param {Event}  event   The event\n */\nGraph3d.prototype._onTouchEnd = function (event) {\n  this.touchDown = false;\n\n  document.removeEventListener(\"touchmove\", this.ontouchmove);\n  document.removeEventListener(\"touchend\", this.ontouchend);\n\n  this._onMouseUp(event);\n};\n\n/**\n * Event handler for mouse wheel event, used to zoom the graph\n * Code from http://adomas.org/javascript-mouse-wheel/\n * @param {Event}  event   The event\n */\nGraph3d.prototype._onWheel = function (event) {\n  if (!event) /* For IE. */ event = window.event;\n  if (this.zoomable && (!this.ctrlToZoom || event.ctrlKey)) {\n    // retrieve delta\n    let delta = 0;\n    if (event.wheelDelta) {\n      /* IE/Opera. */\n      delta = event.wheelDelta / 120;\n    } else if (event.detail) {\n      /* Mozilla case. */\n      // In Mozilla, sign of delta is different than in IE.\n      // Also, delta is multiple of 3.\n      delta = -event.detail / 3;\n    }\n\n    // If delta is nonzero, handle it.\n    // Basically, delta is now positive if wheel was scrolled up,\n    // and negative, if wheel was scrolled down.\n    if (delta) {\n      const oldLength = this.camera.getArmLength();\n      const newLength = oldLength * (1 - delta / 10);\n\n      this.camera.setArmLength(newLength);\n      this.redraw();\n\n      this._hideTooltip();\n    }\n\n    // fire a cameraPositionChange event\n    const parameters = this.getCameraPosition();\n    this.emit(\"cameraPositionChange\", parameters);\n\n    // Prevent default actions caused by mouse wheel.\n    // That might be ugly, but we handle scrolls somehow\n    // anyway, so don't bother here..\n    util.preventDefault(event);\n  }\n};\n\n/**\n * Test whether a point lies inside given 2D triangle\n * @param   {vis.Point2d}   point\n * @param   {vis.Point2d[]} triangle\n * @returns {boolean}   true if given point lies inside or on the edge of the\n *                      triangle, false otherwise\n * @private\n */\nGraph3d.prototype._insideTriangle = function (point, triangle) {\n  const a = triangle[0],\n    b = triangle[1],\n    c = triangle[2];\n\n  /**\n   *\n   * @param {number} x\n   * @returns {number}\n   */\n  function sign(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n\n  const as = sign(\n    (b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x),\n  );\n  const bs = sign(\n    (c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x),\n  );\n  const cs = sign(\n    (a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x),\n  );\n\n  // each of the three signs must be either equal to each other or zero\n  return (\n    (as == 0 || bs == 0 || as == bs) &&\n    (bs == 0 || cs == 0 || bs == cs) &&\n    (as == 0 || cs == 0 || as == cs)\n  );\n};\n\n/**\n * Find a data point close to given screen position (x, y)\n * @param   {number} x\n * @param   {number} y\n * @returns {object | null} The closest data point or null if not close to any\n *                          data point\n * @private\n */\nGraph3d.prototype._dataPointFromXY = function (x, y) {\n  const distMax = 100; // px\n  const center = new Point2d(x, y);\n  let i,\n    dataPoint = null,\n    closestDataPoint = null,\n    closestDist = null;\n\n  if (\n    this.style === Graph3d.STYLE.BAR ||\n    this.style === Graph3d.STYLE.BARCOLOR ||\n    this.style === Graph3d.STYLE.BARSIZE\n  ) {\n    // the data points are ordered from far away to closest\n    for (i = this.dataPoints.length - 1; i >= 0; i--) {\n      dataPoint = this.dataPoints[i];\n      const surfaces = dataPoint.surfaces;\n      if (surfaces) {\n        for (let s = surfaces.length - 1; s >= 0; s--) {\n          // split each surface in two triangles, and see if the center point is inside one of these\n          const surface = surfaces[s];\n          const corners = surface.corners;\n          const triangle1 = [\n            corners[0].screen,\n            corners[1].screen,\n            corners[2].screen,\n          ];\n          const triangle2 = [\n            corners[2].screen,\n            corners[3].screen,\n            corners[0].screen,\n          ];\n          if (\n            this._insideTriangle(center, triangle1) ||\n            this._insideTriangle(center, triangle2)\n          ) {\n            // return immediately at the first hit\n            return dataPoint;\n          }\n        }\n      }\n    }\n  } else {\n    // find the closest data point, using distance to the center of the point on 2d screen\n    for (i = 0; i < this.dataPoints.length; i++) {\n      dataPoint = this.dataPoints[i];\n      const point = dataPoint.screen;\n      if (point) {\n        const distX = Math.abs(x - point.x);\n        const distY = Math.abs(y - point.y);\n        const dist = Math.sqrt(distX * distX + distY * distY);\n\n        if ((closestDist === null || dist < closestDist) && dist < distMax) {\n          closestDist = dist;\n          closestDataPoint = dataPoint;\n        }\n      }\n    }\n  }\n\n  return closestDataPoint;\n};\n\n/**\n * Determine if the given style has bars\n * @param   {number} style the style to check\n * @returns {boolean} true if bar style, false otherwise\n */\nGraph3d.prototype.hasBars = function (style) {\n  return (\n    style == Graph3d.STYLE.BAR ||\n    style == Graph3d.STYLE.BARCOLOR ||\n    style == Graph3d.STYLE.BARSIZE\n  );\n};\n\n/**\n * Display a tooltip for given data point\n * @param {object} dataPoint\n * @private\n */\nGraph3d.prototype._showTooltip = function (dataPoint) {\n  let content, line, dot;\n\n  if (!this.tooltip) {\n    content = document.createElement(\"div\");\n    Object.assign(content.style, {}, this.tooltipStyle.content);\n    content.style.position = \"absolute\";\n\n    line = document.createElement(\"div\");\n    Object.assign(line.style, {}, this.tooltipStyle.line);\n    line.style.position = \"absolute\";\n\n    dot = document.createElement(\"div\");\n    Object.assign(dot.style, {}, this.tooltipStyle.dot);\n    dot.style.position = \"absolute\";\n\n    this.tooltip = {\n      dataPoint: null,\n      dom: {\n        content: content,\n        line: line,\n        dot: dot,\n      },\n    };\n  } else {\n    content = this.tooltip.dom.content;\n    line = this.tooltip.dom.line;\n    dot = this.tooltip.dom.dot;\n  }\n\n  this._hideTooltip();\n\n  this.tooltip.dataPoint = dataPoint;\n  if (typeof this.showTooltip === \"function\") {\n    content.innerHTML = this.showTooltip(dataPoint.point);\n  } else {\n    content.innerHTML =\n      \"<table>\" +\n      \"<tr><td>\" +\n      this.xLabel +\n      \":</td><td>\" +\n      dataPoint.point.x +\n      \"</td></tr>\" +\n      \"<tr><td>\" +\n      this.yLabel +\n      \":</td><td>\" +\n      dataPoint.point.y +\n      \"</td></tr>\" +\n      \"<tr><td>\" +\n      this.zLabel +\n      \":</td><td>\" +\n      dataPoint.point.z +\n      \"</td></tr>\" +\n      \"</table>\";\n  }\n\n  content.style.left = \"0\";\n  content.style.top = \"0\";\n  this.frame.appendChild(content);\n  this.frame.appendChild(line);\n  this.frame.appendChild(dot);\n\n  // calculate sizes\n  const contentWidth = content.offsetWidth;\n  const contentHeight = content.offsetHeight;\n  const lineHeight = line.offsetHeight;\n  const dotWidth = dot.offsetWidth;\n  const dotHeight = dot.offsetHeight;\n\n  let left = dataPoint.screen.x - contentWidth / 2;\n  left = Math.min(\n    Math.max(left, 10),\n    this.frame.clientWidth - 10 - contentWidth,\n  );\n\n  line.style.left = dataPoint.screen.x + \"px\";\n  line.style.top = dataPoint.screen.y - lineHeight + \"px\";\n  content.style.left = left + \"px\";\n  content.style.top = dataPoint.screen.y - lineHeight - contentHeight + \"px\";\n  dot.style.left = dataPoint.screen.x - dotWidth / 2 + \"px\";\n  dot.style.top = dataPoint.screen.y - dotHeight / 2 + \"px\";\n};\n\n/**\n * Hide the tooltip when displayed\n * @private\n */\nGraph3d.prototype._hideTooltip = function () {\n  if (this.tooltip) {\n    this.tooltip.dataPoint = null;\n\n    for (const prop in this.tooltip.dom) {\n      if (Object.prototype.hasOwnProperty.call(this.tooltip.dom, prop)) {\n        const elem = this.tooltip.dom[prop];\n        if (elem && elem.parentNode) {\n          elem.parentNode.removeChild(elem);\n        }\n      }\n    }\n  }\n};\n\n/**--------------------------------------------------------------------------**/\n\n/**\n * Get the horizontal mouse position from a mouse event\n * @param   {Event}  event\n * @returns {number} mouse x\n */\nfunction getMouseX(event) {\n  if (\"clientX\" in event) return event.clientX;\n  return (event.targetTouches[0] && event.targetTouches[0].clientX) || 0;\n}\n\n/**\n * Get the vertical mouse position from a mouse event\n * @param   {Event}  event\n * @returns {number} mouse y\n */\nfunction getMouseY(event) {\n  if (\"clientY\" in event) return event.clientY;\n  return (event.targetTouches[0] && event.targetTouches[0].clientY) || 0;\n}\n\n// -----------------------------------------------------------------------------\n//  Public methods for specific settings\n// -----------------------------------------------------------------------------\n\n/**\n * Set the rotation and distance of the camera\n * @param {object}  pos            An object with the camera position\n * @param {number} [pos.horizontal] The horizontal rotation, between 0 and 2*PI.\n *                                 Optional, can be left undefined.\n * @param {number} [pos.vertical]  The vertical rotation, between 0 and 0.5*PI.\n *                                 if vertical=0.5*PI, the graph is shown from\n *                                 the top. Optional, can be left undefined.\n * @param {number} [pos.distance]  The (normalized) distance of the camera to the\n *                                 center of the graph, a value between 0.71 and\n *                                 5.0. Optional, can be left undefined.\n */\nGraph3d.prototype.setCameraPosition = function (pos) {\n  setCameraPosition(pos, this);\n  this.redraw();\n};\n\n/**\n * Set a new size for the graph\n * @param {string} width  Width in pixels or percentage (for example '800px'\n *                        or '50%')\n * @param {string} height Height in pixels or percentage  (for example '400px'\n *                        or '30%')\n */\nGraph3d.prototype.setSize = function (width, height) {\n  this._setSize(width, height);\n  this.redraw();\n};\n\n// -----------------------------------------------------------------------------\n//  End public methods for specific settings\n// -----------------------------------------------------------------------------\n\nexport default Graph3d;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC1B,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AACnC,EAAE,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;AAC3B,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,EAAE,OAAO,GAAG;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AAC9B,EAAE,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;AAC3B,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,EAAE,OAAO,GAAG;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AAC9B,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AACxC,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AACrC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AACvC,EAAE,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE;;AAEpC,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAExC,EAAE,OAAO,YAAY;AACrB,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AACvC,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,YAAY;AAC1C,EAAE,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC;;ACrGD;AACA;AACA;AACA;AACA,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE;AACvB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC;AAClC;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE;AACpC,EAAE,IAAI,SAAS,KAAK,SAAS,EAAE;AAC/B,IAAI,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;AACnD,EAAE;AACF,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS;AAC5B,EAAE,IAAI,CAAC,OAAO;AACd,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI;;AAEpE,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;AACpB,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC9C;AACA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACnC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAC1C,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;AAE1C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACrD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ;AACnC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM;AAClC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAE3C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACrD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ;AACnC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM;AAClC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAE3C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACrD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ;AACnC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM;AAClC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAE3C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACpD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ;AAClC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,eAAe;AACjD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AACvC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;AAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK;AAChD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,mBAAmB;AACrD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS;AACpD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;;AAE1C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACtD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ;AACpC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AACzC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;AAChC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAChD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ;AAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;AAE5C;AACA,IAAI,MAAM,EAAE,GAAG,IAAI;AACnB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AACpD,MAAM,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;AAC5B,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE;AAC/C,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;AACpB,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE;AAC/C,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;AAC1B,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE;AAC/C,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;AACpB,IAAI,CAAC;AACL,EAAE;;AAEF,EAAE,IAAI,CAAC,gBAAgB,GAAG,SAAS;;AAEnC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE;AAClB,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS;;AAExB,EAAE,IAAI,CAAC,WAAW,GAAG,SAAS;AAC9B,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC3B,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI;AACtB;;AAEA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;AACpC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE;AACjB,IAAI,KAAK,EAAE;AACX,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxB,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;AACpC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,IAAI,KAAK,EAAE;AACX,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxB,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY;AACxC,EAAE,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;;AAE1B,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,IAAI,KAAK,EAAE;AACX,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxB,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC5B;AACA,IAAI,KAAK,GAAG,CAAC;AACb,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxB,EAAE;;AAEF,EAAE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACxB,EAAE,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK;;AAE1B;AACA;AACA,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC,CAAC;AACxD;;AAEA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,YAAY;AAC5C,IAAI,EAAE,CAAC,QAAQ,EAAE;AACjB,EAAE,CAAC,EAAE,QAAQ,CAAC;AACd,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;AAC1C,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE;AACtC,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;AACpC;AACA,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;;AAExB,EAAE,IAAI,CAAC,QAAQ,EAAE;;AAEjB,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAClB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM;AAClC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;AACpC,EAAE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;AACjC,EAAE,IAAI,CAAC,WAAW,GAAG,SAAS;;AAE9B,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAClB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM;AAClC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,QAAQ,EAAE;AAC3D,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ;AAClC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,QAAQ,EAAE;AACvD,EAAE,IAAI,CAAC,YAAY,GAAG,QAAQ;AAC9B,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AAC/C,EAAE,OAAO,IAAI,CAAC,YAAY;AAC1B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,MAAM,EAAE;AACjD,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM;AACxB,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY;AACxC,EAAE,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE;AAC3C,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC3B,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AACtC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAClB;AACA,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;AAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI;AAC1E,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK;AAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW;AAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW;AACjC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW;AACjC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW;AACjC,MAAM,EAAE;AACR,MAAM,IAAI;;AAEV;AACA,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;AAC7C,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,MAAM,EAAE;AAC/C,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEtB,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9C,OAAO,IAAI,CAAC,KAAK,GAAG,SAAS;AAC7B,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,KAAK,EAAE;AAC7C,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK;;AAEtB,IAAI,IAAI,CAAC,MAAM,EAAE;AACjB,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;AACzC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY;AACxC,EAAE,OAAO,IAAI,CAAC,KAAK;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,YAAY;AACnC,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,CAAC;;AAED,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,KAAK,EAAE;AACjD;AACA,EAAE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;AAC7E,EAAE,IAAI,CAAC,cAAc,EAAE;;AAEvB,EAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO;AACnC,EAAE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;;AAE5D,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;;AAElC;AACA;AACA;AACA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,IAAI,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AACtC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1B,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AACpC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;AACxB,EAAE,CAAC;AACH,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;AAC1D,EAAE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;AACtD,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC5B,CAAC;;AAED,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,IAAI,EAAE;AAC/C,EAAE,MAAM,KAAK;AACb,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE;AAC9E,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC;;AAEpB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChE,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAC1B,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;;AAEpE,EAAE,OAAO,KAAK;AACd,CAAC;;AAED,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AAChD,EAAE,MAAM,KAAK;AACb,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE;;AAE9E,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;AACtD,EAAE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC;;AAEpB,EAAE,OAAO,IAAI;AACb,CAAC;;AAED,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,KAAK,EAAE;AACjD,EAAE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY;AAChD,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI;;AAEnC,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;;AAEnC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAEtB,EAAE,IAAI,CAAC,cAAc,EAAE;AACvB,CAAC;;AAED,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;AAC1C,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;;AAElC;AACA,EAAE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;AAC7D,EAAE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEzD,EAAE,IAAI,CAAC,cAAc,EAAE;AACvB,CAAC;;AC7VD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE;AAClD;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC;AACjB,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC;AACf,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AAChB,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;AACxB,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC;;AAEpB,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE;AAC9C,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;AAC7C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE;AACxE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AAC9B,IAAI,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,KAAK,CAAC;AACxE,EAAE;AACF,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;AAC5B,IAAI,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,KAAK,CAAC;AACtE,EAAE;AACF,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;AAC7B,IAAI,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,KAAK,CAAC;AACvE,EAAE;;AAEF,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC;AACjC,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;AAE3B,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,IAAI,EAAE,UAAU,EAAE;AAC3D,EAAE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,CAAC,EAAE;;AAEvC,EAAE,IAAI,UAAU,KAAK,SAAS,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU;;AAE5D,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;AAC9B,IAAI,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC;AACrD,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,mBAAmB,GAAG,UAAU,IAAI,EAAE;AACjD,EAAE,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE;AAC7B,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;AAClC,EAAE,CAAC;;AAEH;AACA,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEzD;AACA,EAAE,IAAI,UAAU,GAAG,KAAK;AACxB,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK;AAC/E,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK;;AAE/E;AACA,EAAE,IAAI,UAAU,IAAI,CAAC,EAAE;AACvB,IAAI,UAAU,GAAG,CAAC;AAClB,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;AAC9C,EAAE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC9D,CAAC;;AAED;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;AAC3C,EAAE,OAAO,IAAI,CAAC,KAAK;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,UAAU,EAAE;AACnD,EAAE,IAAI,UAAU,KAAK,SAAS,EAAE;AAChC,IAAI,UAAU,GAAG,KAAK;AACtB,EAAE;;AAEF,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;;AAE1D,EAAE,IAAI,UAAU,EAAE;AAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACzC,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,IAAI;AACJ,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;AACxC,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK;AAC7B,CAAC;;AAED;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,GAAG,GAAG,YAAY;AACvC,EAAE,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI;AAClC,CAAC;;ACxKD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,GAAG;AAClB,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE;AAClC,EAAE,IAAI,CAAC,WAAW,GAAG,EAAE;AACvB,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC;AACjC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,CAAC;AAC/B,EAAE,IAAI,CAAC,SAAS,GAAG,GAAG;AACtB,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,EAAE;AACnC,EAAE,IAAI,CAAC,gBAAgB,GAAG,GAAG;;AAE7B,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,EAAE;AACrC,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;;AAExD,EAAE,IAAI,CAAC,0BAA0B,EAAE;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AAC7C,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;AACtB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;AACpB,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB;AAC/B,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG;;AAEjC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;AACvB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;AACxB,EAAE;AACF,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;AACvB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;AACxB,EAAE;AACF,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC;AACzB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC;AACzB,EAAE,IAAI,CAAC,0BAA0B,EAAE;AACnC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,YAAY;AACzC,EAAE,OAAO,IAAI,CAAC,YAAY;AAC1B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACrD,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC;AACxB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC;AACxB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC;;AAExB,EAAE,IAAI,CAAC,0BAA0B,EAAE;AACnC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,UAAU,EAAE,QAAQ,EAAE;AAClE,EAAE,IAAI,UAAU,KAAK,SAAS,EAAE;AAChC,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,UAAU;AAC5C,EAAE;;AAEF,EAAE,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC9B,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,QAAQ;AACxC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,CAAC;AACpE,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;AACjD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;AAC/C,EAAE;;AAEF,EAAE,IAAI,UAAU,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1D,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACrC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAC9C,EAAE,MAAM,GAAG,GAAG,EAAE;AAChB,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;AAC9C,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;;AAE1C,EAAE,OAAO,GAAG;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,MAAM,EAAE;AAClD,EAAE,IAAI,MAAM,KAAK,SAAS,EAAE;;AAE5B,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM;;AAEzB;AACA;AACA;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;AAClD,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,GAAG,GAAG;;AAEhD,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AAC1D,EAAE,IAAI,CAAC,0BAA0B,EAAE;AACnC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAC5C,EAAE,OAAO,IAAI,CAAC,SAAS;AACvB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACjD,EAAE,OAAO,IAAI,CAAC,cAAc;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACjD,EAAE,OAAO,IAAI,CAAC,cAAc;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,0BAA0B,GAAG,YAAY;AAC1D;AACA,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;AACtB,IAAI,IAAI,CAAC,SAAS;AAClB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AACzC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;AACtB,IAAI,IAAI,CAAC,SAAS;AAClB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AACzC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;;AAE7E;AACA,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;AACjE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC;AAC3B,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU;;AAEtD,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AAClC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AAClC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;AAChC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;AAChC,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;AACtB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG;;AAElB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AAClE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AACjE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;AAC9D,CAAC;;AC3LD;AACA;AACA;AACA;;AAKA;AACA,MAAM,KAAK,GAAG;AACd,EAAE,GAAG,EAAE,CAAC;AACR,EAAE,QAAQ,EAAE,CAAC;AACb,EAAE,OAAO,EAAE,CAAC;AACZ,EAAE,GAAG,EAAE,CAAC;AACR,EAAE,OAAO,EAAE,CAAC;AACZ,EAAE,QAAQ,EAAE,CAAC;AACb,EAAE,OAAO,EAAE,CAAC;AACZ,EAAE,IAAI,EAAE,CAAC;AACT,EAAE,IAAI,EAAE,CAAC;AACT,EAAE,OAAO,EAAE,CAAC;AACZ,CAAC;;AAED;AACA,MAAM,SAAS,GAAG;AAClB,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG;AAChB,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO;AAC3B,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ;AAC7B,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO;AAC3B,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;AAClB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;AAClB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO;AACxB,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG;AAChB,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ;AAC7B,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO;AAC3B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG;AACnB,EAAE,OAAO;AACT,EAAE,QAAQ;AACV,EAAE,aAAa;AACf,EAAE,aAAa;AACf,EAAE,QAAQ;AACV,EAAE,QAAQ;AACV,EAAE,QAAQ;AACV,EAAE,aAAa;AACf,EAAE,aAAa;AACf,EAAE,aAAa;AACf,EAAE,WAAW;AACb,EAAE,WAAW;AACb,EAAE,WAAW;AACb,EAAE,gBAAgB;AAClB,EAAE,UAAU;AACZ,EAAE,iBAAiB;AACnB,EAAE,YAAY;AACd,EAAE,iBAAiB;AACnB,EAAE,iBAAiB;AACnB,EAAE,kBAAkB;AACpB,EAAE,eAAe;AACjB,EAAE,cAAc;AAChB,EAAE,oBAAoB;AACtB,EAAE,oBAAoB;AACtB,EAAE,uBAAuB;AACzB,EAAE,mBAAmB;AACrB,EAAE,kBAAkB;AACpB,EAAE,oBAAoB;AACtB,EAAE,WAAW;AACb,EAAE,cAAc;AAChB,EAAE,cAAc;AAChB,EAAE,WAAW;AACb,EAAE,SAAS;AACX,EAAE,SAAS;AACX,EAAE,UAAU;AACZ,EAAE,cAAc;AAChB,EAAE,YAAY;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG;AAC3B,EAAE,WAAW;AACb,EAAE,WAAW;AACb,EAAE,UAAU;AACZ,EAAE,UAAU;AACZ,EAAE,MAAM;AACR,EAAE,MAAM;AACR,EAAE,OAAO;AACT,EAAE,MAAM;AACR,EAAE,MAAM;AACR,EAAE,OAAO;AACT,EAAE,MAAM;AACR,EAAE,MAAM;AACR,EAAE,OAAO;AACT,CAAC;;AAED;AACA,IAAI,QAAQ,GAAG,SAAS;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,CAAC,GAAG,EAAE;AACtB,EAAE,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;AAC1B,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE,EAAE;;AAEF,EAAE,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU,CAAC,GAAG,EAAE;AACzB,EAAE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,OAAO,GAAG,IAAI,QAAQ,EAAE;AACjE,IAAI,OAAO,GAAG;AACd,EAAE;;AAEF,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE;AAC5C,EAAE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE;AAC7C,IAAI,OAAO,SAAS;AACpB,EAAE;;AAEF,EAAE,OAAO,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;AAC7C,EAAE,IAAI,MAAM;AACZ,EAAE,IAAI,MAAM;;AAEZ,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;AAC1C,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AACtB,IAAI,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;;AAE5C,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;AAC7B,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;AAC5C,EAAE,IAAI,MAAM;AACZ,EAAE,IAAI,MAAM;;AAEZ,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;AAC1C,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AACtB,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;;AAEnC,IAAI,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;;AAE5C,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;AAC7B,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;AACzC,IAAI,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;AACzC,EAAE;AACF,EAAE,IAAI,GAAG,KAAK,SAAS,EAAE;AACzB,IAAI,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;AACpC,EAAE;;AAEF;AACA,EAAE,QAAQ,GAAG,GAAG;;AAEhB;AACA,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC;AACjC,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,SAAS,CAAC;;AAEpD;AACA,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;;AAE9B;AACA,EAAE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;AAClB,EAAE,GAAG,CAAC,WAAW,GAAG,KAAK;AACzB,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI;AAC7B,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE;AAClC,EAAE,IAAI,OAAO,KAAK,SAAS,EAAE;AAC7B,IAAI;AACJ,EAAE;AACF,EAAE,IAAI,GAAG,KAAK,SAAS,EAAE;AACzB,IAAI,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;AACpC,EAAE;;AAEF,EAAE,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;AACnD,IAAI,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;AAC3D,EAAE;;AAEF;AACA,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC;AACpC,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,SAAS,CAAC;;AAEvD;AACA,EAAE,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE;AACtC,EAAE,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,EAAE;AACzC,IAAI,kBAAkB,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC;AAChD,EAAE;;AAEF,EAAE,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC;AAClC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1B,EAAE,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE;AACvC,IAAI,OAAO,CAAC,IAAI;AAChB,MAAM,uEAAuE;AAC7E,QAAQ,2EAA2E;AACnF,QAAQ,qEAAqE;AAC7E,KAAK;AACL,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE;AACpC,MAAM,MAAM,IAAI,KAAK;AACrB,QAAQ,oEAAoE;AAC5E,OAAO;AACP,IAAI;AACJ,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE;AACjC,MAAM,OAAO,CAAC,IAAI;AAClB,QAAQ,2CAA2C;AACnD,UAAU,GAAG,CAAC,KAAK;AACnB,UAAU,QAAQ;AAClB,UAAU,6DAA6D;AACvE,OAAO;AACP,IAAI,CAAC,MAAM;AACX,MAAM,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC;AAC7C,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC;AAClC,EAAE;AACF,EAAE,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;AACpC,EAAE,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC;;AAE5C;AACA;AACA,EAAE,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE;AACjC,IAAI,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO;AACjC,EAAE;AACF,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,SAAS,EAAE;AAChC,IAAI,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,OAAO;AACtC,IAAI,OAAO,CAAC,IAAI;AAChB,MAAM,yEAAyE;AAC/E,QAAQ,qDAAqD;AAC7D,KAAK;AACL,EAAE;;AAEF,EAAE,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE;AACtC,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;AACxD,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,UAAU,EAAE,GAAG,EAAE;AACxC,EAAE,IAAI,UAAU,KAAK,SAAS,EAAE;AAChC;AACA,IAAI,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,KAAK,SAAS;;AAE7D,IAAI,IAAI,eAAe,EAAE;AACzB;AACA,MAAM,MAAM,kBAAkB;AAC9B,QAAQ,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO;;AAEnE,MAAM,GAAG,CAAC,UAAU,GAAG,kBAAkB;AACzC,IAAI;AAGJ,EAAE,CAAC,MAAM;AACT,IAAI,GAAG,CAAC,UAAU,GAAG,UAAU;AAC/B,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAoB,CAAC,SAAS,EAAE;AACzC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC;;AAErC,EAAE,IAAI,MAAM,KAAK,SAAS,EAAE;AAC5B,IAAI,OAAO,EAAE;AACb,EAAE;;AAEF,EAAE,OAAO,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,KAAK,EAAE;AACjC,EAAE,IAAI,KAAK,GAAG,KAAK;;AAEnB,EAAE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACzB,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;AAC5B,MAAM,KAAK,GAAG,IAAI;AAClB,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;AAC9B,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE;AAC3B,IAAI,OAAO;AACX,EAAE;;AAEF,EAAE,IAAI,WAAW;;AAEjB,EAAE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACjC,IAAI,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC;;AAE7C,IAAI,IAAI,WAAW,KAAK,EAAE,EAAE;AAC5B,MAAM,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,GAAG,cAAc,CAAC;AACzD,IAAI;AACJ,EAAE,CAAC,MAAM;AACT;AACA,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;AAClC,MAAM,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,GAAG,cAAc,CAAC;AACzD,IAAI;;AAEJ,IAAI,WAAW,GAAG,KAAK;AACvB,EAAE;;AAEF,EAAE,GAAG,CAAC,KAAK,GAAG,WAAW;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,kBAAkB,CAAC,eAAe,EAAE,GAAG,EAAE;AAClD,EAAE,IAAI,IAAI,GAAG,OAAO;AACpB,EAAE,IAAI,MAAM,GAAG,MAAM;AACrB,EAAE,IAAI,WAAW,GAAG,CAAC;;AAErB,EAAE,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;AAC3C,IAAI,IAAI,GAAG,eAAe;AAC1B,IAAI,MAAM,GAAG,MAAM;AACnB,IAAI,WAAW,GAAG,CAAC;AACnB,EAAE,CAAC,MAAM,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;AAClD,IAAI,IAAI,eAAe,CAAC,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,eAAe,CAAC,IAAI;AACvE,IAAI,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM;AAC7E,IAAI,IAAI,eAAe,CAAC,WAAW,KAAK,SAAS;AACjD,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW;AAC/C,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;AAC1D,EAAE;;AAEF,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI;AACxC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM;AACtC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,GAAG,IAAI;AAClD,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE;AACtC,EAAE,IAAI,SAAS,KAAK,SAAS,EAAE;AAC/B,IAAI,OAAO;AACX,EAAE;;AAEF,EAAE,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE;AACnC,IAAI,GAAG,CAAC,SAAS,GAAG,EAAE;AACtB,EAAE;;AAEF,EAAE,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACrC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS;AAClC,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS;AACpC,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE;AACxB,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI;AACzC,IAAI;AACJ,IAAI,IAAI,SAAS,CAAC,MAAM,EAAE;AAC1B,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;AAC7C,IAAI;AACJ,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,SAAS,EAAE;AAC7C,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW;AACvD,IAAI;AACJ,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,aAAa,EAAE,GAAG,EAAE;AAC7C,EAAE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE;AAC7D,IAAI,OAAO;AACX,EAAE;AACF,EAAE,IAAI,aAAa,KAAK,KAAK,EAAE;AAC/B,IAAI,GAAG,CAAC,aAAa,GAAG,SAAS;AACjC,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE;AACvC,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE;AAC1B,EAAE;;AAEF,EAAE,IAAI,SAAS;AACf,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AACpC,IAAI,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC;AAC9C,EAAE,CAAC,MAAM,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AAChD,IAAI,SAAS,GAAG,gBAAgB,CAAC,aAAa,CAAC,GAAG,CAAC;AACnD,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;AACxD,EAAE;AACF;AACA,EAAE,SAAS,CAAC,OAAO,EAAE;AACrB,EAAE,GAAG,CAAC,QAAQ,GAAG,SAAS;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE;AACpC,EAAE,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC9B,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,SAAS;AACf,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC/B,IAAI,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC;AACzC,EAAE,CAAC,MAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC3C,IAAI,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC9C,EAAE,CAAC,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAC7C,IAAI,SAAS,GAAG,QAAQ;AACxB,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;AACnD,EAAE;AACF,EAAE,GAAG,CAAC,QAAQ,GAAG,SAAS;AAC1B;;AAEA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,QAAQ,EAAE;AACnC,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,IAAI,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;AAChE,EAAE;AACF,EAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,SAAS,EAAE;AAC3C,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;AACrC,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,4CAA4C,CAAC,CAAC;AACrE,IAAI;AACJ,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AACnC,EAAE,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,IAAI,EAAE;AAChC,EAAE,IAAI,IAAI,KAAK,SAAS,EAAE;AAC1B,IAAI,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;AACnD,EAAE;AACF,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,EAAE;AACzD,IAAI,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC;AAC5E,EAAE;AACF,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,EAAE;AACzD,IAAI,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC;AAC5E,EAAE;AACF,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE;AAC/B,IAAI,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;AACxE,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;AAEjE,EAAE,MAAM,SAAS,GAAG,EAAE;AACtB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;AAC5C,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG;AACxD,IAAI,SAAS,CAAC,IAAI;AAClB,MAAM,IAAI,CAAC,QAAQ;AACnB,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG;AAC/B,QAAQ,IAAI,CAAC,UAAU,GAAG,GAAG;AAC7B,QAAQ,IAAI,CAAC,UAAU,GAAG,GAAG;AAC7B,OAAO;AACP,KAAK;AACL,EAAE;AACF,EAAE,OAAO,SAAS;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB,CAAC,cAAc,EAAE,GAAG,EAAE;AAChD,EAAE,MAAM,MAAM,GAAG,cAAc;AAC/B,EAAE,IAAI,MAAM,KAAK,SAAS,EAAE;AAC5B,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;AAChC,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE;AAC7B,EAAE;;AAEF,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;AAC/D,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC1C;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAM,GAAG,QAAQ;AACvB,MAAM,IAAI,GAAG,SAAS;AACtB,MAAM,MAAM,GAAG,QAAQ;AACvB,MAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,MAAM,KAAK,GAAG,OAAO;AACrB;AACA;AACA;;AAEA,MAAM,YAAY,GAAG;AACrB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE;AAClB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;AACpB,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE;AACzB,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AACtD,CAAC;;AAED,MAAM,oBAAoB,GAAG;AAC7B,EAAE,GAAG,EAAE;AACP,IAAI,KAAK,EAAE,EAAE,MAAM,EAAE;AACrB,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE;AACnB,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE;AACxB,GAAG;AACH,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AACpE,CAAC;;AAED,MAAM,eAAe,GAAG;AACxB,EAAE,GAAG,EAAE;AACP,IAAI,KAAK,EAAE,EAAE,MAAM,EAAE;AACrB,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE;AACnB,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE;AACxB,GAAG;AACH,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE;AAC3E,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG;AACnB,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE;AAC/D,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE;AAC/B,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACrC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE;AACvB,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;AAClC,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;AAClC,EAAE,eAAe,EAAE,YAAY;AAC/B,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC/C,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC/C,EAAE,cAAc,EAAE;AAClB,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE;AACxB,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE;AAC1B,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE;AACxB,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE;AACxB,GAAG;AACH,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC7B,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC/B,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE;AACrB,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE;AACrB,EAAE,QAAQ,EAAE,eAAe;AAC3B,EAAE,SAAS,EAAE,YAAY;AACzB,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE;AAChC,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE;AAChC,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE;AAC1B,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE;AACzB,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE;AACvB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;AACnC,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACpC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;AACpB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;AACpB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;AACpB,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE;AACzB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC1C,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC1C,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC1C,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC1C,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC1C,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC1C,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE;AAClE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACnC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC7B,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE;AACvD,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACpC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC/B,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACpC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC9B,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC9B,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC9B,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACrC,EAAE,aAAa,EAAE,oBAAoB;AACrC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC3C,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC3C,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC3C,EAAE,KAAK,EAAE;AACT,IAAI,MAAM;AACV,IAAI,MAAM,EAAE;AACZ,MAAM,KAAK;AACX,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,KAAK;AACX,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,MAAM;AACZ,MAAM,MAAM;AACZ,MAAM,SAAS;AACf,KAAK;AACL,GAAG;AACH,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE;AAClD,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;AAClC,EAAE,YAAY,EAAE;AAChB,IAAI,OAAO,EAAE;AACb,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE;AACvB,MAAM,UAAU,EAAE,EAAE,MAAM,EAAE;AAC5B,MAAM,MAAM,EAAE,EAAE,MAAM,EAAE;AACxB,MAAM,YAAY,EAAE,EAAE,MAAM,EAAE;AAC9B,MAAM,SAAS,EAAE,EAAE,MAAM,EAAE;AAC3B,MAAM,OAAO,EAAE,EAAE,MAAM,EAAE;AACzB,MAAM,QAAQ,EAAE,EAAE,MAAM,EAAE;AAC1B,KAAK;AACL,IAAI,IAAI,EAAE;AACV,MAAM,UAAU,EAAE,EAAE,MAAM,EAAE;AAC5B,MAAM,MAAM,EAAE,EAAE,MAAM,EAAE;AACxB,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE;AACvB,MAAM,aAAa,EAAE,EAAE,MAAM,EAAE;AAC/B,MAAM,QAAQ,EAAE,EAAE,MAAM,EAAE;AAC1B,KAAK;AACL,IAAI,GAAG,EAAE;AACT,MAAM,MAAM,EAAE,EAAE,MAAM,EAAE;AACxB,MAAM,YAAY,EAAE,EAAE,MAAM,EAAE;AAC9B,MAAM,MAAM,EAAE,EAAE,MAAM,EAAE;AACxB,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE;AACvB,MAAM,aAAa,EAAE,EAAE,MAAM,EAAE;AAC/B,MAAM,QAAQ,EAAE,EAAE,MAAM,EAAE;AAC1B,KAAK;AACL,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE;AACxB,GAAG;AACH,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;AACvC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;AACvC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;AACvC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC9C,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC9C,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE;;AAE3B;AACA,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;AACpB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE;AACnB,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE;AACtB,CAAC;;AClKD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,GAAG;AACjB,EAAE,IAAI,CAAC,GAAG,GAAG,SAAS;AACtB,EAAE,IAAI,CAAC,GAAG,GAAG,SAAS;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,KAAK,EAAE;AAC1C,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE;;AAE3B,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE;AAClD,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK;AACpB,EAAE;;AAEF,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE;AAClD,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK;AACpB,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE;AAC3C,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AACrB,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AACrB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,GAAG,EAAE;AACxC,EAAE,IAAI,GAAG,KAAK,SAAS,EAAE;AACzB,IAAI;AACJ,EAAE;;AAEF,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG;AAC/B,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG;;AAE/B;AACA;AACA,EAAE,IAAI,MAAM,GAAG,MAAM,EAAE;AACvB,IAAI,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;AACjE,EAAE;;AAEF,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM;AACnB,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,YAAY;AACpC,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AACrC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAClC,CAAC;;AC/ED;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AAC1C,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS;AAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;AACtB,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;AAErB,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS;AACxB,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS;;AAExB;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;;AAExD,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AACvB,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE;;AAEtB,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK;AACrB,EAAE,IAAI,CAAC,cAAc,GAAG,SAAS;;AAEjC,EAAE,IAAI,KAAK,CAAC,gBAAgB,EAAE;AAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;AACvB,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC3B,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;AACtB,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY;AACxC,EAAE,OAAO,IAAI,CAAC,MAAM;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACjD,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;;AAEhC,EAAE,IAAI,CAAC,GAAG,CAAC;AACX,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;AAC7B,IAAI,CAAC,EAAE;AACP,EAAE;;AAEF,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;AACpC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY;AACxC,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW;AAC/B,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,YAAY;AACzC,EAAE,OAAO,IAAI,CAAC,MAAM;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AAChD,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,OAAO,SAAS;;AAEhD,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,YAAY;AACzC,EAAE,OAAO,IAAI,CAAC,MAAM;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,KAAK,EAAE;AAC7C,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;;AAExE,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAC3B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,KAAK,EAAE;AACnD,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK;;AAE7C,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE,OAAO,EAAE;;AAEpC,EAAE,IAAI,UAAU;AAChB,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC9B,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACvC,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,CAAC,GAAG,EAAE;AAChB,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;AAEhC,IAAI,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE;AAC/D,MAAM,MAAM,EAAE,UAAU,IAAI,EAAE;AAC9B,QAAQ,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;AACxC,MAAM,CAAC;AACP,KAAK,CAAC,CAAC,GAAG,EAAE;AACZ,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC;;AAExD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU;AACvC,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,QAAQ,EAAE;AACzD,EAAE,IAAI,CAAC,cAAc,GAAG,QAAQ;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AAChD,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;;AAExE,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;AACpB,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACjC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,KAAK,EAAE;AACrD,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE,KAAK,GAAG,CAAC;;AAEpC,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;;AAEhC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClC;AACA,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE;AACtC,MAAM,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACpD,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAChD,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACzC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;AACvC,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,uBAAuB,GAAG,QAAQ,GAAG,GAAG;AACvE;AACA,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI;;AAEzC,IAAI,MAAM,EAAE,GAAG,IAAI;AACnB,IAAI,UAAU,CAAC,YAAY;AAC3B,MAAM,EAAE,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC;AACpC,IAAI,CAAC,EAAE,EAAE,CAAC;AACV,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;AACvB,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;;AAEtB;AACA,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE;AACtC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;AACvC,MAAM,KAAK,CAAC,QAAQ,GAAG,SAAS;AAChC,IAAI;;AAEJ,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;AAClD,EAAE;AACF,CAAC;;AC7LD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,GAAG;AACrB,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;AACxE,EAAE,IAAI,OAAO,KAAK,SAAS,EAAE;;AAE7B,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC9B,IAAI,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;AAClC,EAAE;;AAEF,EAAE,IAAI,IAAI;AACV,EAAE,IAAI,OAAO,YAAY,OAAO,IAAI,OAAO,YAAY,QAAQ,EAAE;AACjE,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;AACxB,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;AAC3D,EAAE;;AAEF,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;;AAExB,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;;AAEpB;AACA,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;AACpB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;AACzC,EAAE;;AAEF,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO;AACxB,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;;AAEvB;AACA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,IAAI,CAAC,SAAS,GAAG,YAAY;AAC/B,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;AAC/B,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEtC;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG;AACjB,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG;AACjB,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG;;AAEjB,EAAE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;;AAEzC;AACA,EAAE,IAAI,QAAQ,EAAE;AAChB,IAAI,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE;AAChD,MAAM,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,gBAAgB;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvE,IAAI;;AAEJ,IAAI,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE;AAChD,MAAM,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,gBAAgB;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvE,IAAI;AACJ,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;AAC3D,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;AAC3D,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;;AAExD,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE;AAC9D,IAAI,IAAI,CAAC,QAAQ,GAAG,OAAO;AAC3B,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AAC/D,IAAI,IAAI,CAAC,iBAAiB;AAC1B,MAAM,UAAU;AAChB,MAAM,OAAO,CAAC,eAAe;AAC7B,MAAM,OAAO,CAAC,eAAe;AAC7B,KAAK;AACL,IAAI,IAAI,CAAC,UAAU,GAAG,UAAU;AAChC,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,QAAQ,GAAG,GAAG;AACvB,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM;AACjC,EAAE;;AAEF;AACA,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;AAChE,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACvC,MAAM,IAAI,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC3D,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY;AACpD,QAAQ,OAAO,CAAC,MAAM,EAAE;AACxB,MAAM,CAAC,CAAC;AACR,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,UAAU;AAChB,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;AACvB;AACA,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;AACjD,EAAE,CAAC,MAAM;AACT;AACA,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACzD,EAAE;AACF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,MAAM,EAAE,OAAO,EAAE;AACvE,EAAE,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;;AAE/C,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE;AACnB,IAAI,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;AACtD,EAAE;;AAEF,EAAE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE;;AAEpC,EAAE,OAAO;AACT,IAAI,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;AACvC,IAAI,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAC3C,IAAI,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAC3C,IAAI,IAAI,EAAE,OAAO,CAAC,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAC7C,IAAI,WAAW,EAAE,MAAM,GAAG,OAAO;AACjC,IAAI,UAAU,EAAE,MAAM,GAAG,MAAM;AAC/B,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,gBAAgB,GAAG;AACvC,EAAE,IAAI;AACN,EAAE,MAAM;AACR,EAAE,OAAO;AACT,EAAE,QAAQ;AACV,EAAE;AACF,EAAE,MAAM,QAAQ,GAAG,CAAC;AACpB,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;;AAE9D,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC;AACjD,EAAE,IAAI,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE;AACjC;AACA,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvC,EAAE;;AAEF,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;AAC3D,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,KAAK;AACpC,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC3B,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,QAAQ;AAC1E,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM,EAAE,IAAI,EAAE;AAChE,EAAE,IAAI,IAAI,KAAK,SAAS,EAAE;AAC1B,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS;AACzB,EAAE;;AAEF,EAAE,MAAM,MAAM,GAAG,EAAE;;AAEnB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AACtC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE;AACtC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE;AACrC,IAAI,OAAO,CAAC,GAAG,CAAC;AAChB,EAAE,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,IAAI,EAAE,MAAM,EAAE;AACpE,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;;AAErD;AACA;AACA,EAAE,IAAI,aAAa,GAAG,IAAI;;AAE1B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;;AAE1C,IAAI,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa,GAAG,IAAI,EAAE;AACvD,MAAM,aAAa,GAAG,IAAI;AAC1B,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,aAAa;AACtB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,IAAI,EAAE,MAAM,EAAE;AAC7D,EAAE,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;;AAE3B;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAChC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;AACtB,EAAE;;AAEF,EAAE,OAAO,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AAClD,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM;AAC9B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,iBAAiB,GAAG;AACxC,EAAE,KAAK;AACP,EAAE,UAAU;AACZ,EAAE,UAAU;AACZ,EAAE;AACF,EAAE,IAAI,UAAU,KAAK,SAAS,EAAE;AAChC,IAAI,KAAK,CAAC,GAAG,GAAG,UAAU;AAC1B,EAAE;;AAEF,EAAE,IAAI,UAAU,KAAK,SAAS,EAAE;AAChC,IAAI,KAAK,CAAC,GAAG,GAAG,UAAU;AAC1B,EAAE;;AAEF;AACA;AACA;AACA,EAAE,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AACvD,CAAC;;AAED,SAAS,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAC/C,EAAE,OAAO,IAAI,CAAC,SAAS;AACvB,CAAC;;AAED,SAAS,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;AAC7C,EAAE,OAAO,IAAI,CAAC,OAAO;AACrB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,IAAI,EAAE;AACpD,EAAE,MAAM,UAAU,GAAG,EAAE;;AAEvB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE;AAC/B,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AACxB,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAE7C,IAAI,MAAM,GAAG,GAAG,EAAE;AAClB,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK;AACrB,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/D,IAAI,GAAG,CAAC,KAAK,GAAG,SAAS;AACzB,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS;;AAE1B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,IAAI,EAAE;AACvD;AACA;AACA,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;;AAElB;AACA,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACvD,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;;AAEvD,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;;AAE7C;AACA,EAAE,MAAM,UAAU,GAAG,EAAE,CAAC;AACxB,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;;AAEvB;AACA,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;;AAE7C,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;AAC1C,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE;AAC7B,IAAI;;AAEJ,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;AACpC,EAAE;;AAEF;AACA,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/C,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC5B,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;AACnC,UAAU,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;AACtE,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;AACjC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS;AACzE,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;AACnC,UAAU,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG;AAClE,cAAc,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACrC,cAAc,SAAS;AACvB,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;AAC1C,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;AACpC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,SAAS;;AAEnC,EAAE,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC,gBAAgB,EAAE;AACrE,CAAC;;AAED;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AACzC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;AACtB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;AAChC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,IAAI,EAAE;AACrD,EAAE,IAAI,UAAU,GAAG,EAAE;;AAErB,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE;AACjE,IAAI,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC5C,EAAE,CAAC,MAAM;AACT;AACA,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;;AAEzC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE;AACnC;AACA,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClD,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE;AACnB,UAAU,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;AACrD,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AC3aD;AACA,OAAO,CAAC,KAAK,GAAG,KAAK;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,SAAS;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,QAAQ,GAAG;AACnB,EAAE,KAAK,EAAE,OAAO;AAChB,EAAE,MAAM,EAAE,OAAO;AACjB,EAAE,WAAW,EAAE,MAAM;AACrB,EAAE,WAAW,EAAE,OAAO;AACtB,EAAE,MAAM,EAAE,GAAG;AACb,EAAE,MAAM,EAAE,GAAG;AACb,EAAE,MAAM,EAAE,GAAG;AACb,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;AAC5B,IAAI,OAAO,CAAC;AACZ,EAAE,CAAC;AACH,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;AAC5B,IAAI,OAAO,CAAC;AACZ,EAAE,CAAC;AACH,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;AAC5B,IAAI,OAAO,CAAC;AACZ,EAAE,CAAC;AACH,EAAE,SAAS,EAAE,IAAI;AACjB,EAAE,SAAS,EAAE,IAAI;AACjB,EAAE,SAAS,EAAE,IAAI;AACjB,EAAE,cAAc,EAAE,KAAK;AACvB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,eAAe,EAAE,IAAI;AACvB,EAAE,UAAU,EAAE,KAAK;AACnB,EAAE,eAAe,EAAE,IAAI;AACvB,EAAE,eAAe,EAAE,IAAI;AACvB,EAAE,gBAAgB,EAAE,IAAI;AACxB,EAAE,aAAa,EAAE,GAAG;;AAEpB,EAAE,YAAY,EAAE,IAAI;AACpB,EAAE,kBAAkB,EAAE,GAAG;AACzB,EAAE,kBAAkB,EAAE,GAAG;;AAEzB,EAAE,qBAAqB,EAAE,aAAa;AACtC,EAAE,iBAAiB,EAAE,IAAI;AACzB,EAAE,gBAAgB,EAAE,KAAK;AACzB,EAAE,kBAAkB,EAAE,aAAa;;AAEnC,EAAE,YAAY,EAAE,EAAE;AAClB,EAAE,YAAY,EAAE,OAAO;AACvB,EAAE,SAAS,EAAE,SAAS;AACtB,EAAE,SAAS,EAAE,SAAS;AACtB,EAAE,OAAO,EAAE,KAAK;AAChB,EAAE,OAAO,EAAE,KAAK;;AAEhB,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,EAAE,OAAO,EAAE,KAAK;AAChB,EAAE,YAAY,EAAE,GAAG;;AAEnB,EAAE,YAAY,EAAE;AAChB,IAAI,OAAO,EAAE;AACb,MAAM,OAAO,EAAE,MAAM;AACrB,MAAM,MAAM,EAAE,mBAAmB;AACjC,MAAM,KAAK,EAAE,SAAS;AACtB,MAAM,UAAU,EAAE,uBAAuB;AACzC,MAAM,YAAY,EAAE,KAAK;AACzB,MAAM,SAAS,EAAE,oCAAoC;AACrD,KAAK;AACL,IAAI,IAAI,EAAE;AACV,MAAM,MAAM,EAAE,MAAM;AACpB,MAAM,KAAK,EAAE,GAAG;AAChB,MAAM,UAAU,EAAE,mBAAmB;AACrC,MAAM,aAAa,EAAE,MAAM;AAC3B,KAAK;AACL,IAAI,GAAG,EAAE;AACT,MAAM,MAAM,EAAE,GAAG;AACjB,MAAM,KAAK,EAAE,GAAG;AAChB,MAAM,MAAM,EAAE,mBAAmB;AACjC,MAAM,YAAY,EAAE,KAAK;AACzB,MAAM,aAAa,EAAE,MAAM;AAC3B,KAAK;AACL,GAAG;;AAEH,EAAE,SAAS,EAAE;AACb,IAAI,IAAI,EAAE,SAAS;AACnB,IAAI,MAAM,EAAE,SAAS;AACrB,IAAI,WAAW,EAAE,CAAC;AAClB,GAAG;;AAEH,EAAE,aAAa,EAAE,aAAa;AAC9B,EAAE,QAAQ,EAAE,aAAa;;AAEzB,EAAE,cAAc,EAAE;AAClB,IAAI,UAAU,EAAE,GAAG;AACnB,IAAI,QAAQ,EAAE,GAAG;AACjB,IAAI,QAAQ,EAAE,GAAG;AACjB,GAAG;;AAEH,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,UAAU,EAAE,KAAK;;AAEnB;AACA;AACA;AACA,EAAE,UAAU,EAAE,aAAa;AAC3B,EAAE,eAAe,EAAE,aAAa;;AAEhC,EAAE,SAAS,EAAE,aAAa;AAC1B,EAAE,SAAS,EAAE,aAAa;AAC1B,EAAE,QAAQ,EAAE,aAAa;AACzB,EAAE,QAAQ,EAAE,aAAa;AACzB,EAAE,IAAI,EAAE,aAAa;AACrB,EAAE,IAAI,EAAE,aAAa;AACrB,EAAE,KAAK,EAAE,aAAa;AACtB,EAAE,IAAI,EAAE,aAAa;AACrB,EAAE,IAAI,EAAE,aAAa;AACrB,EAAE,KAAK,EAAE,aAAa;AACtB,EAAE,IAAI,EAAE,aAAa;AACrB,EAAE,IAAI,EAAE,aAAa;AACrB,EAAE,KAAK,EAAE,aAAa;AACtB,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3C,EAAE,IAAI,EAAE,IAAI,YAAY,OAAO,CAAC,EAAE;AAClC,IAAI,MAAM,IAAI,WAAW,CAAC,kDAAkD,CAAC;AAC7E,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,SAAS;;AAEnC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE;AAClC,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;AAEzB;AACA,EAAE,IAAI,CAAC,MAAM,EAAE;;AAEf,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;;AAErC;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS;AACvB,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS;AACvB,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS;AACvB,EAAE,IAAI,CAAC,QAAQ,GAAG,SAAS;;AAE3B;;AAEA;AACA,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;;AAE1B;AACA,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACpB;;AAEA;AACA,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;;AAE1B;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,YAAY;AAC1C,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO;AAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAC3B,GAAG;;AAEH;AACA,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AAC5B,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACrC;AACA,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,IAAI,CAAC,MAAM;AACX;AACA,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,IAAI;AACJ,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa;AACpC;;AAEA;AACA,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACrC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AAClD,EAAE;;AAEF;AACA,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;AACvD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,OAAO,EAAE;AACtD,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;AAC9D,EAAE,OAAO,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC;AACtD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,0BAA0B,GAAG,UAAU,OAAO,EAAE;AAClE,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;AACxD,IAAI,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;AACpD,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC;AACzB,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC;AACzB,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC;AACzB;AACA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC;AACA,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC5E,IAAI,EAAE;AACN,MAAM,KAAK;AACX,SAAS,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7E,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACrD,IAAI,EAAE;AACN,MAAM,KAAK;AACX,SAAS,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7E,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;;AAErD,EAAE,OAAO,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,2BAA2B,GAAG,UAAU,WAAW,EAAE;AACvE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC;AACtB,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC;AACtB,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC;;AAEtB;AACA,EAAE,IAAI,EAAE;AACR,EAAE,IAAI,EAAE;AACR,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AAC5B,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC9B,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC9B,EAAE,CAAC,MAAM;AACT,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAChD,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAChD,EAAE;;AAEF;AACA;AACA,EAAE,OAAO,IAAI,OAAO;AACpB,IAAI,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;AAC5D,IAAI,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;AAC5D,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM,EAAE;AACxD,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AAC3B,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9D,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC;;AAEhE;AACA,IAAI,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC;AACrE,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7E,EAAE;;AAEF;AACA,EAAE,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AACpC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAC1B,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AAClD;AACA,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS;AAC3B,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;AACzB,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;AACzB,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;AACzB,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;;AAEjC;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;AACvB,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;AACvB,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;AACvB,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS;AAC/B,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS;AAC/B,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;AACrB,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;AACrB,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;AACrB,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ;;AAE7B;AACA,EAAE,IAAI,CAAC,SAAS,EAAE;AAClB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,IAAI,EAAE;AAClD,EAAE,MAAM,UAAU,GAAG,EAAE;;AAEvB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE;AAC/B,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AACxB,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAE7C,IAAI,MAAM,GAAG,GAAG,EAAE;AAClB,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK;AACrB,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/D,IAAI,GAAG,CAAC,KAAK,GAAG,SAAS;AACzB,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS;;AAE1B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,IAAI,EAAE;AACnD;AACA;AACA,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;;AAElB,EAAE,IAAI,UAAU,GAAG,EAAE;;AAErB,EAAE;AACF,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI;AACrC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC;AACjC,IAAI;AACJ;AACA;;AAEA;AACA,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACnE,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;;AAEnE,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;;AAEzC;AACA,IAAI,MAAM,UAAU,GAAG,EAAE,CAAC;AAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;;AAEzB;AACA,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;;AAE/C,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;AAC5C,QAAQ,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE;AAC/B,MAAM;;AAEN,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;AACtC,IAAI;;AAEJ;AACA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjD,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC9B,UAAU,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;AACrC,YAAY,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;AACxE,UAAU,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;AACnC,YAAY,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS;AAC3E,UAAU,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;AACrC,YAAY,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG;AACpE,gBAAgB,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACvC,gBAAgB,SAAS;AACzB,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE,CAAC,MAAM;AACT;AACA,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;;AAEzC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;AAC3C;AACA,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE;AACnB,UAAU,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;AACrD,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AACvC;AACA,EAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,EAAE;AAChD,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACvE,EAAE;;AAEF,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5C,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACxC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;;AAEtC;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACtD,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAC/C,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3C;AACA,EAAE;AACF,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;AAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AACtC,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACnC,IAAI,QAAQ,CAAC,SAAS,GAAG,kDAAkD;AAC3E,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC3C,EAAE;;AAEF,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACnD,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAC/C,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AACxC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK;AACtC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;AAE3C;AACA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,MAAM,WAAW,GAAG,UAAU,KAAK,EAAE;AACvC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1B,EAAE,CAAC;AACH,EAAE,MAAM,YAAY,GAAG,UAAU,KAAK,EAAE;AACxC,IAAI,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3B,EAAE,CAAC;AACH,EAAE,MAAM,YAAY,GAAG,UAAU,KAAK,EAAE;AACxC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtB,EAAE,CAAC;AACH,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK,EAAE;AACrC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;AACxB,EAAE,CAAC;AACH,EAAE,MAAM,OAAO,GAAG,UAAU,KAAK,EAAE;AACnC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtB,EAAE,CAAC;AACH;;AAEA,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AAC9D,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC;AAChE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC;AAChE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC;AAC5D,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;;AAEtD;AACA,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,KAAK,EAAE,MAAM,EAAE;AACtD,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;AAChC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;;AAElC,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;AAC9C,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;;AAEzC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;AACzD,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY;;AAE3D;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAC/E,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAC/C;AACA,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;AAE9D,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;AACrD,IAAI,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;AAE7C,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACjC,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;AAC9C,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;;AAEvD,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACjC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;AAC9C;AACA,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;AAC5D,IAAI,IAAI,CAAC,cAAc;AACvB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;AACtE,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnD,EAAE;;AAEF;AACA,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;AAC5D,IAAI,IAAI,CAAC,cAAc;AACvB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG;AACrC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;AACvE,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnD,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AAClD,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC1C,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAC3C,EAAE,OAAO,GAAG;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,IAAI,EAAE;AAC9C;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;;AAEzE,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC1B,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,IAAI,EAAE;AAC5C,EAAE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE;;AAE3C,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACtB,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,cAAc,EAAE;AACvB,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,OAAO,EAAE;AAClD,EAAE,IAAI,OAAO,KAAK,SAAS,EAAE;;AAE7B,EAAE,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;AAC5D,EAAE,IAAI,UAAU,KAAK,IAAI,EAAE;AAC3B,IAAI,OAAO,CAAC,KAAK;AACjB,MAAM,0DAA0D;AAChE,MAAM,qBAAqB;AAC3B,KAAK;AACL,EAAE;;AAEF,EAAE,IAAI,CAAC,aAAa,EAAE;;AAEtB,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3B,EAAE,IAAI,CAAC,qBAAqB,EAAE;AAC9B,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AACxC,EAAE,IAAI,CAAC,kBAAkB,EAAE;;AAE3B,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAC7C,EAAE,IAAI,CAAC,cAAc,EAAE;AACvB,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,qBAAqB,GAAG,YAAY;AACtD,EAAE,IAAI,MAAM,GAAG,SAAS;;AAExB,EAAE,QAAQ,IAAI,CAAC,KAAK;AACpB,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB;AACxC,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,QAAQ;AAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB;AAC7C,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB;AAC5C,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB;AACxC,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB;AAC5C,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,QAAQ;AAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB;AAC7C,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB;AAC5C,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB;AAC5C,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI;AAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB;AACzC,MAAM;AACN,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI;AAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB;AACzC,MAAM;AACN,IAAI;AACJ,MAAM,MAAM,IAAI,KAAK;AACrB,QAAQ,yCAAyC;AACjD,UAAU,mBAAmB;AAC7B,UAAU,IAAI,CAAC,KAAK;AACpB,UAAU,GAAG;AACb,OAAO;AACP;;AAEA,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM;AACnC,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACnD,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC7B,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB;AACpD,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB;AACpD,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB;AACpD,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc;AAC9C,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc;AAC9C,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc;AAC9C,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AACvC,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACrC,IAAI,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;AACjD,EAAE;;AAEF,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,EAAE,IAAI,CAAC,YAAY,EAAE;AACrB,EAAE,IAAI,CAAC,WAAW,EAAE;;AAEpB,EAAE,IAAI,CAAC,gBAAgB,EAAE;;AAEzB,EAAE,IAAI,CAAC,WAAW,EAAE;AACpB,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC5C,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAClC,EAAE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;AAErC,EAAE,GAAG,CAAC,QAAQ,GAAG,OAAO;AACxB,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO;;AAEvB,EAAE,OAAO,GAAG;AACZ,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAC7C,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAClC,EAAE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;AAErC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;AAClD,CAAC;;AAED,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY;AACzC,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY;AACnD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AAChD,EAAE,IAAI,KAAK;;AAEX,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;AAC5C,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AACnC;AACA,IAAI,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,kBAAkB;AAC7C,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;AACnD,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS;AAC1B,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,GAAG,EAAE;AACd,EAAE;AACF,EAAE,OAAO,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;AAC9C;AACA,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;AAChC,IAAI;AACJ,EAAE;;AAEF;AACA,EAAE;AACF,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI;AACrC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AACxC,IAAI;AACJ,IAAI;AACJ,EAAE;;AAEF;AACA,EAAE,MAAM,YAAY;AACpB,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;;AAExC;AACA,EAAE,MAAM,aAAa;AACrB,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,QAAQ;AACzC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,QAAQ;;AAEzC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,EAAE,GAAG,CAAC;AAC9D,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;AACzB,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;AACvC,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM;AACpD,EAAE,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK;AAC5B,EAAE,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM;;AAE7B,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;AACnB,EAAE,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC;;AAE1B,EAAE,IAAI,YAAY,KAAK,KAAK,EAAE;AAC9B;AACA,IAAI,MAAM,IAAI,GAAG,CAAC;AAClB,IAAI,MAAM,IAAI,GAAG,MAAM,CAAC;AACxB,IAAI,IAAI,CAAC;;AAET,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;AAClC;AACA,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;AAC9C,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;;AAExC,MAAM,GAAG,CAAC,WAAW,GAAG,KAAK;AAC7B,MAAM,GAAG,CAAC,SAAS,EAAE;AACrB,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;AAC/B,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC;AAChC,MAAM,GAAG,CAAC,MAAM,EAAE;AAClB,IAAI;AACJ,IAAI,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS;AACpC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC;AAC5C,EAAE,CAAC,MAAM;AACT;AACA,IAAI,IAAI,QAAQ;AAChB,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;AAC9C;AACA,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAC5E,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;AAGrD,IAAI,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS;AACpC,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI;AACvC,IAAI,GAAG,CAAC,SAAS,EAAE;AACnB,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;AACzB,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1B,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,EAAE,MAAM,CAAC;AACvC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;AAC5B,IAAI,GAAG,CAAC,SAAS,EAAE;AACnB,IAAI,GAAG,CAAC,IAAI,EAAE;AACd,IAAI,GAAG,CAAC,MAAM,EAAE;AAChB,EAAE;;AAEF;AACA,EAAE,MAAM,WAAW,GAAG,CAAC,CAAC;;AAExB,EAAE,MAAM,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AACzE,EAAE,MAAM,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AACzE,EAAE,MAAM,IAAI,GAAG,IAAI,UAAU;AAC7B,IAAI,SAAS;AACb,IAAI,SAAS;AACb,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,CAAC;AAC/B,IAAI,IAAI;AACR,GAAG;AACH,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAElB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE;AACtB,IAAI,MAAM,CAAC;AACX,MAAM,MAAM;AACZ,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,CAAC,IAAI,MAAM;AAC1E,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;AACnD,IAAI,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;;AAE7B,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;;AAE9D,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,GAAG,OAAO;AACzB,EAAE,GAAG,CAAC,YAAY,GAAG,KAAK;AAC1B,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;AAChC,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAClD,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;AAC9C,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU;AAC9C,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAClC,EAAE,MAAM,CAAC,SAAS,GAAG,EAAE;;AAEvB,EAAE,IAAI,CAAC,UAAU,EAAE;AACnB,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS;AAC7B,IAAI;AACJ,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG;AAClB,IAAI,OAAO,EAAE,IAAI,CAAC,qBAAqB;AACvC,GAAG;AACH,EAAE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAC5C,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM;;AAExB;AACA,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC/B;;AAEA,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;AACrC,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC;;AAEhD;AACA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,MAAM,QAAQ,GAAG,YAAY;AAC/B,IAAI,MAAM,UAAU,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU;AAC9C,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE;;AAEnC,IAAI,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;AACjC,IAAI,EAAE,CAAC,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE;;AAE/C,IAAI,EAAE,CAAC,MAAM,EAAE;AACf,EAAE,CAAC;;AAEH,EAAE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC;AACtC,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;AAC9C,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE;AAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AACrC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC5C,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACvC,EAAE,IAAI,IAAI,KAAK,SAAS,EAAE;;AAE1B,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;;AAEhC,EAAE,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC;AAC1B,EAAE,GAAG,CAAC,SAAS,GAAG,MAAM;AACxB,EAAE,GAAG,CAAC,SAAS,GAAG,MAAM;AACxB,EAAE,GAAG,CAAC,SAAS,GAAG,MAAM;AACxB,EAAE,GAAG,CAAC,YAAY,GAAG,KAAK;;AAE1B,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM;AACvB,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM;AACvB,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE;AAChE,EAAE,IAAI,WAAW,KAAK,SAAS,EAAE;AACjC,IAAI,GAAG,CAAC,WAAW,GAAG,WAAW;AACjC,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,EAAE;AACjB,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5B,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACxB,EAAE,GAAG,CAAC,MAAM,EAAE;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG;AACnC,EAAE,GAAG;AACL,EAAE,OAAO;AACT,EAAE,IAAI;AACN,EAAE,QAAQ;AACV,EAAE,OAAO;AACT,EAAE;AACF,EAAE,IAAI,OAAO,KAAK,SAAS,EAAE;AAC7B,IAAI,OAAO,GAAG,CAAC;AACf,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;;AAE9C,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AAClC,IAAI,GAAG,CAAC,SAAS,GAAG,QAAQ;AAC5B,IAAI,GAAG,CAAC,YAAY,GAAG,KAAK;AAC5B,IAAI,OAAO,CAAC,CAAC,IAAI,OAAO;AACxB,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACzC,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,EAAE,CAAC,MAAM;AACT,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM;AAC1B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAChC,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG;AACnC,EAAE,GAAG;AACL,EAAE,OAAO;AACT,EAAE,IAAI;AACN,EAAE,QAAQ;AACV,EAAE,OAAO;AACT,EAAE;AACF,EAAE,IAAI,OAAO,KAAK,SAAS,EAAE;AAC7B,IAAI,OAAO,GAAG,CAAC;AACf,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;;AAE9C,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AAClC,IAAI,GAAG,CAAC,SAAS,GAAG,QAAQ;AAC5B,IAAI,GAAG,CAAC,YAAY,GAAG,KAAK;AAC5B,IAAI,OAAO,CAAC,CAAC,IAAI,OAAO;AACxB,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACzC,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,EAAE,CAAC,MAAM;AACT,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM;AAC1B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAChC,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;AACzE,EAAE,IAAI,MAAM,KAAK,SAAS,EAAE;AAC5B,IAAI,MAAM,GAAG,CAAC;AACd,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC9C,EAAE,GAAG,CAAC,SAAS,GAAG,OAAO;AACzB,EAAE,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC7B,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAChC,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,oBAAoB,GAAG;AACzC,EAAE,GAAG;AACL,EAAE,OAAO;AACT,EAAE,IAAI;AACN,EAAE,QAAQ;AACV,EAAE,OAAO;AACT,EAAE;;AAKF,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC9C,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AAClC,IAAI,GAAG,CAAC,IAAI,EAAE;AACd,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACvC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5B,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5B,IAAI,GAAG,CAAC,OAAO,EAAE;AACjB,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACzC,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5C,EAAE,CAAC,MAAM;AACT,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM;AAC1B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5C,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,oBAAoB,GAAG;AACzC,EAAE,GAAG;AACL,EAAE,OAAO;AACT,EAAE,IAAI;AACN,EAAE,QAAQ;AACV,EAAE,OAAO;AACT,EAAE;;AAKF,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC9C,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AAClC,IAAI,GAAG,CAAC,IAAI,EAAE;AACd,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACvC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5B,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5B,IAAI,GAAG,CAAC,OAAO,EAAE;AACjB,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACzC,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO;AAC3B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5C,EAAE,CAAC,MAAM;AACT,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM;AAC1B,IAAI,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5C,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;AAC/E,EAAE,IAAI,MAAM,KAAK,SAAS,EAAE;AAC5B,IAAI,MAAM,GAAG,CAAC;AACd,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC9C,EAAE,GAAG,CAAC,SAAS,GAAG,OAAO;AACzB,EAAE,GAAG,CAAC,YAAY,GAAG,QAAQ;AAC7B,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAChC,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE;AAClE,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC1C,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;;AAEtC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC;AAC5C,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC5C,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,EAAE,IAAI,IAAI;AACV,IAAI,EAAE;AACN,IAAI,IAAI;AACR,IAAI,UAAU;AACd,IAAI,IAAI;AACR,IAAI,KAAK;AACT,IAAI,KAAK;AACT,IAAI,KAAK;AACT,IAAI,MAAM;AACV,IAAI,OAAO;AACX,IAAI,OAAO;;AAEX;AACA;AACA;AACA,EAAE,GAAG,CAAC,IAAI;AACV,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY;;AAE9E;AACA,EAAE,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,EAAE,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,EAAE,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AACpD,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,UAAU;AAC1D,EAAE,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;AAEvE,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC5B,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC5B,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC5B,EAAE,IAAI,OAAO;;AAEb;AACA,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;AACnB,EAAE,UAAU,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS;AAC9C,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;AACvE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAElB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE;AACtB,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;;AAE/B,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;AACvB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACjD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AACjD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC/B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEjD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AACjD,IAAI;;AAEJ,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;AACjD,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;AACnD,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC;AAC9E,IAAI;;AAEJ,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,EAAE;;AAEF;AACA,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;AACnB,EAAE,UAAU,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS;AAC9C,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;AACvE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAElB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE;AACtB,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;;AAE/B,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;AACvB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AACjD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AACjD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC/B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEjD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AACjD,IAAI;;AAEJ,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AACjD,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;AACnD,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC;AAC9E,IAAI;;AAEJ,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,EAAE;;AAEF;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;AACtB,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;AACrB,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS;AAChD,IAAI,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;AACzE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAEpB,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACrD,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;;AAErD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE;AACxB,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;;AAEjC;AACA,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACjD,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAChD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AACvD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEjD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG;AAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;;AAE1D,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,IAAI;;AAEJ,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;AACrB,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;AAChD,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;AAC9C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AAC/C,EAAE;;AAEF;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;AACtB,IAAI,IAAI,MAAM;AACd,IAAI,IAAI,MAAM;AACd,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;;AAErB;AACA,IAAI,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,IAAI,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;AACrD;AACA,IAAI,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,IAAI,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5D,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;AACrD,EAAE;;AAEF;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;AACtB,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;AACrB;AACA,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC1D,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACxD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AAC/C;AACA,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC1D,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACxD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AAC/C,EAAE;;AAEF;AACA,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC5B,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AAC3C,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC;AAC7C,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO;AACzE,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;AAChD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;AACpD,EAAE;;AAEF;AACA,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC5B,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AAC3C,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO;AACzE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC;AAC7C,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;;AAEhD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;AACpD,EAAE;;AAEF;AACA,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC5B,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AAC3C,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACrD,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACrD,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC;AAC7C,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;;AAE3C,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;AAClD,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE;AACrD,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE;AAC3B,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AAC9B,MAAM,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW;AAC9D,IAAI,CAAC,MAAM;AACX,MAAM;AACN,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;AACpE;AACA,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;AACnC,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG;AAC/B,EAAE,GAAG;AACL,EAAE,KAAK;AACP,EAAE,MAAM;AACR,EAAE,MAAM;AACR,EAAE,KAAK;AACP,EAAE,WAAW;AACb,EAAE;AACF,EAAE,IAAI,OAAO;;AAEb;AACA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK;AAC7B,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AAC9B,EAAE,MAAM,GAAG,GAAG;AACd,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;AAC7E,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;AAC7E,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;AAC7E,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;AAC7E,GAAG;AACH,EAAE,MAAM,MAAM,GAAG;AACjB,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE;AACxE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE;AACxE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE;AACxE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE;AACxE,GAAG;;AAEH;AACA,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;AAC7B,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,EAAE,CAAC,CAAC;AACJ,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;AAChC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,EAAE,CAAC,CAAC;;AAEJ;AACA,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;AAC3E,IAAI;AACJ,MAAM,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,KAAK;AACL,IAAI;AACJ,MAAM,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,KAAK;AACL,IAAI;AACJ,MAAM,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,KAAK;AACL,IAAI;AACJ,MAAM,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,KAAK;AACL,GAAG;AACH,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ;;AAE3B;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;AACzB,IAAI,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC;AACvE,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AAC/E;AACA;AACA;AACA,EAAE;;AAEF;AACA,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE;AAChC,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAChC,IAAI,IAAI,IAAI,EAAE,OAAO,IAAI;;AAEzB;AACA,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC;AACnC,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,EAAE,OAAO,EAAE;;AAEpC;AACA,IAAI,OAAO,CAAC;AACZ,EAAE,CAAC,CAAC;;AAEJ;AACA,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7C,EAAE,GAAG,CAAC,WAAW,GAAG,WAAW;AAC/B,EAAE,GAAG,CAAC,SAAS,GAAG,KAAK;AACvB;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;AACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;AACvC,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAC5E,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,SAAS,KAAK,SAAS,EAAE;AAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,SAAS;AAC7B,EAAE;AACF,EAAE,IAAI,WAAW,KAAK,SAAS,EAAE;AACjC,IAAI,GAAG,CAAC,WAAW,GAAG,WAAW;AACjC,EAAE;AACF,EAAE,GAAG,CAAC,SAAS,EAAE;AACjB,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;;AAEpD,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;AAC1C,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AAC3B,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,EAAE;AACjB,EAAE,GAAG,CAAC,IAAI,EAAE;AACZ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACf,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG;AAChC,EAAE,GAAG;AACL,EAAE,KAAK;AACP,EAAE,KAAK;AACP,EAAE,WAAW;AACb,EAAE,IAAI;AACN,EAAE;AACF,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;;AAE9C,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7C,EAAE,GAAG,CAAC,WAAW,GAAG,WAAW;AAC/B,EAAE,GAAG,CAAC,SAAS,GAAG,KAAK;AACvB,EAAE,GAAG,CAAC,SAAS,EAAE;AACjB,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC;AACvE,EAAE,GAAG,CAAC,IAAI,EAAE;AACZ,EAAE,GAAG,CAAC,MAAM,EAAE;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,KAAK,EAAE;AACvD,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AACxE,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACpC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;AAC5C,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,KAAK;AACf,IAAI,MAAM,EAAE,WAAW;AACvB,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE;AACrD;AACA,EAAE,IAAI,KAAK,EAAE,WAAW,EAAE,UAAU;AACpC,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;AAC1E,IAAI,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;AACvC,EAAE;AACF,EAAE;AACF,IAAI,UAAU;AACd,IAAI,OAAO,UAAU,KAAK,QAAQ;AAClC,IAAI,UAAU,CAAC,IAAI;AACnB,IAAI,UAAU,CAAC;AACf,IAAI;AACJ,IAAI,OAAO;AACX,MAAM,IAAI,EAAE,UAAU,CAAC,IAAI;AAC3B,MAAM,MAAM,EAAE,UAAU,CAAC,MAAM;AAC/B,KAAK;AACL,EAAE;;AAEF,EAAE,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;AAC7C,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK;AAC7B,IAAI,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK;AACnC,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AAC1E,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAChC,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;AACxC,EAAE;AACF,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,KAAK;AACf,IAAI,MAAM,EAAE,WAAW;AACvB,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAC/C,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;AAC7B,IAAI,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;AACjC,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClD,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAChB,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAChC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC/B,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;AACxC,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC5D,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,CAAC;AACvD,IAAI,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,UAAU;AAChD,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC;AACpC,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAClC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5C,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5C,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5C,EAAE,CAAC,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAC7C,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AACjC,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;AAC7B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AACjD,EAAE;AACF,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AACjD,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK;AACzE,MAAM,CAAC,GAAG,CAAC;AACX,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,EAAE,CAAC,MAAM;AACT,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK;AACxE,MAAM,CAAC,GAAG,CAAC;AACX,KAAK,CAAC,CAAC,CAAC;AACR,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE,IAAI,EAAE;AACvD,EAAE,IAAI,IAAI,KAAK,SAAS,EAAE;AAC1B,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC1B,EAAE;;AAEF,EAAE,IAAI,MAAM;AACZ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AAC5B,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAC9D,EAAE;AACF,EAAE,IAAI,MAAM,GAAG,CAAC,EAAE;AAClB,IAAI,MAAM,GAAG,CAAC;AACd,EAAE;;AAEF,EAAE,OAAO,MAAM;AACf,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AAC/D,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;;AAE9C,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;AACzE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AACpE,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;;AAE5C,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;AACzE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,wBAAwB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AACnE;AACA,EAAE,MAAM,QAAQ;AAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACvE,EAAE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AAC9D,EAAE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;;AAE9D,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;;AAEtC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;AACzE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AAC/D,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;;AAE9C,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;AAC1D,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,wBAAwB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AACnE;AACA,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;AAChD,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;;AAErD,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC;AACvC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AACpE,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;;AAE5C,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;AAC1D,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,wBAAwB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AACnE,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,EAAE,MAAM,QAAQ;AAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;;AAEvE,EAAE,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,kBAAkB;AACnD,EAAE,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC,kBAAkB,GAAG,OAAO;AAC/D,EAAE,MAAM,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ;;AAE7C,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;;AAEtC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;AAChE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,wBAAwB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AACnE,EAAE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU;AAChC,EAAE,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ;AAC5B,EAAE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU;;AAEhC,EAAE;AACF,IAAI,KAAK,KAAK,SAAS;AACvB,IAAI,KAAK,KAAK,SAAS;AACvB,IAAI,GAAG,KAAK,SAAS;AACrB,IAAI,KAAK,KAAK;AACd,IAAI;AACJ,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,cAAc,GAAG,IAAI;AAC3B,EAAE,IAAI,SAAS;AACf,EAAE,IAAI,WAAW;AACjB,EAAE,IAAI,YAAY;;AAElB,EAAE,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE;AAC9C;AACA;AACA;AACA;AACA,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;AAC5D,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;AAC1D,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;;AAE5D,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AAC9B,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG;AACzC,QAAQ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;AAC7C,QAAQ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC;AAC3C,OAAO;AACP;AACA;AACA,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,UAAU;AACxC,QAAQ,aAAa,CAAC,SAAS,EAAE;AACjC,QAAQ,eAAe,CAAC,SAAS,EAAE;AACnC,OAAO;AACP,IAAI,CAAC,MAAM;AACX,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE;AAC7D,IAAI;AACJ,IAAI,cAAc,GAAG,YAAY,GAAG,CAAC;AACrC,EAAE;;AAEF,EAAE,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAC9C,IAAI,MAAM,IAAI;AACd,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;AACxB,QAAQ,KAAK,CAAC,KAAK,CAAC,KAAK;AACzB,QAAQ,GAAG,CAAC,KAAK,CAAC,KAAK;AACvB,QAAQ,KAAK,CAAC,KAAK,CAAC,KAAK;AACzB,MAAM,CAAC;AACP,IAAI,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AACjE;AACA,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,CAAC;AAC1D,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;AACxC,EAAE,CAAC,MAAM;AACT,IAAI,SAAS,GAAG,MAAM;AACtB,EAAE;;AAEF,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AAC5B,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;AACjC,EAAE,CAAC,MAAM;AACT,IAAI,WAAW,GAAG,SAAS;AAC3B,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7C;;AAEA,EAAE,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;AAC3C,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;AACpD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;AAC3D,EAAE,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE;AAC9C,IAAI;AACJ,EAAE;;AAEF,EAAE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACtD,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;;AAE3D,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AAChD,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACxC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;AACzC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AAChE,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;AAClD,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;AAChD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,GAAG,EAAE,KAAK,EAAE;AAChE,EAAE,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;AACrC,IAAI;AACJ,EAAE;;AAEF,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7C,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;;AAEzC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;AACvD,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACjD,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,EAAE,IAAI,CAAC;;AAEP,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO;;AAE3E,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;;AAEzC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/C,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;AAEpC;AACA,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;AACnD,EAAE;AACF,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,KAAK,EAAE;AACzD;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;AACrC,EAAE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;;AAErC,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACnD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK;;AAE/B;AACA;AACA,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;AAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAC1B,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;AAC5E,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;;AAE/C,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;;AAEjC,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACpC,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;;AAEtD,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;;AAElC;AACA;AACA;AACA,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,IAAI,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AACtC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1B,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AACpC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;AACxB,EAAE,CAAC;AACH,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC;AACxD,EAAE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC;AACpD,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI;AACpB,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK;;AAE/B;AACA,EAAE,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW;AAC/D,EAAE,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW;;AAE/D;AACA,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE;AACvC;AACA,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG;AAC/C,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG;;AAEhD,IAAI,MAAM,OAAO;AACjB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC;AACrC,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG;AACpD,IAAI,MAAM,OAAO;AACjB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC;AACrC,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG;;AAEpD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;AAC3C,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACnC,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,KAAK,GAAG,GAAG;AACtE,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG;;AAElE,IAAI,MAAM,SAAS,GAAG,CAAC,CAAC;AACxB,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;;AAE/D;AACA;AACA,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,EAAE;AACvD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK;AAC3E,IAAI;AACJ,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,EAAE;AACvD,MAAM,aAAa;AACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK;AAC3E,IAAI;;AAEJ;AACA,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,SAAS,EAAE;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;AAC/D,IAAI;AACJ,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,SAAS,EAAE;AACrD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE;AAC7E,IAAI;AACJ,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,WAAW,CAAC;AAC1D,EAAE;;AAEF,EAAE,IAAI,CAAC,MAAM,EAAE;;AAEf;AACA,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC7C,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,UAAU,CAAC;;AAE/C,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE;AAChD,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAClC,EAAE,IAAI,CAAC,cAAc,GAAG,KAAK;;AAE7B;AACA,EAAE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;AAC7D,EAAE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEzD,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC5B,CAAC;;AAED;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,KAAK,EAAE;AAC9C;AACA,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AAC7D,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACpB,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AAC3D,IAAI,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,IAAI;AACvD,IAAI,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,GAAG;AACtD,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AAC5E,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9C,IAAI;AACJ,EAAE,CAAC,MAAM;AACT;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;AACvB,EAAE;AACF,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE;AAChD,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;AAClC,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AACzD,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,IAAI;AACrD,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,GAAG;;AAEpD,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACzB,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;AAC3B,IAAI,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACrC,EAAE;;AAEF;AACA,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;AAC3B,IAAI,IAAI,CAAC,YAAY,EAAE;AACvB,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AAC9C;AACA,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AAC9C;AACA,MAAM,IAAI,SAAS,EAAE;AACrB,QAAQ,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM;AACb,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,MAAM;AACN,IAAI;AACJ,EAAE,CAAC,MAAM;AACT;AACA,IAAI,MAAM,EAAE,GAAG,IAAI;AACnB,IAAI,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,YAAY;AACjD,MAAM,EAAE,CAAC,cAAc,GAAG,IAAI;;AAE9B;AACA,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,MAAM,IAAI,SAAS,EAAE;AACrB,QAAQ,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;AAClC,MAAM;AACN,IAAI,CAAC,EAAE,KAAK,CAAC;AACb,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE;AACnD,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;;AAEvB,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,EAAE,IAAI,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AACtC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1B,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE;AACrC,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC;AACzB,EAAE,CAAC;AACH,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC;AACxD,EAAE,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;;AAEtD,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1B,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1B,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE;AACjD,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK;;AAExB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;AAC7D,EAAE,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;;AAE3D,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,KAAK,EAAE;AAC9C,EAAE,IAAI,CAAC,KAAK,gBAAgB,KAAK,GAAG,MAAM,CAAC,KAAK;AAChD,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE;AAC5D;AACA,IAAI,IAAI,KAAK,GAAG,CAAC;AACjB,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE;AAC1B;AACA,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,GAAG;AACpC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;AAC7B;AACA;AACA;AACA,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AAC/B,IAAI;;AAEJ;AACA;AACA;AACA,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAClD,MAAM,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;;AAEpD,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AACzC,MAAM,IAAI,CAAC,MAAM,EAAE;;AAEnB,MAAM,IAAI,CAAC,YAAY,EAAE;AACzB,IAAI;;AAEJ;AACA,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC/C,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,UAAU,CAAC;;AAEjD;AACA;AACA;AACA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC9B,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE,QAAQ,EAAE;AAC/D,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AACvB,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AACnB,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;;AAEnB;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE;AACnB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;AACrC,EAAE;;AAEF,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjE,GAAG;AACH,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjE,GAAG;AACH,EAAE,MAAM,EAAE,GAAG,IAAI;AACjB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjE,GAAG;;AAEH;AACA,EAAE;AACF,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AACnC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AACpC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AACnC;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE;AACrD,EAAE,MAAM,OAAO,GAAG,GAAG,CAAC;AACtB,EAAE,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,EAAE,IAAI,CAAC;AACP,IAAI,SAAS,GAAG,IAAI;AACpB,IAAI,gBAAgB,GAAG,IAAI;AAC3B,IAAI,WAAW,GAAG,IAAI;;AAEtB,EAAE;AACF,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG;AACpC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,QAAQ;AACzC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC;AACjC,IAAI;AACJ;AACA,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACtD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ;AACzC,MAAM,IAAI,QAAQ,EAAE;AACpB,QAAQ,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACvD;AACA,UAAU,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;AACrC,UAAU,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;AACzC,UAAU,MAAM,SAAS,GAAG;AAC5B,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7B,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7B,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7B,WAAW;AACX,UAAU,MAAM,SAAS,GAAG;AAC5B,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7B,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7B,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7B,WAAW;AACX,UAAU;AACV,YAAY,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC;AACnD,YAAY,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS;AAClD,YAAY;AACZ;AACA,YAAY,OAAO,SAAS;AAC5B,UAAU;AACV,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE,CAAC,MAAM;AACT;AACA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpC,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM;AACpC,MAAM,IAAI,KAAK,EAAE;AACjB,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAC3C,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAC3C,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;;AAE7D,QAAQ,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,GAAG,WAAW,KAAK,IAAI,GAAG,OAAO,EAAE;AAC5E,UAAU,WAAW,GAAG,IAAI;AAC5B,UAAU,gBAAgB,GAAG,SAAS;AACtC,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,gBAAgB;AACzB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE;AAC7C,EAAE;AACF,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG;AAC9B,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ;AACnC,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;AAC3B;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,SAAS,EAAE;AACtD,EAAE,IAAI,OAAO,EAAE,IAAI,EAAE,GAAG;;AAExB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACrB,IAAI,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC/D,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;;AAEvC,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACxC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACzD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;;AAEpC,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACvC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACvD,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;;AAEnC,IAAI,IAAI,CAAC,OAAO,GAAG;AACnB,MAAM,SAAS,EAAE,IAAI;AACrB,MAAM,GAAG,EAAE;AACX,QAAQ,OAAO,EAAE,OAAO;AACxB,QAAQ,IAAI,EAAE,IAAI;AAClB,QAAQ,GAAG,EAAE,GAAG;AAChB,OAAO;AACP,KAAK;AACL,EAAE,CAAC,MAAM;AACT,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;AACtC,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI;AAChC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG;AAC9B,EAAE;;AAEF,EAAE,IAAI,CAAC,YAAY,EAAE;;AAErB,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,SAAS;AACpC,EAAE,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE;AAC9C,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC;AACzD,EAAE,CAAC,MAAM;AACT,IAAI,OAAO,CAAC,SAAS;AACrB,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,IAAI,CAAC,MAAM;AACjB,MAAM,YAAY;AAClB,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;AACvB,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,MAAM,IAAI,CAAC,MAAM;AACjB,MAAM,YAAY;AAClB,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;AACvB,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,MAAM,IAAI,CAAC,MAAM;AACjB,MAAM,YAAY;AAClB,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;AACvB,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,EAAE;;AAEF,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AAC1B,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;AACzB,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;AACjC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AAC9B,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;;AAE7B;AACA,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW;AAC1C,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY;AAC5C,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;AACtC,EAAE,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW;AAClC,EAAE,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY;;AAEpC,EAAE,IAAI,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC;AAClD,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;AACjB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AACtB,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,GAAG,YAAY;AAC9C,GAAG;;AAEH,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;AAC7C,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI;AACzD,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;AAClC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI;AAC5E,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,IAAI;AAC3D,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,IAAI;AAC3D,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAC7C,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;AACpB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI;;AAEjC,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AACzC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;AACxE,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3C,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACrC,UAAU,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;AAC3C,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE;AACF,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,CAAC,KAAK,EAAE;AAC1B,EAAE,IAAI,SAAS,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC,OAAO;AAC9C,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,CAAC,KAAK,EAAE;AAC1B,EAAE,IAAI,SAAS,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC,OAAO;AAC9C,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,GAAG,EAAE;AACrD,EAAE,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC;AAC9B,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE,MAAM,EAAE;AACrD,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;AAC9B,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,CAAC;;;;"}