UNPKG

tldraw

Version:

A tiny little drawing editor.

8 lines (7 loc) • 41.7 kB
{ "version": 3, "sources": ["../../../../src/lib/shapes/geo/GeoShapeUtil.tsx"], "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tBaseBoxShapeUtil,\n\tBox,\n\tEditor,\n\tEllipse2d,\n\tGeometry2d,\n\tGroup2d,\n\tHALF_PI,\n\tHTMLContainer,\n\tHandleSnapGeometry,\n\tPI2,\n\tPolygon2d,\n\tPolyline2d,\n\tRectangle2d,\n\tSVGContainer,\n\tStadium2d,\n\tSvgExportContext,\n\tTLGeoShape,\n\tTLGeoShapeProps,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\texhaustiveSwitchError,\n\tgeoShapeMigrations,\n\tgeoShapeProps,\n\tgetDefaultColorTheme,\n\tgetPolygonVertices,\n\tlerp,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport { HyperlinkButton } from '../shared/HyperlinkButton'\nimport { SvgTextLabel } from '../shared/SvgTextLabel'\nimport { TextLabel } from '../shared/TextLabel'\nimport {\n\tFONT_FAMILIES,\n\tLABEL_FONT_SIZES,\n\tLABEL_PADDING,\n\tSTROKE_SIZES,\n\tTEXT_PROPS,\n} from '../shared/default-shape-constants'\nimport {\n\tgetFillDefForCanvas,\n\tgetFillDefForExport,\n\tgetFontDefForExport,\n} from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { GeoShapeBody } from './components/GeoShapeBody'\nimport {\n\tcloudOutline,\n\tgetCloudPath,\n\tgetEllipseDrawIndicatorPath,\n\tgetHeartParts,\n\tgetHeartPath,\n\tgetRoundedInkyPolygonPath,\n\tgetRoundedPolygonPoints,\n} from './geo-shape-helpers'\nimport { getLines } from './getLines'\n\nconst MIN_SIZE_WITH_LABEL = 17 * 3\n\n/** @public */\nexport class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {\n\tstatic override type = 'geo' as const\n\tstatic override props = geoShapeProps\n\tstatic override migrations = geoShapeMigrations\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLGeoShape['props'] {\n\t\treturn {\n\t\t\tw: 100,\n\t\t\th: 100,\n\t\t\tgeo: 'rectangle',\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tfill: 'none',\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tfont: 'draw',\n\t\t\ttext: '',\n\t\t\talign: 'middle',\n\t\t\tverticalAlign: 'middle',\n\t\t\tgrowY: 0,\n\t\t\turl: '',\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\toverride getGeometry(shape: TLGeoShape) {\n\t\tconst w = Math.max(1, shape.props.w)\n\t\tconst h = Math.max(1, shape.props.h + shape.props.growY)\n\t\tconst cx = w / 2\n\t\tconst cy = h / 2\n\n\t\tconst isFilled = shape.props.fill !== 'none' // || shape.props.text.trim().length > 0\n\n\t\tlet body: Geometry2d\n\n\t\tswitch (shape.props.geo) {\n\t\t\tcase 'cloud': {\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: cloudOutline(w, h, shape.id, shape.props.size, shape.props.scale),\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'triangle': {\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [new Vec(cx, 0), new Vec(w, h), new Vec(0, h)],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'diamond': {\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [new Vec(cx, 0), new Vec(w, cy), new Vec(cx, h), new Vec(0, cy)],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'pentagon': {\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: getPolygonVertices(w, h, 5),\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'hexagon': {\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: getPolygonVertices(w, h, 6),\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'octagon': {\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: getPolygonVertices(w, h, 8),\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'ellipse': {\n\t\t\t\tbody = new Ellipse2d({\n\t\t\t\t\twidth: w,\n\t\t\t\t\theight: h,\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'oval': {\n\t\t\t\tbody = new Stadium2d({\n\t\t\t\t\twidth: w,\n\t\t\t\t\theight: h,\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'star': {\n\t\t\t\t// Most of this code is to offset the center, a 5 point star\n\t\t\t\t// will need to be moved downward because from its center [0,0]\n\t\t\t\t// it will have a bigger minY than maxY. This is because it'll\n\t\t\t\t// have 2 points at the bottom.\n\t\t\t\tconst sides = 5\n\t\t\t\tconst step = PI2 / sides / 2\n\t\t\t\tconst rightMostIndex = Math.floor(sides / 4) * 2\n\t\t\t\tconst leftMostIndex = sides * 2 - rightMostIndex\n\t\t\t\tconst topMostIndex = 0\n\t\t\t\tconst bottomMostIndex = Math.floor(sides / 2) * 2\n\t\t\t\tconst maxX = (Math.cos(-HALF_PI + rightMostIndex * step) * w) / 2\n\t\t\t\tconst minX = (Math.cos(-HALF_PI + leftMostIndex * step) * w) / 2\n\n\t\t\t\tconst minY = (Math.sin(-HALF_PI + topMostIndex * step) * h) / 2\n\t\t\t\tconst maxY = (Math.sin(-HALF_PI + bottomMostIndex * step) * h) / 2\n\t\t\t\tconst diffX = w - Math.abs(maxX - minX)\n\t\t\t\tconst diffY = h - Math.abs(maxY - minY)\n\t\t\t\tconst offsetX = w / 2 + minX - (w / 2 - maxX)\n\t\t\t\tconst offsetY = h / 2 + minY - (h / 2 - maxY)\n\n\t\t\t\tconst ratio = 1\n\t\t\t\tconst cx = (w - offsetX) / 2\n\t\t\t\tconst cy = (h - offsetY) / 2\n\t\t\t\tconst ox = (w + diffX) / 2\n\t\t\t\tconst oy = (h + diffY) / 2\n\t\t\t\tconst ix = (ox * ratio) / 2\n\t\t\t\tconst iy = (oy * ratio) / 2\n\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: Array.from(Array(sides * 2)).map((_, i) => {\n\t\t\t\t\t\tconst theta = -HALF_PI + i * step\n\t\t\t\t\t\treturn new Vec(\n\t\t\t\t\t\t\tcx + (i % 2 ? ix : ox) * Math.cos(theta),\n\t\t\t\t\t\t\tcy + (i % 2 ? iy : oy) * Math.sin(theta)\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'rhombus': {\n\t\t\t\tconst offset = Math.min(w * 0.38, h * 0.38)\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [new Vec(offset, 0), new Vec(w, 0), new Vec(w - offset, h), new Vec(0, h)],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'rhombus-2': {\n\t\t\t\tconst offset = Math.min(w * 0.38, h * 0.38)\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [new Vec(0, 0), new Vec(w - offset, 0), new Vec(w, h), new Vec(offset, h)],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'trapezoid': {\n\t\t\t\tconst offset = Math.min(w * 0.38, h * 0.38)\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [new Vec(offset, 0), new Vec(w - offset, 0), new Vec(w, h), new Vec(0, h)],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'arrow-right': {\n\t\t\t\tconst ox = Math.min(w, h) * 0.38\n\t\t\t\tconst oy = h * 0.16\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [\n\t\t\t\t\t\tnew Vec(0, oy),\n\t\t\t\t\t\tnew Vec(w - ox, oy),\n\t\t\t\t\t\tnew Vec(w - ox, 0),\n\t\t\t\t\t\tnew Vec(w, h / 2),\n\t\t\t\t\t\tnew Vec(w - ox, h),\n\t\t\t\t\t\tnew Vec(w - ox, h - oy),\n\t\t\t\t\t\tnew Vec(0, h - oy),\n\t\t\t\t\t],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'arrow-left': {\n\t\t\t\tconst ox = Math.min(w, h) * 0.38\n\t\t\t\tconst oy = h * 0.16\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [\n\t\t\t\t\t\tnew Vec(ox, 0),\n\t\t\t\t\t\tnew Vec(ox, oy),\n\t\t\t\t\t\tnew Vec(w, oy),\n\t\t\t\t\t\tnew Vec(w, h - oy),\n\t\t\t\t\t\tnew Vec(ox, h - oy),\n\t\t\t\t\t\tnew Vec(ox, h),\n\t\t\t\t\t\tnew Vec(0, h / 2),\n\t\t\t\t\t],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'arrow-up': {\n\t\t\t\tconst ox = w * 0.16\n\t\t\t\tconst oy = Math.min(w, h) * 0.38\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [\n\t\t\t\t\t\tnew Vec(w / 2, 0),\n\t\t\t\t\t\tnew Vec(w, oy),\n\t\t\t\t\t\tnew Vec(w - ox, oy),\n\t\t\t\t\t\tnew Vec(w - ox, h),\n\t\t\t\t\t\tnew Vec(ox, h),\n\t\t\t\t\t\tnew Vec(ox, oy),\n\t\t\t\t\t\tnew Vec(0, oy),\n\t\t\t\t\t],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'arrow-down': {\n\t\t\t\tconst ox = w * 0.16\n\t\t\t\tconst oy = Math.min(w, h) * 0.38\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints: [\n\t\t\t\t\t\tnew Vec(ox, 0),\n\t\t\t\t\t\tnew Vec(w - ox, 0),\n\t\t\t\t\t\tnew Vec(w - ox, h - oy),\n\t\t\t\t\t\tnew Vec(w, h - oy),\n\t\t\t\t\t\tnew Vec(w / 2, h),\n\t\t\t\t\t\tnew Vec(0, h - oy),\n\t\t\t\t\t\tnew Vec(ox, h - oy),\n\t\t\t\t\t],\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'check-box':\n\t\t\tcase 'x-box':\n\t\t\tcase 'rectangle': {\n\t\t\t\tbody = new Rectangle2d({\n\t\t\t\t\twidth: w,\n\t\t\t\t\theight: h,\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'heart': {\n\t\t\t\t// kind of expensive (creating the primitives to create a different primitive) but hearts are rare and beautiful things\n\t\t\t\tconst parts = getHeartParts(w, h)\n\t\t\t\tconst points = parts.reduce<Vec[]>((acc, part) => {\n\t\t\t\t\tacc.push(...part.vertices)\n\t\t\t\t\treturn acc\n\t\t\t\t}, [])\n\n\t\t\t\tbody = new Polygon2d({\n\t\t\t\t\tpoints,\n\t\t\t\t\tisFilled,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\texhaustiveSwitchError(shape.props.geo)\n\t\t\t}\n\t\t}\n\n\t\tconst unscaledlabelSize = getUnscaledLabelSize(this.editor, shape)\n\t\t// unscaled w and h\n\t\tconst unscaledW = w / shape.props.scale\n\t\tconst unscaledH = h / shape.props.scale\n\t\tconst unscaledminWidth = Math.min(100, unscaledW / 2)\n\t\tconst unscaledMinHeight = Math.min(\n\t\t\tLABEL_FONT_SIZES[shape.props.size] * TEXT_PROPS.lineHeight + LABEL_PADDING * 2,\n\t\t\tunscaledH / 2\n\t\t)\n\n\t\tconst unscaledLabelWidth = Math.min(\n\t\t\tunscaledW,\n\t\t\tMath.max(unscaledlabelSize.w, Math.min(unscaledminWidth, Math.max(1, unscaledW - 8)))\n\t\t)\n\t\tconst unscaledLabelHeight = Math.min(\n\t\t\tunscaledH,\n\t\t\tMath.max(unscaledlabelSize.h, Math.min(unscaledMinHeight, Math.max(1, unscaledH - 8)))\n\t\t)\n\n\t\t// not sure if bug\n\n\t\tconst lines = getLines(shape.props, STROKE_SIZES[shape.props.size] * shape.props.scale)\n\t\tconst edges = lines ? lines.map((line) => new Polyline2d({ points: line })) : []\n\n\t\t// todo: use centroid for label position\n\n\t\treturn new Group2d({\n\t\t\tchildren: [\n\t\t\t\tbody,\n\t\t\t\tnew Rectangle2d({\n\t\t\t\t\tx:\n\t\t\t\t\t\tshape.props.align === 'start'\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: shape.props.align === 'end'\n\t\t\t\t\t\t\t\t? (unscaledW - unscaledLabelWidth) * shape.props.scale\n\t\t\t\t\t\t\t\t: ((unscaledW - unscaledLabelWidth) / 2) * shape.props.scale,\n\t\t\t\t\ty:\n\t\t\t\t\t\tshape.props.verticalAlign === 'start'\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: shape.props.verticalAlign === 'end'\n\t\t\t\t\t\t\t\t? (unscaledH - unscaledLabelHeight) * shape.props.scale\n\t\t\t\t\t\t\t\t: ((unscaledH - unscaledLabelHeight) / 2) * shape.props.scale,\n\t\t\t\t\twidth: unscaledLabelWidth * shape.props.scale,\n\t\t\t\t\theight: unscaledLabelHeight * shape.props.scale,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t\tisLabel: true,\n\t\t\t\t}),\n\t\t\t\t...edges,\n\t\t\t],\n\t\t})\n\t}\n\n\toverride getHandleSnapGeometry(shape: TLGeoShape): HandleSnapGeometry {\n\t\tconst geometry = this.getGeometry(shape)\n\t\t// we only want to snap handles to the outline of the shape - not to its label etc.\n\t\tconst outline = geometry.children[0]\n\t\tswitch (shape.props.geo) {\n\t\t\tcase 'arrow-down':\n\t\t\tcase 'arrow-left':\n\t\t\tcase 'arrow-right':\n\t\t\tcase 'arrow-up':\n\t\t\tcase 'check-box':\n\t\t\tcase 'diamond':\n\t\t\tcase 'hexagon':\n\t\t\tcase 'octagon':\n\t\t\tcase 'pentagon':\n\t\t\tcase 'rectangle':\n\t\t\tcase 'rhombus':\n\t\t\tcase 'rhombus-2':\n\t\t\tcase 'star':\n\t\t\tcase 'trapezoid':\n\t\t\tcase 'triangle':\n\t\t\tcase 'x-box':\n\t\t\t\t// poly-line type shapes hand snap points for each vertex & the center\n\t\t\t\treturn { outline: outline, points: [...outline.getVertices(), geometry.bounds.center] }\n\t\t\tcase 'cloud':\n\t\t\tcase 'ellipse':\n\t\t\tcase 'heart':\n\t\t\tcase 'oval':\n\t\t\t\t// blobby shapes only have a snap point in their center\n\t\t\t\treturn { outline: outline, points: [geometry.bounds.center] }\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(shape.props.geo)\n\t\t}\n\t}\n\n\toverride getText(shape: TLGeoShape) {\n\t\treturn shape.props.text\n\t}\n\n\toverride onEditEnd(shape: TLGeoShape) {\n\t\tconst {\n\t\t\tid,\n\t\t\ttype,\n\t\t\tprops: { text },\n\t\t} = shape\n\n\t\tif (text.trimEnd() !== shape.props.text) {\n\t\t\tthis.editor.updateShapes([\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\ttype,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\ttext: text.trimEnd(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t}\n\t}\n\n\tcomponent(shape: TLGeoShape) {\n\t\tconst { id, type, props } = shape\n\t\tconst { fill, font, align, verticalAlign, size, text } = props\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst { editor } = this\n\t\tconst isOnlySelected = useValue(\n\t\t\t'isGeoOnlySelected',\n\t\t\t() => shape.id === editor.getOnlySelectedShapeId(),\n\t\t\t[]\n\t\t)\n\t\tconst isEditingAnything = editor.getEditingShapeId() !== null\n\t\tconst showHtmlContainer = isEditingAnything || shape.props.text\n\t\tconst isForceSolid = useValue(\n\t\t\t'force solid',\n\t\t\t() => {\n\t\t\t\treturn editor.getZoomLevel() < 0.2\n\t\t\t},\n\t\t\t[editor]\n\t\t)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer>\n\t\t\t\t\t<GeoShapeBody shape={shape} shouldScale={true} forceSolid={isForceSolid} />\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showHtmlContainer && (\n\t\t\t\t\t<HTMLContainer\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\twidth: shape.props.w,\n\t\t\t\t\t\t\theight: shape.props.h + props.growY,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TextLabel\n\t\t\t\t\t\t\tshapeId={id}\n\t\t\t\t\t\t\ttype={type}\n\t\t\t\t\t\t\tfont={font}\n\t\t\t\t\t\t\tfontSize={LABEL_FONT_SIZES[size] * shape.props.scale}\n\t\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\t\tpadding={LABEL_PADDING * shape.props.scale}\n\t\t\t\t\t\t\tfill={fill}\n\t\t\t\t\t\t\talign={align}\n\t\t\t\t\t\t\tverticalAlign={verticalAlign}\n\t\t\t\t\t\t\ttext={text}\n\t\t\t\t\t\t\tisSelected={isOnlySelected}\n\t\t\t\t\t\t\tlabelColor={theme[props.labelColor].solid}\n\t\t\t\t\t\t\twrap\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HTMLContainer>\n\t\t\t\t)}\n\t\t\t\t{shape.props.url && <HyperlinkButton url={shape.props.url} />}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLGeoShape) {\n\t\tconst { id, props } = shape\n\t\tconst { w, size } = props\n\t\tconst h = props.h + props.growY\n\n\t\tconst strokeWidth = STROKE_SIZES[size]\n\n\t\tconst geometry = this.editor.getShapeGeometry(shape)\n\n\t\tswitch (props.geo) {\n\t\t\tcase 'ellipse': {\n\t\t\t\tif (props.dash === 'draw') {\n\t\t\t\t\treturn <path d={getEllipseDrawIndicatorPath(id, w, h, strokeWidth)} />\n\t\t\t\t}\n\n\t\t\t\treturn <path d={geometry.getSvgPathData(true)} />\n\t\t\t}\n\t\t\tcase 'heart': {\n\t\t\t\treturn <path d={getHeartPath(w, h)} />\n\t\t\t}\n\t\t\tcase 'oval': {\n\t\t\t\treturn <path d={geometry.getSvgPathData(true)} />\n\t\t\t}\n\t\t\tcase 'cloud': {\n\t\t\t\treturn <path d={getCloudPath(w, h, id, size, shape.props.scale)} />\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst geometry = this.editor.getShapeGeometry(shape)\n\t\t\t\tconst outline =\n\t\t\t\t\tgeometry instanceof Group2d ? geometry.children[0].vertices : geometry.vertices\n\t\t\t\tlet path: string\n\n\t\t\t\tif (props.dash === 'draw') {\n\t\t\t\t\tconst polygonPoints = getRoundedPolygonPoints(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\toutline,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tstrokeWidth * 2 * shape.props.scale,\n\t\t\t\t\t\t1\n\t\t\t\t\t)\n\t\t\t\t\tpath = getRoundedInkyPolygonPath(polygonPoints)\n\t\t\t\t} else {\n\t\t\t\t\tpath = 'M' + outline[0] + 'L' + outline.slice(1) + 'Z'\n\t\t\t\t}\n\n\t\t\t\tconst lines = getLines(shape.props, strokeWidth)\n\n\t\t\t\tif (lines) {\n\t\t\t\t\tfor (const [A, B] of lines) {\n\t\t\t\t\t\tpath += `M${A.x},${A.y}L${B.x},${B.y}`\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn <path d={path} />\n\t\t\t}\n\t\t}\n\t}\n\n\toverride toSvg(shape: TLGeoShape, ctx: SvgExportContext) {\n\t\t// We need to scale the shape to 1x for export\n\t\tconst newShape = {\n\t\t\t...shape,\n\t\t\tprops: {\n\t\t\t\t...shape.props,\n\t\t\t\tw: shape.props.w / shape.props.scale,\n\t\t\t\th: shape.props.h / shape.props.scale,\n\t\t\t},\n\t\t}\n\t\tconst props = newShape.props\n\t\tctx.addExportDef(getFillDefForExport(props.fill))\n\n\t\tlet textEl\n\t\tif (props.text) {\n\t\t\tctx.addExportDef(getFontDefForExport(props.font))\n\t\t\tconst theme = getDefaultColorTheme(ctx)\n\n\t\t\tconst bounds = new Box(0, 0, props.w, props.h + props.growY)\n\t\t\ttextEl = (\n\t\t\t\t<SvgTextLabel\n\t\t\t\t\tfontSize={LABEL_FONT_SIZES[props.size]}\n\t\t\t\t\tfont={props.font}\n\t\t\t\t\talign={props.align}\n\t\t\t\t\tverticalAlign={props.verticalAlign}\n\t\t\t\t\ttext={props.text}\n\t\t\t\t\tlabelColor={theme[props.labelColor].solid}\n\t\t\t\t\tbounds={bounds}\n\t\t\t\t\tpadding={16}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<GeoShapeBody shouldScale={false} shape={newShape} forceSolid={false} />\n\t\t\t\t{textEl}\n\t\t\t</>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(\n\t\tshape: TLGeoShape,\n\t\t{ handle, newPoint, scaleX, scaleY, initialShape }: TLResizeInfo<TLGeoShape>\n\t) {\n\t\tconst unscaledInitialW = initialShape.props.w / initialShape.props.scale\n\t\tconst unscaledInitialH = initialShape.props.h / initialShape.props.scale\n\t\tconst unscaledGrowY = initialShape.props.growY / initialShape.props.scale\n\t\t// use the w/h from props here instead of the initialBounds here,\n\t\t// since cloud shapes calculated bounds can differ from the props w/h.\n\t\tlet unscaledW = unscaledInitialW * scaleX\n\t\tlet unscaledH = (unscaledInitialH + unscaledGrowY) * scaleY\n\t\tlet overShrinkX = 0\n\t\tlet overShrinkY = 0\n\n\t\tconst min = MIN_SIZE_WITH_LABEL\n\n\t\tif (shape.props.text.trim()) {\n\t\t\tlet newW = Math.max(Math.abs(unscaledW), min)\n\t\t\tlet newH = Math.max(Math.abs(unscaledH), min)\n\n\t\t\tif (newW < min && newH === min) newW = min\n\t\t\tif (newW === min && newH < min) newH = min\n\n\t\t\tconst unscaledLabelSize = getUnscaledLabelSize(this.editor, {\n\t\t\t\t...shape,\n\t\t\t\tprops: {\n\t\t\t\t\t...shape.props,\n\t\t\t\t\tw: newW * shape.props.scale,\n\t\t\t\t\th: newH * shape.props.scale,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tconst nextW = Math.max(Math.abs(unscaledW), unscaledLabelSize.w) * Math.sign(unscaledW)\n\t\t\tconst nextH = Math.max(Math.abs(unscaledH), unscaledLabelSize.h) * Math.sign(unscaledH)\n\t\t\toverShrinkX = Math.abs(nextW) - Math.abs(unscaledW)\n\t\t\toverShrinkY = Math.abs(nextH) - Math.abs(unscaledH)\n\n\t\t\tunscaledW = nextW\n\t\t\tunscaledH = nextH\n\t\t}\n\n\t\tconst scaledW = unscaledW * shape.props.scale\n\t\tconst scaledH = unscaledH * shape.props.scale\n\n\t\tconst offset = new Vec(0, 0)\n\n\t\t// x offsets\n\n\t\tif (scaleX < 0) {\n\t\t\toffset.x += scaledW\n\t\t}\n\n\t\tif (handle === 'left' || handle === 'top_left' || handle === 'bottom_left') {\n\t\t\toffset.x += scaleX < 0 ? overShrinkX : -overShrinkX\n\t\t}\n\n\t\t// y offsets\n\n\t\tif (scaleY < 0) {\n\t\t\toffset.y += scaledH\n\t\t}\n\n\t\tif (handle === 'top' || handle === 'top_left' || handle === 'top_right') {\n\t\t\toffset.y += scaleY < 0 ? overShrinkY : -overShrinkY\n\t\t}\n\n\t\tconst { x, y } = offset.rot(shape.rotation).add(newPoint)\n\n\t\treturn {\n\t\t\tx,\n\t\t\ty,\n\t\t\tprops: {\n\t\t\t\tw: Math.max(Math.abs(scaledW), 1),\n\t\t\t\th: Math.max(Math.abs(scaledH), 1),\n\t\t\t\tgrowY: 0,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride onBeforeCreate(shape: TLGeoShape) {\n\t\tif (!shape.props.text) {\n\t\t\tif (shape.props.growY) {\n\t\t\t\t// No text / some growY, set growY to 0\n\t\t\t\treturn {\n\t\t\t\t\t...shape,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tgrowY: 0,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No text / no growY, nothing to change\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tconst unscaledPrevHeight = shape.props.h / shape.props.scale\n\t\tconst unscaledNextHeight = getUnscaledLabelSize(this.editor, shape).h\n\n\t\tlet growY: number | null = null\n\n\t\tif (unscaledNextHeight > unscaledPrevHeight) {\n\t\t\tgrowY = unscaledNextHeight - unscaledPrevHeight\n\t\t} else {\n\t\t\tif (shape.props.growY) {\n\t\t\t\tgrowY = 0\n\t\t\t}\n\t\t}\n\n\t\tif (growY !== null) {\n\t\t\treturn {\n\t\t\t\t...shape,\n\t\t\t\tprops: {\n\t\t\t\t\t...shape.props,\n\t\t\t\t\t// scale the growY\n\t\t\t\t\tgrowY: growY * shape.props.scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeUpdate(prev: TLGeoShape, next: TLGeoShape) {\n\t\tconst prevText = prev.props.text\n\t\tconst nextText = next.props.text\n\n\t\t// No change to text, font, or size, no need to update update\n\t\tif (\n\t\t\tprevText === nextText &&\n\t\t\tprev.props.font === next.props.font &&\n\t\t\tprev.props.size === next.props.size\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\t// If we got rid of the text, cancel out any growY from the prev text\n\t\tif (prevText && !nextText) {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\tgrowY: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// Get the prev width and height in unscaled values\n\t\tconst unscaledPrevWidth = prev.props.w / prev.props.scale\n\t\tconst unscaledPrevHeight = prev.props.h / prev.props.scale\n\t\tconst unscaledPrevGrowY = prev.props.growY / prev.props.scale\n\n\t\t// Get the next width and height in unscaled values\n\t\tconst unscaledNextLabelSize = getUnscaledLabelSize(this.editor, next)\n\n\t\t// When entering the first character in a label (not pasting in multiple characters...)\n\t\tif (!prevText && nextText && nextText.length === 1) {\n\t\t\tlet unscaledW = Math.max(unscaledPrevWidth, unscaledNextLabelSize.w)\n\t\t\tlet unscaledH = Math.max(unscaledPrevHeight, unscaledNextLabelSize.h)\n\n\t\t\tconst min = MIN_SIZE_WITH_LABEL\n\n\t\t\t// If both the width and height were less than the minimum size, make the shape square\n\t\t\tif (unscaledPrevWidth < min && unscaledPrevHeight < min) {\n\t\t\t\tunscaledW = Math.max(unscaledW, min)\n\t\t\t\tunscaledH = Math.max(unscaledH, min)\n\t\t\t\tunscaledW = Math.max(unscaledW, unscaledH)\n\t\t\t\tunscaledH = Math.max(unscaledW, unscaledH)\n\t\t\t}\n\n\t\t\t// Don't set a growY\u2014at least, not until we've implemented a growX property\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\t// Scale the results\n\t\t\t\t\tw: unscaledW * next.props.scale,\n\t\t\t\t\th: unscaledH * next.props.scale,\n\t\t\t\t\tgrowY: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tlet growY: number | null = null\n\n\t\tif (unscaledNextLabelSize.h > unscaledPrevHeight) {\n\t\t\tgrowY = unscaledNextLabelSize.h - unscaledPrevHeight\n\t\t} else {\n\t\t\tif (unscaledPrevGrowY) {\n\t\t\t\tgrowY = 0\n\t\t\t}\n\t\t}\n\n\t\tif (growY !== null) {\n\t\t\tconst unscaledNextWidth = next.props.w / next.props.scale\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\t// Scale the results\n\t\t\t\t\tgrowY: growY * next.props.scale,\n\t\t\t\t\tw: Math.max(unscaledNextWidth, unscaledNextLabelSize.w) * next.props.scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tif (unscaledNextLabelSize.w > unscaledPrevWidth) {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\t// Scale the results\n\t\t\t\t\tw: unscaledNextLabelSize.w * next.props.scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// otherwise, no update needed\n\t}\n\n\toverride onDoubleClick(shape: TLGeoShape) {\n\t\t// Little easter egg: double-clicking a rectangle / checkbox while\n\t\t// holding alt will toggle between check-box and rectangle\n\t\tif (this.editor.inputs.altKey) {\n\t\t\tswitch (shape.props.geo) {\n\t\t\t\tcase 'rectangle': {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...shape,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tgeo: 'check-box' as const,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'check-box': {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...shape,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tgeo: 'rectangle' as const,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLGeoShape,\n\t\tendShape: TLGeoShape,\n\t\tt: number\n\t): TLGeoShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\nfunction getUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {\n\tconst { text, font, size, w } = shape.props\n\n\tif (!text) {\n\t\treturn { w: 0, h: 0 }\n\t}\n\n\tconst minSize = editor.textMeasure.measureText('w', {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[font],\n\t\tfontSize: LABEL_FONT_SIZES[size],\n\t\tmaxWidth: 100, // ?\n\t})\n\n\t// TODO: Can I get these from somewhere?\n\tconst sizes = {\n\t\ts: 2,\n\t\tm: 3.5,\n\t\tl: 5,\n\t\txl: 10,\n\t}\n\n\tconst textSize = editor.textMeasure.measureText(text, {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[font],\n\t\tfontSize: LABEL_FONT_SIZES[size],\n\t\tminWidth: minSize.w,\n\t\tmaxWidth: Math.max(\n\t\t\t// Guard because a DOM nodes can't be less 0\n\t\t\t0,\n\t\t\t// A 'w' width that we're setting as the min-width\n\t\t\tMath.ceil(minSize.w + sizes[size]),\n\t\t\t// The actual text size\n\t\t\tMath.ceil(w / shape.props.scale - LABEL_PADDING * 2)\n\t\t),\n\t})\n\n\treturn {\n\t\tw: textSize.w + LABEL_PADDING * 2,\n\t\th: textSize.h + LABEL_PADDING * 2,\n\t}\n}\n"], "mappings": "AAscG,mBAEE,KAFF;AArcH;AAAA,EACC;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,gBAAgB;AAEzB,MAAM,sBAAsB,KAAK;AAG1B,MAAM,qBAAqB,iBAA6B;AAAA,EAC9D,OAAgB,OAAO;AAAA,EACvB,OAAgB,QAAQ;AAAA,EACxB,OAAgB,aAAa;AAAA,EAEpB,UAAU;AAClB,WAAO;AAAA,EACR;AAAA,EAES,kBAAuC;AAC/C,WAAO;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,eAAe;AAAA,MACf,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAES,YAAY,OAAmB;AACvC,UAAM,IAAI,KAAK,IAAI,GAAG,MAAM,MAAM,CAAC;AACnC,UAAM,IAAI,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK;AACvD,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AAEf,UAAM,WAAW,MAAM,MAAM,SAAS;AAEtC,QAAI;AAEJ,YAAQ,MAAM,MAAM,KAAK;AAAA,MACxB,KAAK,SAAS;AACb,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,aAAa,GAAG,GAAG,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,UACxE;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,YAAY;AAChB,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACrD;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,WAAW;AACf,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AAAA,UACvE;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,YAAY;AAChB,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,mBAAmB,GAAG,GAAG,CAAC;AAAA,UAClC;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,WAAW;AACf,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,mBAAmB,GAAG,GAAG,CAAC;AAAA,UAClC;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,WAAW;AACf,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,mBAAmB,GAAG,GAAG,CAAC;AAAA,UAClC;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,WAAW;AACf,eAAO,IAAI,UAAU;AAAA,UACpB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,QAAQ;AACZ,eAAO,IAAI,UAAU;AAAA,UACpB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,QAAQ;AAKZ,cAAM,QAAQ;AACd,cAAM,OAAO,MAAM,QAAQ;AAC3B,cAAM,iBAAiB,KAAK,MAAM,QAAQ,CAAC,IAAI;AAC/C,cAAM,gBAAgB,QAAQ,IAAI;AAClC,cAAM,eAAe;AACrB,cAAM,kBAAkB,KAAK,MAAM,QAAQ,CAAC,IAAI;AAChD,cAAM,OAAQ,KAAK,IAAI,CAAC,UAAU,iBAAiB,IAAI,IAAI,IAAK;AAChE,cAAM,OAAQ,KAAK,IAAI,CAAC,UAAU,gBAAgB,IAAI,IAAI,IAAK;AAE/D,cAAM,OAAQ,KAAK,IAAI,CAAC,UAAU,eAAe,IAAI,IAAI,IAAK;AAC9D,cAAM,OAAQ,KAAK,IAAI,CAAC,UAAU,kBAAkB,IAAI,IAAI,IAAK;AACjE,cAAM,QAAQ,IAAI,KAAK,IAAI,OAAO,IAAI;AACtC,cAAM,QAAQ,IAAI,KAAK,IAAI,OAAO,IAAI;AACtC,cAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,IAAI;AACxC,cAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,IAAI;AAExC,cAAM,QAAQ;AACd,cAAMA,OAAM,IAAI,WAAW;AAC3B,cAAMC,OAAM,IAAI,WAAW;AAC3B,cAAM,MAAM,IAAI,SAAS;AACzB,cAAM,MAAM,IAAI,SAAS;AACzB,cAAM,KAAM,KAAK,QAAS;AAC1B,cAAM,KAAM,KAAK,QAAS;AAE1B,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,MAAM,KAAK,MAAM,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM;AAClD,kBAAM,QAAQ,CAAC,UAAU,IAAI;AAC7B,mBAAO,IAAI;AAAA,cACVD,OAAM,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK;AAAA,cACvCC,OAAM,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK;AAAA,YACxC;AAAA,UACD,CAAC;AAAA,UACD;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,WAAW;AACf,cAAM,SAAS,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI;AAC1C,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACjF;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,aAAa;AACjB,cAAM,SAAS,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI;AAC1C,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,UACjF;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,aAAa;AACjB,cAAM,SAAS,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI;AAC1C,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACjF;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,eAAe;AACnB,cAAM,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI;AAC5B,cAAM,KAAK,IAAI;AACf,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ;AAAA,YACP,IAAI,IAAI,GAAG,EAAE;AAAA,YACb,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,YAClB,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,YACjB,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,YAChB,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,YACjB,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,YACtB,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,UAClB;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,cAAc;AAClB,cAAM,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI;AAC5B,cAAM,KAAK,IAAI;AACf,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ;AAAA,YACP,IAAI,IAAI,IAAI,CAAC;AAAA,YACb,IAAI,IAAI,IAAI,EAAE;AAAA,YACd,IAAI,IAAI,GAAG,EAAE;AAAA,YACb,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,YACjB,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,YAClB,IAAI,IAAI,IAAI,CAAC;AAAA,YACb,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,UACjB;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,YAAY;AAChB,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI;AAC5B,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ;AAAA,YACP,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,YAChB,IAAI,IAAI,GAAG,EAAE;AAAA,YACb,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,YAClB,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,YACjB,IAAI,IAAI,IAAI,CAAC;AAAA,YACb,IAAI,IAAI,IAAI,EAAE;AAAA,YACd,IAAI,IAAI,GAAG,EAAE;AAAA,UACd;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,cAAc;AAClB,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI;AAC5B,eAAO,IAAI,UAAU;AAAA,UACpB,QAAQ;AAAA,YACP,IAAI,IAAI,IAAI,CAAC;AAAA,YACb,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,YACjB,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,YACtB,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,YACjB,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,YAChB,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,YACjB,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,UACnB;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,aAAa;AACjB,eAAO,IAAI,YAAY;AAAA,UACtB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,KAAK,SAAS;AAEb,cAAM,QAAQ,cAAc,GAAG,CAAC;AAChC,cAAM,SAAS,MAAM,OAAc,CAAC,KAAK,SAAS;AACjD,cAAI,KAAK,GAAG,KAAK,QAAQ;AACzB,iBAAO;AAAA,QACR,GAAG,CAAC,CAAC;AAEL,eAAO,IAAI,UAAU;AAAA,UACpB;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAAA,MACA,SAAS;AACR,8BAAsB,MAAM,MAAM,GAAG;AAAA,MACtC;AAAA,IACD;AAEA,UAAM,oBAAoB,qBAAqB,KAAK,QAAQ,KAAK;AAEjE,UAAM,YAAY,IAAI,MAAM,MAAM;AAClC,UAAM,YAAY,IAAI,MAAM,MAAM;AAClC,UAAM,mBAAmB,KAAK,IAAI,KAAK,YAAY,CAAC;AACpD,UAAM,oBAAoB,KAAK;AAAA,MAC9B,iBAAiB,MAAM,MAAM,IAAI,IAAI,WAAW,aAAa,gBAAgB;AAAA,MAC7E,YAAY;AAAA,IACb;AAEA,UAAM,qBAAqB,KAAK;AAAA,MAC/B;AAAA,MACA,KAAK,IAAI,kBAAkB,GAAG,KAAK,IAAI,kBAAkB,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,IACrF;AACA,UAAM,sBAAsB,KAAK;AAAA,MAChC;AAAA,MACA,KAAK,IAAI,kBAAkB,GAAG,KAAK,IAAI,mBAAmB,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,IACtF;AAIA,UAAM,QAAQ,SAAS,MAAM,OAAO,aAAa,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK;AACtF,UAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC,SAAS,IAAI,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC;AAI/E,WAAO,IAAI,QAAQ;AAAA,MAClB,UAAU;AAAA,QACT;AAAA,QACA,IAAI,YAAY;AAAA,UACf,GACC,MAAM,MAAM,UAAU,UACnB,IACA,MAAM,MAAM,UAAU,SACpB,YAAY,sBAAsB,MAAM,MAAM,SAC7C,YAAY,sBAAsB,IAAK,MAAM,MAAM;AAAA,UAC1D,GACC,MAAM,MAAM,kBAAkB,UAC3B,IACA,MAAM,MAAM,kBAAkB,SAC5B,YAAY,uBAAuB,MAAM,MAAM,SAC9C,YAAY,uBAAuB,IAAK,MAAM,MAAM;AAAA,UAC3D,OAAO,qBAAqB,MAAM,MAAM;AAAA,UACxC,QAAQ,sBAAsB,MAAM,MAAM;AAAA,UAC1C,UAAU;AAAA,UACV,SAAS;AAAA,QACV,CAAC;AAAA,QACD,GAAG;AAAA,MACJ;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAES,sBAAsB,OAAuC;AACrE,UAAM,WAAW,KAAK,YAAY,KAAK;AAEvC,UAAM,UAAU,SAAS,SAAS,CAAC;AACnC,YAAQ,MAAM,MAAM,KAAK;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEJ,eAAO,EAAE,SAAkB,QAAQ,CAAC,GAAG,QAAQ,YAAY,GAAG,SAAS,OAAO,MAAM,EAAE;AAAA,MACvF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEJ,eAAO,EAAE,SAAkB,QAAQ,CAAC,SAAS,OAAO,MAAM,EAAE;AAAA,MAC7D;AACC,8BAAsB,MAAM,MAAM,GAAG;AAAA,IACvC;AAAA,EACD;AAAA,EAES,QAAQ,OAAmB;AACnC,WAAO,MAAM,MAAM;AAAA,EACpB;AAAA,EAES,UAAU,OAAmB;AACrC,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO,EAAE,KAAK;AAAA,IACf,IAAI;AAEJ,QAAI,KAAK,QAAQ,MAAM,MAAM,MAAM,MAAM;AACxC,WAAK,OAAO,aAAa;AAAA,QACxB;AAAA,UACC;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACN,MAAM,KAAK,QAAQ;AAAA,UACpB;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,UAAU,OAAmB;AAC5B,UAAM,EAAE,IAAI,MAAM,MAAM,IAAI;AAC5B,UAAM,EAAE,MAAM,MAAM,OAAO,eAAe,MAAM,KAAK,IAAI;AACzD,UAAM,QAAQ,qBAAqB;AACnC,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,iBAAiB;AAAA,MACtB;AAAA,MACA,MAAM,MAAM,OAAO,OAAO,uBAAuB;AAAA,MACjD,CAAC;AAAA,IACF;AACA,UAAM,oBAAoB,OAAO,kBAAkB,MAAM;AACzD,UAAM,oBAAoB,qBAAqB,MAAM,MAAM;AAC3D,UAAM,eAAe;AAAA,MACpB;AAAA,MACA,MAAM;AACL,eAAO,OAAO,aAAa,IAAI;AAAA,MAChC;AAAA,MACA,CAAC,MAAM;AAAA,IACR;AAEA,WACC,iCACC;AAAA,0BAAC,gBACA,8BAAC,gBAAa,OAAc,aAAa,MAAM,YAAY,cAAc,GAC1E;AAAA,MACC,qBACA;AAAA,QAAC;AAAA;AAAA,UACA,OAAO;AAAA,YACN,UAAU;AAAA,YACV,OAAO,MAAM,MAAM;AAAA,YACnB,QAAQ,MAAM,MAAM,IAAI,MAAM;AAAA,UAC/B;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,iBAAiB,IAAI,IAAI,MAAM,MAAM;AAAA,cAC/C,YAAY,WAAW;AAAA,cACvB,SAAS,gBAAgB,MAAM,MAAM;AAAA,cACrC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ,YAAY,MAAM,MAAM,UAAU,EAAE;AAAA,cACpC,MAAI;AAAA;AAAA,UACL;AAAA;AAAA,MACD;AAAA,MAEA,MAAM,MAAM,OAAO,oBAAC,mBAAgB,KAAK,MAAM,MAAM,KAAK;AAAA,OAC5D;AAAA,EAEF;AAAA,EAEA,UAAU,OAAmB;AAC5B,UAAM,EAAE,IAAI,MAAM,IAAI;AACtB,UAAM,EAAE,GAAG,KAAK,IAAI;AACpB,UAAM,IAAI,MAAM,IAAI,MAAM;AAE1B,UAAM,cAAc,aAAa,IAAI;AAErC,UAAM,WAAW,KAAK,OAAO,iBAAiB,KAAK;AAEnD,YAAQ,MAAM,KAAK;AAAA,MAClB,KAAK,WAAW;AACf,YAAI,MAAM,SAAS,QAAQ;AAC1B,iBAAO,oBAAC,UAAK,GAAG,4BAA4B,IAAI,GAAG,GAAG,WAAW,GAAG;AAAA,QACrE;AAEA,eAAO,oBAAC,UAAK,GAAG,SAAS,eAAe,IAAI,GAAG;AAAA,MAChD;AAAA,MACA,KAAK,SAAS;AACb,eAAO,oBAAC,UAAK,GAAG,aAAa,GAAG,CAAC,GAAG;AAAA,MACrC;AAAA,MACA,KAAK,QAAQ;AACZ,eAAO,oBAAC,UAAK,GAAG,SAAS,eAAe,IAAI,GAAG;AAAA,MAChD;AAAA,MACA,KAAK,SAAS;AACb,eAAO,oBAAC,UAAK,GAAG,aAAa,GAAG,GAAG,IAAI,MAAM,MAAM,MAAM,KAAK,GAAG;AAAA,MAClE;AAAA,MAEA,SAAS;AACR,cAAMC,YAAW,KAAK,OAAO,iBAAiB,KAAK;AACnD,cAAM,UACLA,qBAAoB,UAAUA,UAAS,SAAS,CAAC,EAAE,WAAWA,UAAS;AACxE,YAAI;AAEJ,YAAI,MAAM,SAAS,QAAQ;AAC1B,gBAAM,gBAAgB;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc,IAAI,MAAM,MAAM;AAAA,YAC9B;AAAA,UACD;AACA,iBAAO,0BAA0B,aAAa;AAAA,QAC/C,OAAO;AACN,iBAAO,MAAM,QAAQ,CAAC,IAAI,MAAM,QAAQ,MAAM,CAAC,IAAI;AAAA,QACpD;AAEA,cAAM,QAAQ,SAAS,MAAM,OAAO,WAAW;AAE/C,YAAI,OAAO;AACV,qBAAW,CAAC,GAAG,CAAC,KAAK,OAAO;AAC3B,oBAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,UACrC;AAAA,QACD;AAEA,eAAO,oBAAC,UAAK,GAAG,MAAM;AAAA,MACvB;AAAA,IACD;AAAA,EACD;AAAA,EAES,MAAM,OAAmB,KAAuB;AAExD,UAAM,WAAW;AAAA,MAChB,GAAG;AAAA,MACH,OAAO;AAAA,QACN,GAAG,MAAM;AAAA,QACT,GAAG,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,QAC/B,GAAG,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,MAChC;AAAA,IACD;AACA,UAAM,QAAQ,SAAS;AACvB,QAAI,aAAa,oBAAoB,MAAM,IAAI,CAAC;AAEhD,QAAI;AACJ,QAAI,MAAM,MAAM;AACf,UAAI,aAAa,oBAAoB,MAAM,IAAI,CAAC;AAChD,YAAM,QAAQ,qBAAqB,GAAG;AAEtC,YAAM,SAAS,IAAI,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK;AAC3D,eACC;AAAA,QAAC;AAAA;AAAA,UACA,UAAU,iBAAiB,MAAM,IAAI;AAAA,UACrC,MAAM,MAAM;AAAA,UACZ,OAAO,MAAM;AAAA,UACb,eAAe,MAAM;AAAA,UACrB,MAAM,MAAM;AAAA,UACZ,YAAY,MAAM,MAAM,UAAU,EAAE;AAAA,UACpC;AAAA,UACA,SAAS;AAAA;AAAA,MACV;AAAA,IAEF;AAEA,WACC,iCACC;AAAA,0BAAC,gBAAa,aAAa,OAAO,OAAO,UAAU,YAAY,OAAO;AAAA,MACrE;AAAA,OACF;AAAA,EAEF;AAAA,EAES,mBAA8C;AACtD,WAAO,CAAC,oBAAoB,CAAC;AAAA,EAC9B;AAAA,EAES,SACR,OACA,EAAE,QAAQ,UAAU,QAAQ,QAAQ,aAAa,GAChD;AACD,UAAM,mBAAmB,aAAa,MAAM,IAAI,aAAa,MAAM;AACnE,UAAM,mBAAmB,aAAa,MAAM,IAAI,aAAa,MAAM;AACnE,UAAM,gBAAgB,aAAa,MAAM,QAAQ,aAAa,MAAM;AAGpE,QAAI,YAAY,mBAAmB;AACnC,QAAI,aAAa,mBAAmB,iBAAiB;AACrD,QAAI,cAAc;AAClB,QAAI,cAAc;AAElB,UAAM,MAAM;AAEZ,QAAI,MAAM,MAAM,KAAK,KAAK,GAAG;AAC5B,UAAI,OAAO,KAAK,IAAI,KAAK,IAAI,SAAS,GAAG,GAAG;AAC5C,UAAI,OAAO,KAAK,IAAI,KAAK,IAAI,SAAS,GAAG,GAAG;AAE5C,UAAI,OAAO,OAAO,SAAS,IAAK,QAAO;AACvC,UAAI,SAAS,OAAO,OAAO,IAAK,QAAO;AAEvC,YAAM,oBAAoB,qBAAqB,KAAK,QAAQ;AAAA,QAC3D,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG,MAAM;AAAA,UACT,GAAG,OAAO,MAAM,MAAM;AAAA,UACtB,GAAG,OAAO,MAAM,MAAM;AAAA,QACvB;AAAA,MACD,CAAC;AAED,YAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,SAAS,GAAG,kBAAkB,CAAC,IAAI,KAAK,KAAK,SAAS;AACtF,YAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,SAAS,GAAG,kBAAkB,CAAC,IAAI,KAAK,KAAK,SAAS;AACtF,oBAAc,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AAClD,oBAAc,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AAElD,kBAAY;AACZ,kBAAY;AAAA,IACb;AAEA,UAAM,UAAU,YAAY,MAAM,MAAM;AACxC,UAAM,UAAU,YAAY,MAAM,MAAM;AAExC,UAAM,SAAS,IAAI,IAAI,GAAG,CAAC;AAI3B,QAAI,SAAS,GAAG;AACf,aAAO,KAAK;AAAA,IACb;AAEA,QAAI,WAAW,UAAU,WAAW,cAAc,WAAW,eAAe;AAC3E,aAAO,KAAK,SAAS,IAAI,cAAc,CAAC;AAAA,IACzC;AAIA,QAAI,SAAS,GAAG;AACf,aAAO,KAAK;AAAA,IACb;AAEA,QAAI,WAAW,SAAS,WAAW,cAAc,WAAW,aAAa;AACxE,aAAO,KAAK,SAAS,IAAI,cAAc,CAAC;AAAA,IACzC;AAEA,UAAM,EAAE,GAAG,EAAE,IAAI,OAAO,IAAI,MAAM,QAAQ,EAAE,IAAI,QAAQ;AAExD,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACN,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,QAChC,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,QAChC,OAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAAA,EAES,eAAe,OAAmB;AAC1C,QAAI,CAAC,MAAM,MAAM,MAAM;AACtB,UAAI,MAAM,MAAM,OAAO;AAEtB,eAAO;AAAA,UACN,GAAG;AAAA,UACH,OAAO;AAAA,YACN,GAAG,MAAM;AAAA,YACT,OAAO;AAAA,UACR;AAAA,QACD;AAAA,MACD,OAAO;AAEN;AAAA,MACD;AAAA,IACD;AAEA,UAAM,qBAAqB,MAAM,MAAM,IAAI,MAAM,MAAM;AACvD,UAAM,qBAAqB,qBAAqB,KAAK,QAAQ,KAAK,EAAE;AAEpE,QAAI,QAAuB;AAE3B,QAAI,qBAAqB,oBAAoB;AAC5C,cAAQ,qBAAqB;AAAA,IAC9B,OAAO;AACN,UAAI,MAAM,MAAM,OAAO;AACtB,gBAAQ;AAAA,MACT;AAAA,IACD;AAEA,QAAI,UAAU,MAAM;AACnB,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG,MAAM;AAAA;AAAA,UAET,OAAO,QAAQ,MAAM,MAAM;AAAA,QAC5B;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAES,eAAe,MAAkB,MAAkB;AAC3D,UAAM,WAAW,KAAK,MAAM;AAC5B,UAAM,WAAW,KAAK,MAAM;AAG5B,QACC,aAAa,YACb,KAAK,MAAM,SAAS,KAAK,MAAM,QAC/B,KAAK,MAAM,SAAS,KAAK,MAAM,MAC9B;AACD;AAAA,IACD;AAGA,QAAI,YAAY,CAAC,UAAU;AAC1B,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG,KAAK;AAAA,UACR,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAGA,UAAM,oBAAoB,KAAK,MAAM,IAAI,KAAK,MAAM;AACpD,UAAM,qBAAqB,KAAK,MAAM,IAAI,KAAK,MAAM;AACrD,UAAM,oBAAoB,KAAK,MAAM,QAAQ,KAAK,MAAM;AAGxD,UAAM,wBAAwB,qBAAqB,KAAK,QAAQ,IAAI;AAGpE,QAAI,CAAC,YAAY,YAAY,SAAS,WAAW,GAAG;AACnD,UAAI,YAAY,KAAK,IAAI,mBAAmB,sBAAsB,CAAC;AACnE,UAAI,YAAY,KAAK,IAAI,oBAAoB,sBAAsB,CAAC;AAEpE,YAAM,MAAM;AAGZ,UAAI,oBAAoB,OAAO,qBAAqB,KAAK;AACxD,oBAAY,KAAK,IAAI,WAAW,GAAG;AACnC,oBAAY,KAAK,IAAI,WAAW,GAAG;AACnC,oBAAY,KAAK,IAAI,WAAW,SAAS;AACzC,oBAAY,KAAK,IAAI,WAAW,SAAS;AAAA,MAC1C;AAGA,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG,KAAK;AAAA;AAAA,UAER,GAAG,YAAY,KAAK,MAAM;AAAA,UAC1B,GAAG,YAAY,KAAK,MAAM;AAAA,UAC1B,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAEA,QAAI,QAAuB;AAE3B,QAAI,sBAAsB,IAAI,oBAAoB;AACjD,cAAQ,sBAAsB,IAAI;AAAA,IACnC,OAAO;AACN,UAAI,mBAAmB;AACtB,gBAAQ;AAAA,MACT;AAAA,IACD;AAEA,QAAI,UAAU,MAAM;AACnB,YAAM,oBAAoB,KAAK,MAAM,IAAI,KAAK,MAAM;AACpD,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG,KAAK;AAAA;AAAA,UAER,OAAO,QAAQ,KAAK,MAAM;AAAA,UAC1B,GAAG,KAAK,IAAI,mBAAmB,sBAAsB,CAAC,IAAI,KAAK,MAAM;AAAA,QACtE;AAAA,MACD;AAAA,IACD;AAEA,QAAI,sBAAsB,IAAI,mBAAmB;AAChD,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG,KAAK;AAAA;AAAA,UAER,GAAG,sBAAsB,IAAI,KAAK,MAAM;AAAA,QACzC;AAAA,MACD;AAAA,IACD;AAAA,EAGD;AAAA,EAES,cAAc,OAAmB;AAGzC,QAAI,KAAK,OAAO,OAAO,QAAQ;AAC9B,cAAQ,MAAM,MAAM,KAAK;AAAA,QACxB,KAAK,aAAa;AACjB,iBAAO;AAAA,YACN,GAAG;AAAA,YACH,OAAO;AAAA,cACN,KAAK;AAAA,YACN;AAAA,UACD;AAAA,QACD;AAAA,QACA,KAAK,aAAa;AACjB,iBAAO;AAAA,YACN,GAAG;AAAA,YACH,OAAO;AAAA,cACN,KAAK;AAAA,YACN;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA;AAAA,EACD;AAAA,EACS,qBACR,YACA,UACA,GACkB;AAClB,WAAO;AAAA,MACN,GAAI,IAAI,MAAM,SAAS,QAAQ,WAAW;AAAA,MAC1C,GAAG,KAAK,WAAW,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,MAC/C,GAAG,KAAK,WAAW,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,MAC/C,OAAO,KAAK,WAAW,MAAM,OAAO,SAAS,MAAM,OAAO,CAAC;AAAA,IAC5D;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB,QAAgB,OAAmB;AAChE,QAAM,EAAE,MAAM,MAAM,MAAM,EAAE,IAAI,MAAM;AAEtC,MAAI,CAAC,MAAM;AACV,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACrB;AAEA,QAAM,UAAU,OAAO,YAAY,YAAY,KAAK;AAAA,IACnD,GAAG;AAAA,IACH,YAAY,cAAc,IAAI;AAAA,IAC9B,UAAU,iBAAiB,IAAI;AAAA,IAC/B,UAAU;AAAA;AAAA,EACX,CAAC;AAGD,QAAM,QAAQ;AAAA,IACb,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,EACL;AAEA,QAAM,WAAW,OAAO,YAAY,YAAY,MAAM;AAAA,IACrD,GAAG;AAAA,IACH,YAAY,cAAc,IAAI;AAAA,IAC9B,UAAU,iBAAiB,IAAI;AAAA,IAC/B,UAAU,QAAQ;AAAA,IAClB,UAAU,KAAK;AAAA;AAAA,MAEd;AAAA;AAAA,MAEA,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;AAAA;AAAA,MAEjC,KAAK,KAAK,IAAI,MAAM,MAAM,QAAQ,gBAAgB,CAAC;AAAA,IACpD;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,GAAG,SAAS,IAAI,gBAAgB;AAAA,IAChC,GAAG,SAAS,IAAI,gBAAgB;AAAA,EACjC;AACD;", "names": ["cx", "cy", "geometry"] }