{"version":3,"file":"X_RectNotes.mjs","sources":["../../../../src/shapes/canvasx/X_RectNotes.ts"],"sourcesContent":["import { classRegistry } from '../../ClassRegistry';\nimport { X_Textbox as Textbox } from './X_Textbox';\nimport { createRectNotesDefaultControls } from '../../controls/X_commonControls';\nimport type {\n  TBBox,\n  TClassProperties,\n  TOriginX,\n  TOriginY,\n} from '../../typedefs';\nimport { Point } from '../../Point';\nimport { X_Connector } from './X_Connector';\n\n// this will be a separated effort\nexport const rectNotesDefaultValues: Partial<TClassProperties<RectNotes>> = {\n  minWidth: 20,\n  dynamicMinWidth: 2,\n\n  splitByGrapheme: true,\n  height: 138,\n  maxHeight: 138,\n\n  width: 230,\n  cornerStrokeColor: 'gray',\n  cornerStyle: 'circle',\n  cornerColor: 'white',\n  transparentCorners: false,\n};\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\n///@ts-ignore\nexport class RectNotes extends Textbox {\n  /**selectable\n   * Minimum width of textbox, in pixels.\n   * @type Number\n   * @default\n   */\n  declare minWidth: number;\n\n  declare locked: boolean;\n\n  declare verticalAlign: string;\n  declare originX: TOriginX;\n  declare originY: TOriginY;\n  declare width: number;\n  declare cornerStrokeColor: string;\n\n  declare cornerColor: string;\n  declare transparentCorners: boolean;\n  declare zIndex: number;\n  declare height: number;\n  declare maxHeight: number;\n  declare connectors: object[];\n  declare id: string;\n\n  public extendPropeties = [\n    'objType',\n    'whiteboardId',\n    'userId',\n    'timestamp',\n    'zIndex',\n    'locked',\n    'verticalAlign',\n    'lines',\n    'id',\n    'zIndex',\n    'relationship',\n    'emoj',\n    'userEmoji',\n  ];\n  /**\n   * Minimum calculated width of a textbox, in pixels.\n   * fixed to 2 so that an empty textbox cannot go to 0\n   * and is still selectable without text.\n   * @type Number\n   * @default\n   */\n  declare dynamicMinWidth: number;\n\n  /**\n   * Use this boolean property in order to split strings that have no white space concept.\n   * this is a cheap way to help with chinese/japanese\n   * @type Boolean\n   * @since 2.6.0\n   */\n  declare splitByGrapheme: boolean;\n\n  static textLayoutProperties = [...Textbox.textLayoutProperties, 'width'];\n\n  static ownDefaults: Record<string, any> = rectNotesDefaultValues;\n\n  static getDefaults() {\n    return {\n      ...super.getDefaults(),\n      controls: {\n        ...createRectNotesDefaultControls(),\n        // mr: { /* add your desired value here */ },\n      },\n      ...RectNotes.ownDefaults,\n    };\n  }\n  constructor(\n    text: string,\n    options: Partial<TClassProperties<RectNotes>> = {}\n  ) {\n    super(text, options);\n    this.initializeEvent();\n  }\n\n  findById(id: string) {\n    const canvas = this.canvas;\n    const obj: any = canvas\n      ?.getObjects()\n      .filter((widget: any) => widget.id === id);\n    if (obj.length === 0) return null;\n    return obj[0];\n  }\n\n  calculateControlPoint(boundingBox: TBBox, connectingPoint: Point): Point {\n    const left = boundingBox.left;\n    const top = boundingBox.top;\n    const width = boundingBox.width;\n    const height = boundingBox.height;\n\n    const right = left + width;\n    const bottom = top + height;\n\n    const connectingX = connectingPoint.x;\n    const connectingY = connectingPoint.y;\n\n    let controlX: number = 0;\n    let controlY: number = 0;\n\n    // Find the nearest border and calculate the control point outside the bounding box\n    const distances = [\n      { side: 'left', distance: Math.abs(connectingX - left) },\n      { side: 'right', distance: Math.abs(connectingX - right) },\n      { side: 'top', distance: Math.abs(connectingY - top) },\n      { side: 'bottom', distance: Math.abs(connectingY - bottom) },\n    ];\n\n    const nearestBorder = distances.reduce((min, current) =>\n      current.distance < min.distance ? current : min\n    );\n\n    switch (nearestBorder.side) {\n      case 'left':\n        controlX = left - 220;\n        controlY = connectingY;\n        break;\n      case 'right':\n        controlX = right + 220;\n        controlY = connectingY;\n        break;\n      case 'top':\n        controlX = connectingX;\n        controlY = top - 220;\n        break;\n      case 'bottom':\n        controlX = connectingX;\n        controlY = bottom + 220;\n        break;\n    }\n\n    return new Point(controlX, controlY);\n  }\n\n  updateConnector(point: any, connector: X_Connector, type: string) {\n    const controlPoint = this.calculateControlPoint(\n      this.getBoundingRect(),\n      new Point(point.x, point.y)\n    );\n\n    console.log(\n      'updateConnector: point:',\n      point,\n      'control point:',\n      controlPoint,\n      connector,\n      type\n    );\n    //if the connector is from the object, then the startpoint should be updated\n    //if the connector is to the object, then the endpoint should be updated\n\n    //recalculate the startpoint or endpoint of the connector, and also the ControlPoint\n    if (type === 'from') {\n      connector.update({\n        fromPoint: point,\n        control1: controlPoint,\n      });\n    }\n    if (type === 'to') {\n      connector.update({\n        toPoint: point,\n        control2: controlPoint,\n      });\n    }\n  }\n\n  moveOrScaleHandler(e: any) {\n    //if there is a connector, move the connector\n    if (this.connectors?.length === 0) return;\n    this.connectors?.forEach((connector: any) => {\n      const pointConnector = connector.point;\n\n      //get canvas point of the connector point\n      const point = new Point(pointConnector.x, pointConnector.y);\n      //@ts-ignore\n      const transformedPoint = this.transformPointToCanvas(point);\n\n      //use the connectorId to find the connector and then update the connector\n      //ts-ignore\n      const connectorObj = this.findById(connector.connectorId);\n\n      if (!connectorObj) return;\n      console.log('connectorObj', connectorObj);\n\n      if (this.id === connectorObj.fromId) {\n        this.updateConnector(transformedPoint, connectorObj, 'from');\n      }\n\n      if (this.id === connectorObj.toId) {\n        this.updateConnector(transformedPoint, connectorObj, 'to');\n      }\n    });\n  }\n\n  initializeEvent() {\n    this.on('moving', (e) => {\n      this.moveOrScaleHandler(e);\n    });\n\n    this.on('scaling', (e) => {\n      this.moveOrScaleHandler(e);\n    });\n  }\n\n  /**\n   * Unlike superclass's version of this function, Textbox does not update\n   * its width.\n   * @private\n   * @override\n   */\n  initDimensions() {\n    if (!this.initialized) {\n      return;\n    }\n    this.isEditing && this.initDelayedCursor();\n    this._clearCache();\n    // clear dynamicMinWidth as it will be different after we re-wrap line\n    this.dynamicMinWidth = 0;\n    // wrap lines\n    this._styleMap = this._generateStyleMap(this._splitText());\n    // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n    if (this.dynamicMinWidth > this.width) {\n      this.set('fontSize', this.fontSize - 2);\n      this._splitTextIntoLines(this.text);\n      return;\n    }\n    if (this.textAlign.indexOf('justify') !== -1) {\n      // once text is measured we need to make space fatter to make justified text.\n      this.enlargeSpaces();\n    }\n    // clear cache and re-calculate height\n    const height = this.calcTextHeight();\n    if (height > this.maxHeight && this.fontSize > 6) {\n      this.set('fontSize', this.fontSize - 2);\n      this._splitTextIntoLines(this.text);\n      return;\n    }\n    if (height > 130 && this.fontSize === 6) {\n      const prenum = 125 / height;\n      const newText = this.text.substring(0, this.text.length * prenum - 5);\n      this.set('text', newText + '...');\n    }\n    this.height = this.maxHeight;\n    return this.height;\n  }\n\n  /**\n   * Generate an object that translates the style object so that it is\n   * broken up by visual lines (new lines and automatic wrapping).\n   * The original text styles object is broken up by actual lines (new lines only),\n   * which is only sufficient for Text / IText\n   * @private\n   */\n  _generateStyleMap(textInfo: any) {\n    let realLineCount = 0;\n    let realLineCharCount = 0;\n    let charCount = 0;\n    const map: any = {};\n\n    for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n      if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n        realLineCharCount = 0;\n        charCount++;\n        realLineCount++;\n      } else if (\n        !this.splitByGrapheme &&\n        this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n        i > 0\n      ) {\n        // this case deals with space's that are removed from end of lines when wrapping\n        realLineCharCount++;\n        charCount++;\n      }\n\n      map[i] = {\n        line: realLineCount,\n        offset: realLineCharCount,\n      };\n\n      charCount += textInfo.graphemeLines[i].length;\n      realLineCharCount += textInfo.graphemeLines[i].length;\n    }\n\n    return map;\n  }\n\n  /**\n   * Returns true if object has a style property or has it on a specified line\n   * @param {Number} lineIndex\n   * @return {Boolean}\n   */\n  styleHas(property: any, lineIndex: number): boolean {\n    if (this._styleMap && !this.isWrapping) {\n      const map = this._styleMap[lineIndex];\n      if (map) {\n        lineIndex = map.line;\n      }\n    }\n    return super.styleHas(property, lineIndex);\n  }\n\n  // /**\n  //  * Returns true if object has no styling or no styling in a line\n  //  * @param {Number} lineIndex , lineIndex is on wrapped lines.\n  //  * @return {Boolean}\n  //  */\n  // isEmptyStyles(lineIndex: number): boolean {\n  //   if (!this.styles) {\n  //     return true;\n  //   }\n  //   let offset = 0,\n  //     nextLineIndex = lineIndex + 1,\n  //     nextOffset,\n  //     shouldLimit = false;\n  //   const map = this._styleMap[lineIndex],\n  //     mapNextLine = this._styleMap[lineIndex + 1];\n  //   if (map) {\n  //     lineIndex = map.line;\n  //     offset = map.offset;\n  //   }\n  //   if (mapNextLine) {\n  //     nextLineIndex = mapNextLine.line;\n  //     shouldLimit = nextLineIndex === lineIndex;\n  //     nextOffset = mapNextLine.offset;\n  //   }\n  //   const obj =\n  //     typeof lineIndex === 'undefined'\n  //       ? this.styles\n  //       : { line: this.styles[lineIndex] };\n  //   for (const p1 in obj) {\n  //     for (const p2 in obj[p1]) {\n  //       if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n  //         // eslint-disable-next-line no-unused-vars\n  //         for (const p3 in obj[p1][p2]) {\n  //           return false;\n  //         }\n  //       }\n  //     }\n  //   }\n  //   return true;\n  // }\n\n  // /**\n  //  * @param {Number} lineIndex\n  //  * @param {Number} charIndex\n  //  * @private\n  //  */\n  // _getStyleDeclaration(lineIndex: number, charIndex: number) {\n  //   if (this._styleMap && !this.isWrapping) {\n  //     const map = this._styleMap[lineIndex];\n  //     if (!map) {\n  //       return null;\n  //     }\n  //     lineIndex = map.line;\n  //     charIndex = map.offset + charIndex;\n  //   }\n  //   return super._getStyleDeclaration(lineIndex, charIndex);\n  // }\n\n  // /**\n  //  * @param {Number} lineIndex\n  //  * @param {Number} charIndex\n  //  * @param {Object} style\n  //  * @private\n  //  */\n  // _setStyleDeclaration(lineIndex: number, charIndex: number, style: object) {\n  //   const map = this._styleMap[lineIndex];\n  //   lineIndex = map.line;\n  //   charIndex = map.offset + charIndex;\n\n  //   this.styles[lineIndex][charIndex] = style;\n  // }\n\n  // /**\n  //  * @param {Number} lineIndex\n  //  * @param {Number} charIndex\n  //  * @private\n  //  */\n  // _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n  //   const map = this._styleMap[lineIndex];\n  //   lineIndex = map.line;\n  //   charIndex = map.offset + charIndex;\n  //   delete this.styles[lineIndex][charIndex];\n  // }\n\n  /**\n   * probably broken need a fix\n   * Returns the real style line that correspond to the wrapped lineIndex line\n   * Used just to verify if the line does exist or not.\n   * @param {Number} lineIndex\n   * @returns {Boolean} if the line exists or not\n   * @private\n   */\n  _getLineStyle(lineIndex: number): boolean {\n    const map = this._styleMap[lineIndex];\n    return !!this.styles[map.line];\n  }\n\n  /**\n   * Set the line style to an empty object so that is initialized\n   * @param {Number} lineIndex\n   * @param {Object} style\n   * @private\n   */\n  _setLineStyle(lineIndex: number) {\n    const map = this._styleMap[lineIndex];\n    this.styles[map.line] = {};\n  }\n\n  // /**\n  //  * Wraps text using the 'width' property of Textbox. First this function\n  //  * splits text on newlines, so we preserve newlines entered by the user.\n  //  * Then it wraps each line using the width of the Textbox by calling\n  //  * _wrapLine().\n  //  * @param {Array} lines The string array of text that is split into lines\n  //  * @param {Number} desiredWidth width you want to wrap to\n  //  * @returns {Array} Array of lines\n  //  */\n  // _wrapText(lines: Array<any>, desiredWidth: number): Array<any> {\n  //   const wrapped = [];\n  //   this.isWrapping = true;\n  //   for (let i = 0; i < lines.length; i++) {\n  //     wrapped.push(...this._wrapLine(lines[i], i, desiredWidth));\n  //   }\n  //   this.isWrapping = false;\n  //   return wrapped;\n  // }\n\n  // /**\n  //  * Helper function to measure a string of text, given its lineIndex and charIndex offset\n  //  * It gets called when charBounds are not available yet.\n  //  * Override if necessary\n  //  * Use with {@link Textbox#wordSplit}\n  //  *\n  //  * @param {CanvasRenderingContext2D} ctx\n  //  * @param {String} text\n  //  * @param {number} lineIndex\n  //  * @param {number} charOffset\n  //  * @returns {number}\n  //  */\n  // _measureWord(word, lineIndex: number, charOffset = 0): number {\n  //   let width = 0,\n  //     prevGrapheme;\n  //   const skipLeft = true;\n  //   for (let i = 0, len = word.length; i < len; i++) {\n  //     const box = this._getGraphemeBox(\n  //       word[i],\n  //       lineIndex,\n  //       i + charOffset,\n  //       prevGrapheme,\n  //       skipLeft\n  //     );\n  //     width += box.kernedWidth;\n  //     prevGrapheme = word[i];\n  //   }\n  //   return width;\n  // }\n\n  /**\n   * Override this method to customize word splitting\n   * Use with {@link Textbox#_measureWord}\n   * @param {string} value\n   * @returns {string[]} array of words\n   */\n  wordSplit(value: string): string[] {\n    return value.split(this._wordJoiners);\n  }\n\n  /**\n   * Wraps a line of text using the width of the Textbox and a context.\n   * @param {Array} line The grapheme array that represent the line\n   * @param {Number} lineIndex\n   * @param {Number} desiredWidth width you want to wrap the line to\n   * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n   * @returns {Array} Array of line(s) into which the given text is wrapped\n   * to.\n   */\n\n  graphemeSplitForRectNotes(textstring: string): string[] {\n    const graphemes = [];\n    const words = textstring.split(/\\b/);\n    for (let i = 0; i < words.length; i++) {\n      // 检查单词是否全为拉丁字母，长度不大于16\n      if (/^[a-zA-Z]{1,16}$/.test(words[i])) {\n        graphemes.push(words[i]);\n      } else {\n        for (let j = 0; j < words[i].length; j++) {\n          graphemes.push(words[i][j]);\n        }\n      }\n    }\n    return graphemes;\n  }\n\n  // _wrapLine(\n  //   _line: any,\n  //   lineIndex: number,\n  //   desiredWidth: number,\n  //   reservedSpace = 0\n  // ): Array<any> {\n  //   const additionalSpace = this._getWidthOfCharSpacing();\n  //   const splitByGrapheme = this.splitByGrapheme;\n  //   const graphemeLines = [];\n  //   const words = splitByGrapheme\n  //     ? this.graphemeSplitForRectNotes(_line)\n  //     : this.wordSplit(_line);\n  //   const infix = splitByGrapheme ? '' : ' ';\n\n  //   let lineWidth = 0,\n  //     line: any[] = [],\n  //     // spaces in different languages?\n  //     offset = 0,\n  //     infixWidth = 0,\n  //     largestWordWidth = 0,\n  //     lineJustStarted = true;\n  //   // fix a difference between split and graphemeSplit\n  //   if (words.length === 0) {\n  //     words.push([]);\n  //   }\n  //   desiredWidth -= reservedSpace;\n  //   // measure words\n  //   const data = words.map((word) => {\n  //     // if using splitByGrapheme words are already in graphemes.\n  //     word = splitByGrapheme ? word : this.graphemeSplitForRectNotes(word);\n  //     const width = this._measureWord(word, lineIndex, offset);\n  //     largestWordWidth = Math.max(width, largestWordWidth);\n  //     offset += word.length + 1;\n  //     return { word: word, width: width };\n  //   });\n  //   const maxWidth = Math.max(\n  //     desiredWidth,\n  //     largestWordWidth,\n  //     this.dynamicMinWidth\n  //   );\n  //   // layout words\n  //   offset = 0;\n  //   let i;\n  //   for (i = 0; i < words.length; i++) {\n  //     const word = data[i].word;\n  //     const wordWidth = data[i].width;\n  //     offset += word.length;\n\n  //     lineWidth += infixWidth + wordWidth - additionalSpace;\n  //     if (lineWidth > maxWidth && !lineJustStarted) {\n  //       graphemeLines.push(line);\n  //       line = [];\n  //       lineWidth = wordWidth;\n  //       lineJustStarted = true;\n  //     } else {\n  //       lineWidth += additionalSpace;\n  //     }\n\n  //     if (!lineJustStarted && !splitByGrapheme) {\n  //       line.push(infix);\n  //     }\n  //     if (word.length > 1) {\n  //       line = line.concat(word.split(''));\n  //     } else {\n  //       line = line.concat(word);\n  //     }\n\n  //     infixWidth = splitByGrapheme\n  //       ? 0\n  //       : this._measureWord([infix], lineIndex, offset);\n  //     offset++;\n  //     lineJustStarted = false;\n  //   }\n\n  //   i && graphemeLines.push(line);\n\n  //   if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n  //     this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n  //   }\n  //   return graphemeLines;\n  // }\n\n  /**\n   * Detect if the text line is ended with an hard break\n   * text and itext do not have wrapping, return false\n   * @param {Number} lineIndex text to split\n   * @return {Boolean}\n   */\n  isEndOfWrapping(lineIndex: number): boolean {\n    if (!this._styleMap[lineIndex + 1]) {\n      // is last line, return true;\n      return true;\n    }\n    if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n      // this is last line before a line break, return true;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Detect if a line has a linebreak and so we need to account for it when moving\n   * and counting style.\n   * @return Number\n   */\n  missingNewlineOffset(lineIndex: number) {\n    if (this.splitByGrapheme) {\n      return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n    }\n    return 1;\n  }\n\n  /**\n   * Gets lines of text to render in the Textbox. This function calculates\n   * text wrapping on the fly every time it is called.\n   * @param {String} text text to split\n   * @returns {Array} Array of lines in the Textbox.\n   * @override\n   */\n  _splitTextIntoLines(text: string) {\n    const newText = super._splitTextIntoLines(text),\n      graphemeLines = this._wrapText(newText.lines, this.width),\n      lines = new Array(graphemeLines.length);\n    for (let i = 0; i < graphemeLines.length; i++) {\n      lines[i] = graphemeLines[i].join('');\n    }\n    newText.lines = lines;\n    newText.graphemeLines = graphemeLines;\n    return newText;\n  }\n\n  getMinWidth() {\n    return Math.max(this.minWidth, this.dynamicMinWidth);\n  }\n\n  // _removeExtraneousStyles() {\n  //   const linesToKeep = {};\n  //   for (const prop in this._styleMap) {\n  //     if (this._textLines[prop]) {\n  //       linesToKeep[this._styleMap[prop].line] = 1;\n  //     }\n  //   }\n  //   for (const prop in this.styles) {\n  //     if (!linesToKeep[prop]) {\n  //       delete this.styles[prop];\n  //     }\n  //   }\n  // }\n\n  // /**\n  //  * Returns object representation of an instance\n  //  * @method toObject\n  //  * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n  //  * @return {Object} object representation of an instance\n  //  */\n  // toObject(propertiesToInclude: Array<any>): object {\n  //   return super.toObject(\n  //     [...this.extendPropeties, 'minWidth', 'splitByGrapheme'].concat(\n  //       propertiesToInclude\n  //     )\n  //   );\n  // }\n  /**boardx custom function */\n\n  /* caculate cusor positon in the middle of the textbox */\n  getCenteredTop(rectHeight: number) {\n    const textHeight = this.height;\n    return (rectHeight - textHeight) / 2;\n  }\n\n  _render(ctx: CanvasRenderingContext2D) {\n    const path: any = this.path;\n\n    path && !path.isNotVisible() && path._render(ctx);\n    this._setTextStyles(ctx);\n    this._renderTextLinesBackground(ctx);\n    this._renderTextDecoration(ctx, 'underline');\n    this._renderText(ctx);\n    this._renderTextDecoration(ctx, 'overline');\n    this._renderTextDecoration(ctx, 'linethrough');\n  }\n\n  _renderBackground(ctx: CanvasRenderingContext2D) {\n    if (!this.backgroundColor) {\n      return;\n    }\n    const dim = this._getNonTransformedDimensions();\n    ctx.fillStyle = this.backgroundColor;\n\n    // ctx.shadowBlur = 20;\n    // ctx.shadowOffsetX = 2 * this.scaleX * canvas.getZoom();\n    // ctx.shadowOffsetY = 6 * this.scaleY * canvas.getZoom();\n    // ctx.shadowColor = 'rgba(0,0,0,0.1)';\n    // ctx.shadowColor = 'rgba(0,0,0,1)';\n\n    ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n\n    // if there is background color no other shadows\n    // should be casted\n    // this._removeShadow(ctx);\n  }\n  _getTopOffset() {\n    return -this._getTotalLineHeights() / 2;\n  }\n  _getTotalLineHeights() {\n    return this._textLines.reduce(\n      (total, line, index) => total + this.getHeightOfLine(index),\n      0\n    );\n  }\n\n  _getTotalLineHeight() {\n    return this._textLines.reduce(\n      (total, _line, index) => total + this.getHeightOfLine(index),\n      0\n    );\n  }\n\n  _renderText(ctx: CanvasRenderingContext2D) {\n    ctx.shadowOffsetX = ctx.shadowOffsetY = ctx.shadowBlur = 0;\n    ctx.shadowColor = '';\n\n    if (this.paintFirst === 'stroke') {\n      this._renderTextStroke(ctx);\n      this._renderTextFill(ctx);\n    } else {\n      this._renderTextFill(ctx);\n      this._renderTextStroke(ctx);\n    }\n  }\n  drawRoundRectPath(\n    cxt: CanvasRenderingContext2D,\n    width: number,\n    height: number,\n    radius: number\n  ) {\n    cxt.beginPath();\n    //从右下角顺时针绘制，弧度从0到1/2PI\n    cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2);\n\n    //矩形下边线\n    cxt.lineTo(radius, height);\n\n    //左下角圆弧，弧度从1/2PI到PI\n    cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI);\n\n    //矩形左边线\n    cxt.lineTo(0, radius);\n\n    //左上角圆弧，弧度从PI到3/2PI\n    cxt.arc(radius, radius, radius, Math.PI, (Math.PI * 3) / 2);\n\n    //上边线\n    cxt.lineTo(width - radius, 0);\n\n    //右上角圆弧\n    cxt.arc(width - radius, radius, radius, (Math.PI * 3) / 2, Math.PI * 2);\n\n    //右边线\n    cxt.lineTo(width, height - radius);\n    cxt.closePath();\n  }\n}\n\nclassRegistry.setClass(RectNotes);\nclassRegistry.setSVGClass(RectNotes, 'RectNotes');\n"],"names":["rectNotesDefaultValues","minWidth","dynamicMinWidth","splitByGrapheme","height","maxHeight","width","cornerStrokeColor","cornerStyle","cornerColor","transparentCorners","RectNotes","Textbox","getDefaults","_objectSpread","controls","createRectNotesDefaultControls","ownDefaults","constructor","text","options","arguments","length","undefined","_defineProperty","initializeEvent","findById","id","canvas","obj","getObjects","filter","widget","calculateControlPoint","boundingBox","connectingPoint","left","top","right","bottom","connectingX","x","connectingY","y","controlX","controlY","distances","side","distance","Math","abs","nearestBorder","reduce","min","current","Point","updateConnector","point","connector","type","controlPoint","getBoundingRect","console","log","update","fromPoint","control1","toPoint","control2","moveOrScaleHandler","e","_this$connectors","_this$connectors2","connectors","forEach","pointConnector","transformedPoint","transformPointToCanvas","connectorObj","connectorId","fromId","toId","on","initDimensions","initialized","isEditing","initDelayedCursor","_clearCache","_styleMap","_generateStyleMap","_splitText","set","fontSize","_splitTextIntoLines","textAlign","indexOf","enlargeSpaces","calcTextHeight","prenum","newText","substring","textInfo","realLineCount","realLineCharCount","charCount","map","i","graphemeLines","graphemeText","_reSpaceAndTab","test","line","offset","styleHas","property","lineIndex","isWrapping","_getLineStyle","styles","_setLineStyle","wordSplit","value","split","_wordJoiners","graphemeSplitForRectNotes","textstring","graphemes","words","push","j","isEndOfWrapping","missingNewlineOffset","_wrapText","lines","Array","join","getMinWidth","max","getCenteredTop","rectHeight","textHeight","_render","ctx","path","isNotVisible","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","_renderBackground","backgroundColor","dim","_getNonTransformedDimensions","fillStyle","fillRect","_getTopOffset","_getTotalLineHeights","_textLines","total","index","getHeightOfLine","_getTotalLineHeight","_line","shadowOffsetX","shadowOffsetY","shadowBlur","shadowColor","paintFirst","_renderTextStroke","_renderTextFill","drawRoundRectPath","cxt","radius","beginPath","arc","PI","lineTo","closePath","textLayoutProperties","classRegistry","setClass","setSVGClass"],"mappings":";;;;;;AAYA;AACO,MAAMA,sBAA4D,GAAG;AAC1EC,EAAAA,QAAQ,EAAE,EAAE;AACZC,EAAAA,eAAe,EAAE,CAAC;AAElBC,EAAAA,eAAe,EAAE,IAAI;AACrBC,EAAAA,MAAM,EAAE,GAAG;AACXC,EAAAA,SAAS,EAAE,GAAG;AAEdC,EAAAA,KAAK,EAAE,GAAG;AACVC,EAAAA,iBAAiB,EAAE,MAAM;AACzBC,EAAAA,WAAW,EAAE,QAAQ;AACrBC,EAAAA,WAAW,EAAE,OAAO;AACpBC,EAAAA,kBAAkB,EAAE,KAAA;AACtB,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,SAAS,SAASC,SAAO,CAAC;EA4DrC,OAAOC,WAAWA,GAAG;IACnB,OAAAC,cAAA,CAAAA,cAAA,CAAA,EAAA,EACK,KAAK,CAACD,WAAW,EAAE,CAAA,EAAA,EAAA,EAAA;AACtBE,MAAAA,QAAQ,EAAAD,cAAA,CACHE,EAAAA,EAAAA,8BAA8B,EAAE,CAAA;KAGlCL,EAAAA,SAAS,CAACM,WAAW,CAAA,CAAA;AAE5B,GAAA;EACAC,WAAWA,CACTC,IAAY,EAEZ;AAAA,IAAA,IADAC,OAA6C,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE,CAAA;AAElD,IAAA,KAAK,CAACF,IAAI,EAAEC,OAAO,CAAC,CAAA;AAzEtB;AACF;AACA;AACA;AACA;IAJEI,eAAA,CAAA,IAAA,EAAA,iBAAA,EAuByB,CACvB,SAAS,EACT,cAAc,EACd,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,MAAM,EACN,WAAW,CACZ,CAAA,CAAA;IAqCC,IAAI,CAACC,eAAe,EAAE,CAAA;AACxB,GAAA;EAEAC,QAAQA,CAACC,EAAU,EAAE;AACnB,IAAA,MAAMC,MAAM,GAAG,IAAI,CAACA,MAAM,CAAA;IAC1B,MAAMC,GAAQ,GAAGD,MAAM,KAAA,IAAA,IAANA,MAAM,KAANA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,MAAM,CACnBE,UAAU,EAAE,CACbC,MAAM,CAAEC,MAAW,IAAKA,MAAM,CAACL,EAAE,KAAKA,EAAE,CAAC,CAAA;AAC5C,IAAA,IAAIE,GAAG,CAACP,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI,CAAA;IACjC,OAAOO,GAAG,CAAC,CAAC,CAAC,CAAA;AACf,GAAA;AAEAI,EAAAA,qBAAqBA,CAACC,WAAkB,EAAEC,eAAsB,EAAS;AACvE,IAAA,MAAMC,IAAI,GAAGF,WAAW,CAACE,IAAI,CAAA;AAC7B,IAAA,MAAMC,GAAG,GAAGH,WAAW,CAACG,GAAG,CAAA;AAC3B,IAAA,MAAM/B,KAAK,GAAG4B,WAAW,CAAC5B,KAAK,CAAA;AAC/B,IAAA,MAAMF,MAAM,GAAG8B,WAAW,CAAC9B,MAAM,CAAA;AAEjC,IAAA,MAAMkC,KAAK,GAAGF,IAAI,GAAG9B,KAAK,CAAA;AAC1B,IAAA,MAAMiC,MAAM,GAAGF,GAAG,GAAGjC,MAAM,CAAA;AAE3B,IAAA,MAAMoC,WAAW,GAAGL,eAAe,CAACM,CAAC,CAAA;AACrC,IAAA,MAAMC,WAAW,GAAGP,eAAe,CAACQ,CAAC,CAAA;IAErC,IAAIC,QAAgB,GAAG,CAAC,CAAA;IACxB,IAAIC,QAAgB,GAAG,CAAC,CAAA;;AAExB;IACA,MAAMC,SAAS,GAAG,CAChB;AAAEC,MAAAA,IAAI,EAAE,MAAM;AAAEC,MAAAA,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACV,WAAW,GAAGJ,IAAI,CAAA;AAAE,KAAC,EACxD;AAAEW,MAAAA,IAAI,EAAE,OAAO;AAAEC,MAAAA,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACV,WAAW,GAAGF,KAAK,CAAA;AAAE,KAAC,EAC1D;AAAES,MAAAA,IAAI,EAAE,KAAK;AAAEC,MAAAA,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACR,WAAW,GAAGL,GAAG,CAAA;AAAE,KAAC,EACtD;AAAEU,MAAAA,IAAI,EAAE,QAAQ;AAAEC,MAAAA,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACR,WAAW,GAAGH,MAAM,CAAA;AAAE,KAAC,CAC7D,CAAA;IAED,MAAMY,aAAa,GAAGL,SAAS,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEC,OAAO,KAClDA,OAAO,CAACN,QAAQ,GAAGK,GAAG,CAACL,QAAQ,GAAGM,OAAO,GAAGD,GAC9C,CAAC,CAAA;IAED,QAAQF,aAAa,CAACJ,IAAI;AACxB,MAAA,KAAK,MAAM;QACTH,QAAQ,GAAGR,IAAI,GAAG,GAAG,CAAA;AACrBS,QAAAA,QAAQ,GAAGH,WAAW,CAAA;AACtB,QAAA,MAAA;AACF,MAAA,KAAK,OAAO;QACVE,QAAQ,GAAGN,KAAK,GAAG,GAAG,CAAA;AACtBO,QAAAA,QAAQ,GAAGH,WAAW,CAAA;AACtB,QAAA,MAAA;AACF,MAAA,KAAK,KAAK;AACRE,QAAAA,QAAQ,GAAGJ,WAAW,CAAA;QACtBK,QAAQ,GAAGR,GAAG,GAAG,GAAG,CAAA;AACpB,QAAA,MAAA;AACF,MAAA,KAAK,QAAQ;AACXO,QAAAA,QAAQ,GAAGJ,WAAW,CAAA;QACtBK,QAAQ,GAAGN,MAAM,GAAG,GAAG,CAAA;AACvB,QAAA,MAAA;AACJ,KAAA;AAEA,IAAA,OAAO,IAAIgB,KAAK,CAACX,QAAQ,EAAEC,QAAQ,CAAC,CAAA;AACtC,GAAA;AAEAW,EAAAA,eAAeA,CAACC,KAAU,EAAEC,SAAsB,EAAEC,IAAY,EAAE;IAChE,MAAMC,YAAY,GAAG,IAAI,CAAC3B,qBAAqB,CAC7C,IAAI,CAAC4B,eAAe,EAAE,EACtB,IAAIN,KAAK,CAACE,KAAK,CAAChB,CAAC,EAAEgB,KAAK,CAACd,CAAC,CAC5B,CAAC,CAAA;AAEDmB,IAAAA,OAAO,CAACC,GAAG,CACT,yBAAyB,EACzBN,KAAK,EACL,gBAAgB,EAChBG,YAAY,EACZF,SAAS,EACTC,IACF,CAAC,CAAA;AACD;AACA;;AAEA;IACA,IAAIA,IAAI,KAAK,MAAM,EAAE;MACnBD,SAAS,CAACM,MAAM,CAAC;AACfC,QAAAA,SAAS,EAAER,KAAK;AAChBS,QAAAA,QAAQ,EAAEN,YAAAA;AACZ,OAAC,CAAC,CAAA;AACJ,KAAA;IACA,IAAID,IAAI,KAAK,IAAI,EAAE;MACjBD,SAAS,CAACM,MAAM,CAAC;AACfG,QAAAA,OAAO,EAAEV,KAAK;AACdW,QAAAA,QAAQ,EAAER,YAAAA;AACZ,OAAC,CAAC,CAAA;AACJ,KAAA;AACF,GAAA;EAEAS,kBAAkBA,CAACC,CAAM,EAAE;IAAA,IAAAC,gBAAA,EAAAC,iBAAA,CAAA;AACzB;AACA,IAAA,IAAI,CAAAD,CAAAA,gBAAA,GAAI,IAAA,CAACE,UAAU,MAAA,IAAA,IAAAF,gBAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAfA,gBAAA,CAAiBjD,MAAM,MAAK,CAAC,EAAE,OAAA;AACnC,IAAA,CAAAkD,iBAAA,GAAA,IAAI,CAACC,UAAU,MAAAD,IAAAA,IAAAA,iBAAA,KAAfA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,iBAAA,CAAiBE,OAAO,CAAEhB,SAAc,IAAK;AAC3C,MAAA,MAAMiB,cAAc,GAAGjB,SAAS,CAACD,KAAK,CAAA;;AAEtC;AACA,MAAA,MAAMA,KAAK,GAAG,IAAIF,KAAK,CAACoB,cAAc,CAAClC,CAAC,EAAEkC,cAAc,CAAChC,CAAC,CAAC,CAAA;AAC3D;AACA,MAAA,MAAMiC,gBAAgB,GAAG,IAAI,CAACC,sBAAsB,CAACpB,KAAK,CAAC,CAAA;;AAE3D;AACA;MACA,MAAMqB,YAAY,GAAG,IAAI,CAACpD,QAAQ,CAACgC,SAAS,CAACqB,WAAW,CAAC,CAAA;MAEzD,IAAI,CAACD,YAAY,EAAE,OAAA;AACnBhB,MAAAA,OAAO,CAACC,GAAG,CAAC,cAAc,EAAEe,YAAY,CAAC,CAAA;AAEzC,MAAA,IAAI,IAAI,CAACnD,EAAE,KAAKmD,YAAY,CAACE,MAAM,EAAE;QACnC,IAAI,CAACxB,eAAe,CAACoB,gBAAgB,EAAEE,YAAY,EAAE,MAAM,CAAC,CAAA;AAC9D,OAAA;AAEA,MAAA,IAAI,IAAI,CAACnD,EAAE,KAAKmD,YAAY,CAACG,IAAI,EAAE;QACjC,IAAI,CAACzB,eAAe,CAACoB,gBAAgB,EAAEE,YAAY,EAAE,IAAI,CAAC,CAAA;AAC5D,OAAA;AACF,KAAC,CAAC,CAAA;AACJ,GAAA;AAEArD,EAAAA,eAAeA,GAAG;AAChB,IAAA,IAAI,CAACyD,EAAE,CAAC,QAAQ,EAAGZ,CAAC,IAAK;AACvB,MAAA,IAAI,CAACD,kBAAkB,CAACC,CAAC,CAAC,CAAA;AAC5B,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI,CAACY,EAAE,CAAC,SAAS,EAAGZ,CAAC,IAAK;AACxB,MAAA,IAAI,CAACD,kBAAkB,CAACC,CAAC,CAAC,CAAA;AAC5B,KAAC,CAAC,CAAA;AACJ,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEa,EAAAA,cAAcA,GAAG;AACf,IAAA,IAAI,CAAC,IAAI,CAACC,WAAW,EAAE;AACrB,MAAA,OAAA;AACF,KAAA;AACA,IAAA,IAAI,CAACC,SAAS,IAAI,IAAI,CAACC,iBAAiB,EAAE,CAAA;IAC1C,IAAI,CAACC,WAAW,EAAE,CAAA;AAClB;IACA,IAAI,CAACrF,eAAe,GAAG,CAAC,CAAA;AACxB;AACA,IAAA,IAAI,CAACsF,SAAS,GAAG,IAAI,CAACC,iBAAiB,CAAC,IAAI,CAACC,UAAU,EAAE,CAAC,CAAA;AAC1D;AACA,IAAA,IAAI,IAAI,CAACxF,eAAe,GAAG,IAAI,CAACI,KAAK,EAAE;MACrC,IAAI,CAACqF,GAAG,CAAC,UAAU,EAAE,IAAI,CAACC,QAAQ,GAAG,CAAC,CAAC,CAAA;AACvC,MAAA,IAAI,CAACC,mBAAmB,CAAC,IAAI,CAAC1E,IAAI,CAAC,CAAA;AACnC,MAAA,OAAA;AACF,KAAA;IACA,IAAI,IAAI,CAAC2E,SAAS,CAACC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE;AAC5C;MACA,IAAI,CAACC,aAAa,EAAE,CAAA;AACtB,KAAA;AACA;AACA,IAAA,MAAM5F,MAAM,GAAG,IAAI,CAAC6F,cAAc,EAAE,CAAA;IACpC,IAAI7F,MAAM,GAAG,IAAI,CAACC,SAAS,IAAI,IAAI,CAACuF,QAAQ,GAAG,CAAC,EAAE;MAChD,IAAI,CAACD,GAAG,CAAC,UAAU,EAAE,IAAI,CAACC,QAAQ,GAAG,CAAC,CAAC,CAAA;AACvC,MAAA,IAAI,CAACC,mBAAmB,CAAC,IAAI,CAAC1E,IAAI,CAAC,CAAA;AACnC,MAAA,OAAA;AACF,KAAA;IACA,IAAIf,MAAM,GAAG,GAAG,IAAI,IAAI,CAACwF,QAAQ,KAAK,CAAC,EAAE;AACvC,MAAA,MAAMM,MAAM,GAAG,GAAG,GAAG9F,MAAM,CAAA;AAC3B,MAAA,MAAM+F,OAAO,GAAG,IAAI,CAAChF,IAAI,CAACiF,SAAS,CAAC,CAAC,EAAE,IAAI,CAACjF,IAAI,CAACG,MAAM,GAAG4E,MAAM,GAAG,CAAC,CAAC,CAAA;MACrE,IAAI,CAACP,GAAG,CAAC,MAAM,EAAEQ,OAAO,GAAG,KAAK,CAAC,CAAA;AACnC,KAAA;AACA,IAAA,IAAI,CAAC/F,MAAM,GAAG,IAAI,CAACC,SAAS,CAAA;IAC5B,OAAO,IAAI,CAACD,MAAM,CAAA;AACpB,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEqF,iBAAiBA,CAACY,QAAa,EAAE;IAC/B,IAAIC,aAAa,GAAG,CAAC,CAAA;IACrB,IAAIC,iBAAiB,GAAG,CAAC,CAAA;IACzB,IAAIC,SAAS,GAAG,CAAC,CAAA;IACjB,MAAMC,GAAQ,GAAG,EAAE,CAAA;AAEnB,IAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,QAAQ,CAACM,aAAa,CAACrF,MAAM,EAAEoF,CAAC,EAAE,EAAE;AACtD,MAAA,IAAIL,QAAQ,CAACO,YAAY,CAACJ,SAAS,CAAC,KAAK,IAAI,IAAIE,CAAC,GAAG,CAAC,EAAE;AACtDH,QAAAA,iBAAiB,GAAG,CAAC,CAAA;AACrBC,QAAAA,SAAS,EAAE,CAAA;AACXF,QAAAA,aAAa,EAAE,CAAA;OAChB,MAAM,IACL,CAAC,IAAI,CAACnG,eAAe,IACrB,IAAI,CAAC0G,cAAc,CAACC,IAAI,CAACT,QAAQ,CAACO,YAAY,CAACJ,SAAS,CAAC,CAAC,IAC1DE,CAAC,GAAG,CAAC,EACL;AACA;AACAH,QAAAA,iBAAiB,EAAE,CAAA;AACnBC,QAAAA,SAAS,EAAE,CAAA;AACb,OAAA;MAEAC,GAAG,CAACC,CAAC,CAAC,GAAG;AACPK,QAAAA,IAAI,EAAET,aAAa;AACnBU,QAAAA,MAAM,EAAET,iBAAAA;OACT,CAAA;MAEDC,SAAS,IAAIH,QAAQ,CAACM,aAAa,CAACD,CAAC,CAAC,CAACpF,MAAM,CAAA;MAC7CiF,iBAAiB,IAAIF,QAAQ,CAACM,aAAa,CAACD,CAAC,CAAC,CAACpF,MAAM,CAAA;AACvD,KAAA;AAEA,IAAA,OAAOmF,GAAG,CAAA;AACZ,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACEQ,EAAAA,QAAQA,CAACC,QAAa,EAAEC,SAAiB,EAAW;IAClD,IAAI,IAAI,CAAC3B,SAAS,IAAI,CAAC,IAAI,CAAC4B,UAAU,EAAE;AACtC,MAAA,MAAMX,GAAG,GAAG,IAAI,CAACjB,SAAS,CAAC2B,SAAS,CAAC,CAAA;AACrC,MAAA,IAAIV,GAAG,EAAE;QACPU,SAAS,GAAGV,GAAG,CAACM,IAAI,CAAA;AACtB,OAAA;AACF,KAAA;AACA,IAAA,OAAO,KAAK,CAACE,QAAQ,CAACC,QAAQ,EAAEC,SAAS,CAAC,CAAA;AAC5C,GAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,aAAaA,CAACF,SAAiB,EAAW;AACxC,IAAA,MAAMV,GAAG,GAAG,IAAI,CAACjB,SAAS,CAAC2B,SAAS,CAAC,CAAA;IACrC,OAAO,CAAC,CAAC,IAAI,CAACG,MAAM,CAACb,GAAG,CAACM,IAAI,CAAC,CAAA;AAChC,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEQ,aAAaA,CAACJ,SAAiB,EAAE;AAC/B,IAAA,MAAMV,GAAG,GAAG,IAAI,CAACjB,SAAS,CAAC2B,SAAS,CAAC,CAAA;IACrC,IAAI,CAACG,MAAM,CAACb,GAAG,CAACM,IAAI,CAAC,GAAG,EAAE,CAAA;AAC5B,GAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACES,SAASA,CAACC,KAAa,EAAY;AACjC,IAAA,OAAOA,KAAK,CAACC,KAAK,CAAC,IAAI,CAACC,YAAY,CAAC,CAAA;AACvC,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAEEC,yBAAyBA,CAACC,UAAkB,EAAY;IACtD,MAAMC,SAAS,GAAG,EAAE,CAAA;AACpB,IAAA,MAAMC,KAAK,GAAGF,UAAU,CAACH,KAAK,CAAC,IAAI,CAAC,CAAA;AACpC,IAAA,KAAK,IAAIhB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGqB,KAAK,CAACzG,MAAM,EAAEoF,CAAC,EAAE,EAAE;AACrC;MACA,IAAI,kBAAkB,CAACI,IAAI,CAACiB,KAAK,CAACrB,CAAC,CAAC,CAAC,EAAE;AACrCoB,QAAAA,SAAS,CAACE,IAAI,CAACD,KAAK,CAACrB,CAAC,CAAC,CAAC,CAAA;AAC1B,OAAC,MAAM;AACL,QAAA,KAAK,IAAIuB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,CAACrB,CAAC,CAAC,CAACpF,MAAM,EAAE2G,CAAC,EAAE,EAAE;UACxCH,SAAS,CAACE,IAAI,CAACD,KAAK,CAACrB,CAAC,CAAC,CAACuB,CAAC,CAAC,CAAC,CAAA;AAC7B,SAAA;AACF,OAAA;AACF,KAAA;AACA,IAAA,OAAOH,SAAS,CAAA;AAClB,GAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEI,eAAeA,CAACf,SAAiB,EAAW;IAC1C,IAAI,CAAC,IAAI,CAAC3B,SAAS,CAAC2B,SAAS,GAAG,CAAC,CAAC,EAAE;AAClC;AACA,MAAA,OAAO,IAAI,CAAA;AACb,KAAA;AACA,IAAA,IAAI,IAAI,CAAC3B,SAAS,CAAC2B,SAAS,GAAG,CAAC,CAAC,CAACJ,IAAI,KAAK,IAAI,CAACvB,SAAS,CAAC2B,SAAS,CAAC,CAACJ,IAAI,EAAE;AACzE;AACA,MAAA,OAAO,IAAI,CAAA;AACb,KAAA;AACA,IAAA,OAAO,KAAK,CAAA;AACd,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACEoB,oBAAoBA,CAAChB,SAAiB,EAAE;IACtC,IAAI,IAAI,CAAChH,eAAe,EAAE;MACxB,OAAO,IAAI,CAAC+H,eAAe,CAACf,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAChD,KAAA;AACA,IAAA,OAAO,CAAC,CAAA;AACV,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEtB,mBAAmBA,CAAC1E,IAAY,EAAE;AAChC,IAAA,MAAMgF,OAAO,GAAG,KAAK,CAACN,mBAAmB,CAAC1E,IAAI,CAA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"}