@vervedoc/docx-editor-view 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docx-editor-view.js +13237 -0
- package/dist/docx-editor-view.js.map +1 -0
- package/dist/docx-editor-view.umd.cjs +113 -0
- package/dist/docx-editor-view.umd.cjs.map +1 -0
- package/dist/index.d.ts +1509 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx-editor-view.js","sources":["../../docx-editor-schema/dist/docx-editor-schema.js","../src/plugin-stubs.ts","../src/event/handlers/paste.ts","../src/cursor/CursorAgent.ts","../src/cursor/Cursor.ts","../src/control/CheckboxControl.ts","../src/control/radio/RadioControl.ts","../src/event/handlers/mousedown.ts","../src/event/handlers/mouseup.ts","../src/event/handlers/mouseleave.ts","../src/event/handlers/mousemove.ts","../src/event/handlers/keydown/backspace.ts","../src/event/handlers/keydown/delete.ts","../src/event/handlers/keydown/enter.ts","../src/event/handlers/keydown/left.ts","../src/event/handlers/keydown/right.ts","../src/event/handlers/keydown/tab.ts","../src/event/handlers/keydown/updown.ts","../src/event/handlers/keydown/index.ts","../src/event/handlers/input.ts","../src/event/handlers/cut.ts","../src/event/handlers/copy.ts","../src/event/handlers/drop.ts","../src/event/handlers/contextmenu.ts","../src/event/handlers/click.ts","../src/event/handlers/composition.ts","../src/event/handlers/drag.ts","../src/event/CanvasEvent.ts","../src/event/GlobalEvent.ts","../src/position/Position.ts","../../docx-editor-state/dist/docx-editor-state.js","../src/frame/Background.ts","../src/utils/separator.ts","../src/richtext/AbstractRichText.ts","../src/richtext/Highlight.ts","../src/richtext/ParagraphColor.ts","../src/frame/Margin.ts","../src/interactive/Search.ts","../src/richtext/Strikeout.ts","../src/richtext/Underline.ts","../src/particle/ImageParticle.ts","../src/particle/TextParticle.ts","../src/frame/PageNumber.ts","../src/observer/ScrollObserver.ts","../src/observer/SelectionObserver.ts","../src/particle/table/TableParticle.ts","../src/particle/table/TableTool.ts","../src/particle/HyperlinkParticle.ts","../src/frame/Header.ts","../src/particle/SuperscriptParticle.ts","../src/particle/SubscriptParticle.ts","../src/particle/SeparatorParticle.ts","../src/particle/PageBreakParticle.ts","../src/frame/Watermark.ts","../src/control/ControlSearch.ts","../src/control/Border.ts","../src/control/SelectControl.ts","../src/control/TextControl.ts","../src/control/date/DateControl.ts","../src/control/NumberControl.ts","../src/control/Control.ts","../src/particle/CheckboxParticle.ts","../src/particle/RadioParticle.ts","../src/particle/previewer/Previewer.ts","../src/observer/ImageObserver.ts","../src/zone/ZoneTip.ts","../src/zone/Zone.ts","../src/frame/Footer.ts","../src/particle/ListSymbolDrawer.ts","../src/particle/ListParticle.ts","../src/particle/LineBreakParticle.ts","../src/frame/Placeholder.ts","../src/interactive/Group.ts","../src/observer/MouseObserver.ts","../src/frame/LineNumber.ts","../src/frame/PageBorder.ts","../src/particle/table/TableOperate.ts","../src/interactive/Area.ts","../src/frame/Badge.ts","../src/draw/Draw.ts","../src/interactive/FloatingBar.ts","../src/plugin/Plugin.ts","../src/plugin/override/Override.ts","../src/plugin/register/Register.ts"],"sourcesContent":["var Xu = /* @__PURE__ */ ((u) => (u.EDIT = \"edit\", u.READONLY = \"readonly\", u.FORM = \"form\", u))(Xu || {}), vu = /* @__PURE__ */ ((u) => (u.CONTAIN = \"contain\", u.COVER = \"cover\", u))(vu || {}), Iu = /* @__PURE__ */ ((u) => (u.REPEAT = \"repeat\", u.NO_REPEAT = \"no-repeat\", u.REPEAT_X = \"repeat-x\", u.REPEAT_Y = \"repeat-y\", u))(Iu || {}), K = /* @__PURE__ */ ((u) => (u.IFRAME = \"iframe\", u.VIDEO = \"video\", u.AUDIO = \"audio\", u.CHART = \"chart\", u))(K || {}), $ = /* @__PURE__ */ ((u) => (u.HALF = \"half\", u.ONE_THIRD = \"one-third\", u.QUARTER = \"quarter\", u))($ || {}), G = /* @__PURE__ */ ((u) => (u.ARABIC = \"arabic\", u.CHINESE = \"chinese\", u))(G || {}), Cu = /* @__PURE__ */ ((u) => (u.INLINE = \"inline\", u.BLOCK = \"block\", u.SURROUND = \"surround\", u.FLOAT_TOP = \"float-top\", u.FLOAT_BOTTOM = \"float-bottom\", u))(Cu || {}), su = /* @__PURE__ */ ((u) => (u.BEFORE = \"before\", u.AFTER = \"after\", u.OUTER_BEFORE = \"outer-before\", u.OUTER_AFTER = \"outer-after\", u))(su || {}), Mu = /* @__PURE__ */ ((u) => (u.ROW = \"row\", u.COLUMN = \"column\", u))(Mu || {}), Y = /* @__PURE__ */ ((u) => (u.TEXT = \"text\", u.SELECT = \"select\", u.CHECKBOX = \"checkbox\", u.RADIO = \"radio\", u.DATE = \"date\", u.NUMBER = \"number\", u))(Y || {}), m = /* @__PURE__ */ ((u) => (u.PREFIX = \"prefix\", u.POSTFIX = \"postfix\", u.PRE_TEXT = \"preText\", u.POST_TEXT = \"postText\", u.PLACEHOLDER = \"placeholder\", u.VALUE = \"value\", u.CHECKBOX = \"checkbox\", u.RADIO = \"radio\", u))(m || {}), zu = /* @__PURE__ */ ((u) => (u.ROW_START = \"rowStart\", u.VALUE_START = \"valueStart\", u))(zu || {}), Wu = /* @__PURE__ */ ((u) => (u.ACTIVE = \"active\", u.INACTIVE = \"inactive\", u))(Wu || {}), ju = /* @__PURE__ */ ((u) => (u.COMPONENT = \"component\", u.MENU = \"menu\", u.MAIN = \"main\", u.FOOTER = \"footer\", u.CONTEXTMENU = \"contextmenu\", u.POPUP = \"popup\", u.CATALOG = \"catalog\", u.COMMENT = \"comment\", u))(ju || {}), Vu = /* @__PURE__ */ ((u) => (u.PAGE = \"page\", u.TABLE = \"table\", u))(Vu || {}), fu = /* @__PURE__ */ ((u) => (u.EDIT = \"edit\", u.CLEAN = \"clean\", u.READONLY = \"readonly\", u.FORM = \"form\", u.PRINT = \"print\", u.DESIGN = \"design\", u))(fu || {}), Yu = /* @__PURE__ */ ((u) => (u.HEADER = \"header\", u.MAIN = \"main\", u.FOOTER = \"footer\", u))(Yu || {}), Ou = /* @__PURE__ */ ((u) => (u.PAGING = \"paging\", u.CONTINUITY = \"continuity\", u))(Ou || {}), Lu = /* @__PURE__ */ ((u) => (u.VERTICAL = \"vertical\", u.HORIZONTAL = \"horizontal\", u))(Lu || {}), Ru = /* @__PURE__ */ ((u) => (u.BREAK_ALL = \"break-all\", u.BREAK_WORD = \"break-word\", u))(Ru || {}), bu = /* @__PURE__ */ ((u) => (u.SPEED = \"speed\", u.COMPATIBILITY = \"compatibility\", u))(bu || {}), f = /* @__PURE__ */ ((u) => (u.TEXT = \"text\", u.IMAGE = \"image\", u.TABLE = \"table\", u.HYPERLINK = \"hyperlink\", u.SUPERSCRIPT = \"superscript\", u.SUBSCRIPT = \"subscript\", u.SEPARATOR = \"separator\", u.PAGE_BREAK = \"pageBreak\", u.CONTROL = \"control\", u.AREA = \"area\", u.CHECKBOX = \"checkbox\", u.RADIO = \"radio\", u.LATEX = \"latex\", u.TAB = \"tab\", u.DATE = \"date\", u.BLOCK = \"block\", u.TITLE = \"title\", u.LIST = \"list\", u.PLACEHOLDER = \"placeholder\", u.FOOTNOTE_MARK = \"footnoteMark\", u.FOOTNOTE_CONTENT = \"footnoteContent\", u.FOOTNOTE_SEPARATOR = \"footnoteSeparator\", u.COLUMN_BREAK = \"columnBreak\", u.REVISION_INSERT = \"revisionInsert\", u.REVISION_DELETE = \"revisionDelete\", u))(f || {}), $u = /* @__PURE__ */ ((u) => (u.font = \"font\", u.size = \"size\", u.characterScale = \"characterScale\", u.width = \"width\", u.height = \"height\", u.bold = \"bold\", u.color = \"color\", u.highlight = \"highlight\", u.italic = \"italic\", u.underline = \"underline\", u.strikeout = \"strikeout\", u))($u || {}), Zu = /* @__PURE__ */ ((u) => (u[u.LEFT = 0] = \"LEFT\", u[u.CENTER = 1] = \"CENTER\", u[u.RIGHT = 2] = \"RIGHT\", u))(Zu || {}), qu = /* @__PURE__ */ ((u) => (u.Delete = \"Delete\", u.Backspace = \"Backspace\", u.Enter = \"Enter\", u.Left = \"ArrowLeft\", u.Right = \"ArrowRight\", u.Up = \"ArrowUp\", u.Down = \"ArrowDown\", u.ESC = \"Escape\", u.TAB = \"Tab\", u.META = \"Meta\", u.LEFT_BRACKET = \"[\", u.RIGHT_BRACKET = \"]\", u.COMMA = \",\", u.PERIOD = \".\", u.LEFT_ANGLE_BRACKET = \"<\", u.RIGHT_ANGLE_BRACKET = \">\", u.EQUAL = \"=\", u.MINUS = \"-\", u.PLUS = \"+\", u.BACKSLASH = \"\\\\\", u.A = \"a\", u.B = \"b\", u.C = \"c\", u.D = \"d\", u.E = \"e\", u.F = \"f\", u.G = \"g\", u.H = \"h\", u.I = \"i\", u.J = \"j\", u.K = \"k\", u.L = \"l\", u.M = \"m\", u.N = \"n\", u.O = \"o\", u.P = \"p\", u.Q = \"q\", u.R = \"r\", u.S = \"s\", u.T = \"t\", u.U = \"u\", u.V = \"v\", u.W = \"w\", u.X = \"x\", u.Y = \"y\", u.Z = \"z\", u.A_UPPERCASE = \"A\", u.B_UPPERCASE = \"B\", u.C_UPPERCASE = \"C\", u.D_UPPERCASE = \"D\", u.E_UPPERCASE = \"E\", u.F_UPPERCASE = \"F\", u.G_UPPERCASE = \"G\", u.H_UPPERCASE = \"H\", u.I_UPPERCASE = \"I\", u.J_UPPERCASE = \"J\", u.K_UPPERCASE = \"K\", u.L_UPPERCASE = \"L\", u.M_UPPERCASE = \"M\", u.N_UPPERCASE = \"N\", u.O_UPPERCASE = \"O\", u.P_UPPERCASE = \"P\", u.Q_UPPERCASE = \"Q\", u.R_UPPERCASE = \"R\", u.S_UPPERCASE = \"S\", u.T_UPPERCASE = \"T\", u.U_UPPERCASE = \"U\", u.V_UPPERCASE = \"V\", u.W_UPPERCASE = \"W\", u.X_UPPERCASE = \"X\", u.Y_UPPERCASE = \"Y\", u.Z_UPPERCASE = \"Z\", u.ZERO = \"0\", u.ONE = \"1\", u.TWO = \"2\", u.THREE = \"3\", u.FOUR = \"4\", u.FIVE = \"5\", u.SIX = \"6\", u.SEVEN = \"7\", u.EIGHT = \"8\", u.NINE = \"9\", u))(qu || {}), mu = /* @__PURE__ */ ((u) => (u.PAGE = \"page\", u.CONTINUITY = \"continuity\", u))(mu || {}), q = /* @__PURE__ */ ((u) => (u.UL = \"ul\", u.OL = \"ol\", u))(q || {}), b = /* @__PURE__ */ ((u) => (u.DISC = \"disc\", u.CIRCLE = \"circle\", u.SQUARE = \"square\", u.CHECKBOX = \"checkbox\", u.DIAMOND = \"diamond\", u.DASH = \"dash\", u.CHECK = \"check\", u.TRIANGLE = \"triangle\", u.STAR = \"star\", u.ARROW = \"arrow\", u.DIAMOND_SOLID = \"diamond-solid\", u.ANGLE = \"angle\", u.HOLLOW_CIRCLE = \"hollow-circle\", u.HOLLOW_SQUARE = \"hollow-square\", u.HEART_HOLLOW = \"heart-hollow\", u.HASH = \"hash\", u.TRIANGLE_SOLID = \"triangle-solid\", u.STAR_SOLID = \"star-solid\", u.HEART_SOLID = \"heart-solid\", u.FLOWER = \"flower\", u.ASTERISK = \"asterisk\", u.HOLLOW_DIAMOND = \"hollow-diamond\", u.HOLLOW_TRIANGLE = \"hollow-triangle\", u))(b || {}), Qu = /* @__PURE__ */ ((u) => (u.DECIMAL = \"decimal\", u.DECIMAL_DOT = \"decimal-dot\", u.DECIMAL_PAREN = \"decimal-paren\", u.DECIMAL_CIRCLE = \"decimal-circle\", u.DECIMAL_BRACKET = \"decimal-bracket\", u.CHINESE = \"chinese\", u.CHINESE_BRACKET = \"chinese-bracket\", u.UPPER_ALPHA = \"upper-alpha\", u.LOWER_ALPHA_DOT = \"lower-alpha-dot\", u))(Qu || {}), N = /* @__PURE__ */ ((u) => (u.DISC = \"disc\", u.CIRCLE = \"circle\", u.SQUARE = \"square\", u.CHECKBOX = \"checkbox\", u.DIAMOND = \"diamond\", u.DASH = \"dash\", u.CHECK = \"check\", u.DECIMAL = \"decimal\", u.DECIMAL_DOT = \"decimal-dot\", u.DECIMAL_PAREN = \"decimal-paren\", u.DECIMAL_CIRCLE = \"decimal-circle\", u.DECIMAL_BRACKET = \"decimal-bracket\", u.CHINESE = \"chinese\", u.CHINESE_BRACKET = \"chinese-bracket\", u.UPPER_ALPHA = \"upper-alpha\", u.LOWER_ALPHA_DOT = \"lower-alpha-dot\", u))(N || {}), Ju = /* @__PURE__ */ ((u) => (u.UP = \"top\", u.DOWN = \"down\", u.LEFT = \"left\", u.RIGHT = \"right\", u))(Ju || {}), P = /* @__PURE__ */ ((u) => (u.LEFT = \"left\", u.CENTER = \"center\", u.RIGHT = \"right\", u.ALIGNMENT = \"alignment\", u.JUSTIFY = \"justify\", u))(P || {}), Ku = /* @__PURE__ */ ((u) => (u.SOLID = \"solid\", u.DOUBLE = \"double\", u.DASHED = \"dashed\", u.DOTTED = \"dotted\", u.WAVY = \"wavy\", u))(Ku || {}), ue = /* @__PURE__ */ ((u) => (u.SOLID = \"solid\", u.DASHED = \"dashed\", u.DOTTED = \"dotted\", u))(ue || {}), S = /* @__PURE__ */ ((u) => (u.FIRST = \"first\", u.SECOND = \"second\", u.THIRD = \"third\", u.FOURTH = \"fourth\", u.FIFTH = \"fifth\", u.SIXTH = \"sixth\", u))(S || {}), du = /* @__PURE__ */ ((u) => (u.TOP = \"top\", u.MIDDLE = \"middle\", u.BOTTOM = \"bottom\", u))(du || {}), Su = /* @__PURE__ */ ((u) => (u.TEXT = \"text\", u.IMAGE = \"image\", u))(Su || {}), tu = /* @__PURE__ */ ((u) => (u.ALL = \"all\", u.EMPTY = \"empty\", u.EXTERNAL = \"external\", u.INTERNAL = \"internal\", u.DASH = \"dash\", u))(tu || {}), J = /* @__PURE__ */ ((u) => (u.TOP = \"top\", u.RIGHT = \"right\", u.BOTTOM = \"bottom\", u.LEFT = \"left\", u))(J || {}), ee = /* @__PURE__ */ ((u) => (u.FORWARD = \"forward\", u.BACK = \"back\", u))(ee || {}), te = /* @__PURE__ */ ((u) => (u.ROW = \"row\", u.COL = \"col\", u))(te || {});\nconst De = \"1.0.0\", re = {\n version: De\n}, vt = \"1.0.0\", It = String(re.version), Ot = \"editor-component\", ne = \"ce\", Lt = `${ne}-clipboard`, lu = {\n print: {\n imagePreviewerDisabled: !1\n },\n readonly: {\n imagePreviewerDisabled: !1\n },\n form: {\n controlDeletableDisabled: !1\n }\n}, H = \"\", Rt = `\n`, bt = \"\t\", mt = \" \", Au = \" \", St = [\n \"·\",\n \"、\",\n \":\",\n \":\",\n \",\",\n \",\",\n \".\",\n \"。\",\n \";\",\n \";\",\n \"?\",\n \"?\",\n \"!\",\n \"!\"\n], Nt = {\n [$.HALF]: 1 / 2,\n [$.ONE_THIRD]: 1 / 3,\n [$.QUARTER]: 1 / 4\n}, le = {\n ENGLISH: \"A-Za-z\",\n SPANISH: \"A-Za-zÁÉÍÓÚáéíóúÑñÜü\",\n FRENCH: \"A-Za-zÀÂÇàâçÉéÈèÊêËëÎîÏïÔôÙùÛûŸÿ\",\n GERMAN: \"A-Za-zÄäÖöÜüß\",\n RUSSIAN: \"А-Яа-яЁё\",\n PORTUGUESE: \"A-Za-zÁÉÍÓÚáéíóúÃÕãõÇç\",\n ITALIAN: \"A-Za-zÀàÈèÉéÌìÍíÎîÓóÒòÙù\",\n DUTCH: \"A-Za-zÀàÁáÂâÄäÈèÉéÊêËëÌìÍíÎîÏïÓóÒòÔôÖöÙùÛûÜü\",\n SWEDISH: \"A-Za-zÅåÄäÖö\",\n GREEK: \"ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω\"\n}, yt = \"日\", Pt = [\n \"bold\",\n \"color\",\n \"highlight\",\n \"font\",\n \"size\",\n \"characterScale\",\n \"italic\",\n \"underline\",\n \"strikeout\",\n \"textDecoration\"\n], uu = [\n \"rowFlex\",\n \"rowMargin\",\n \"paragraphColor\",\n \"paragraphIndentLeft\",\n \"paragraphFirstLineIndent\",\n \"paragraphSpacingBefore\",\n \"paragraphSpacingAfter\"\n], Ht = [\n \"type\",\n \"font\",\n \"size\",\n \"characterScale\",\n \"bold\",\n \"color\",\n \"italic\",\n \"highlight\",\n \"paragraphColor\",\n \"underline\",\n \"strikeout\",\n \"rowFlex\",\n \"url\",\n \"areaId\",\n \"hyperlinkId\",\n \"dateId\",\n \"dateFormat\",\n \"groupIds\",\n \"rowMargin\",\n \"textDecoration\",\n \"dashArray\",\n \"separatorType\",\n \"separatorLineWidth\",\n \"revisionId\",\n \"revisionType\",\n \"revisionAuthor\",\n \"revisionDate\"\n], oe = [\n \"type\",\n \"font\",\n \"size\",\n \"characterScale\",\n \"bold\",\n \"color\",\n \"italic\",\n \"highlight\",\n \"paragraphColor\",\n \"underline\",\n \"strikeout\",\n \"rowFlex\",\n \"rowMargin\",\n \"dashArray\",\n \"separatorType\",\n \"separatorLineWidth\",\n \"trList\",\n \"tableToolDisabled\",\n \"borderType\",\n \"borderColor\",\n \"borderWidth\",\n \"borderExternalWidth\",\n \"width\",\n \"height\",\n \"url\",\n \"colgroup\",\n \"valueList\",\n \"control\",\n \"checkbox\",\n \"radio\",\n \"dateFormat\",\n \"block\",\n \"level\",\n \"title\",\n \"listType\",\n \"listStyle\",\n \"listWrap\",\n \"groupIds\",\n \"conceptId\",\n \"imgDisplay\",\n \"imgFloatPosition\",\n \"imgToolDisabled\",\n \"textDecoration\",\n \"extension\",\n \"externalId\",\n \"areaId\",\n \"area\",\n \"paragraphIndentLeft\",\n \"paragraphFirstLineIndent\",\n \"paragraphSpacingBefore\",\n \"paragraphSpacingAfter\",\n \"revisionId\",\n \"revisionType\",\n \"revisionAuthor\",\n \"revisionDate\"\n], ie = [\n \"conceptId\",\n \"extension\",\n \"externalId\",\n \"verticalAlign\",\n \"backgroundColor\",\n \"borderTypes\",\n \"borderStyle\",\n \"slashTypes\",\n \"disabled\",\n \"deletable\"\n], Nu = [\n \"tdId\",\n \"trId\",\n \"tableId\"\n], yu = [\n \"level\",\n \"titleId\",\n \"title\"\n], ae = [\n \"listId\",\n \"listType\",\n \"listStyle\"\n], wt = [\n \"control\",\n \"controlId\",\n \"controlComponent\"\n], Pu = [\n \"font\",\n \"size\",\n \"bold\",\n \"highlight\",\n \"italic\",\n \"strikeout\"\n], Hu = [\"areaId\", \"area\"], wu = [\n ...Nu,\n ...yu,\n ...ae,\n ...Hu\n], nu = [\n f.TEXT,\n f.HYPERLINK,\n f.SUBSCRIPT,\n f.SUPERSCRIPT,\n f.CONTROL,\n f.DATE,\n f.PLACEHOLDER\n], _t = [\n f.IMAGE,\n f.LATEX\n], ce = [\n f.BLOCK,\n f.PAGE_BREAK,\n f.SEPARATOR,\n f.TABLE\n], se = [\"HR\", \"TABLE\", \"UL\", \"OL\"], kt = [\n f.TITLE,\n f.LIST\n], xt = 12, Fe = {\n width: 1,\n color: \"#000000\",\n dragWidth: 2,\n dragColor: \"#0000FF\",\n dragFloatImageDisabled: !1\n}, Ut = {\n PAGE_SCALE: \"pageScale\"\n}, Ee = {\n PAGE_NO: \"{pageNo}\",\n PAGE_COUNT: \"{pageCount}\"\n}, Ce = {\n bottom: 60,\n size: 12,\n font: \"Microsoft YaHei\",\n color: \"#000000\",\n rowFlex: P.CENTER,\n format: Ee.PAGE_NO,\n numberType: G.ARABIC,\n disabled: !1,\n startPageNo: 1,\n fromPageNo: 0,\n maxPageNo: null\n}, Gt = [\n { value: \"{pageNo}\", label: \"1, 2, 3 ...\", numberType: G.ARABIC },\n { value: \"- {pageNo} -\", label: \"- 1 -, - 2 -, - 3 - ...\", numberType: G.ARABIC },\n { value: \"— {pageNo} —\", label: \"— 1 —, — 2 —, — 3 — ...\", numberType: G.ARABIC },\n { value: \"第 {pageNo} 页\", label: \"第 1 页\", numberType: G.ARABIC },\n { value: \"第 {pageNo} 页 共 {pageCount} 页\", label: \"第 1 页 共 X 页\", numberType: G.ARABIC },\n { value: \"{pageNo} / {pageCount}\", label: \"1 / X\", numberType: G.ARABIC },\n { value: \"{pageNo} of {pageCount}\", label: \"1 of X\", numberType: G.ARABIC },\n { value: \"第{pageNo}页\", label: \"第一页\", numberType: G.CHINESE },\n { value: \"第{pageNo}页 共 {pageCount} 页\", label: \"第一页 共 X 页\", numberType: G.CHINESE },\n { value: \"{pageNo}\", label: \"I, II, III ...\", numberType: \"roman-upper\" },\n { value: \"{pageNo}\", label: \"i, ii, iii ...\", numberType: \"roman-lower\" },\n { value: \"{pageNo}\", label: \"①, ②, ③ ...\", numberType: \"circled-number\" },\n { value: \"{pageNo}\", label: \"一, 二, 三 ...\", numberType: \"chinese-number\" },\n { value: \"{pageNo}\", label: \"壹, 贰, 叁 ...\", numberType: \"chinese-formal-number\" },\n { value: \"{pageNo}\", label: \"A, B, C ...\", numberType: \"alphabet-upper\" },\n { value: \"{pageNo}\", label: \"a, b, c ...\", numberType: \"alphabet-lower\" }\n], Xt = [\n { label: \"宋体\", value: \"SimSun, serif\" },\n { label: \"楷体\", value: \"KaiTi, serif\" },\n { label: \"仿宋\", value: \"FangSong, serif\" },\n { label: \"黑体\", value: \"SimHei, sans-serif\" },\n { label: \"微软雅黑\", value: \"Microsoft YaHei, sans-serif\" },\n { label: \"微软正黑体\", value: \"Microsoft JhengHei, sans-serif\" },\n { label: \"华文新魏\", value: \"STXinwei, serif\" },\n { label: \"思源黑体\", value: \"Source Han Sans CN, sans-serif\" },\n { label: \"思源宋体\", value: \"Source Han Serif CN, serif\" },\n { label: \"Arial\", value: \"Arial, sans-serif\" },\n { label: \"Times New Roman\", value: \"Times New Roman, serif\" },\n { label: \"Segoe UI\", value: \"Segoe UI, sans-serif\" },\n { label: \"Courier New\", value: \"Courier New, monospace\" }\n], Mt = [\n { label: \"初号\", value: 42 },\n { label: \"小初\", value: 36 },\n { label: \"一号\", value: 26 },\n { label: \"小一\", value: 24 },\n { label: \"二号\", value: 22 },\n { label: \"小二\", value: 18 },\n { label: \"三号\", value: 16 },\n { label: \"小三\", value: 15 },\n { label: \"四号\", value: 14 },\n { label: \"小四\", value: 12 },\n { label: \"五号\", value: 10.5 },\n { label: \"小五\", value: 9 },\n { label: \"六号\", value: 7.5 },\n { label: \"小六\", value: 6.5 },\n { label: \"七号\", value: 5.5 },\n { label: \"八号\", value: 5 },\n { label: \"5\", value: 5 },\n { label: \"5.5\", value: 5.5 },\n { label: \"6\", value: 6 },\n { label: \"6.5\", value: 6.5 },\n { label: \"7\", value: 7 },\n { label: \"7.5\", value: 7.5 },\n { label: \"8\", value: 8 },\n { label: \"9\", value: 9 },\n { label: \"10\", value: 10 },\n { label: \"10.5\", value: 10.5 },\n { label: \"11\", value: 11 },\n { label: \"12\", value: 12 },\n { label: \"14\", value: 14 },\n { label: \"16\", value: 16 },\n { label: \"18\", value: 18 },\n { label: \"20\", value: 20 },\n { label: \"22\", value: 22 },\n { label: \"24\", value: 24 },\n { label: \"26\", value: 26 },\n { label: \"28\", value: 28 },\n { label: \"36\", value: 36 },\n { label: \"48\", value: 48 },\n { label: \"72\", value: 72 }\n], zt = /[0-9.]/, fe = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/, de = /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC6F(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDD75(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC2\\uDECE-\\uDEDB\\uDEE0-\\uDEE8]|\\uDD3C(?:\\u200D[\\u2640\\u2642]\\uFE0F?|\\uD83C[\\uDFFB-\\uDFFF])?|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g, pe = new RegExp(\n `${de.source}|${fe.source}`,\n \"g\"\n), Wt = /[、,。?!;:……「」“”‘’*()【】〔〕〖〗〘〙〚〛《》———﹝﹞–—\\\\/·.,!?;:`~<>()[\\]{}'\"|]/, pu = new RegExp(`^[${H}\n]`), Ae = {\n data: \"\",\n type: Su.TEXT,\n width: 0,\n height: 0,\n color: \"#AEB5C0\",\n opacity: 0.3,\n size: 200,\n font: \"Microsoft YaHei\",\n repeat: !1,\n gap: [10, 10],\n numberType: G.ARABIC\n}, he = {\n defaultFirstSize: 21,\n defaultSecondSize: 19,\n defaultThirdSize: 16,\n defaultFourthSize: 14,\n defaultFifthSize: 12,\n defaultSixthSize: 10\n}, ge = {\n [S.FIRST]: \"defaultFirstSize\",\n [S.SECOND]: \"defaultSecondSize\",\n [S.THIRD]: \"defaultThirdSize\",\n [S.FOURTH]: \"defaultFourthSize\",\n [S.FIFTH]: \"defaultFifthSize\",\n [S.SIXTH]: \"defaultSixthSize\"\n}, Fu = {\n [S.FIRST]: 1,\n [S.SECOND]: 2,\n [S.THIRD]: 3,\n [S.FOURTH]: 4,\n [S.FIFTH]: 5,\n [S.SIXTH]: 6\n}, Te = {\n H1: S.FIRST,\n H2: S.SECOND,\n H3: S.THIRD,\n H4: S.FOURTH,\n H5: S.FIFTH,\n H6: S.SIXTH\n}, Be = {\n [b.DISC]: \"•\",\n [b.CIRCLE]: \"◦\",\n [b.SQUARE]: \"▫︎\",\n [b.CHECKBOX]: \"☑️\",\n [b.DIAMOND]: \"◆\",\n [b.DASH]: \"—\",\n [b.CHECK]: \"✓\",\n [b.TRIANGLE]: \"▶\",\n [b.STAR]: \"★\",\n [b.ARROW]: \"▸\",\n [b.DIAMOND_SOLID]: \"♦\",\n [b.ANGLE]: \">\",\n [b.HOLLOW_CIRCLE]: \"○\",\n [b.HOLLOW_SQUARE]: \"□\",\n [b.HEART_HOLLOW]: \"♡\",\n [b.HASH]: \"#\",\n [b.TRIANGLE_SOLID]: \"▲\",\n [b.STAR_SOLID]: \"☆\",\n [b.HEART_SOLID]: \"♥\",\n [b.FLOWER]: \"✿\",\n [b.ASTERISK]: \"*\",\n [b.HOLLOW_DIAMOND]: \"◇\",\n [b.HOLLOW_TRIANGLE]: \"▷\"\n}, ve = {\n [q.OL]: \"ol\",\n [q.UL]: \"ul\"\n}, Ie = {\n [N.DISC]: \"disc\",\n [N.CIRCLE]: \"circle\",\n [N.SQUARE]: \"square\",\n [N.DECIMAL]: \"decimal\",\n [N.DECIMAL_DOT]: \"decimal\",\n [N.DECIMAL_PAREN]: \"decimal\",\n [N.DECIMAL_CIRCLE]: \"decimal\",\n [N.DECIMAL_BRACKET]: \"decimal\",\n [N.CHINESE]: \"decimal\",\n [N.CHINESE_BRACKET]: \"decimal\",\n [N.UPPER_ALPHA]: \"upper-alpha\",\n [N.LOWER_ALPHA_DOT]: \"lower-alpha\",\n [N.CHECKBOX]: \"checkbox\",\n [N.DIAMOND]: \"disc\",\n [N.DASH]: \"disc\",\n [N.CHECK]: \"disc\"\n}, Oe = {\n data: \"\",\n color: \"#DCDFE6\",\n opacity: 1,\n size: 16,\n font: \"Microsoft YaHei\"\n}, Le = {\n color: \"#FFFFFF\",\n image: \"\",\n size: vu.COVER,\n repeat: Iu.NO_REPEAT,\n applyPageNumbers: []\n}, Re = {\n top: 0,\n left: 5\n}, be = {\n width: 14,\n height: 14,\n gap: 5,\n lineWidth: 1,\n fillStyle: \"#5175f4\",\n strokeStyle: \"#ffffff\",\n verticalAlign: du.BOTTOM\n}, me = {\n placeholderColor: \"#9c9b9b\",\n bracketColor: \"#000000\",\n prefix: \"{\",\n postfix: \"}\",\n borderWidth: 1,\n borderColor: \"#000000\",\n activeBackgroundColor: \"\",\n disabledBackgroundColor: \"\",\n existValueBackgroundColor: \"\",\n noValueBackgroundColor: \"\"\n}, Se = {\n bottom: 30,\n inactiveAlpha: 1,\n maxHeightRadio: $.HALF,\n disabled: !1,\n editable: !0\n}, Ne = {\n opacity: 0.35,\n backgroundColor: \"#F8C4C4\",\n activeOpacity: 0.35,\n activeBackgroundColor: \"#F8C4C4\",\n disabled: !1,\n deletable: !0\n}, ye = {\n top: 30,\n inactiveAlpha: 1,\n maxHeightRadio: $.HALF,\n disabled: !1,\n editable: !0\n}, Pe = {\n disabled: !0,\n color: \"#CCCCCC\",\n lineWidth: 1.5\n}, He = {\n color: \"#000000\",\n lineWidth: 1,\n padding: [0, 5, 0, 5],\n disabled: !0\n}, we = {\n font: \"Microsoft YaHei\",\n fontSize: 12,\n lineDash: [3, 1],\n disabled: !0\n}, _e = {\n width: 14,\n height: 14,\n gap: 5,\n lineWidth: 1,\n fillStyle: \"#5175f4\",\n strokeStyle: \"#000000\",\n verticalAlign: du.BOTTOM\n}, ke = {\n lineWidth: 1,\n strokeStyle: \"#000000\"\n}, xe = {\n tdPadding: [0, 0, 0, 0],\n defaultTrHeight: 6,\n defaultTrMinHeight: 6,\n defaultColMinWidth: 40,\n defaultBorderColor: \"#000000\"\n}, Ue = {\n size: 12,\n font: \"Microsoft YaHei\",\n color: \"#000000\",\n disabled: !0,\n right: 20,\n type: mu.CONTINUITY\n}, Ge = {\n tipDisabled: !0\n};\nfunction _u(u) {\n return u && u.__esModule && Object.prototype.hasOwnProperty.call(u, \"default\") ? u.default : u;\n}\nvar Xe = function u(e, n) {\n if (e === n) return !0;\n if (e && n && typeof e == \"object\" && typeof n == \"object\") {\n if (e.constructor !== n.constructor) return !1;\n var r, o, c;\n if (Array.isArray(e)) {\n if (r = e.length, r != n.length) return !1;\n for (o = r; o-- !== 0; )\n if (!u(e[o], n[o])) return !1;\n return !0;\n }\n if (e.constructor === RegExp) return e.source === n.source && e.flags === n.flags;\n if (e.valueOf !== Object.prototype.valueOf) return e.valueOf() === n.valueOf();\n if (e.toString !== Object.prototype.toString) return e.toString() === n.toString();\n if (c = Object.keys(e), r = c.length, r !== Object.keys(n).length) return !1;\n for (o = r; o-- !== 0; )\n if (!Object.prototype.hasOwnProperty.call(n, c[o])) return !1;\n for (o = r; o-- !== 0; ) {\n var l = c[o];\n if (!u(e[l], n[l])) return !1;\n }\n return !0;\n }\n return e !== e && n !== n;\n};\nconst Me = /* @__PURE__ */ _u(Xe);\nvar ze = We;\nfunction Z(u) {\n return u instanceof Buffer ? Buffer.from(u) : new u.constructor(u.buffer.slice(), u.byteOffset, u.length);\n}\nfunction We(u) {\n if (u = u || {}, u.circles) return je(u);\n const e = /* @__PURE__ */ new Map();\n if (e.set(Date, (l) => new Date(l)), e.set(Map, (l, D) => new Map(r(Array.from(l), D))), e.set(Set, (l, D) => new Set(r(Array.from(l), D))), u.constructorHandlers)\n for (const l of u.constructorHandlers)\n e.set(l[0], l[1]);\n let n = null;\n return u.proto ? c : o;\n function r(l, D) {\n const i = Object.keys(l), t = new Array(i.length);\n for (let a = 0; a < i.length; a++) {\n const s = i[a], F = l[s];\n typeof F != \"object\" || F === null ? t[s] = F : F.constructor !== Object && (n = e.get(F.constructor)) ? t[s] = n(F, D) : ArrayBuffer.isView(F) ? t[s] = Z(F) : t[s] = D(F);\n }\n return t;\n }\n function o(l) {\n if (typeof l != \"object\" || l === null) return l;\n if (Array.isArray(l)) return r(l, o);\n if (l.constructor !== Object && (n = e.get(l.constructor)))\n return n(l, o);\n const D = {};\n for (const i in l) {\n if (Object.hasOwnProperty.call(l, i) === !1) continue;\n const t = l[i];\n typeof t != \"object\" || t === null ? D[i] = t : t.constructor !== Object && (n = e.get(t.constructor)) ? D[i] = n(t, o) : ArrayBuffer.isView(t) ? D[i] = Z(t) : D[i] = o(t);\n }\n return D;\n }\n function c(l) {\n if (typeof l != \"object\" || l === null) return l;\n if (Array.isArray(l)) return r(l, c);\n if (l.constructor !== Object && (n = e.get(l.constructor)))\n return n(l, c);\n const D = {};\n for (const i in l) {\n const t = l[i];\n typeof t != \"object\" || t === null ? D[i] = t : t.constructor !== Object && (n = e.get(t.constructor)) ? D[i] = n(t, c) : ArrayBuffer.isView(t) ? D[i] = Z(t) : D[i] = c(t);\n }\n return D;\n }\n}\nfunction je(u) {\n const e = [], n = [], r = /* @__PURE__ */ new Map();\n if (r.set(Date, (i) => new Date(i)), r.set(Map, (i, t) => new Map(c(Array.from(i), t))), r.set(Set, (i, t) => new Set(c(Array.from(i), t))), u.constructorHandlers)\n for (const i of u.constructorHandlers)\n r.set(i[0], i[1]);\n let o = null;\n return u.proto ? D : l;\n function c(i, t) {\n const a = Object.keys(i), s = new Array(a.length);\n for (let F = 0; F < a.length; F++) {\n const E = a[F], C = i[E];\n if (typeof C != \"object\" || C === null)\n s[E] = C;\n else if (C.constructor !== Object && (o = r.get(C.constructor)))\n s[E] = o(C, t);\n else if (ArrayBuffer.isView(C))\n s[E] = Z(C);\n else {\n const A = e.indexOf(C);\n A !== -1 ? s[E] = n[A] : s[E] = t(C);\n }\n }\n return s;\n }\n function l(i) {\n if (typeof i != \"object\" || i === null) return i;\n if (Array.isArray(i)) return c(i, l);\n if (i.constructor !== Object && (o = r.get(i.constructor)))\n return o(i, l);\n const t = {};\n e.push(i), n.push(t);\n for (const a in i) {\n if (Object.hasOwnProperty.call(i, a) === !1) continue;\n const s = i[a];\n if (typeof s != \"object\" || s === null)\n t[a] = s;\n else if (s.constructor !== Object && (o = r.get(s.constructor)))\n t[a] = o(s, l);\n else if (ArrayBuffer.isView(s))\n t[a] = Z(s);\n else {\n const F = e.indexOf(s);\n F !== -1 ? t[a] = n[F] : t[a] = l(s);\n }\n }\n return e.pop(), n.pop(), t;\n }\n function D(i) {\n if (typeof i != \"object\" || i === null) return i;\n if (Array.isArray(i)) return c(i, D);\n if (i.constructor !== Object && (o = r.get(i.constructor)))\n return o(i, D);\n const t = {};\n e.push(i), n.push(t);\n for (const a in i) {\n const s = i[a];\n if (typeof s != \"object\" || s === null)\n t[a] = s;\n else if (s.constructor !== Object && (o = r.get(s.constructor)))\n t[a] = o(s, D);\n else if (ArrayBuffer.isView(s))\n t[a] = Z(s);\n else {\n const F = e.indexOf(s);\n F !== -1 ? t[a] = n[F] : t[a] = D(s);\n }\n }\n return e.pop(), n.pop(), t;\n }\n}\nconst Ve = /* @__PURE__ */ _u(ze);\nvar Ye = $e;\nfunction $e() {\n for (var u = [].slice.call(arguments), e, n = u.length; e = u[n - 1], n--; )\n if (!e || typeof e != \"object\" && typeof e != \"function\")\n throw new Error(\"expected object, got \" + e);\n for (var r = u[0], o = u.slice(1), c = o.length, n = 0; n < c; n++) {\n var l = o[n];\n for (var D in l)\n r[D] = l[D];\n }\n return r;\n}\nvar Ze = qe;\nfunction qe(u, e) {\n var n = {};\n typeof e == \"string\" && (e = [].slice.call(arguments, 1));\n for (var r = e.length, o = 0; o < r; o++) {\n var c = e[o];\n c in u && (n[c] = u[c]);\n }\n return n;\n}\nvar Qe = Je;\nfunction Je(u, e) {\n var n = {};\n typeof e == \"string\" && (e = [].slice.call(arguments, 1));\n for (var r in u)\n (!u.hasOwnProperty || u.hasOwnProperty(r)) && e.indexOf(r) === -1 && (n[r] = u[r]);\n return n;\n}\nvar jt = Ke;\nfunction Ke(u, e, n) {\n var r = null, o = null, c = function() {\n r && (clearTimeout(r), o = null, r = null);\n }, l = function() {\n var i = o;\n c(), i && i();\n }, D = function() {\n if (!e)\n return u.apply(this, arguments);\n var i = this, t = arguments, a = n && !r;\n if (c(), o = function() {\n u.apply(i, t);\n }, r = setTimeout(function() {\n if (r = null, !a) {\n var s = o;\n return o = null, s();\n }\n }, e), a)\n return o();\n };\n return D.cancel = c, D.flush = l, D;\n}\nvar Vt = ut;\nfunction ut(u, e, n) {\n var r = null, o = null, c = n && n.leading, l = n && n.trailing;\n c == null && (c = !0), l == null && (l = !c), c == !0 && (l = !1);\n var D = function() {\n r && (clearTimeout(r), r = null);\n }, i = function() {\n var a = o;\n D(), a && a();\n }, t = function() {\n var a = c && !r, s = this, F = arguments;\n if (o = function() {\n return u.apply(s, F);\n }, r || (r = setTimeout(function() {\n if (r = null, l)\n return o();\n }, e)), a)\n return a = !1, o();\n };\n return t.cancel = D, t.flush = i, t;\n}\nlet et = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\", X = (u = 21) => {\n let e = \"\", n = crypto.getRandomValues(new Uint8Array(u |= 0));\n for (; u--; )\n e += et[n[u] & 63];\n return e;\n};\nconst tt = Ve();\nfunction Eu(u, e) {\n if (!u || typeof u != \"object\")\n return u;\n let n = {};\n return Array.isArray(u) ? n = u.map((r) => Eu(r, e)) : Object.keys(u).forEach((r) => {\n if (!e.includes(r))\n return n[r] = Eu(u[r], e);\n }), n;\n}\nfunction ku(u) {\n return typeof structuredClone == \"function\" ? structuredClone(u) : tt(u);\n}\nfunction ou(u) {\n return u && u.nodeType === 1 && u.tagName.toLowerCase() === \"body\";\n}\nfunction Yt(u, e, n) {\n if (u && !ou(u))\n for (u = n ? u : u.parentNode; u; ) {\n if (!e || e(u) || ou(u))\n return e && !e(u) && ou(u) ? null : u;\n u = u.parentNode;\n }\n return null;\n}\nfunction j(u) {\n const e = [];\n if (Intl.Segmenter) {\n const r = new Intl.Segmenter().segment(u);\n for (const { segment: o } of r)\n e.push(o);\n } else {\n const n = /* @__PURE__ */ new Map();\n for (const o of u.matchAll(pe))\n n.set(o.index, o[0]);\n let r = 0;\n for (; r < u.length; ) {\n const o = n.get(r);\n o ? (e.push(o), r += o.length) : (e.push(u[r]), r++);\n }\n }\n return e;\n}\nfunction $t(u, e) {\n const n = document.createElement(\"a\");\n n.href = u, n.download = e, n.click();\n}\nfunction Zt(u, e) {\n return Dt(3, u, e);\n}\nfunction Dt(u, e, n) {\n let r = 0, o = 0;\n const c = function(l) {\n r = (/* @__PURE__ */ new Date()).getTime() - o < 300 ? r + 1 : 0, o = (/* @__PURE__ */ new Date()).getTime(), r >= u - 1 && (n(l), r = 0);\n };\n return e.addEventListener(\"click\", c), () => {\n e.removeEventListener(\"click\", c);\n };\n}\nfunction hu(u) {\n return Object.prototype.toString.call(u) === \"[object Object]\";\n}\nfunction gu(u) {\n return Array.isArray(u);\n}\nfunction qt(u) {\n return Object.prototype.toString.call(u) === \"[object Number]\";\n}\nfunction Qt(u) {\n return Object.prototype.toString.call(u) === \"[object String]\";\n}\nfunction Jt(u, e) {\n return hu(u) && hu(e) ? Ye(e, u) : (gu(u) && gu(e) && e.push(...u), e);\n}\nfunction Kt(u) {\n queueMicrotask(() => {\n u();\n });\n}\nfunction uD(u) {\n const e = [\n \"零\",\n \"一\",\n \"二\",\n \"三\",\n \"四\",\n \"五\",\n \"六\",\n \"七\",\n \"八\",\n \"九\"\n ], n = [\n \"\",\n \"十\",\n \"百\",\n \"千\",\n \"万\",\n \"十\",\n \"百\",\n \"千\",\n \"亿\",\n \"十\",\n \"百\",\n \"千\",\n \"万\",\n \"十\",\n \"百\",\n \"千\",\n \"亿\"\n ];\n if (!u || isNaN(u)) return \"零\";\n const r = u.toString().split(\"\");\n let o = \"\";\n for (let c = 0; c < r.length; c++) {\n const l = r.length - 1 - c;\n o = `${n[c]}${o}`, o = `${e[Number(r[l])]}${o}`;\n }\n return o = o.replace(/零(千|百|十)/g, \"零\").replace(/十零/g, \"十\"), o = o.replace(/零+/g, \"零\"), o = o.replace(/零亿/g, \"亿\").replace(/零万/g, \"万\"), o = o.replace(/亿万/g, \"亿\"), o = o.replace(/零+$/, \"\"), o = o.replace(/^一十/g, \"十\"), o;\n}\nfunction iu(u, e, n) {\n for (let r = 0; r < u.length; r++) {\n const o = u[r], c = e[o];\n c !== void 0 ? n[o] = c : delete n[o];\n }\n}\nfunction Du(u, e) {\n return Ze(u, e);\n}\nfunction rt(u, e) {\n return Qe(u, e);\n}\nfunction eD(u) {\n const n = new TextEncoder().encode(u), r = Array.from(n, (c) => String.fromCharCode(c));\n return window.btoa(r.join(\"\"));\n}\nfunction tD(u) {\n let e = u.parentElement;\n for (; e; ) {\n const r = window.getComputedStyle(e).getPropertyValue(\"overflow-y\");\n if (e.scrollHeight > e.clientHeight && (r === \"auto\" || r === \"scroll\"))\n return e;\n e = e.parentElement;\n }\n return document.documentElement;\n}\nfunction DD(u, e) {\n const n = u.x, r = u.x + u.width, o = u.y, c = u.y + u.height, l = e.x, D = e.x + e.width, i = e.y, t = e.y + e.height;\n return !(n > D || r < l || o > t || c < i);\n}\nfunction rD(u) {\n return u == null;\n}\nfunction nD(u) {\n return u.replace(/\\r\\n|\\r/g, `\n`);\n}\nfunction nt(u) {\n return u !== null && typeof u == \"object\" && \"value\" in u && typeof u.value == \"string\";\n}\nfunction lD(u) {\n return Array.isArray(u) && u.every(nt);\n}\nconst lt = typeof navigator < \"u\" && /Mac OS X/.test(navigator.userAgent), oD = typeof navigator < \"u\" && /iPad|iPhone/.test(navigator.userAgent), iD = typeof navigator < \"u\" && /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\nfunction aD(u) {\n return lt ? u.metaKey : u.ctrlKey;\n}\nfunction cD(u, e) {\n return JSON.stringify(u);\n}\nfunction ot(u = {}) {\n var h, O, M;\n const e = {\n ...xe,\n ...u.table\n }, n = {\n ...ye,\n ...u.header\n }, r = {\n ...Se,\n ...u.footer\n }, o = {\n ...Ce,\n ...u.pageNumber\n }, c = {\n ...Ae,\n ...u.watermark\n }, l = {\n ...me,\n ...u.control\n }, D = {\n ...be,\n ...u.checkbox\n }, i = {\n ..._e,\n ...u.radio\n }, t = {\n ...Fe,\n ...u.cursor\n }, a = {\n ...he,\n ...u.title\n }, s = {\n ...Oe,\n ...u.placeholder\n }, F = {\n ...Ne,\n ...u.group\n }, E = {\n ...we,\n ...u.pageBreak\n }, C = {\n ...Ge,\n ...u.zone\n }, A = {\n ...Le,\n ...u.background\n }, g = {\n ...Pe,\n ...u.lineBreak\n }, R = {\n ...ke,\n ...u.separator\n }, I = {\n ...Ue,\n ...u.lineNumber\n }, y = {\n ...He,\n ...u.pageBorder\n }, w = {\n ...Re,\n ...u.badge\n }, p = {\n print: {\n ...lu.print,\n ...(h = u.modeRule) == null ? void 0 : h.print\n },\n readonly: {\n ...lu.readonly,\n ...(O = u.modeRule) == null ? void 0 : O.readonly\n },\n form: {\n ...lu.form,\n ...(M = u.modeRule) == null ? void 0 : M.form\n }\n }, d = {\n enabled: !0,\n ...u.floatingBar\n };\n return {\n mode: fu.EDIT,\n locale: \"zhCN\",\n defaultType: \"TEXT\",\n defaultColor: \"#000000\",\n defaultFont: \"SimSun, serif\",\n defaultSize: 14,\n minSize: 5,\n maxSize: 72,\n defaultRowMargin: 1,\n defaultLineHeight: 1,\n defaultBasicRowMarginHeight: 8,\n defaultTabWidth: 32,\n width: 794,\n height: 1123,\n scale: 1,\n pageGap: 20,\n underlineColor: \"#000000\",\n strikeoutColor: \"#FF0000\",\n rangeAlpha: 0.6,\n rangeColor: \"#AECBFA\",\n rangeMinWidth: 5,\n searchMatchAlpha: 0.6,\n searchMatchColor: \"#FFFF00\",\n searchNavigateMatchColor: \"#AAD280\",\n highlightAlpha: 0.6,\n highlightMarginHeight: 8,\n resizerColor: \"#4182D9\",\n resizerSize: 5,\n marginIndicatorSize: 35,\n marginIndicatorColor: \"#BABABA\",\n marginIndicatorDisabled: !1,\n margins: [96, 120, 96, 120],\n pageMode: Ou.PAGING,\n renderMode: bu.SPEED,\n defaultHyperlinkColor: \"#0000FF\",\n paperDirection: Lu.VERTICAL,\n inactiveAlpha: 0.6,\n historyMaxRecordCount: 100,\n wordBreak: Ru.BREAK_WORD,\n printPixelRatio: 3,\n maskMargin: [0, 0, 0, 0],\n letterClass: [le.ENGLISH],\n shortcutDisableKeys: [],\n scrollContainerSelector: \"\",\n pageOuterSelectionDisable: !1,\n ...u,\n table: e,\n header: n,\n footer: r,\n pageNumber: o,\n watermark: c,\n control: l,\n checkbox: D,\n radio: i,\n cursor: t,\n title: a,\n placeholder: s,\n group: F,\n pageBreak: E,\n zone: C,\n background: A,\n lineBreak: g,\n separator: R,\n lineNumber: I,\n pageBorder: y,\n badge: w,\n modeRule: p,\n floatingBar: d,\n trackChanges: u.trackChanges ?? !1,\n revisionInsertColor: u.revisionInsertColor ?? \"#1a73e8\",\n revisionDeleteColor: u.revisionDeleteColor ?? \"#f56c6c\",\n annotationColor: u.annotationColor ?? \"#409eff\",\n revisionColor: u.revisionColor ?? \"#e60000\",\n revisionDisplayMode: u.revisionDisplayMode ?? \"all\",\n showCommentBalloons: u.showCommentBalloons ?? !0,\n showRevisionBalloons: u.showRevisionBalloons ?? !0\n };\n}\nconst it = [\"allow-scripts\", \"allow-same-origin\"];\nfunction Tu(u) {\n const e = [];\n for (let n = 0; n < u.length; n++) {\n const r = u[n], o = j(r.value);\n for (let c = 0; c < o.length; c++)\n e.push({ ...r, value: o[c] });\n }\n return e;\n}\nfunction Bu(u) {\n return gt(u).replace(/\\u200B/g, \"\").replace(/\\s+/g, \" \").trim();\n}\nfunction at(u) {\n return u || X();\n}\nfunction sD(u) {\n const e = [], n = (c) => {\n let l = 0;\n for (; l < c.length; ) {\n const D = c[l];\n if (!D) {\n l++;\n continue;\n }\n if (D.type === f.TITLE) {\n if (D.titleId && D.level) {\n const i = Bu(D.valueList || []);\n i && e.push({\n id: D.titleId,\n name: i,\n level: D.level,\n pageNo: 1,\n subCatalog: []\n });\n }\n l++;\n continue;\n }\n if (D.type === f.TABLE) {\n for (const i of D.trList || [])\n for (const t of i.tdList || [])\n n(t.value || []);\n l++;\n continue;\n }\n if (D.titleId && D.level) {\n const i = D.titleId, t = D.level, a = [];\n for (; l < c.length; ) {\n const F = c[l];\n if (!F || F.titleId !== i)\n break;\n a.push(F), l++;\n }\n const s = Bu(a);\n s && e.push({\n id: i,\n name: s,\n level: t,\n pageNo: 1,\n subCatalog: []\n });\n continue;\n }\n Array.isArray(D.valueList) && n(D.valueList), l++;\n }\n };\n if (n(u), !e.length) return null;\n const r = [], o = [];\n for (const c of e) {\n for (; o.length > 0 && Fu[o[o.length - 1].level] >= Fu[c.level]; )\n o.pop();\n o.length === 0 ? r.push(c) : o[o.length - 1].subCatalog.push(c), o.push(c);\n }\n return r;\n}\nfunction Q(u, e) {\n var i;\n const {\n isHandleFirstElement: n = !0,\n isForceCompensation: r = !1,\n editorOptions: o,\n laTexToSVG: c\n } = e, l = u[0];\n (r || n && (l == null ? void 0 : l.type) !== f.LIST && (l != null && l.type && l.type !== f.TEXT || !pu.test(l == null ? void 0 : l.value))) && u.unshift({\n value: H,\n rowFlex: l == null ? void 0 : l.rowFlex,\n listId: l == null ? void 0 : l.listId,\n listType: l == null ? void 0 : l.listType,\n listStyle: l == null ? void 0 : l.listStyle,\n listLevel: l == null ? void 0 : l.listLevel,\n listIndent: l == null ? void 0 : l.listIndent,\n listHanging: l == null ? void 0 : l.listHanging,\n paragraphIndentLeft: l == null ? void 0 : l.paragraphIndentLeft,\n paragraphSpacingBefore: l == null ? void 0 : l.paragraphSpacingBefore,\n paragraphSpacingAfter: l == null ? void 0 : l.paragraphSpacingAfter,\n paragraphFirstLineIndent: l == null ? void 0 : l.paragraphFirstLineIndent\n });\n let D = 0;\n for (; D < u.length; ) {\n let t = u[D];\n if (t.type === f.TITLE) {\n u.splice(D, 1);\n const a = t.valueList || [];\n if (Q(a, {\n ...e,\n isHandleFirstElement: !1,\n isForceCompensation: !1\n }), a.length) {\n const s = at(t.titleId), F = o.title;\n for (let E = 0; E < a.length; E++) {\n const C = a[E];\n C.title = t.title, t.level && (C.titleId = s, C.level = t.level), Et(C) && (C.size || (C.size = F[ge[C.level]]), C.bold === void 0 && (C.bold = !0)), u.splice(D, 0, C), D++;\n }\n }\n D--;\n } else if (t.type === f.LIST) {\n u.splice(D, 1);\n const a = t.valueList || [];\n if (Q(a, {\n ...e,\n isHandleFirstElement: !0,\n isForceCompensation: !1\n }), a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n E.listId = s, E.listType = t.listType, E.listStyle = t.listStyle, u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.AREA) {\n u.splice(D, 1);\n const a = (t == null ? void 0 : t.valueList) || [];\n if (Q(a, {\n ...e,\n isHandleFirstElement: !0,\n isForceCompensation: !0\n }), a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n if (E.areaId = t.areaId || s, E.area = t.area, E.areaIndex = F, E.type === f.TABLE) {\n const C = E.trList;\n for (let A = 0; A < C.length; A++) {\n const g = C[A];\n for (let R = 0; R < g.tdList.length; R++) {\n const y = g.tdList[R].value;\n for (let w = 0; w < y.length; w++) {\n const p = y[w];\n p.areaId = t.areaId || s, p.area = t.area;\n }\n }\n }\n }\n u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.TABLE) {\n const a = t.id || X();\n if (t.id = a, t.trList) {\n const { defaultTrMinHeight: s } = o.table;\n for (let F = 0; F < t.trList.length; F++) {\n const E = t.trList[F], C = E.id || X();\n E.id = C, (!E.minHeight || E.minHeight < s) && (E.minHeight = s), E.height < E.minHeight && (E.height = E.minHeight);\n for (let A = 0; A < E.tdList.length; A++) {\n const g = E.tdList[A], R = g.id || X();\n g.id = R, Q(g.value, {\n ...e,\n isHandleFirstElement: !0,\n isForceCompensation: !0\n });\n for (let I = 0; I < g.value.length; I++) {\n const y = g.value[I];\n y.tdId = R, y.trId = C, y.tableId = a;\n }\n }\n }\n }\n } else if (t.type === f.HYPERLINK) {\n u.splice(D, 1);\n const a = Tu(t.valueList || []);\n if (a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n E.type = t.type, E.url = t.url, E.hyperlinkId = s, u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.DATE) {\n u.splice(D, 1);\n const a = Tu(t.valueList || []);\n if (a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n E.type = t.type, E.dateFormat = t.dateFormat, E.dateId = s, u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.CONTROL) {\n if (!t.control) {\n D++;\n continue;\n }\n const {\n prefix: a,\n postfix: s,\n preText: F,\n postText: E,\n value: C,\n placeholder: A,\n code: g,\n type: R,\n valueSets: I\n } = t.control, {\n editorOptions: {\n control: y,\n checkbox: w,\n radio: p\n }\n } = e, d = t.controlId || X();\n u.splice(D, 1);\n const h = Du(t, [\n ...wu,\n ...uu\n ]), O = Du(\n t.control,\n Pu\n ), M = {\n ...O,\n color: o.control.bracketColor\n }, k = j(a || y.prefix);\n for (let B = 0; B < k.length; B++) {\n const v = k[B];\n u.splice(D, 0, {\n ...h,\n ...M,\n controlId: d,\n value: v,\n type: t.type,\n control: t.control,\n controlComponent: m.PREFIX\n }), D++;\n }\n if (F) {\n const B = j(F);\n for (let v = 0; v < B.length; v++) {\n const T = B[v];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: T,\n type: t.type,\n control: t.control,\n controlComponent: m.PRE_TEXT\n }), D++;\n }\n }\n if (C && C.length || R === Y.CHECKBOX || R === Y.RADIO || R === Y.SELECT && g && (!C || !C.length)) {\n let B = C ? ku(C) : [];\n if (R === Y.CHECKBOX) {\n const v = g ? g.split(\",\") : [];\n if (Array.isArray(I) && I.length) {\n const T = B.reduce(\n (_, U) => _.concat(\n U.value.split(\"\").map((W) => ({ ...U, value: W }))\n ),\n []\n );\n let L = 0;\n for (let _ = 0; _ < I.length; _++) {\n const U = I[_];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: \"\",\n type: t.type,\n control: t.control,\n controlComponent: m.CHECKBOX,\n checkbox: {\n code: U.code,\n value: v.includes(U.code)\n }\n }), D++;\n const W = j(U.value);\n for (let V = 0; V < W.length; V++) {\n const eu = W[V], Gu = V === W.length - 1;\n u.splice(D, 0, {\n ...h,\n ...O,\n ...T[L],\n controlId: d,\n value: eu === `\n` ? H : eu,\n letterSpacing: Gu ? w.gap : 0,\n control: t.control,\n controlComponent: m.VALUE\n }), L++, D++;\n }\n }\n }\n } else if (R === Y.RADIO) {\n if (Array.isArray(I) && I.length) {\n const v = B.reduce(\n (L, _) => L.concat(\n _.value.split(\"\").map((U) => ({ ..._, value: U }))\n ),\n []\n );\n let T = 0;\n for (let L = 0; L < I.length; L++) {\n const _ = I[L];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: \"\",\n type: t.type,\n control: t.control,\n controlComponent: m.RADIO,\n radio: {\n code: _.code,\n value: g === _.code\n }\n }), D++;\n const U = j(_.value);\n for (let W = 0; W < U.length; W++) {\n const V = U[W], eu = W === U.length - 1;\n u.splice(D, 0, {\n ...h,\n ...O,\n ...v[T],\n controlId: d,\n value: V === `\n` ? H : V,\n letterSpacing: eu ? p.gap : 0,\n control: t.control,\n controlComponent: m.VALUE\n }), T++, D++;\n }\n }\n }\n } else {\n if ((!C || !C.length) && Array.isArray(I) && I.length) {\n const v = I.find((T) => T.code === g);\n v && (B = [\n {\n value: v.value\n }\n ]);\n }\n Q(B, {\n ...e,\n isHandleFirstElement: !1,\n isForceCompensation: !1\n });\n for (let v = 0; v < B.length; v++) {\n const T = B[v], L = T.value;\n u.splice(D, 0, {\n ...h,\n ...O,\n ...T,\n controlId: d,\n value: L === `\n` ? H : L,\n type: T.type || f.TEXT,\n control: t.control,\n controlComponent: m.VALUE\n }), D++;\n }\n }\n } else if (A) {\n const B = {\n ...O,\n color: o.control.placeholderColor\n }, v = j(A);\n for (let T = 0; T < v.length; T++) {\n const L = v[T];\n u.splice(D, 0, {\n ...h,\n ...B,\n controlId: d,\n value: L === `\n` ? H : L,\n type: t.type,\n control: t.control,\n controlComponent: m.PLACEHOLDER\n }), D++;\n }\n }\n if (E) {\n const B = j(E);\n for (let v = 0; v < B.length; v++) {\n const T = B[v];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: T,\n type: t.type,\n control: t.control,\n controlComponent: m.POST_TEXT\n }), D++;\n }\n }\n const z = j(s || y.postfix);\n for (let B = 0; B < z.length; B++) {\n const v = z[B];\n u.splice(D, 0, {\n ...h,\n ...M,\n controlId: d,\n value: v,\n type: t.type,\n control: t.control,\n controlComponent: m.POSTFIX\n }), D++;\n }\n D--;\n } else if ((!t.type || nu.includes(t.type) && t.type !== f.PLACEHOLDER) && ((i = t.value) == null ? void 0 : i.length) > 1) {\n u.splice(D, 1);\n const a = j(t.value);\n for (let s = 0; s < a.length; s++)\n u.splice(D + s, 0, { ...t, value: a[s] });\n t = u[D];\n }\n if ((t.value === `\n` || t.value == `\\r\n`) && (t.value = H), (t.type === f.IMAGE || t.type === f.BLOCK) && (t.id = t.id || X()), t.type === f.LATEX && c) {\n const { svg: a, width: s, height: F } = c(t.value);\n t.width = t.width || s, t.height = t.height || F, t.laTexSVG = a, t.id = t.id || X();\n }\n D++;\n }\n}\nfunction ct(u, e) {\n const n = Object.keys(u), r = Object.keys(e);\n if (n.length !== r.length) return !1;\n for (let o = 0; o < n.length; o++) {\n const c = n[o];\n if (c !== \"value\" && !(c === \"groupIds\" && Array.isArray(u[c]) && Array.isArray(e[c]) && Me(u[c], e[c])) && u[c] !== e[c])\n return !1;\n }\n return !0;\n}\nfunction au(u, e = {}) {\n const { extraPickAttrs: n } = e, r = [...oe];\n n && r.push(...n);\n const o = {\n value: u.value === H ? `\n` : u.value\n };\n return r.forEach((c) => {\n const l = u[c];\n l !== void 0 && (o[c] = l);\n }), o;\n}\nfunction x(u, e = {}) {\n const { extraPickAttrs: n, isClassifyArea: r = !1, isClone: o = !0 } = e, c = o ? ku(u) : u, l = [];\n let D = 0;\n for (; D < c.length; ) {\n let i = c[D];\n if (D === 0 && i.value === H && !i.listId && (!i.type || i.type === f.TEXT)) {\n const a = c[D + 1];\n a && uu.forEach((s) => {\n i[s] !== void 0 && a[s] === void 0 && (a[s] = i[s]);\n }), D++;\n continue;\n }\n if (i.areaId) {\n const a = i.areaId, s = i.area, F = [];\n for (; D < c.length; ) {\n const C = c[D];\n if (a !== C.areaId) {\n D--;\n break;\n }\n delete C.area, delete C.areaId, F.push(C), D++;\n }\n const E = x(F, e);\n if (r) {\n const C = {\n type: f.AREA,\n value: \"\",\n areaId: a,\n area: s\n };\n C.valueList = E, i = C;\n } else {\n l.splice(D, 0, ...E);\n continue;\n }\n } else if (i.titleId && i.level) {\n const a = i.titleId;\n if (a) {\n const s = i.level, F = {\n type: f.TITLE,\n title: i.title,\n titleId: a,\n value: \"\",\n level: s\n }, E = [];\n for (; D < c.length; ) {\n const C = c[D];\n if (a !== C.titleId) {\n D--;\n break;\n }\n delete C.level, delete C.title, E.push(C), D++;\n }\n F.valueList = x(E, e), i = F;\n }\n } else if (i.listId && i.listType) {\n const a = i.listId;\n if (a) {\n const s = i.listType, F = i.listStyle, E = {\n type: f.LIST,\n value: \"\",\n listId: a,\n listType: s,\n listStyle: F\n }, C = [];\n for (; D < c.length; ) {\n const A = c[D];\n if (a !== A.listId) {\n D--;\n break;\n }\n delete A.listType, delete A.listStyle, C.push(A), D++;\n }\n E.valueList = x(C, e), i = E;\n }\n } else if (i.type === f.TABLE) {\n if (i.pagingId) {\n let a = D + 1, s = 0;\n for (; a < c.length; ) {\n const F = c[a];\n if (F.pagingId === i.pagingId)\n i.height += F.height, i.trList.push(...F.trList), a++, s++;\n else\n break;\n }\n D += s;\n }\n if (i.trList)\n for (let a = 0; a < i.trList.length; a++) {\n const s = i.trList[a];\n delete s.id;\n for (let F = 0; F < s.tdList.length; F++) {\n const E = s.tdList[F], C = {\n colspan: E.colspan,\n rowspan: E.rowspan,\n value: x(E.value, {\n ...e,\n isClassifyArea: !1\n })\n };\n ie.forEach((A) => {\n const g = E[A];\n g !== void 0 && (C[A] = g);\n }), s.tdList[F] = C;\n }\n }\n } else if (i.type === f.HYPERLINK) {\n const a = i.hyperlinkId;\n if (a) {\n const s = {\n type: f.HYPERLINK,\n value: \"\",\n url: i.url\n }, F = [];\n for (; D < c.length; ) {\n const E = c[D];\n if (a !== E.hyperlinkId) {\n D--;\n break;\n }\n delete E.type, delete E.url, F.push(E), D++;\n }\n s.valueList = x(F, e), i = s;\n }\n } else if (i.type === f.DATE) {\n const a = i.dateId;\n if (a) {\n const s = {\n type: f.DATE,\n value: \"\",\n dateFormat: i.dateFormat\n }, F = [];\n for (; D < c.length; ) {\n const E = c[D];\n if (a !== E.dateId) {\n D--;\n break;\n }\n delete E.type, delete E.dateFormat, F.push(E), D++;\n }\n s.valueList = x(F, e), i = s;\n }\n } else if (i.controlId) {\n const a = i.controlId;\n if (i.controlComponent === m.PREFIX) {\n const s = [];\n let F = !1, E = D;\n for (; E < c.length; ) {\n const C = c[E];\n if (a !== C.controlId) break;\n C.controlComponent === m.VALUE && (delete C.control, delete C.controlId, s.push(C)), C.controlComponent === m.POSTFIX && (F = !0), E++;\n }\n if (F) {\n const C = Du(i, Pu), A = {\n ...i.control,\n ...C\n }, g = {\n ...Du(i, uu),\n type: f.CONTROL,\n value: \"\",\n control: A,\n controlId: a\n };\n g.control.value = x(s, e), i = au(g, { extraPickAttrs: n }), D += E - D - 1;\n }\n }\n if (i.controlComponent && (delete i.control, delete i.controlId, i.controlComponent !== m.VALUE && i.controlComponent !== m.PRE_TEXT && i.controlComponent !== m.POST_TEXT)) {\n D++;\n continue;\n }\n }\n const t = au(i, { extraPickAttrs: n });\n if (!i.type || i.type === f.TEXT || i.type === f.SUBSCRIPT || i.type === f.SUPERSCRIPT)\n for (; D < c.length; ) {\n const a = c[D + 1];\n if (D++, a && ct(\n t,\n au(a, { extraPickAttrs: n })\n )) {\n const s = a.value === H ? `\n` : a.value;\n t.value += s;\n } else\n break;\n }\n else\n D++;\n l.push(t);\n }\n return l;\n}\nfunction st(u) {\n switch (window.getComputedStyle(u).textAlign) {\n case \"left\":\n case \"start\":\n return P.LEFT;\n case \"center\":\n return P.CENTER;\n case \"right\":\n case \"end\":\n return P.RIGHT;\n case \"justify\":\n return P.ALIGNMENT;\n case \"justify-all\":\n return P.JUSTIFY;\n default:\n return P.LEFT;\n }\n}\nfunction xu(u) {\n return u === P.ALIGNMENT ? \"justify\" : u;\n}\nfunction Ft(u) {\n switch (u) {\n case P.LEFT:\n return \"flex-start\";\n case P.CENTER:\n return \"center\";\n case P.RIGHT:\n return \"flex-end\";\n case P.ALIGNMENT:\n case P.JUSTIFY:\n return \"space-between\";\n default:\n return \"flex-start\";\n }\n}\nfunction Et(u) {\n return !u.type || nu.includes(u.type);\n}\nfunction Ct(u, e) {\n const n = u[e];\n if (!n) return null;\n const r = u[e + 1];\n return !n.listId && n.value === H && r && r.value !== H && n.areaId === r.areaId ? r : n;\n}\nfunction ft(u, e, n, r) {\n var t, a, s;\n let o = Ct(u, n);\n if (!o) return;\n const { isBreakWhenWrap: c = !1, editorOptions: l } = r || {}, { mode: D } = l || {};\n D !== fu.DESIGN && ((t = o.title) != null && t.disabled) && (o = rt(o, yu));\n let i = !1;\n for (let F = 0; F < e.length; F++) {\n const E = e[F];\n if (c && !o.listId && pu.test(E.value) && (i = !0), i || !o.listId && E.type === f.LIST) {\n const A = [\n ...Nu,\n ...uu,\n ...Hu\n ];\n iu(A, o, E), (a = E.valueList) == null || a.forEach((g) => {\n iu(A, o, g);\n });\n continue;\n }\n (s = E.valueList) != null && s.length && ft(\n u,\n E.valueList,\n n,\n r\n );\n const C = [...wu];\n ru(E) || C.push(...uu), iu(C, o, E);\n }\n}\nfunction dt(u, e) {\n let n = \"span\";\n u.type === f.SUPERSCRIPT ? n = \"sup\" : u.type === f.SUBSCRIPT && (n = \"sub\");\n const r = document.createElement(n);\n return r.style.fontFamily = u.font || e.defaultFont, u.rowFlex && (r.style.textAlign = xu(u.rowFlex)), u.color && (r.style.color = u.color), u.bold && (r.style.fontWeight = \"600\"), u.italic && (r.style.fontStyle = \"italic\"), r.style.fontSize = `${u.size || e.defaultSize}px`, u.highlight && (r.style.backgroundColor = u.highlight), u.underline && (r.style.textDecoration = \"underline\"), u.strikeout && (r.style.textDecoration += \" line-through\"), r.innerText = u.value.replace(new RegExp(`${H}`, \"g\"), `\n`), r;\n}\nfunction Uu(u) {\n let e = 0;\n const n = /* @__PURE__ */ new Map();\n for (let r = 0; r < u.length; r++) {\n const o = u[r];\n if (r === 0) {\n if (o.checkbox) continue;\n o.value = o.value.replace(pu, \"\");\n }\n if (o.listWrap) {\n const c = n.get(e) || [];\n c.push(o), n.set(e, c);\n } else {\n const c = o.value.split(`\n`);\n for (let l = 0; l < c.length; l++) {\n l > 0 && (e += 1);\n const D = c[l], i = n.get(e) || [];\n i.push({\n ...o,\n value: D\n }), n.set(e, i);\n }\n }\n }\n return n;\n}\nfunction pt(u) {\n var r;\n const e = [];\n if (!u.length) return e;\n let n = ((r = u[0]) == null ? void 0 : r.rowFlex) || null;\n e.push({\n rowFlex: n,\n data: [u[0]]\n });\n for (let o = 1; o < u.length; o++) {\n const c = u[o], l = c.rowFlex || null;\n n === l && !ru(c) && !ru(u[o - 1]) ? e[e.length - 1].data.push(c) : (e.push({\n rowFlex: l,\n data: [c]\n }), n = l);\n }\n for (let o = 0; o < e.length; o++) {\n const c = e[o];\n c.data = x(c.data);\n }\n return e;\n}\nfunction At(u, e) {\n const n = ot(e);\n function r(l) {\n var i, t, a, s, F, E, C, A, g, R, I, y;\n const D = document.createElement(\"div\");\n for (let w = 0; w < l.length; w++) {\n const p = l[w];\n if (p.type === f.TABLE) {\n const d = document.createElement(\"table\");\n d.setAttribute(\"cellSpacing\", \"0\"), d.setAttribute(\"cellpadding\", \"0\"), d.setAttribute(\"border\", \"0\");\n const h = \"1px solid #000000\";\n !p.borderType || p.borderType === tu.ALL ? (d.style.borderTop = h, d.style.borderLeft = h) : p.borderType === tu.EXTERNAL && (d.style.border = h), d.style.width = `${p.width}px`;\n const O = document.createElement(\"colgroup\");\n for (let k = 0; k < p.colgroup.length; k++) {\n const z = p.colgroup[k], B = document.createElement(\"col\");\n B.setAttribute(\"width\", `${z.width}`), O.append(B);\n }\n d.append(O);\n const M = p.trList;\n for (let k = 0; k < M.length; k++) {\n const z = document.createElement(\"tr\"), B = M[k];\n z.style.height = `${B.height}px`;\n for (let v = 0; v < B.tdList.length; v++) {\n const T = document.createElement(\"td\");\n (!p.borderType || p.borderType === tu.ALL) && (T.style.borderBottom = T.style.borderRight = \"1px solid\");\n const L = B.tdList[v];\n T.colSpan = L.colspan, T.rowSpan = L.rowspan, T.style.verticalAlign = L.verticalAlign || \"top\", (i = L.borderTypes) != null && i.includes(J.TOP) && (T.style.borderTop = h), (t = L.borderTypes) != null && t.includes(J.RIGHT) && (T.style.borderRight = h), (a = L.borderTypes) != null && a.includes(J.BOTTOM) && (T.style.borderBottom = h), (s = L.borderTypes) != null && s.includes(J.LEFT) && (T.style.borderLeft = h);\n const _ = At(L.value, e);\n T.innerHTML = _.innerHTML, L.backgroundColor && (T.style.backgroundColor = L.backgroundColor), z.append(T);\n }\n d.append(z);\n }\n D.append(d);\n } else if (p.type === f.HYPERLINK) {\n const d = document.createElement(\"a\");\n d.innerText = p.valueList.map((h) => h.value).join(\"\"), p.url && (d.href = p.url), D.append(d);\n } else if (p.type === f.TITLE) {\n const d = document.createElement(\n `h${Fu[p.level]}`\n ), h = r(p.valueList);\n d.innerHTML = h.innerHTML, D.append(d);\n } else if (p.type === f.LIST) {\n const d = document.createElement(\n ve[p.listType]\n );\n p.listStyle && (d.style.listStyleType = Ie[p.listStyle]);\n const h = x(p.valueList);\n Uu(h).forEach((M) => {\n const k = document.createElement(\"li\"), z = r(M);\n k.innerHTML = z.innerHTML, d.append(k);\n }), D.append(d);\n } else if (p.type === f.IMAGE) {\n const d = document.createElement(\"img\");\n p.value && (d.src = p.value, d.width = p.width, d.height = p.height), D.append(d);\n } else if (p.type === f.BLOCK) {\n if (((F = p.block) == null ? void 0 : F.type) === K.VIDEO) {\n const d = (E = p.block.videoBlock) == null ? void 0 : E.src;\n if (d) {\n const h = document.createElement(\"video\");\n h.style.display = \"block\", h.controls = !0, h.src = d, h.width = p.width || (e == null ? void 0 : e.width) || window.innerWidth, h.height = p.height, D.append(h);\n }\n } else if (((C = p.block) == null ? void 0 : C.type) === K.IFRAME) {\n const { src: d, srcdoc: h } = p.block.iframeBlock || {};\n if (d || h) {\n const O = document.createElement(\"iframe\");\n O.sandbox.add(...it), O.style.display = \"block\", O.style.border = \"none\", d ? O.src = d : h && (O.srcdoc = h), O.width = `${p.width || (e == null ? void 0 : e.width) || window.innerWidth}`, O.height = `${p.height}`, D.append(O);\n }\n }\n } else if (p.type === f.SEPARATOR) {\n const d = document.createElement(\"hr\");\n D.append(d);\n } else if (p.type === f.CHECKBOX) {\n const d = document.createElement(\"input\");\n d.type = \"checkbox\", (A = p.checkbox) != null && A.value && d.setAttribute(\"checked\", \"true\"), D.append(d);\n } else if (p.type === f.RADIO) {\n const d = document.createElement(\"input\");\n d.type = \"radio\", (g = p.radio) != null && g.value && d.setAttribute(\"checked\", \"true\"), D.append(d);\n } else if (p.type === f.TAB) {\n const d = document.createElement(\"span\");\n d.innerHTML = `${Au}${Au}`, D.append(d);\n } else if (p.type === f.CONTROL) {\n const d = document.createElement(\"span\"), h = r(((R = p.control) == null ? void 0 : R.value) || []);\n d.innerHTML = h.innerHTML, D.append(d);\n } else if (!p.type || p.type === f.LATEX || nu.includes(p.type)) {\n let d = \"\";\n if (p.type === f.DATE ? d = ((I = p.valueList) == null ? void 0 : I.map((O) => O.value).join(\"\")) || \"\" : d = p.value, !d) continue;\n const h = dt(p, n);\n ((y = l[w - 1]) == null ? void 0 : y.type) === f.TITLE && (d = d.replace(/^\\n/, \"\")), h.innerText = d.replace(new RegExp(`${H}`, \"g\"), `\n`), D.append(h);\n }\n }\n return D;\n }\n const o = document.createElement(\"div\"), c = pt(u);\n for (let l = 0; l < c.length; l++) {\n const D = c[l], i = !D.rowFlex || D.rowFlex === P.LEFT, t = document.createElement(\"div\");\n if (!i) {\n const a = D.data[0];\n ru(a) ? (t.style.display = \"flex\", t.style.justifyContent = Ft(\n a.rowFlex\n )) : t.style.textAlign = xu(\n D.rowFlex\n );\n }\n t.innerHTML = r(D.data).innerHTML, i ? t.childNodes.forEach((a) => {\n o.append(a.cloneNode(!0));\n }) : o.append(t);\n }\n return o;\n}\nfunction ht(u) {\n if (!u || u.nodeType !== 3) return null;\n const e = u.parentNode, n = e.nodeName === \"FONT\" ? e.parentNode : e, r = st(n), o = u.textContent, c = window.getComputedStyle(n);\n if (!o || n.nodeName === \"STYLE\") return null;\n const l = {\n value: o,\n color: c.color,\n bold: Number(c.fontWeight) > 500,\n italic: c.fontStyle.includes(\"italic\"),\n size: Math.floor(parseFloat(c.fontSize))\n };\n return n.nodeName === \"SUB\" || c.verticalAlign === \"sub\" ? l.type = f.SUBSCRIPT : (n.nodeName === \"SUP\" || c.verticalAlign === \"super\") && (l.type = f.SUPERSCRIPT), r !== P.LEFT && (l.rowFlex = r), c.backgroundColor !== \"rgba(0, 0, 0, 0)\" && (l.highlight = c.backgroundColor), c.textDecorationLine.includes(\"underline\") && (l.underline = !0), c.textDecorationLine.includes(\"line-through\") && (l.strikeout = !0), l;\n}\nfunction cu(u, e) {\n const n = [];\n function r(l) {\n if (l.nodeType === 3) {\n const D = ht(l);\n D && n.push(D);\n } else if (l.nodeType === 1) {\n const D = l.childNodes;\n for (let i = 0; i < D.length; i++) {\n const t = D[i];\n if (t.nodeName === \"BR\")\n n.push({\n value: `\n`\n });\n else if (t.nodeName === \"A\") {\n const a = t, s = a.innerText;\n s && n.push({\n type: f.HYPERLINK,\n value: \"\",\n valueList: [\n {\n value: s\n }\n ],\n url: a.href\n });\n } else if (/H[1-6]/.test(t.nodeName)) {\n const s = cu(\n Tt(t, \"div\").outerHTML,\n e\n );\n n.push({\n value: \"\",\n type: f.TITLE,\n level: Te[t.nodeName],\n valueList: s\n }), t.nextSibling && !se.includes(t.nextSibling.nodeName) && n.push({\n value: `\n`\n });\n } else if (t.nodeName === \"UL\" || t.nodeName === \"OL\") {\n const a = t, s = {\n value: \"\",\n type: f.LIST,\n valueList: []\n };\n t.nodeName === \"OL\" ? s.listType = q.OL : (s.listType = q.UL, s.listStyle = a.style.listStyleType), a.querySelectorAll(\"li\").forEach((F) => {\n const E = cu(F.innerHTML, e);\n E.forEach((C) => {\n C.value === `\n` && (C.listWrap = !0);\n }), E.unshift({\n value: `\n`\n }), s.valueList.push(...E);\n }), n.push(s);\n } else if (t.nodeName === \"HR\")\n n.push({\n value: `\n`,\n type: f.SEPARATOR\n });\n else if (t.nodeName === \"IMG\") {\n const { src: a, width: s, height: F } = t;\n a && s && F && n.push({\n width: s,\n height: F,\n value: a,\n type: f.IMAGE\n });\n } else if (t.nodeName === \"VIDEO\") {\n const { src: a, width: s, height: F } = t;\n a && s && F && n.push({\n value: \"\",\n type: f.BLOCK,\n block: {\n type: K.VIDEO,\n videoBlock: {\n src: a\n }\n },\n width: s,\n height: F\n });\n } else if (t.nodeName === \"IFRAME\") {\n const { src: a, srcdoc: s, width: F, height: E } = t;\n (a || s) && F && E && n.push({\n value: \"\",\n type: f.BLOCK,\n block: {\n type: K.IFRAME,\n iframeBlock: {\n src: a,\n srcdoc: s\n }\n },\n width: parseInt(F),\n height: parseInt(E)\n });\n } else if (t.nodeName === \"TABLE\") {\n const a = t, s = {\n type: f.TABLE,\n value: `\n`,\n colgroup: [],\n trList: []\n };\n if (a.querySelectorAll(\"tr\").forEach((F) => {\n const E = window.getComputedStyle(F).height.replace(\"px\", \"\"), C = {\n height: Number(E),\n tdList: []\n };\n F.querySelectorAll(\"th,td\").forEach((A) => {\n const g = A, R = cu(\n g.innerHTML,\n e\n ), I = {\n colspan: g.colSpan,\n rowspan: g.rowSpan,\n value: R\n };\n g.style.backgroundColor && (I.backgroundColor = g.style.backgroundColor), C.tdList.push(I);\n }), s.trList.push(C);\n }), s.trList.length) {\n const F = s.trList[0].tdList.reduce(\n (C, A) => C + A.colspan,\n 0\n ), E = Math.ceil(e.innerWidth / F);\n for (let C = 0; C < F; C++)\n s.colgroup.push({\n width: E\n });\n n.push(s);\n }\n } else t.nodeName === \"INPUT\" && t.type === m.CHECKBOX ? n.push({\n type: f.CHECKBOX,\n value: \"\",\n checkbox: {\n value: t.checked\n }\n }) : t.nodeName === \"INPUT\" && t.type === m.RADIO ? n.push({\n type: f.RADIO,\n value: \"\",\n radio: {\n value: t.checked\n }\n }) : (r(t), t.nodeType === 1 && i !== D.length - 1 && window.getComputedStyle(t).display === \"block\" && n.push({\n value: `\n`\n }));\n }\n }\n }\n const o = document.createElement(\"div\");\n o.innerHTML = u, document.body.appendChild(o);\n const c = [];\n return o.childNodes.forEach((l) => {\n var D;\n l.nodeType !== 1 && !((D = l.textContent) != null && D.trim()) && c.push(l);\n }), c.forEach((l) => l.remove()), r(o), o.remove(), n;\n}\nfunction gt(u) {\n function e(n) {\n var o, c, l, D, i, t, a;\n let r = \"\";\n for (let s = 0; s < n.length; s++) {\n const F = n[s];\n if (F.type === f.TABLE) {\n r += `\n`;\n const E = F.trList;\n for (let C = 0; C < E.length; C++) {\n const A = E[C];\n for (let g = 0; g < A.tdList.length; g++) {\n const R = A.tdList[g], I = e(x(R.value)), y = g === 0, w = A.tdList.length - 1 === g;\n r += `${y ? \"\" : \" \"}${I}${w ? `\n` : \"\"}`;\n }\n }\n } else if (F.type === f.TAB)\n r += \"\t\";\n else if (F.type === f.HYPERLINK)\n r += F.valueList.map((E) => E.value).join(\"\");\n else if (F.type === f.TITLE)\n r += `${e(x(F.valueList))}`;\n else if (F.type === f.LIST) {\n const E = x(F.valueList), C = Uu(E);\n let A = \"\";\n F.listType === q.UL && (A = Be[F.listStyle]), C.forEach((g, R) => {\n const I = C.size - 1 === R;\n r += `\n${A || `${R + 1}.`}${e(\n g\n )}${I ? `\n` : \"\"}`;\n });\n } else if (F.type === f.CHECKBOX)\n r += (o = F.checkbox) != null && o.value ? \"☑\" : \"□\";\n else if (F.type === f.RADIO)\n r += (c = F.radio) != null && c.value ? \"☉\" : \"○\";\n else if (!F.type || F.type === f.LATEX || nu.includes(F.type)) {\n let E = \"\";\n if (F.type === f.CONTROL) {\n const C = ((D = (l = F.control.value) == null ? void 0 : l[0]) == null ? void 0 : D.value) || \"\";\n E = C ? `${((i = F.control) == null ? void 0 : i.preText) || \"\"}${C}${((t = F.control) == null ? void 0 : t.postText) || \"\"}` : \"\";\n } else F.type === f.DATE ? E = ((a = F.valueList) == null ? void 0 : a.map((C) => C.value).join(\"\")) || \"\" : E = F.value;\n r += E.replace(new RegExp(`${H}`, \"g\"), `\n`);\n }\n }\n return r;\n }\n return e(x(u));\n}\nfunction FD(u) {\n return Eu(u, [\n \"metrics\",\n \"style\"\n ]);\n}\nfunction ru(u) {\n return !!(u != null && u.type) && (ce.includes(u.type) || u.imgDisplay === Cu.INLINE);\n}\nfunction Tt(u, e) {\n const n = document.createElement(e);\n for (let r = 0; r < u.attributes.length; r++) {\n const o = u.attributes[r];\n n.setAttribute(o.name, o.value);\n }\n return n.innerHTML = u.innerHTML, n;\n}\nfunction ED(u) {\n const e = [];\n for (let n = 0; n < u.length; n++) {\n const r = u[n];\n r.imgDisplay === Cu.SURROUND && e.push(r);\n }\n return e;\n}\nfunction CD(u, e) {\n var n;\n for (let r = u.length - 1; r >= 0; r--)\n ((n = u[r].imgFloatPosition) == null ? void 0 : n.pageNo) === e && u.splice(r, 1);\n}\nfunction Bt(u) {\n return u.value === H && !u.listWrap;\n}\nfunction fD(u, e) {\n return u === 0 || Bt(e[u - 1]);\n}\nfunction dD(u) {\n return u.type === f.TABLE;\n}\nfunction pD(u) {\n return u.type === f.IMAGE;\n}\nfunction AD(u, e, n = su.BEFORE) {\n var o, c, l, D, i, t, a, s, F, E, C, A;\n if (!((c = (o = u[e]) == null ? void 0 : o.control) != null && c.hide) && !((D = (l = u[e]) == null ? void 0 : l.area) != null && D.hide))\n return e;\n let r = e;\n if (n === su.BEFORE)\n for (r = e - 1; r > 0; ) {\n if (!((t = (i = u[r]) == null ? void 0 : i.control) != null && t.hide) && !((s = (a = u[r]) == null ? void 0 : a.area) != null && s.hide))\n return r;\n r--;\n }\n else\n for (r = e + 1; r < u.length; ) {\n if (!((E = (F = u[r]) == null ? void 0 : F.control) != null && E.hide) && !((A = (C = u[r]) == null ? void 0 : C.area) != null && A.hide))\n return r;\n r++;\n }\n return r;\n}\nexport {\n Hu as AREA_CONTEXT_ATTR,\n Xu as AreaMode,\n ce as BLOCK_ELEMENT_TYPE,\n Iu as BackgroundRepeat,\n vu as BackgroundSize,\n K as BlockType,\n wt as CONTROL_CONTEXT_ATTR,\n Pu as CONTROL_STYLE_ATTR,\n xt as CURSOR_AGENT_OFFSET_HEIGHT,\n m as ControlComponent,\n zu as ControlIndentation,\n Wu as ControlState,\n Y as ControlType,\n vt as DOCX_EDITOR_DATA_VERSION,\n It as DOCX_EDITOR_SCHEMA_VERSION,\n ue as DashType,\n Lt as EDITOR_CLIPBOARD,\n Ot as EDITOR_COMPONENT,\n wu as EDITOR_ELEMENT_CONTEXT_ATTR,\n Ht as EDITOR_ELEMENT_COPY_ATTR,\n Pt as EDITOR_ELEMENT_STYLE_ATTR,\n oe as EDITOR_ELEMENT_ZIP_ATTR,\n Xt as EDITOR_FONT_OPTIONS,\n ne as EDITOR_PREFIX,\n uu as EDITOR_ROW_ATTR,\n Mt as EDITOR_SIZE_OPTIONS,\n ju as EditorComponent,\n Vu as EditorContext,\n fu as EditorMode,\n Yu as EditorZone,\n $u as ElementStyleKey,\n f as ElementType,\n Ee as FORMAT_PLACEHOLDER,\n Mu as FlexDirection,\n bt as HORIZON_TAB,\n _t as IMAGE_ELEMENT_TYPE,\n se as INLINE_NODE_NAME,\n Ut as INTERNAL_SHORTCUT_KEY,\n Cu as ImageDisplay,\n qu as KeyMap,\n le as LETTER_CLASS,\n ae as LIST_CONTEXT_ATTR,\n mu as LineNumberType,\n N as ListStyle,\n q as ListType,\n su as LocationPosition,\n yt as METRICS_BASIS_TEXT,\n $ as MaxHeightRatio,\n Zu as MouseEventButton,\n Ju as MoveDirection,\n mt as NBSP,\n Au as NON_BREAKING_SPACE,\n zt as NUMBER_LIKE_REG,\n G as NumberType,\n Qu as OlStyle,\n Gt as PAGE_NUMBER_STYLES,\n St as PUNCTUATION_LIST,\n Wt as PUNCTUATION_REG,\n Ou as PageMode,\n Lu as PaperDirection,\n bu as RenderMode,\n P as RowFlex,\n pu as START_LINE_BREAK_REG,\n Nu as TABLE_CONTEXT_ATTR,\n ie as TABLE_TD_ZIP_ATTR,\n nu as TEXTLIKE_ELEMENT_TYPE,\n yu as TITLE_CONTEXT_ATTR,\n tu as TableBorder,\n te as TableOrder,\n J as TdBorder,\n ee as TdSlash,\n Ku as TextDecorationStyle,\n S as TitleLevel,\n pe as UNICODE_SYMBOL_REG,\n b as UlStyle,\n kt as VIRTUAL_ELEMENT_TYPE,\n du as VerticalAlign,\n Rt as WRAP,\n Su as WatermarkType,\n Ru as WordBreak,\n H as ZERO,\n sD as buildCatalogFromElementList,\n iu as cloneProperty,\n uD as convertNumberToChinese,\n eD as convertStringToBase64,\n At as createDomFromElementList,\n jt as debounce,\n ku as deepClone,\n Eu as deepCloneOmitKeys,\n Le as defaultBackground,\n Re as defaultBadgeOption,\n be as defaultCheckboxOption,\n me as defaultControlOption,\n Fe as defaultCursorOption,\n Se as defaultFooterOption,\n Ne as defaultGroupOption,\n ye as defaultHeaderOption,\n Pe as defaultLineBreak,\n Ue as defaultLineNumberOption,\n lu as defaultModeRuleOption,\n He as defaultPageBorderOption,\n we as defaultPageBreakOption,\n Ce as defaultPageNumberOption,\n Oe as defaultPlaceholderOption,\n _e as defaultRadioOption,\n ke as defaultSeparatorOption,\n xe as defaultTableOption,\n he as defaultTitleOption,\n Ae as defaultWatermarkOption,\n Ge as defaultZoneOption,\n CD as deleteSurroundElementList,\n $t as downloadFile,\n Yt as findParent,\n tD as findScrollContainer,\n ft as formatElementContext,\n Q as formatElementList,\n Ct as getAnchorElement,\n cu as getElementListByHTML,\n ru as getIsBlockElement,\n AD as getNonHideElementIndex,\n at as getOrCreateTitleId,\n FD as getSlimCloneElementList,\n gt as getTextFromElementList,\n X as getUUID,\n Zt as handleTripleClick,\n lt as isApple,\n gu as isArray,\n Me as isArrayEqual,\n nt as isElement,\n lD as isElementList,\n fD as isFirstElementOfParagraph,\n oD as isIOS,\n pD as isImageElement,\n iD as isMobile,\n aD as isMod,\n rD as isNonValue,\n qt as isNumber,\n hu as isObject,\n Me as isObjectEqual,\n Bt as isParagraphSeparator,\n DD as isRectIntersect,\n Qt as isString,\n dD as isTableElement,\n Et as isTextLikeElement,\n Ie as listStyleCSSMapping,\n ve as listTypeElementMapping,\n Nt as maxHeightRadioMapping,\n Jt as mergeObject,\n ot as mergeOption,\n Kt as nextTick,\n nD as normalizeLineBreak,\n rt as omitObject,\n au as pickElementAttr,\n Du as pickObject,\n ED as pickSurroundElementList,\n j as splitText,\n Vt as throttle,\n Te as titleNodeNameMapping,\n Fu as titleOrderNumberMapping,\n ge as titleSizeMapping,\n Be as ulStyleMapping,\n cD as writeElementList,\n x as zipElementList\n};\n//# sourceMappingURL=docx-editor-schema.js.map\n","import {\r\n DOCX_EDITOR_SCHEMA_VERSION,\r\n EDITOR_CLIPBOARD,\r\n createDomFromElementList,\r\n zipElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport type {\r\n DeepRequired,\r\n IEditorOption,\r\n IElement\r\n} from '@vervedoc/docx-editor-schema'\r\n\r\nexport const version = DOCX_EDITOR_SCHEMA_VERSION\r\n\r\nexport class HistoryManager {\r\n constructor(..._: any[]) {}\r\n undo(..._: any[]) {}\r\n redo(..._: any[]) {}\r\n recovery(..._: any[]) {}\r\n clear(..._: any[]) {}\r\n popUndo(..._: any[]): any { return undefined }\r\n isStackEmpty(..._: any[]): boolean { return true }\r\n isCanUndo(..._: any[]): boolean { return false }\r\n isCanRedo(..._: any[]): boolean { return false }\r\n execute(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class WorkerManager {\r\n constructor(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class I18n {\r\n constructor(..._: any[]) {}\r\n t(key: string, ..._args: any[]): string { return key }\r\n registerLangMap(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class Actuator {\r\n constructor(..._: any[]) {}\r\n}\r\n\r\nexport class LaTexParticle {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n}\r\n\r\nexport class DateParticle {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n renderDatePicker(..._: any[]) {}\r\n clearDatePicker(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class BlockParticle {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n clear(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class DatePicker {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport interface IClipboardData {\r\n text: string\r\n elementList: IElement[]\r\n}\r\n\r\nfunction setClipboardData(data: IClipboardData) {\r\n if (typeof localStorage === 'undefined') return\r\n try {\r\n localStorage.setItem(\r\n EDITOR_CLIPBOARD,\r\n JSON.stringify({\r\n text: data.text,\r\n elementList: data.elementList\r\n })\r\n )\r\n } catch {\r\n // Ignore storage failures and still allow the system clipboard path.\r\n }\r\n}\r\n\r\nexport function getClipboardData(): IClipboardData | null {\r\n if (typeof localStorage === 'undefined') return null\r\n try {\r\n const clipboardText = localStorage.getItem(EDITOR_CLIPBOARD)\r\n if (!clipboardText) return null\r\n const clipboardData = JSON.parse(clipboardText)\r\n if (\r\n typeof clipboardData?.text === 'string' &&\r\n Array.isArray(clipboardData?.elementList)\r\n ) {\r\n return clipboardData\r\n }\r\n } catch {\r\n // Ignore malformed clipboard cache.\r\n }\r\n return null\r\n}\r\n\r\nexport function getIsClipboardContainFile(clipboardData: DataTransfer): boolean {\r\n return Array.from(clipboardData.items).some(item => item.kind === 'file')\r\n}\r\n\r\nexport function removeClipboardData(): void {\r\n if (typeof localStorage === 'undefined') return\r\n try {\r\n localStorage.removeItem(EDITOR_CLIPBOARD)\r\n } catch {\r\n // Ignore storage failures.\r\n }\r\n}\r\n\r\nfunction fallbackWriteClipboardItem(html: string) {\r\n if (typeof document === 'undefined' || typeof window === 'undefined') return\r\n const fakeElement = document.createElement('div')\r\n fakeElement.setAttribute('contenteditable', 'true')\r\n fakeElement.style.position = 'fixed'\r\n fakeElement.style.left = '-9999px'\r\n fakeElement.style.top = '0'\r\n fakeElement.style.opacity = '0'\r\n fakeElement.innerHTML = html\r\n const selection = window.getSelection()\r\n const ranges: Range[] = []\r\n if (selection) {\r\n for (let i = 0; i < selection.rangeCount; i++) {\r\n ranges.push(selection.getRangeAt(i).cloneRange())\r\n }\r\n }\r\n const range = document.createRange()\r\n const br = document.createElement('span')\r\n br.innerText = '\\n'\r\n fakeElement.append(br)\r\n document.body.append(fakeElement)\r\n range.selectNodeContents(fakeElement)\r\n selection?.removeAllRanges()\r\n selection?.addRange(range)\r\n try {\r\n document.execCommand('copy')\r\n } finally {\r\n selection?.removeAllRanges()\r\n ranges.forEach(savedRange => selection?.addRange(savedRange))\r\n fakeElement.remove()\r\n }\r\n}\r\n\r\nfunction writeClipboardItem(\r\n text: string,\r\n html: string,\r\n elementList: IElement[]\r\n) {\r\n if (!text && !html && !elementList.length) return\r\n setClipboardData({ text, elementList })\r\n if (typeof window === 'undefined') return\r\n const clipboard = window.navigator?.clipboard\r\n const ClipboardItemCtor = window.ClipboardItem\r\n if (clipboard?.write && ClipboardItemCtor) {\r\n const plainText = new Blob([text], { type: 'text/plain' })\r\n const htmlText = new Blob([html], { type: 'text/html' })\r\n // @ts-ignore Browser ClipboardItem typing differs across runtimes.\r\n const item = new ClipboardItemCtor({\r\n [plainText.type]: plainText,\r\n [htmlText.type]: htmlText\r\n })\r\n void clipboard.write([item]).catch(() => fallbackWriteClipboardItem(html))\r\n return\r\n }\r\n fallbackWriteClipboardItem(html)\r\n}\r\n\r\nexport function writeElementList(\r\n elementList: IElement[],\r\n options: DeepRequired<IEditorOption>\r\n): string {\r\n if (typeof document === 'undefined') {\r\n return JSON.stringify(elementList)\r\n }\r\n const clipboardDom = createDomFromElementList(elementList, options)\r\n document.body.append(clipboardDom)\r\n const text = clipboardDom.innerText\r\n const html = clipboardDom.innerHTML\r\n clipboardDom.remove()\r\n if (!text && !html && !elementList.length) return ''\r\n writeClipboardItem(text, html, zipElementList(elementList))\r\n return text\r\n}\r\n\r\nexport class Shortcut {\r\n constructor(..._: any[]) {}\r\n registerShortcutList(..._: any[]) {}\r\n removeEvent() {}\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { VIRTUAL_ELEMENT_TYPE } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IPasteOption } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n getClipboardData,\r\n getIsClipboardContainFile,\r\n removeClipboardData\r\n} from '../../plugin-stubs'\r\nimport {\r\n formatElementContext,\r\n getElementListByHTML\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\nimport { IOverrideResult } from '../../plugin/override/Override'\r\nimport { normalizeLineBreak } from '@vervedoc/docx-editor-schema'\r\n\r\nexport function pasteElement(host: CanvasEvent, elementList: IElement[]) {\r\n const draw = host.getDraw()\r\n if (\r\n draw.isReadonly() ||\r\n draw.isDisabled() ||\r\n draw.getControl().getIsDisabledPasteControl()\r\n ) {\r\n return\r\n }\r\n const rangeManager = draw.getRange()\r\n const { startIndex } = rangeManager.getRange()\r\n const originalElementList = draw.getElementList()\r\n // 全选粘贴无需格式化上下文\r\n if (~startIndex && !rangeManager.getIsSelectAll()) {\r\n // 如果是复制到虚拟元素里,则粘贴列表的虚拟元素需扁平化处理,避免产生新的虚拟元素\r\n const anchorElement = originalElementList[startIndex]\r\n if (anchorElement?.titleId || anchorElement?.listId) {\r\n let start = 0\r\n while (start < elementList.length) {\r\n const pasteElement = elementList[start]\r\n if (anchorElement.titleId && /^\\n/.test(pasteElement.value)) {\r\n break\r\n }\r\n if (VIRTUAL_ELEMENT_TYPE.includes(pasteElement.type!)) {\r\n elementList.splice(start, 1)\r\n if (pasteElement.valueList) {\r\n for (let v = 0; v < pasteElement.valueList.length; v++) {\r\n const element = pasteElement.valueList[v]\r\n if (element.value === ZERO || element.value === '\\n') {\r\n continue\r\n }\r\n elementList.splice(start, 0, element)\r\n start++\r\n }\r\n }\r\n start--\r\n }\r\n start++\r\n }\r\n }\r\n formatElementContext(originalElementList, elementList, startIndex, {\r\n isBreakWhenWrap: true,\r\n editorOptions: draw.getOptions()\r\n })\r\n }\r\n draw.insertElementList(elementList)\r\n}\r\n\r\nexport function pasteHTML(host: CanvasEvent, htmlText: string) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const elementList = getElementListByHTML(htmlText, {\r\n innerWidth: draw.getOriginalInnerWidth()\r\n })\r\n pasteElement(host, elementList)\r\n}\r\n\r\nexport function pasteImage(host: CanvasEvent, file: File | Blob) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex } = rangeManager.getRange()\r\n const elementList = draw.getElementList()\r\n // 创建文件读取器\r\n const fileReader = new FileReader()\r\n fileReader.readAsDataURL(file)\r\n fileReader.onload = () => {\r\n // 计算宽高\r\n const image = new Image()\r\n const value = fileReader.result as string\r\n image.src = value\r\n image.onload = () => {\r\n const imageElement: IElement = {\r\n value,\r\n type: ElementType.IMAGE,\r\n width: image.width,\r\n height: image.height\r\n }\r\n if (~startIndex) {\r\n formatElementContext(elementList, [imageElement], startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n }\r\n draw.insertElementList([imageElement])\r\n }\r\n }\r\n}\r\n\r\nexport function pasteByEvent(host: CanvasEvent, evt: ClipboardEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const clipboardData = evt.clipboardData\r\n if (!clipboardData) return\r\n // 自定义粘贴事件\r\n const { paste } = draw.getOverride()\r\n if (paste) {\r\n const overrideResult = paste(evt)\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n // 优先读取编辑器内部粘贴板数据(粘贴板不包含文件时)\r\n if (!getIsClipboardContainFile(clipboardData)) {\r\n const clipboardText = clipboardData.getData('text')\r\n const editorClipboardData = getClipboardData()\r\n // 不同系统间默认换行符不同 windows:\\r\\n mac:\\n\r\n if (\r\n editorClipboardData &&\r\n normalizeLineBreak(clipboardText) ===\r\n normalizeLineBreak(editorClipboardData.text)\r\n ) {\r\n pasteElement(host, editorClipboardData.elementList)\r\n return\r\n }\r\n }\r\n removeClipboardData()\r\n // 从粘贴板提取数据\r\n let isHTML = false\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i]\r\n if (item.type === 'text/html') {\r\n isHTML = true\r\n break\r\n }\r\n }\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i]\r\n if (item.kind === 'string') {\r\n if (item.type === 'text/plain' && !isHTML) {\r\n item.getAsString(plainText => {\r\n host.input(plainText)\r\n })\r\n break\r\n }\r\n if (item.type === 'text/html' && isHTML) {\r\n item.getAsString(htmlText => {\r\n pasteHTML(host, htmlText)\r\n })\r\n break\r\n }\r\n } else if (item.kind === 'file') {\r\n if (item.type.includes('image')) {\r\n const file = item.getAsFile()\r\n if (file) {\r\n pasteImage(host, file)\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport async function pasteByApi(host: CanvasEvent, options?: IPasteOption) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n // 自定义粘贴事件\r\n const { paste } = draw.getOverride()\r\n if (paste) {\r\n const overrideResult = paste()\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n const editorClipboardData = getClipboardData()\r\n let clipboardText = ''\r\n try {\r\n clipboardText = await navigator.clipboard.readText()\r\n } catch {\r\n clipboardText = editorClipboardData?.text || ''\r\n }\r\n if (\r\n editorClipboardData &&\r\n normalizeLineBreak(clipboardText) ===\r\n normalizeLineBreak(editorClipboardData.text)\r\n ) {\r\n pasteElement(host, editorClipboardData.elementList)\r\n return\r\n }\r\n removeClipboardData()\r\n // 从内存粘贴板获取数据\r\n if (options?.isPlainText) {\r\n if (clipboardText) {\r\n host.input(clipboardText)\r\n }\r\n } else {\r\n let clipboardData: ClipboardItem[] = []\r\n try {\r\n clipboardData = await navigator.clipboard.read()\r\n } catch {\r\n if (clipboardText) {\r\n host.input(clipboardText)\r\n }\r\n return\r\n }\r\n let isHTML = false\r\n for (const item of clipboardData) {\r\n if (item.types.includes('text/html')) {\r\n isHTML = true\r\n break\r\n }\r\n }\r\n for (const item of clipboardData) {\r\n if (item.types.includes('text/plain') && !isHTML) {\r\n const textBlob = await item.getType('text/plain')\r\n const text = await textBlob.text()\r\n if (text) {\r\n host.input(text)\r\n }\r\n } else if (item.types.includes('text/html') && isHTML) {\r\n const htmlTextBlob = await item.getType('text/html')\r\n const htmlText = await htmlTextBlob.text()\r\n if (htmlText) {\r\n pasteHTML(host, htmlText)\r\n }\r\n } else if (item.types.some(type => type.startsWith('image/'))) {\r\n const type = item.types.find(type => type.startsWith('image/'))!\r\n const imageBlob = await item.getType(type)\r\n pasteImage(host, imageBlob)\r\n }\r\n }\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { CanvasEvent } from '../event/CanvasEvent'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { pasteByEvent } from '../event/handlers/paste'\r\n\r\nexport class CursorAgent {\r\n private draw: Draw\r\n private container: HTMLDivElement\r\n private agentCursorDom: HTMLTextAreaElement\r\n private canvasEvent: CanvasEvent\r\n private eventBus: EventBus<EventBusMap>\r\n\r\n constructor(draw: Draw, canvasEvent: CanvasEvent) {\r\n this.draw = draw\r\n this.container = draw.getContainer()\r\n this.canvasEvent = canvasEvent\r\n this.eventBus = draw.getEventBus()\r\n // 代理光标绘制\r\n const agentCursorDom = document.createElement('textarea')\r\n agentCursorDom.autocomplete = 'off'\r\n agentCursorDom.classList.add(`${EDITOR_PREFIX}-inputarea`)\r\n agentCursorDom.innerText = ''\r\n this.container.append(agentCursorDom)\r\n this.agentCursorDom = agentCursorDom\r\n // 事件\r\n agentCursorDom.onkeydown = (evt: KeyboardEvent) => this._keyDown(evt)\r\n agentCursorDom.oninput = this._input.bind(this)\r\n agentCursorDom.onpaste = (evt: ClipboardEvent) => this._paste(evt)\r\n agentCursorDom.addEventListener(\r\n 'compositionstart',\r\n this._compositionstart.bind(this)\r\n )\r\n agentCursorDom.addEventListener(\r\n 'compositionend',\r\n this._compositionend.bind(this)\r\n )\r\n }\r\n\r\n public getAgentCursorDom(): HTMLTextAreaElement {\r\n return this.agentCursorDom\r\n }\r\n\r\n private _keyDown(evt: KeyboardEvent) {\r\n this.canvasEvent.keydown(evt)\r\n }\r\n\r\n private _input(evt: Event) {\r\n const data = (<InputEvent>evt).data\r\n if (data) {\r\n this.canvasEvent.input(data)\r\n }\r\n if (this.eventBus.hasSubscribers('input')) {\r\n this.eventBus.emit('input', evt)\r\n }\r\n }\r\n\r\n private _paste(evt: ClipboardEvent) {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const clipboardData = evt.clipboardData\r\n if (!clipboardData) return\r\n pasteByEvent(this.canvasEvent, evt)\r\n evt.preventDefault()\r\n }\r\n\r\n private _compositionstart() {\r\n this.canvasEvent.compositionstart()\r\n }\r\n\r\n private _compositionend(evt: CompositionEvent) {\r\n this.canvasEvent.compositionend(evt)\r\n }\r\n}\r\n","import { CURSOR_AGENT_OFFSET_HEIGHT } from '@vervedoc/docx-editor-schema'\r\nimport { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { ICursorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { findScrollContainer } from '@vervedoc/docx-editor-schema'\r\nimport { isMobile } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { CanvasEvent } from '../event/CanvasEvent'\r\nimport { Position } from '../position/Position'\r\nimport { CursorAgent } from './CursorAgent'\r\n\r\nexport type IDrawCursorOption = ICursorOption & {\r\n isShow?: boolean\r\n isBlink?: boolean\r\n isFocus?: boolean\r\n hitLineStartIndex?: number\r\n}\r\n\r\nexport interface IMoveCursorToVisibleOption {\r\n direction: MoveDirection\r\n cursorPosition: IElementPosition\r\n}\r\n\r\nexport class Cursor {\r\n private readonly ANIMATION_CLASS = `${EDITOR_PREFIX}-cursor--animation`\r\n\r\n private draw: Draw\r\n private container: HTMLDivElement\r\n private options: DeepRequired<IEditorOption>\r\n private position: Position\r\n private cursorDom: HTMLDivElement\r\n private cursorAgent: CursorAgent\r\n private blinkTimeout: number | null\r\n private hitLineStartIndex: number | undefined\r\n\r\n constructor(draw: Draw, canvasEvent: CanvasEvent) {\r\n this.draw = draw\r\n this.container = draw.getContainer()\r\n this.position = draw.getPosition()\r\n this.options = draw.getOptions()\r\n\r\n this.cursorDom = document.createElement('div')\r\n this.cursorDom.classList.add(`${EDITOR_PREFIX}-cursor`)\r\n this.container.append(this.cursorDom)\r\n this.cursorAgent = new CursorAgent(draw, canvasEvent)\r\n this.blinkTimeout = null\r\n }\r\n\r\n public getCursorDom(): HTMLDivElement {\r\n return this.cursorDom\r\n }\r\n\r\n public getAgentDom(): HTMLTextAreaElement {\r\n return this.cursorAgent.getAgentCursorDom()\r\n }\r\n\r\n public getAgentIsActive(): boolean {\r\n return this.getAgentDom() === document.activeElement\r\n }\r\n\r\n public getAgentDomValue(): string {\r\n return this.getAgentDom().value\r\n }\r\n\r\n public clearAgentDomValue() {\r\n this.getAgentDom().value = ''\r\n }\r\n\r\n public getHitLineStartIndex() {\r\n return this.hitLineStartIndex\r\n }\r\n\r\n private _blinkStart() {\r\n this.cursorDom.classList.add(this.ANIMATION_CLASS)\r\n }\r\n\r\n private _blinkStop() {\r\n this.cursorDom.classList.remove(this.ANIMATION_CLASS)\r\n }\r\n\r\n private _setBlinkTimeout() {\r\n this._clearBlinkTimeout()\r\n this.blinkTimeout = window.setTimeout(() => {\r\n this._blinkStart()\r\n }, 500)\r\n }\r\n\r\n private _clearBlinkTimeout() {\r\n if (this.blinkTimeout) {\r\n this._blinkStop()\r\n window.clearTimeout(this.blinkTimeout)\r\n this.blinkTimeout = null\r\n }\r\n }\r\n\r\n public focus() {\r\n // 移动端只读模式禁用聚焦避免唤起输入法,web端允许聚焦避免事件无法捕获\r\n if (isMobile && this.draw.isReadonly()) return\r\n const agentCursorDom = this.cursorAgent.getAgentCursorDom()\r\n // 光标不聚焦时重新定位\r\n if (document.activeElement !== agentCursorDom) {\r\n agentCursorDom.focus()\r\n agentCursorDom.setSelectionRange(0, 0)\r\n }\r\n }\r\n\r\n public drawCursor(payload?: IDrawCursorOption) {\r\n let cursorPosition = this.position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { scale, cursor } = this.options\r\n const {\r\n color,\r\n width,\r\n isShow = true,\r\n isBlink = true,\r\n isFocus = true,\r\n hitLineStartIndex\r\n } = { ...cursor, ...payload }\r\n // 设置光标代理\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n // 光标位置\r\n this.hitLineStartIndex = hitLineStartIndex\r\n if (hitLineStartIndex) {\r\n const positionList = this.position.getPositionList()\r\n cursorPosition = positionList[hitLineStartIndex]\r\n }\r\n const {\r\n metrics,\r\n coordinate: { leftTop, rightTop },\r\n ascent,\r\n pageNo\r\n } = cursorPosition\r\n const zoneManager = this.draw.getZone()\r\n const curPageNo = zoneManager.isMainActive()\r\n ? pageNo\r\n : this.draw.getPageNo()\r\n const preY = curPageNo * (height + pageGap)\r\n // 默认偏移高度\r\n const defaultOffsetHeight = CURSOR_AGENT_OFFSET_HEIGHT * scale\r\n // 增加1/4字体大小(最小为defaultOffsetHeight即默认偏移高度)\r\n const increaseHeight = Math.min(metrics.height / 4, defaultOffsetHeight)\r\n const cursorHeight = metrics.height + increaseHeight * 2\r\n const agentCursorDom = this.cursorAgent.getAgentCursorDom()\r\n if (isFocus) {\r\n setTimeout(() => {\r\n this.focus()\r\n })\r\n }\r\n // fillText位置 + 文字基线到底部距离 - 模拟光标偏移量\r\n const descent =\r\n metrics.boundingBoxDescent < 0 ? 0 : metrics.boundingBoxDescent\r\n const cursorTop =\r\n leftTop[1] + ascent + descent - (cursorHeight - increaseHeight) + preY\r\n const cursorLeft = hitLineStartIndex ? leftTop[0] : rightTop[0]\r\n agentCursorDom.style.left = `${cursorLeft}px`\r\n agentCursorDom.style.top = `${\r\n cursorTop + cursorHeight - defaultOffsetHeight\r\n }px`\r\n // 模拟光标显示\r\n if (!isShow) {\r\n this.recoveryCursor()\r\n return\r\n }\r\n const isReadonly = this.draw.isReadonly()\r\n this.cursorDom.style.width = `${width * scale}px`\r\n this.cursorDom.style.backgroundColor = color\r\n this.cursorDom.style.left = `${cursorLeft}px`\r\n this.cursorDom.style.top = `${cursorTop}px`\r\n this.cursorDom.style.display = isReadonly ? 'none' : 'block'\r\n this.cursorDom.style.height = `${cursorHeight}px`\r\n if (isBlink) {\r\n this._setBlinkTimeout()\r\n } else {\r\n this._clearBlinkTimeout()\r\n }\r\n }\r\n\r\n public recoveryCursor() {\r\n this.cursorDom.style.display = 'none'\r\n this._clearBlinkTimeout()\r\n }\r\n\r\n public moveCursorToVisible(payload: IMoveCursorToVisibleOption) {\r\n const { cursorPosition, direction } = payload\r\n if (!cursorPosition || !direction) return\r\n const {\r\n pageNo,\r\n coordinate: { leftTop, leftBottom }\r\n } = cursorPosition\r\n // 当前页面距离滚动容器顶部距离\r\n const prePageY =\r\n pageNo * (this.draw.getHeight() + this.draw.getPageGap()) +\r\n this.container.getBoundingClientRect().top\r\n // 向上移动时:以顶部距离为准,向下移动时:以底部位置为准\r\n const isUp = direction === MoveDirection.UP\r\n const x = leftBottom[0]\r\n const y = isUp ? leftTop[1] + prePageY : leftBottom[1] + prePageY\r\n // 查找滚动容器,如果是滚动容器是document,则限制范围为当前窗口\r\n const scrollContainer = findScrollContainer(this.container)\r\n const rect = {\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0\r\n }\r\n if (scrollContainer === document.documentElement) {\r\n rect.right = window.innerWidth\r\n rect.bottom = window.innerHeight\r\n } else {\r\n const { left, right, top, bottom } =\r\n scrollContainer.getBoundingClientRect()\r\n rect.left = left\r\n rect.right = right\r\n rect.top = top\r\n rect.bottom = bottom\r\n }\r\n // 可视范围根据参数调整\r\n const { maskMargin } = this.options\r\n rect.top += maskMargin[0]\r\n rect.bottom -= maskMargin[2]\r\n // 不在可视范围时,移动滚动条到合适位置\r\n if (\r\n !(x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)\r\n ) {\r\n const { scrollLeft, scrollTop } = scrollContainer\r\n isUp\r\n ? scrollContainer.scroll(scrollLeft, scrollTop - (rect.top - y))\r\n : scrollContainer.scroll(scrollLeft, scrollTop + y - rect.bottom)\r\n }\r\n }\r\n}\r\n","import { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { Control } from './Control'\r\n\r\nexport class CheckboxControl implements IControlInstance {\r\n protected element: IElement\r\n protected control: Control\r\n\r\n constructor(element: IElement, control: Control) {\r\n this.element = element\r\n this.control = control\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getCode(): string | null {\r\n return this.element.control?.code || null\r\n }\r\n\r\n public getValue(): IElement[] {\r\n const elementList = this.control.getElementList()\r\n const { startIndex } = this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n data.unshift(preElement)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n data.push(nextElement)\r\n }\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public setValue(): number {\r\n return -1\r\n }\r\n\r\n public setSelect(\r\n codes: string[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const { control } = this.element\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.CHECKBOX) {\r\n const checkbox = preElement.checkbox!\r\n checkbox.value = codes.includes(checkbox.code!)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.CHECKBOX) {\r\n const checkbox = nextElement.checkbox!\r\n checkbox.value = codes.includes(checkbox.code!)\r\n }\r\n nextIndex++\r\n }\r\n control!.code = codes.join(',')\r\n this.control.repaintControl({\r\n curIndex: startIndex,\r\n isSetCursor: false\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n // 删除\r\n if (evt.key === KeyMap.Backspace || evt.key === KeyMap.Delete) {\r\n return this.control.removeControl(startIndex)\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n return -1\r\n }\r\n}\r\n","import { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { CheckboxControl } from '../CheckboxControl'\r\n\r\nexport class RadioControl extends CheckboxControl {\r\n public setSelect(\r\n codes: string[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const { control } = this.element\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.RADIO) {\r\n const radio = preElement.radio!\r\n radio.value = codes.includes(radio.code!)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.RADIO) {\r\n const radio = nextElement.radio!\r\n radio.value = codes.includes(radio.code!)\r\n }\r\n nextIndex++\r\n }\r\n control!.code = codes.join(',')\r\n this.control.repaintControl({\r\n curIndex: startIndex,\r\n isSetCursor: false\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n }\r\n}\r\n","import { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MouseEventButton } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ControlType } from '@vervedoc/docx-editor-schema'\r\nimport { IPreviewerDrawOption } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone } from '@vervedoc/docx-editor-schema'\r\nimport { isMod } from '@vervedoc/docx-editor-schema'\r\nimport { CheckboxControl } from '../../control/CheckboxControl'\r\nimport { RadioControl } from '../../control/radio/RadioControl'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\nexport function setRangeCache(host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const position = draw.getPosition()\r\n const rangeManager = draw.getRange()\r\n // 缓存选区上下文信息\r\n host.isAllowDrag = true\r\n host.cacheRange = deepClone(rangeManager.getRange())\r\n host.cacheElementList = draw.getElementList()\r\n host.cachePositionList = position.getPositionList()\r\n host.cachePositionContext = position.getPositionContext()\r\n}\r\n\r\nexport function hitCheckbox(element: IElement, draw: Draw) {\r\n const { checkbox, control } = element\r\n // 复选框不在控件内独立控制\r\n if (!control) {\r\n draw.getCheckboxParticle().setSelect(element)\r\n } else {\r\n const codes = control?.code ? control.code.split(',') : []\r\n if (checkbox?.value) {\r\n const codeIndex = codes.findIndex(c => c === checkbox.code)\r\n codes.splice(codeIndex, 1)\r\n } else {\r\n if (checkbox?.code) {\r\n codes.push(checkbox.code)\r\n }\r\n }\r\n const activeControl = draw.getControl().getActiveControl()\r\n if (activeControl instanceof CheckboxControl) {\r\n activeControl.setSelect(codes)\r\n }\r\n }\r\n}\r\n\r\nexport function hitRadio(element: IElement, draw: Draw) {\r\n const { radio, control } = element\r\n // 单选框不在控件内独立控制\r\n if (!control) {\r\n draw.getRadioParticle().setSelect(element)\r\n } else {\r\n const codes = radio?.code ? [radio.code] : []\r\n const activeControl = draw.getControl().getActiveControl()\r\n if (activeControl instanceof RadioControl) {\r\n activeControl.setSelect(codes)\r\n }\r\n }\r\n}\r\n\r\nexport function mousedown(evt: MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n const rangeManager = draw.getRange()\r\n const position = draw.getPosition()\r\n // 存在选区时忽略右键点击\r\n const range = rangeManager.getRange()\r\n if (\r\n evt.button === MouseEventButton.RIGHT &&\r\n (range.isCrossRowCol || !rangeManager.getIsCollapsed())\r\n ) {\r\n return\r\n }\r\n // 是否是选区拖拽\r\n if (!host.isAllowDrag) {\r\n if (!isReadonly && range.startIndex !== range.endIndex) {\r\n const isPointInRange = rangeManager.getIsPointInRange(\r\n evt.offsetX,\r\n evt.offsetY\r\n )\r\n if (isPointInRange) {\r\n setRangeCache(host)\r\n return\r\n }\r\n }\r\n }\r\n const target = evt.target as HTMLDivElement\r\n const pageIndex = target.dataset.index\r\n // 设置pageNo\r\n if (pageIndex) {\r\n draw.setPageNo(Number(pageIndex))\r\n }\r\n host.isAllowSelection = true\r\n // 缓存旧上下文信息\r\n const oldPositionContext = deepClone(position.getPositionContext())\r\n const positionResult = position.adjustPositionContext({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n if (!positionResult) return\r\n const {\r\n index,\r\n isDirectHit,\r\n isCheckbox,\r\n isRadio,\r\n isImage,\r\n isTable,\r\n tdValueIndex,\r\n hitLineStartIndex\r\n } = positionResult\r\n // 记录选区开始位置\r\n host.mouseDownStartPosition = {\r\n ...positionResult,\r\n index: isTable ? tdValueIndex! : index,\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n }\r\n const elementList = draw.getElementList()\r\n const positionList = position.getPositionList()\r\n const curIndex = isTable ? tdValueIndex! : index\r\n const curElement = elementList[curIndex]\r\n // 绘制\r\n const isDirectHitImage = !!(isDirectHit && isImage)\r\n const isDirectHitCheckbox = !!(isDirectHit && isCheckbox)\r\n const isDirectHitRadio = !!(isDirectHit && isRadio)\r\n if (~index) {\r\n let startIndex = curIndex\r\n let endIndex = curIndex\r\n // shift激活时进行选区处理\r\n if (evt.shiftKey) {\r\n const { startIndex: oldStartIndex } = rangeManager.getRange()\r\n if (~oldStartIndex) {\r\n const newPositionContext = position.getPositionContext()\r\n if (newPositionContext.tdId === oldPositionContext.tdId) {\r\n if (curIndex > oldStartIndex) {\r\n startIndex = oldStartIndex\r\n } else {\r\n endIndex = oldStartIndex\r\n }\r\n }\r\n }\r\n }\r\n rangeManager.setRange(startIndex, endIndex)\r\n position.setCursorPosition(positionList[curIndex])\r\n // 复选框\r\n if (isDirectHitCheckbox && !isReadonly) {\r\n hitCheckbox(curElement, draw)\r\n } else if (isDirectHitRadio && !isReadonly) {\r\n hitRadio(curElement, draw)\r\n } else if (\r\n curElement.controlComponent === ControlComponent.VALUE &&\r\n (curElement.control?.type === ControlType.CHECKBOX ||\r\n curElement.control?.type === ControlType.RADIO)\r\n ) {\r\n // 向左查找\r\n let preIndex = curIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlComponent === ControlComponent.CHECKBOX) {\r\n hitCheckbox(preElement, draw)\r\n break\r\n } else if (preElement.controlComponent === ControlComponent.RADIO) {\r\n hitRadio(preElement, draw)\r\n break\r\n }\r\n preIndex--\r\n }\r\n } else {\r\n draw.render({\r\n curIndex,\r\n isCompute: false,\r\n isSubmitHistory: false,\r\n isSetCursor:\r\n !isDirectHitImage && !isDirectHitCheckbox && !isDirectHitRadio\r\n })\r\n }\r\n // 首字需定位到行首,非上一行最后一个字后\r\n if (hitLineStartIndex) {\r\n host.getDraw().getCursor().drawCursor({\r\n hitLineStartIndex\r\n })\r\n }\r\n }\r\n // 预览工具组件\r\n const previewer = draw.getPreviewer()\r\n previewer.clearResizer()\r\n if (isDirectHitImage) {\r\n const previewerDrawOption: IPreviewerDrawOption = {\r\n // 只读或控件外表单模式禁用拖拽\r\n dragDisable:\r\n isReadonly ||\r\n (!curElement.controlId && draw.getMode() === EditorMode.FORM)\r\n }\r\n if (curElement.type === ElementType.LATEX) {\r\n previewerDrawOption.mime = 'svg'\r\n previewerDrawOption.srcKey = 'laTexSVG'\r\n }\r\n previewer.drawResizer(\r\n curElement,\r\n positionList[curIndex],\r\n previewerDrawOption\r\n )\r\n // 光标事件代理丢失,重新定位\r\n draw.getCursor().drawCursor({\r\n isShow: false\r\n })\r\n // 点击图片允许拖拽调整位置\r\n setRangeCache(host)\r\n // 浮动元素创建镜像图片\r\n if (\r\n curElement.imgDisplay === ImageDisplay.SURROUND ||\r\n curElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n curElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n draw.getImageParticle().createFloatImage(curElement)\r\n }\r\n // 图片点击事件\r\n const eventBus = draw.getEventBus()\r\n if (eventBus.hasSubscribers('imageMousedown')) {\r\n eventBus.emit('imageMousedown', {\r\n evt,\r\n element: curElement\r\n })\r\n }\r\n }\r\n // 表格工具组件\r\n const tableTool = draw.getTableTool()\r\n tableTool.dispose()\r\n if (isTable && !isReadonly && draw.getMode() !== EditorMode.FORM) {\r\n tableTool.render()\r\n }\r\n // 超链接\r\n const hyperlinkParticle = draw.getHyperlinkParticle()\r\n hyperlinkParticle.clearHyperlinkPopup()\r\n if (curElement.type === ElementType.HYPERLINK) {\r\n if (isMod(evt)) {\r\n hyperlinkParticle.openHyperlink(curElement)\r\n } else {\r\n hyperlinkParticle.drawHyperlinkPopup(curElement, positionList[curIndex])\r\n }\r\n }\r\n // 日期控件\r\n const dateParticle = draw.getDateParticle()\r\n dateParticle.clearDatePicker()\r\n if (curElement.type === ElementType.DATE && !isReadonly) {\r\n dateParticle.renderDatePicker(curElement, positionList[curIndex])\r\n }\r\n}\r\n","import {\r\n CONTROL_CONTEXT_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent, ControlType } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone, getUUID, omitObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext, formatElementList } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\ntype IDragElement = IElement & { dragId: string }\r\n\r\nfunction createDragId(element: IElement): string {\r\n const dragId = getUUID()\r\n Reflect.set(element, 'dragId', dragId)\r\n return dragId\r\n}\r\n\r\nfunction getElementIndexByDragId(dragId: string, elementList: IElement[]) {\r\n return (<IDragElement[]>elementList).findIndex(el => el.dragId === dragId)\r\n}\r\n\r\n// 移动悬浮图片位置\r\nfunction moveImgPosition(\r\n element: IElement,\r\n evt: MouseEvent,\r\n host: CanvasEvent\r\n) {\r\n const draw = host.getDraw()\r\n if (\r\n element.imgDisplay === ImageDisplay.SURROUND ||\r\n element.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n element.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n const moveX = evt.offsetX - host.mouseDownStartPosition!.x!\r\n const moveY = evt.offsetY - host.mouseDownStartPosition!.y!\r\n const imgFloatPosition = element.imgFloatPosition!\r\n element.imgFloatPosition = {\r\n x: imgFloatPosition.x + moveX,\r\n y: imgFloatPosition.y + moveY,\r\n pageNo: draw.getPageNo()\r\n }\r\n }\r\n draw.getImageParticle().destroyFloatImage()\r\n}\r\n\r\nexport function mouseup(evt: MouseEvent, host: CanvasEvent) {\r\n // 判断是否允许拖放\r\n if (host.isAllowDrop) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) {\r\n host.mousedown(evt)\r\n return\r\n }\r\n const position = draw.getPosition()\r\n const positionList = position.getPositionList()\r\n const positionContext = position.getPositionContext()\r\n const rangeManager = draw.getRange()\r\n const cacheRange = host.cacheRange!\r\n const cacheElementList = host.cacheElementList!\r\n const cachePositionList = host.cachePositionList!\r\n const cachePositionContext = host.cachePositionContext\r\n const range = rangeManager.getRange()\r\n // 缓存选区的信息\r\n const isCacheRangeCollapsed = cacheRange.startIndex === cacheRange.endIndex\r\n // 选区闭合时,起始位置向前移动一位进行扩选\r\n const cacheStartIndex = isCacheRangeCollapsed\r\n ? cacheRange.startIndex - 1\r\n : cacheRange.startIndex\r\n const cacheEndIndex = cacheRange.endIndex\r\n // 是否需要拖拽-位置发生改变\r\n if (\r\n range.startIndex >= cacheStartIndex &&\r\n range.endIndex <= cacheEndIndex &&\r\n host.cachePositionContext?.tdId === positionContext.tdId\r\n ) {\r\n // 清除渲染副作用\r\n draw.clearSideEffect()\r\n // 浮动元素拖拽需要提交历史\r\n let isSubmitHistory = false\r\n let isCompute = false\r\n if (isCacheRangeCollapsed) {\r\n // 图片移动\r\n const dragElement = cacheElementList[cacheEndIndex]\r\n if (\r\n dragElement.type === ElementType.IMAGE ||\r\n dragElement.type === ElementType.LATEX\r\n ) {\r\n moveImgPosition(dragElement, evt, host)\r\n if (\r\n dragElement.imgDisplay === ImageDisplay.SURROUND ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n draw.getPreviewer().drawResizer(dragElement)\r\n isSubmitHistory = true\r\n } else {\r\n const cachePosition = cachePositionList[cacheEndIndex]\r\n draw.getPreviewer().drawResizer(dragElement, cachePosition)\r\n }\r\n // 四周环绕型元素需计算\r\n isCompute = dragElement.imgDisplay === ImageDisplay.SURROUND\r\n }\r\n }\r\n rangeManager.replaceRange({\r\n ...cacheRange\r\n })\r\n draw.render({\r\n isCompute,\r\n isSubmitHistory,\r\n isSetCursor: false\r\n })\r\n return\r\n }\r\n // 是否是不可拖拽的控件结构元素\r\n const dragElementList = cacheElementList.slice(\r\n cacheStartIndex + 1,\r\n cacheEndIndex + 1\r\n )\r\n const isContainControl = dragElementList.find(element => element.controlId)\r\n if (isContainControl) {\r\n // 仅允许 (最前/后元素不是控件 || 在控件前后 || 文本控件且是值) 拖拽\r\n const cacheStartElement = cacheElementList[cacheStartIndex + 1]\r\n const cacheEndElement = cacheElementList[cacheEndIndex]\r\n const isAllowDragControl =\r\n ((!cacheStartElement.controlId ||\r\n cacheStartElement.controlComponent === ControlComponent.PREFIX) &&\r\n (!cacheEndElement.controlId ||\r\n cacheEndElement.controlComponent === ControlComponent.POSTFIX)) ||\r\n (cacheStartElement.controlId === cacheEndElement.controlId &&\r\n cacheStartElement.controlComponent === ControlComponent.PREFIX &&\r\n cacheEndElement.controlComponent === ControlComponent.POSTFIX) ||\r\n (cacheStartElement.control?.type === ControlType.TEXT &&\r\n cacheStartElement.controlComponent === ControlComponent.VALUE &&\r\n cacheEndElement.control?.type === ControlType.TEXT &&\r\n cacheEndElement.controlComponent === ControlComponent.VALUE)\r\n if (!isAllowDragControl) {\r\n draw.render({\r\n curIndex: range.startIndex,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n return\r\n }\r\n }\r\n // 格式化元素\r\n const control = draw.getControl()\r\n const elementList = draw.getElementList()\r\n // 是否排除控件属性(1.不包含控件 2.新位置在控件内 3.选区不包含完整控件)\r\n const isOmitControlAttr =\r\n !isContainControl ||\r\n !!elementList[range.startIndex].controlId ||\r\n !control.getIsElementListContainFullControl(dragElementList)\r\n const editorOptions = draw.getOptions()\r\n // 元素属性复制(1.文本提取样式及相关上下文 2.非文本排除相关上下文)\r\n const replaceElementList = dragElementList.map(el => {\r\n if (!el.type || el.type === ElementType.TEXT) {\r\n const newElement: IElement = {\r\n value: el.value\r\n }\r\n const copyAttr = EDITOR_ELEMENT_STYLE_ATTR\r\n if (!isOmitControlAttr) {\r\n copyAttr.push(...CONTROL_CONTEXT_ATTR)\r\n }\r\n copyAttr.forEach(attr => {\r\n const value = el[attr] as never\r\n if (value !== undefined) {\r\n newElement[attr] = value\r\n }\r\n })\r\n return newElement\r\n } else {\r\n let newElement = deepClone(el)\r\n if (isOmitControlAttr) {\r\n newElement = omitObject(newElement, CONTROL_CONTEXT_ATTR)\r\n }\r\n formatElementList([newElement], {\r\n isHandleFirstElement: false,\r\n editorOptions\r\n })\r\n return newElement\r\n }\r\n })\r\n formatElementContext(elementList, replaceElementList, range.startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n // 缓存拖拽选区开始元素、位置、开始结束id\r\n const cacheStartElement = cacheElementList[cacheStartIndex]\r\n const cacheStartPosition = cachePositionList[cacheStartIndex]\r\n const cacheRangeStartId = createDragId(cacheElementList[cacheStartIndex])\r\n const cacheRangeEndId = createDragId(cacheElementList[cacheEndIndex])\r\n // 设置拖拽值\r\n const replaceLength = replaceElementList.length\r\n let rangeStart = range.startIndex\r\n let rangeEnd = rangeStart + replaceLength\r\n const activeControl = control.getActiveControl()\r\n if (\r\n activeControl &&\r\n cacheElementList[rangeStart].controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n rangeEnd = activeControl.setValue(replaceElementList)\r\n rangeStart = rangeEnd - replaceLength\r\n } else {\r\n draw.spliceElementList(elementList, rangeStart + 1, 0, replaceElementList)\r\n }\r\n if (!~rangeEnd) {\r\n draw.render({\r\n isSetCursor: false\r\n })\r\n return\r\n }\r\n // 缓存当前开始结束id\r\n const rangeStartId = createDragId(elementList[rangeStart])\r\n const rangeEndId = createDragId(elementList[rangeEnd])\r\n // 删除原有拖拽元素\r\n const cacheRangeStartIndex = getElementIndexByDragId(\r\n cacheRangeStartId,\r\n cacheElementList\r\n )\r\n const cacheRangeEndIndex = getElementIndexByDragId(\r\n cacheRangeEndId,\r\n cacheElementList\r\n )\r\n const cacheEndElement = cacheElementList[cacheRangeEndIndex]\r\n if (\r\n cacheEndElement.controlId &&\r\n cacheEndElement.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n rangeManager.replaceRange({\r\n ...cacheRange,\r\n startIndex: cacheRangeStartIndex,\r\n endIndex: cacheRangeEndIndex\r\n })\r\n control.getActiveControl()?.cut()\r\n } else {\r\n // td不可删除判断\r\n let isTdElementDeletable = true\r\n if (cachePositionContext?.isTable) {\r\n const { tableId, trIndex, tdIndex } = cachePositionContext\r\n const originElementList = draw.getOriginalElementList()\r\n isTdElementDeletable = !originElementList.some(\r\n el =>\r\n el.id === tableId &&\r\n el?.trList?.[trIndex!]?.tdList?.[tdIndex!]?.deletable === false\r\n )\r\n }\r\n if (isTdElementDeletable) {\r\n draw.spliceElementList(\r\n cacheElementList,\r\n cacheRangeStartIndex + 1,\r\n cacheRangeEndIndex - cacheRangeStartIndex\r\n )\r\n }\r\n }\r\n // 重设上下文\r\n const startElement = elementList[range.startIndex]\r\n const startPosition = positionList[range.startIndex]\r\n let positionContextIndex = positionContext.index\r\n if (positionContextIndex) {\r\n if (startElement.tableId && !cacheStartElement.tableId) {\r\n // 表格外移动到表格内&&表格之前\r\n if (cacheStartPosition.index < positionContextIndex) {\r\n positionContextIndex -= replaceLength\r\n }\r\n } else if (!startElement.tableId && cacheStartElement.tableId) {\r\n // 表格内移到表格外&&表格之前\r\n if (startPosition.index < positionContextIndex) {\r\n positionContextIndex += replaceLength\r\n }\r\n }\r\n position.setPositionContext({\r\n ...positionContext,\r\n index: positionContextIndex\r\n })\r\n }\r\n // 重设选区\r\n const rangeStartIndex = getElementIndexByDragId(rangeStartId, elementList)\r\n const rangeEndIndex = getElementIndexByDragId(rangeEndId, elementList)\r\n rangeManager.setRange(\r\n isCacheRangeCollapsed ? rangeEndIndex : rangeStartIndex,\r\n rangeEndIndex,\r\n range.tableId,\r\n range.startTdIndex,\r\n range.endTdIndex,\r\n range.startTrIndex,\r\n range.endTrIndex\r\n )\r\n // 清除渲染副作用\r\n draw.clearSideEffect()\r\n // 移动图片\r\n let imgElement: IElement | null = null\r\n if (isCacheRangeCollapsed) {\r\n const elementList = draw.getElementList()\r\n const dragElement = elementList[rangeEndIndex]\r\n if (\r\n dragElement.type === ElementType.IMAGE ||\r\n dragElement.type === ElementType.LATEX\r\n ) {\r\n moveImgPosition(dragElement, evt, host)\r\n imgElement = dragElement\r\n }\r\n }\r\n // 重新渲染\r\n draw.render({\r\n isSetCursor: false\r\n })\r\n // 控件值变更回调\r\n if (activeControl) {\r\n control.emitControlContentChange()\r\n } else if (cacheStartElement.controlId) {\r\n control.emitControlContentChange({\r\n context: {\r\n range: cacheRange,\r\n elementList: cacheElementList\r\n },\r\n controlElement: cacheStartElement\r\n })\r\n }\r\n // 拖拽后渲染图片工具\r\n if (imgElement) {\r\n if (\r\n imgElement.imgDisplay === ImageDisplay.SURROUND ||\r\n imgElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n imgElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n draw.getPreviewer().drawResizer(imgElement)\r\n } else {\r\n const dragPositionList = position.getPositionList()\r\n const dragPosition = dragPositionList[rangeEndIndex]\r\n draw.getPreviewer().drawResizer(imgElement, dragPosition)\r\n }\r\n }\r\n } else if (host.isAllowDrag) {\r\n // 如果是允许拖拽不允许拖放(点击选区时光标闭合)则光标重置\r\n if (host.cacheRange?.startIndex !== host.cacheRange?.endIndex) {\r\n host.mousedown(evt)\r\n }\r\n }\r\n}\r\n","import { CanvasEvent } from '../CanvasEvent'\r\n\r\nexport function mouseleave(evt: MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n // 鼠标移出页面时选区禁用\r\n if (!draw.getOptions().pageOuterSelectionDisable) return\r\n // 是否还在canvas内部\r\n const pageContainer = draw.getPageContainer()\r\n const { x, y, width, height } = pageContainer.getBoundingClientRect()\r\n if (evt.x >= x && evt.x <= x + width && evt.y >= y && evt.y <= y + height) {\r\n return\r\n }\r\n host.setIsAllowSelection(false)\r\n}\r\n","import { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\nexport function mousemove(evt: MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n // 是否是拖拽文字\r\n if (host.isAllowDrag) {\r\n // 是否允许拖拽到选区\r\n const x = evt.offsetX\r\n const y = evt.offsetY\r\n const { startIndex, endIndex } = host.cacheRange!\r\n const positionList = host.cachePositionList!\r\n for (let p = startIndex + 1; p <= endIndex; p++) {\r\n const {\r\n coordinate: { leftTop, rightBottom }\r\n } = positionList[p]\r\n if (\r\n x >= leftTop[0] &&\r\n x <= rightBottom[0] &&\r\n y >= leftTop[1] &&\r\n y <= rightBottom[1]\r\n ) {\r\n return\r\n }\r\n }\r\n const cacheStartIndex = host.cacheRange?.startIndex\r\n if (cacheStartIndex) {\r\n // 浮动元素拖拽调整位置\r\n const dragElement = host.cacheElementList![cacheStartIndex]\r\n if (\r\n dragElement?.type === ElementType.IMAGE &&\r\n (dragElement.imgDisplay === ImageDisplay.SURROUND ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM)\r\n ) {\r\n draw.getPreviewer().clearResizer()\r\n draw.getImageParticle().dragFloatImage(evt.movementX, evt.movementY)\r\n }\r\n }\r\n host.dragover(evt)\r\n host.isAllowDrop = true\r\n return\r\n }\r\n if (!host.isAllowSelection || !host.mouseDownStartPosition) return\r\n const target = evt.target as HTMLDivElement\r\n const pageIndex = target.dataset.index\r\n // 设置pageNo\r\n if (pageIndex) {\r\n draw.setPageNo(Number(pageIndex))\r\n }\r\n // 结束位置\r\n const position = draw.getPosition()\r\n const positionResult = position.getPositionByXY({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n if (!~positionResult.index) return\r\n const {\r\n index,\r\n isTable,\r\n tdValueIndex,\r\n tdIndex,\r\n trIndex,\r\n tableId,\r\n trId,\r\n tdId\r\n } = positionResult\r\n const {\r\n index: startIndex,\r\n isTable: startIsTable,\r\n tdIndex: startTdIndex,\r\n trIndex: startTrIndex,\r\n tableId: startTableId\r\n } = host.mouseDownStartPosition\r\n const endIndex = isTable ? tdValueIndex! : index\r\n // 判断是否是表格跨行/列\r\n const rangeManager = draw.getRange()\r\n if (\r\n isTable &&\r\n startIsTable &&\r\n (tdIndex !== startTdIndex || trIndex !== startTrIndex)\r\n ) {\r\n rangeManager.setRange(\r\n endIndex,\r\n endIndex,\r\n tableId,\r\n startTdIndex,\r\n tdIndex,\r\n startTrIndex,\r\n trIndex\r\n )\r\n position.setPositionContext({\r\n isTable,\r\n index,\r\n trIndex,\r\n tdIndex,\r\n tdId,\r\n trId,\r\n tableId\r\n })\r\n } else {\r\n let end = ~endIndex ? endIndex : 0\r\n // 开始或结束位置存在表格,但是非相同表格则忽略选区设置\r\n if ((startIsTable || isTable) && startTableId !== tableId) return\r\n // 开始位置\r\n let start = startIndex\r\n if (start > end) {\r\n // prettier-ignore\r\n [start, end] = [end, start]\r\n }\r\n if (start === end) return\r\n // 背景文本禁止选区\r\n const elementList = draw.getElementList()\r\n const startElement = elementList[start + 1]\r\n const endElement = elementList[end]\r\n if (\r\n startElement?.controlComponent === ControlComponent.PLACEHOLDER &&\r\n endElement?.controlComponent === ControlComponent.PLACEHOLDER &&\r\n startElement.controlId === endElement.controlId\r\n ) {\r\n return\r\n }\r\n rangeManager.setRange(start, end)\r\n }\r\n // 绘制\r\n draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function backspace(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly()) return\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n const options = draw.getOptions()\r\n const isTrackChanges = options.trackChanges\r\n\r\n const control = draw.getControl()\r\n const position = draw.getPosition()\r\n if (rangeManager.getIsCollapsed()) {\r\n const range = rangeManager.getRange()\r\n const elementList = draw.getElementList()\r\n const element = elementList[range.startIndex]\r\n if (element.control?.hide || element.area?.hide) {\r\n const newIndex = control.removeControl(range.startIndex)\r\n if (newIndex) {\r\n range.startIndex = newIndex\r\n range.endIndex = newIndex\r\n rangeManager.replaceRange(range)\r\n const positionList = position.getPositionList()\r\n position.setCursorPosition(positionList[newIndex])\r\n }\r\n }\r\n }\r\n const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange()\r\n let curIndex: number | null\r\n if (isCrossRowCol) {\r\n const rowCol = draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return\r\n let isDeleted = false\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const col = row[c]\r\n if (col.value.length > 1) {\r\n draw.spliceElementList(col.value, 1, col.value.length - 1)\r\n isDeleted = true\r\n }\r\n }\r\n }\r\n curIndex = isDeleted ? 0 : null\r\n } else if (\r\n control.getActiveControl() &&\r\n control.getIsRangeCanCaptureEvent()\r\n ) {\r\n curIndex = control.keydown(evt)\r\n if (curIndex) {\r\n control.emitControlContentChange()\r\n }\r\n } else {\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n const elementList = draw.getElementList()\r\n if (isCollapsed && index === 0) {\r\n const firstElement = elementList[index]\r\n if (firstElement.value === ZERO) {\r\n if (firstElement.listId) {\r\n draw.getListParticle().unsetList()\r\n }\r\n evt.preventDefault()\r\n return\r\n }\r\n }\r\n const startElement = elementList[startIndex]\r\n if (isCollapsed && startElement.rowFlex && startElement.value === ZERO) {\r\n const rowFlexElementList = rangeManager.getRangeRowElementList()\r\n if (rowFlexElementList) {\r\n const preElement = elementList[startIndex - 1]\r\n rowFlexElementList.forEach(element => {\r\n element.rowFlex = preElement?.rowFlex\r\n })\r\n }\r\n }\r\n if (!isCollapsed) {\r\n if (isTrackChanges) {\r\n\r\n for (let i = startIndex + 1; i <= endIndex; i++) {\r\n const element = elementList[i]\r\n if (element && !element.revisionId) {\r\n element.revisionId = 'rev_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = startIndex\r\n } else {\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n curIndex = startIndex\r\n }\r\n } else {\r\n if (isTrackChanges) {\r\n const element = elementList[index]\r\n if (element && !element.revisionId) {\r\n let nextRevisionElement = null\r\n for (let i = index + 1; i < elementList.length; i++) {\r\n const el = elementList[i]\r\n if (el && el.revisionType === 'delete' && el.revisionAuthor === '当前用户') {\r\n nextRevisionElement = el\r\n break\r\n }\r\n if (el && !el.revisionId) break\r\n }\r\n if (nextRevisionElement) {\r\n element.revisionId = nextRevisionElement.revisionId\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = nextRevisionElement.revisionAuthor\r\n element.revisionDate = nextRevisionElement.revisionDate\r\n } else {\r\n element.revisionId = 'rev_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = index - 1\r\n } else {\r\n draw.spliceElementList(elementList, index, 1)\r\n curIndex = index - 1\r\n }\r\n }\r\n }\r\n draw.getGlobalEvent().setCanvasEventAbility()\r\n if (curIndex === null) {\r\n rangeManager.setRange(startIndex, startIndex)\r\n draw.render({\r\n curIndex: startIndex,\r\n isSubmitHistory: false,\r\n isPartialRender: true\r\n })\r\n } else {\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({\r\n curIndex,\r\n isPartialRender: true\r\n })\r\n }\r\n}\r\n","import { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function del(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly()) return\r\n // 可输入性验证\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n const options = draw.getOptions()\r\n const isTrackChanges = options.trackChanges\r\n\r\n const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange()\r\n // 隐藏控件删除\r\n const elementList = draw.getElementList()\r\n const control = draw.getControl()\r\n if (rangeManager.getIsCollapsed()) {\r\n const nextElement = elementList[startIndex + 1]\r\n if (nextElement?.control?.hide || nextElement?.area?.hide) {\r\n const newIndex = control.removeControl(startIndex + 1)\r\n if (newIndex) {\r\n // 更新位置信息\r\n const position = draw.getPosition()\r\n const positionList = position.getPositionList()\r\n position.setCursorPosition(positionList[newIndex])\r\n }\r\n }\r\n }\r\n // 删除操作\r\n let curIndex: number | null\r\n if (isCrossRowCol) {\r\n // 表格跨行列选中时清空单元格内容\r\n const rowCol = draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return\r\n let isDeleted = false\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const col = row[c]\r\n if (col.value.length > 1) {\r\n draw.spliceElementList(col.value, 1, col.value.length - 1)\r\n isDeleted = true\r\n }\r\n }\r\n }\r\n // 删除成功后定位\r\n curIndex = isDeleted ? 0 : null\r\n } else if (control.getActiveControl() && control.getIsRangeWithinControl()) {\r\n // 光标在控件内\r\n curIndex = control.keydown(evt)\r\n if (curIndex) {\r\n control.emitControlContentChange()\r\n }\r\n } else if (elementList[endIndex + 1]?.controlId) {\r\n // 光标在控件前\r\n curIndex = control.removeControl(endIndex + 1)\r\n } else {\r\n // 普通元素\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n // 命中图片直接删除\r\n const positionContext = position.getPositionContext()\r\n if (positionContext.isDirectHit && positionContext.isImage) {\r\n draw.spliceElementList(elementList, index, 1)\r\n curIndex = index - 1\r\n } else {\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n if (!isCollapsed) {\r\n if (isTrackChanges) {\r\n\r\n for (let i = startIndex + 1; i <= endIndex; i++) {\r\n const element = elementList[i]\r\n if (element && !element.revisionId) {\r\n element.revisionId = `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = startIndex\r\n } else {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n curIndex = startIndex\r\n }\r\n } else {\r\n if (!elementList[index + 1]) return\r\n if (isTrackChanges) {\r\n const element = elementList[index + 1]\r\n\r\n if (element && !element.revisionId) {\r\n const nextElement = elementList[index + 2]\r\n if (nextElement && nextElement.revisionType === 'delete' && nextElement.revisionAuthor === '当前用户') {\r\n element.revisionId = nextElement.revisionId\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = nextElement.revisionAuthor\r\n element.revisionDate = nextElement.revisionDate\r\n } else {\r\n element.revisionId = `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = index\r\n } else {\r\n draw.spliceElementList(elementList, index + 1, 1)\r\n curIndex = index\r\n }\r\n }\r\n }\r\n }\r\n draw.getGlobalEvent().setCanvasEventAbility()\r\n if (curIndex === null) {\r\n rangeManager.setRange(startIndex, startIndex)\r\n draw.render({\r\n curIndex: startIndex,\r\n isSubmitHistory: false,\r\n isPartialRender: true\r\n })\r\n } else {\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({\r\n curIndex,\r\n isPartialRender: true\r\n })\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n AREA_CONTEXT_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR,\r\n EDITOR_ROW_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { omitObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function enter(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly()) return\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n const elementList = draw.getElementList()\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n // 最后一个列表项行首回车取消列表设置\r\n if (\r\n isCollapsed &&\r\n endElement.listId &&\r\n endElement.value === ZERO &&\r\n elementList[endIndex + 1]?.listId !== endElement.listId\r\n ) {\r\n draw.getListParticle().unsetList()\r\n return\r\n }\r\n // 列表块内换行\r\n let enterText: IElement = {\r\n value: ZERO\r\n }\r\n if (evt.shiftKey && startElement.listId) {\r\n enterText.listWrap = true\r\n }\r\n // 格式化上下文\r\n formatElementContext(elementList, [enterText], startIndex, {\r\n isBreakWhenWrap: true,\r\n editorOptions: draw.getOptions()\r\n })\r\n // shift长按 && 最后位置回车无需复制区域上下文\r\n if (\r\n evt.shiftKey &&\r\n endElement.areaId &&\r\n endElement.areaId !== elementList[endIndex + 1]?.areaId\r\n ) {\r\n enterText = omitObject(enterText, AREA_CONTEXT_ATTR)\r\n }\r\n // 标题结尾处回车无需格式化及样式复制\r\n if (\r\n !(\r\n endElement.titleId &&\r\n endElement.titleId !== elementList[endIndex + 1]?.titleId\r\n )\r\n ) {\r\n // 复制样式属性\r\n const copyElement = rangeManager.getRangeAnchorStyle(elementList, endIndex)\r\n if (copyElement) {\r\n const copyAttr = [...EDITOR_ROW_ATTR]\r\n // 不复制控件后缀样式\r\n if (copyElement.controlComponent !== ControlComponent.POSTFIX) {\r\n copyAttr.push(...EDITOR_ELEMENT_STYLE_ATTR)\r\n }\r\n copyAttr.forEach(attr => {\r\n if (!evt.shiftKey && attr === 'characterScale') {\r\n return\r\n }\r\n const value = copyElement[attr] as never\r\n if (value !== undefined) {\r\n enterText[attr] = value\r\n }\r\n })\r\n }\r\n }\r\n // 控件或文档插入换行元素\r\n const control = draw.getControl()\r\n const activeControl = control.getActiveControl()\r\n let curIndex: number\r\n if (activeControl && control.getIsRangeWithinControl()) {\r\n curIndex = control.setValue([enterText])\r\n control.emitControlContentChange()\r\n } else {\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n if (isCollapsed) {\r\n draw.spliceElementList(elementList, index + 1, 0, [enterText])\r\n } else {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex,\r\n [enterText]\r\n )\r\n }\r\n curIndex = index + 1\r\n }\r\n if (~curIndex) {\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({ curIndex })\r\n }\r\n evt.preventDefault()\r\n}\r\n","import { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { getNonHideElementIndex } from '@vervedoc/docx-editor-schema'\r\nimport { isMod } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function left(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const positionContext = position.getPositionContext()\r\n const { index } = cursorPosition\r\n if (index <= 0 && !positionContext.isTable) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n const elementList = draw.getElementList()\r\n // 表单模式下控件移动\r\n const control = draw.getControl()\r\n if (\r\n draw.getMode() === EditorMode.FORM &&\r\n control.getActiveControl() &&\r\n (elementList[index]?.controlComponent === ControlComponent.PREFIX ||\r\n elementList[index]?.controlComponent === ControlComponent.PRE_TEXT)\r\n ) {\r\n control.initNextControl({\r\n direction: MoveDirection.UP\r\n })\r\n return\r\n }\r\n // 单词整体移动\r\n let moveCount = 1\r\n if (isMod(evt)) {\r\n const LETTER_REG = draw.getLetterReg()\r\n // 起始位置\r\n const moveStartIndex =\r\n evt.shiftKey && !isCollapsed && startIndex === cursorPosition?.index\r\n ? endIndex\r\n : startIndex\r\n if (LETTER_REG.test(elementList[moveStartIndex]?.value)) {\r\n let i = moveStartIndex - 1\r\n while (i > 0) {\r\n const element = elementList[i]\r\n if (!LETTER_REG.test(element.value)) {\r\n break\r\n }\r\n moveCount++\r\n i--\r\n }\r\n }\r\n }\r\n const curIndex = startIndex - moveCount\r\n // shift则缩放选区\r\n let anchorStartIndex = curIndex\r\n let anchorEndIndex = curIndex\r\n if (evt.shiftKey && cursorPosition) {\r\n if (startIndex !== endIndex) {\r\n if (startIndex === cursorPosition.index) {\r\n // 减小选区\r\n anchorStartIndex = startIndex\r\n anchorEndIndex = endIndex - moveCount\r\n } else {\r\n anchorStartIndex = curIndex\r\n anchorEndIndex = endIndex\r\n }\r\n } else {\r\n anchorEndIndex = endIndex\r\n }\r\n }\r\n // 表格单元格间跳转\r\n if (!evt.shiftKey) {\r\n const element = elementList[startIndex]\r\n // 之前是表格则进入最后一个单元格最后一个元素\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n const lastTrIndex = trList.length - 1\r\n const lastTr = trList[lastTrIndex]\r\n const lastTdIndex = lastTr.tdList.length - 1\r\n const lastTd = lastTr.tdList[lastTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: startIndex,\r\n trIndex: lastTrIndex,\r\n tdIndex: lastTdIndex,\r\n tdId: lastTd.id,\r\n trId: lastTr.id,\r\n tableId: element.id\r\n })\r\n anchorStartIndex = lastTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n } else if (element.tableId) {\r\n // 在表格单元格内&在首位则往前移动单元格\r\n if (startIndex === 0) {\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[positionContext.index!].trList!\r\n outer: for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n if (tr.id !== element.trId) continue\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (td.id !== element.tdId) continue\r\n // 移动到表格前\r\n if (r === 0 && d === 0) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = positionContext.index! - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 上一个单元格\r\n let preTrIndex = r\r\n let preTdIndex = d - 1\r\n if (preTdIndex < 0) {\r\n preTrIndex = r - 1\r\n preTdIndex = trList[preTrIndex].tdList.length - 1\r\n }\r\n const preTr = trList[preTrIndex]\r\n const preTd = preTr.tdList[preTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: preTrIndex,\r\n tdIndex: preTdIndex,\r\n tdId: preTd.id,\r\n trId: preTr.id,\r\n tableId: element.tableId\r\n })\r\n anchorStartIndex = preTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n break outer\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 执行跳转\r\n if (!~anchorStartIndex || !~anchorEndIndex) return\r\n // 隐藏元素跳过\r\n const newElementList = draw.getElementList()\r\n anchorStartIndex = getNonHideElementIndex(newElementList, anchorStartIndex)\r\n anchorEndIndex = getNonHideElementIndex(newElementList, anchorEndIndex)\r\n // 设置上下文\r\n rangeManager.setRange(anchorStartIndex, anchorEndIndex)\r\n const isAnchorCollapsed = anchorStartIndex === anchorEndIndex\r\n draw.render({\r\n curIndex: isAnchorCollapsed ? anchorStartIndex : undefined,\r\n isSetCursor: isAnchorCollapsed,\r\n isSubmitHistory: false,\r\n isCompute: false\r\n })\r\n evt.preventDefault()\r\n}\r\n","import { LocationPosition } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { getNonHideElementIndex } from '@vervedoc/docx-editor-schema'\r\nimport { isMod } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function right(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n const positionList = position.getPositionList()\r\n const positionContext = position.getPositionContext()\r\n if (index > positionList.length - 1 && !positionContext.isTable) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n let elementList = draw.getElementList()\r\n // 表单模式下控件移动\r\n const control = draw.getControl()\r\n if (\r\n draw.getMode() === EditorMode.FORM &&\r\n control.getActiveControl() &&\r\n (elementList[index + 1]?.controlComponent === ControlComponent.POSTFIX ||\r\n elementList[index + 1]?.controlComponent === ControlComponent.POST_TEXT)\r\n ) {\r\n control.initNextControl({\r\n direction: MoveDirection.DOWN\r\n })\r\n return\r\n }\r\n // 单词整体移动\r\n let moveCount = 1\r\n if (isMod(evt)) {\r\n const LETTER_REG = draw.getLetterReg()\r\n // 起始位置\r\n const moveStartIndex =\r\n evt.shiftKey && !isCollapsed && startIndex === cursorPosition?.index\r\n ? endIndex\r\n : startIndex\r\n if (LETTER_REG.test(elementList[moveStartIndex + 1]?.value)) {\r\n let i = moveStartIndex + 2\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n if (!LETTER_REG.test(element.value)) {\r\n break\r\n }\r\n moveCount++\r\n i++\r\n }\r\n }\r\n }\r\n const curIndex = endIndex + moveCount\r\n // shift则缩放选区\r\n let anchorStartIndex = curIndex\r\n let anchorEndIndex = curIndex\r\n if (evt.shiftKey && cursorPosition) {\r\n if (startIndex !== endIndex) {\r\n if (startIndex === cursorPosition.index) {\r\n // 增大选区\r\n anchorStartIndex = startIndex\r\n anchorEndIndex = curIndex\r\n } else {\r\n anchorStartIndex = startIndex + moveCount\r\n anchorEndIndex = endIndex\r\n }\r\n } else {\r\n anchorStartIndex = startIndex\r\n }\r\n }\r\n // 表格单元格间跳转\r\n if (!evt.shiftKey) {\r\n const element = elementList[endIndex]\r\n const nextElement = elementList[endIndex + 1]\r\n // 后一个元素是表格,则进入单元格第一个起始位置\r\n if (nextElement?.type === ElementType.TABLE) {\r\n const trList = nextElement.trList!\r\n const nextTr = trList[0]\r\n const nextTd = nextTr.tdList[0]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: endIndex + 1,\r\n trIndex: 0,\r\n tdIndex: 0,\r\n tdId: nextTd.id,\r\n trId: nextTr.id,\r\n tableId: nextElement.id\r\n })\r\n anchorStartIndex = 0\r\n anchorEndIndex = 0\r\n draw.getTableTool().render()\r\n } else if (element.tableId) {\r\n // 在表格单元格内&单元格元素最后\r\n if (!nextElement) {\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[positionContext.index!].trList!\r\n outer: for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n if (tr.id !== element.trId) continue\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (td.id !== element.tdId) continue\r\n // 移动到表格后\r\n if (r === trList.length - 1 && d === tdList.length - 1) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = positionContext.index!\r\n anchorEndIndex = anchorStartIndex\r\n elementList = draw.getElementList()\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 下一个单元格\r\n let nextTrIndex = r\r\n let nextTdIndex = d + 1\r\n if (nextTdIndex > tdList.length - 1) {\r\n nextTrIndex = r + 1\r\n nextTdIndex = 0\r\n }\r\n const preTr = trList[nextTrIndex]\r\n const preTd = preTr.tdList[nextTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: nextTrIndex,\r\n tdIndex: nextTdIndex,\r\n tdId: preTd.id,\r\n trId: preTr.id,\r\n tableId: element.tableId\r\n })\r\n anchorStartIndex = 0\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n break outer\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 执行跳转\r\n const maxElementListIndex = elementList.length - 1\r\n if (\r\n anchorStartIndex > maxElementListIndex ||\r\n anchorEndIndex > maxElementListIndex\r\n ) {\r\n return\r\n }\r\n // 隐藏元素跳过\r\n const newElementList = draw.getElementList()\r\n anchorStartIndex = getNonHideElementIndex(\r\n newElementList,\r\n anchorStartIndex,\r\n LocationPosition.AFTER\r\n )\r\n anchorEndIndex = getNonHideElementIndex(\r\n newElementList,\r\n anchorEndIndex,\r\n LocationPosition.AFTER\r\n )\r\n // 设置上下文\r\n rangeManager.setRange(anchorStartIndex, anchorEndIndex)\r\n const isAnchorCollapsed = anchorStartIndex === anchorEndIndex\r\n draw.render({\r\n curIndex: isAnchorCollapsed ? anchorStartIndex : undefined,\r\n isSetCursor: isAnchorCollapsed,\r\n isSubmitHistory: false,\r\n isCompute: false\r\n })\r\n evt.preventDefault()\r\n}\r\n","import { EDITOR_ELEMENT_STYLE_ATTR } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { pickObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function tab(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n evt.preventDefault()\r\n // 在控件上下文时,tab键控制控件之间移动\r\n const control = draw.getControl()\r\n const activeControl = control.getActiveControl()\r\n if (activeControl && control.getIsRangeWithinControl()) {\r\n control.initNextControl({\r\n direction: evt.shiftKey ? MoveDirection.UP : MoveDirection.DOWN\r\n })\r\n } else {\r\n const rangeManager = draw.getRange()\r\n const elementList = draw.getElementList()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n // 插入tab符\r\n const anchorStyle = rangeManager.getRangeAnchorStyle(elementList, endIndex)\r\n // 仅复制样式\r\n const copyStyle = anchorStyle\r\n ? pickObject(anchorStyle, EDITOR_ELEMENT_STYLE_ATTR)\r\n : null\r\n const tabElement: IElement = {\r\n ...copyStyle,\r\n type: ElementType.TAB,\r\n value: ''\r\n }\r\n formatElementContext(elementList, [tabElement], startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n draw.insertElementList([tabElement])\r\n }\r\n}\r\n","import { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\ninterface IGetNextPositionIndexPayload {\r\n positionList: IElementPosition[]\r\n index: number\r\n rowNo: number\r\n isUp: boolean\r\n cursorX: number\r\n}\r\n// 根据当前位置索引查找上下行最接近的索引位置\r\nfunction getNextPositionIndex(payload: IGetNextPositionIndexPayload) {\r\n const { positionList, index, isUp, rowNo, cursorX } = payload\r\n let nextIndex = -1\r\n // 查找下一行位置列表\r\n const probablePosition: IElementPosition[] = []\r\n if (isUp) {\r\n let p = index - 1\r\n // 等于0的时候上一行是第一行\r\n while (p >= 0) {\r\n const position = positionList[p]\r\n p--\r\n if (position.rowNo === rowNo) continue\r\n if (probablePosition[0] && probablePosition[0].rowNo !== position.rowNo) {\r\n break\r\n }\r\n probablePosition.unshift(position)\r\n }\r\n } else {\r\n let p = index + 1\r\n while (p < positionList.length) {\r\n const position = positionList[p]\r\n p++\r\n if (position.rowNo === rowNo) continue\r\n if (probablePosition[0] && probablePosition[0].rowNo !== position.rowNo) {\r\n break\r\n }\r\n probablePosition.push(position)\r\n }\r\n }\r\n // 查找下一行位置:第一个存在交叉宽度的元素位置\r\n for (let p = 0; p < probablePosition.length; p++) {\r\n const nextPosition = probablePosition[p]\r\n const {\r\n coordinate: {\r\n leftTop: [nextLeftX],\r\n rightTop: [nextRightX]\r\n }\r\n } = nextPosition\r\n if (p === probablePosition.length - 1) {\r\n nextIndex = nextPosition.index\r\n }\r\n if (cursorX < nextLeftX || cursorX > nextRightX) continue\r\n nextIndex = nextPosition.index\r\n break\r\n }\r\n return nextIndex\r\n}\r\n\r\nexport function updown(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n let positionList = position.getPositionList()\r\n const isUp = evt.key === KeyMap.Up\r\n // 新的光标开始结束位置\r\n let anchorStartIndex = -1\r\n let anchorEndIndex = -1\r\n // 单元格之间跳转及跳出表格逻辑\r\n const positionContext = position.getPositionContext()\r\n if (\r\n !evt.shiftKey &&\r\n positionContext.isTable &&\r\n ((isUp && cursorPosition.rowIndex === 0) ||\r\n (!isUp && cursorPosition.rowIndex === draw.getRowCount() - 1))\r\n ) {\r\n const { index, trIndex, tdIndex, tableId } = positionContext\r\n if (isUp) {\r\n // 向上移动-第一行则移出到表格外,否则上一行相同列位置\r\n if (trIndex === 0) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = index! - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 查找上一行相同列索引位置信息\r\n let preTrIndex = -1\r\n let preTdIndex = -1\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[index!].trList!\r\n // 当前单元格所在列实际索引\r\n const curTdColIndex = trList[trIndex!].tdList[tdIndex!].colIndex!\r\n outer: for (let r = trIndex! - 1; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (\r\n td.colIndex === curTdColIndex ||\r\n (td.colIndex! + td.colspan - 1 >= curTdColIndex &&\r\n td.colIndex! <= curTdColIndex)\r\n ) {\r\n preTrIndex = r\r\n preTdIndex = d\r\n break outer\r\n }\r\n }\r\n }\r\n if (!~preTrIndex || !~preTdIndex) return\r\n const preTr = trList[preTrIndex]\r\n const preTd = preTr.tdList[preTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: preTrIndex,\r\n tdIndex: preTdIndex,\r\n tdId: preTd.id,\r\n trId: preTr.id,\r\n tableId\r\n })\r\n anchorStartIndex = preTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n } else {\r\n // 向下移动-最后一行则移出表格外,否则下一行相同列位置\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[index!].trList!\r\n if (trIndex === trList.length - 1) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = index!\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 查找下一行相同列索引位置信息\r\n let nexTrIndex = -1\r\n let nextTdIndex = -1\r\n // 当前单元格所在列实际索引\r\n const curTdColIndex = trList[trIndex!].tdList[tdIndex!].colIndex!\r\n outer: for (let r = trIndex! + 1; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (\r\n td.colIndex === curTdColIndex ||\r\n (td.colIndex! + td.colspan - 1 >= curTdColIndex &&\r\n td.colIndex! <= curTdColIndex)\r\n ) {\r\n nexTrIndex = r\r\n nextTdIndex = d\r\n break outer\r\n }\r\n }\r\n }\r\n if (!~nexTrIndex || !~nextTdIndex) return\r\n const nextTr = trList[nexTrIndex]\r\n const nextTd = nextTr.tdList[nextTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: nexTrIndex,\r\n tdIndex: nextTdIndex,\r\n tdId: nextTd.id,\r\n trId: nextTr.id,\r\n tableId\r\n })\r\n anchorStartIndex = nextTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n }\r\n } else {\r\n // 普通元素及跳进表格逻辑\r\n let anchorPosition: IElementPosition = cursorPosition\r\n // 扩大选区时,判断移动光标点\r\n if (evt.shiftKey) {\r\n if (startIndex === cursorPosition.index) {\r\n anchorPosition = positionList[endIndex]\r\n } else {\r\n anchorPosition = positionList[startIndex]\r\n }\r\n }\r\n const {\r\n index,\r\n rowNo,\r\n rowIndex,\r\n coordinate: {\r\n rightTop: [curRightX]\r\n }\r\n } = anchorPosition\r\n // 向上时在首行、向下时在尾行则忽略\r\n if (\r\n (isUp && rowIndex === 0) ||\r\n (!isUp && rowIndex === draw.getRowCount() - 1)\r\n ) {\r\n return\r\n }\r\n // 查找下一行位置列表\r\n const nextIndex = getNextPositionIndex({\r\n positionList,\r\n index,\r\n rowNo,\r\n isUp,\r\n cursorX: curRightX\r\n })\r\n if (nextIndex < 0) return\r\n // shift则缩放选区\r\n anchorStartIndex = nextIndex\r\n anchorEndIndex = nextIndex\r\n if (evt.shiftKey) {\r\n if (startIndex !== endIndex) {\r\n if (startIndex === cursorPosition.index) {\r\n anchorStartIndex = startIndex\r\n } else {\r\n anchorEndIndex = endIndex\r\n }\r\n } else {\r\n if (isUp) {\r\n anchorEndIndex = endIndex\r\n } else {\r\n anchorStartIndex = startIndex\r\n }\r\n }\r\n }\r\n // 如果下一行是表格则进入单元格内\r\n const elementList = draw.getElementList()\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.type === ElementType.TABLE) {\r\n const { scale } = draw.getOptions()\r\n const margins = draw.getMargins()\r\n const trList = nextElement.trList!\r\n // 查找进入的单元格及元素位置\r\n let trIndex = -1\r\n let tdIndex = -1\r\n let tdPositionIndex = -1\r\n if (isUp) {\r\n outer: for (let r = trList.length - 1; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const tdX = td.x! * scale + margins[3]\r\n const tdWidth = td.width! * scale\r\n if (curRightX >= tdX && curRightX <= tdX + tdWidth) {\r\n const tdPositionList = td.positionList!\r\n const lastPosition = tdPositionList[tdPositionList.length - 1]\r\n const nextPositionIndex =\r\n getNextPositionIndex({\r\n positionList: tdPositionList,\r\n index: lastPosition.index + 1, // 虚拟起始位置+1(从左往右找)\r\n rowNo: lastPosition.rowNo - 1, // 虚拟起始行号-1(从下往上找)\r\n isUp,\r\n cursorX: curRightX\r\n }) || lastPosition.index\r\n trIndex = r\r\n tdIndex = d\r\n tdPositionIndex = nextPositionIndex\r\n break outer\r\n }\r\n }\r\n }\r\n } else {\r\n outer: for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const tdX = td.x! * scale + margins[3]\r\n const tdWidth = td.width! * scale\r\n if (curRightX >= tdX && curRightX <= tdX + tdWidth) {\r\n const tdPositionList = td.positionList!\r\n const nextPositionIndex =\r\n getNextPositionIndex({\r\n positionList: tdPositionList,\r\n index: -1, // 虚拟起始位置-1(从右往左找)\r\n rowNo: -1, // 虚拟起始行号-1(从上往下找)\r\n isUp,\r\n cursorX: curRightX\r\n }) || 0\r\n trIndex = r\r\n tdIndex = d\r\n tdPositionIndex = nextPositionIndex\r\n break outer\r\n }\r\n }\r\n }\r\n }\r\n // 设置上下文\r\n if (~trIndex && ~tdIndex && ~tdPositionIndex) {\r\n const nextTr = trList[trIndex]\r\n const nextTd = nextTr.tdList[tdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: nextIndex,\r\n trIndex: trIndex,\r\n tdIndex: tdIndex,\r\n tdId: nextTd.id,\r\n trId: nextTr.id,\r\n tableId: nextElement.id\r\n })\r\n anchorStartIndex = tdPositionIndex\r\n anchorEndIndex = anchorStartIndex\r\n positionList = position.getPositionList()\r\n draw.getTableTool().render()\r\n }\r\n }\r\n }\r\n // 执行跳转\r\n if (!~anchorStartIndex || !~anchorEndIndex) return\r\n if (anchorStartIndex > anchorEndIndex) {\r\n // prettier-ignore\r\n [anchorStartIndex, anchorEndIndex] = [anchorEndIndex, anchorStartIndex]\r\n }\r\n rangeManager.setRange(anchorStartIndex, anchorEndIndex)\r\n const isCollapsed = anchorStartIndex === anchorEndIndex\r\n draw.render({\r\n curIndex: isCollapsed ? anchorStartIndex : undefined,\r\n isSetCursor: isCollapsed,\r\n isSubmitHistory: false,\r\n isCompute: false\r\n })\r\n // 将光标移动到可视范围内\r\n draw.getCursor().moveCursorToVisible({\r\n cursorPosition: positionList[isUp ? anchorStartIndex : anchorEndIndex],\r\n direction: isUp ? MoveDirection.UP : MoveDirection.DOWN\r\n })\r\n}\r\n","import { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\nimport { backspace } from './backspace'\r\nimport { del } from './delete'\r\nimport { enter } from './enter'\r\nimport { left } from './left'\r\nimport { right } from './right'\r\nimport { tab } from './tab'\r\nimport { updown } from './updown'\r\n\r\nexport function keydown(evt: KeyboardEvent, host: CanvasEvent) {\r\n if (host.isComposing) return\r\n const draw = host.getDraw()\r\n if (evt.key === KeyMap.Backspace) {\r\n backspace(evt, host)\r\n } else if (evt.key === KeyMap.Delete) {\r\n del(evt, host)\r\n } else if (evt.key === KeyMap.Enter) {\r\n enter(evt, host)\r\n } else if (evt.key === KeyMap.Left) {\r\n left(evt, host)\r\n } else if (evt.key === KeyMap.Right) {\r\n right(evt, host)\r\n } else if (evt.key === KeyMap.Up || evt.key === KeyMap.Down) {\r\n updown(evt, host)\r\n } else if (evt.key === KeyMap.ESC) {\r\n host.clearPainterStyle()\r\n const zoneManager = draw.getZone()\r\n if (!zoneManager.isMainActive()) {\r\n zoneManager.setZone(EditorZone.MAIN)\r\n }\r\n evt.preventDefault()\r\n } else if (evt.key === KeyMap.TAB) {\r\n tab(evt, host)\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n EDITOR_ELEMENT_COPY_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IRangeElementStyle } from '@vervedoc/docx-editor-schema'\r\nimport { splitText } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\n// 输入防抖定时器\r\nlet inputDebounceTimer: number | null = null\r\n// 待渲染标记\r\nlet pendingRender = false\r\n\r\nexport function input(data: string, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!data || !cursorPosition) return\r\n const isComposing = host.isComposing\r\n // 正在合成文本进行非输入操作\r\n if (isComposing && host.compositionInfo?.value === data) return\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n // 移除合成前,缓存设置的默认样式设置\r\n const defaultStyle =\r\n rangeManager.getDefaultStyle() || host.compositionInfo?.defaultStyle || null\r\n // 移除合成输入\r\n removeComposingInput(host)\r\n if (!isComposing) {\r\n const cursor = draw.getCursor()\r\n cursor.clearAgentDomValue()\r\n }\r\n const { TEXT, HYPERLINK, SUBSCRIPT, SUPERSCRIPT, DATE, TAB } = ElementType\r\n const text = data.replaceAll(`\\n`, ZERO)\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n // 格式化元素\r\n const elementList = draw.getElementList()\r\n const copyElement = rangeManager.getRangeAnchorStyle(elementList, endIndex)\r\n if (!copyElement) return\r\n const isDesignMode = draw.isDesignMode()\r\n const options = draw.getOptions()\r\n const isTrackChanges = options.trackChanges\r\n const inputData: IElement[] = splitText(text).map(value => {\r\n const newElement: IElement = {\r\n value\r\n }\r\n if (isTrackChanges) {\r\n newElement.revisionId = `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n newElement.revisionType = 'insert'\r\n newElement.revisionAuthor = '当前用户'\r\n newElement.revisionDate = new Date().toISOString()\r\n }\r\n if (\r\n isDesignMode ||\r\n (!copyElement.title?.disabled && !copyElement.control?.disabled)\r\n ) {\r\n const nextElement = elementList[endIndex + 1]\r\n // 文本、超链接、日期、上下标:复制所有信息(元素类型、样式、特殊属性)\r\n if (\r\n !copyElement.type ||\r\n copyElement.type === TEXT ||\r\n (copyElement.type === HYPERLINK && nextElement?.type === HYPERLINK) ||\r\n (copyElement.type === DATE && nextElement?.type === DATE) ||\r\n (copyElement.type === SUBSCRIPT && nextElement?.type === SUBSCRIPT) ||\r\n (copyElement.type === SUPERSCRIPT && nextElement?.type === SUPERSCRIPT)\r\n ) {\r\n EDITOR_ELEMENT_COPY_ATTR.forEach(attr => {\r\n // 在分组外无需复制分组信息\r\n if (attr === 'groupIds' && !nextElement?.groupIds) return\r\n const value = copyElement[attr] as never\r\n if (value !== undefined) {\r\n newElement[attr] = value\r\n }\r\n })\r\n }\r\n // 仅复制样式:存在默认样式设置 || 无法匹配文本类元素时(TAB)\r\n if (defaultStyle || copyElement.type === TAB) {\r\n EDITOR_ELEMENT_STYLE_ATTR.forEach(attr => {\r\n const value =\r\n defaultStyle?.[attr as keyof IRangeElementStyle] ||\r\n copyElement[attr]\r\n if (value !== undefined) {\r\n newElement[attr] = value as never\r\n }\r\n })\r\n }\r\n if (isComposing) {\r\n newElement.underline = true\r\n }\r\n }\r\n return newElement\r\n })\r\n // 控件-移除placeholder\r\n const control = draw.getControl()\r\n let curIndex: number\r\n if (control.getActiveControl() && control.getIsRangeWithinControl()) {\r\n curIndex = control.setValue(inputData)\r\n if (!isComposing) {\r\n control.emitControlContentChange()\r\n }\r\n } else {\r\n const start = startIndex + 1\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(elementList, start, endIndex - startIndex)\r\n }\r\n formatElementContext(elementList, inputData, startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n draw.spliceElementList(elementList, start, 0, inputData)\r\n curIndex = startIndex + inputData.length\r\n }\r\n if (~curIndex) {\r\n rangeManager.setRange(curIndex, curIndex)\r\n \r\n // 使用防抖渲染优化大文档编辑性能\r\n if (inputDebounceTimer) {\r\n window.clearTimeout(inputDebounceTimer)\r\n }\r\n pendingRender = true\r\n \r\n // 如果是合成输入(中文输入法),立即渲染以显示候选字\r\n if (isComposing) {\r\n draw.render({\r\n curIndex,\r\n isSubmitHistory: false,\r\n isPartialRender: true\r\n })\r\n pendingRender = false\r\n } else {\r\n // 普通输入使用防抖,50ms 内的连续输入只渲染一次\r\n inputDebounceTimer = window.setTimeout(() => {\r\n if (pendingRender) {\r\n draw.render({\r\n curIndex,\r\n isSubmitHistory: true,\r\n isPartialRender: true\r\n })\r\n pendingRender = false\r\n }\r\n inputDebounceTimer = null\r\n }, 50)\r\n }\r\n }\r\n if (isComposing) {\r\n host.compositionInfo = {\r\n elementList,\r\n value: text,\r\n startIndex: curIndex - inputData.length,\r\n endIndex: curIndex,\r\n defaultStyle\r\n }\r\n }\r\n}\r\n\r\nexport function removeComposingInput(host: CanvasEvent) {\r\n if (!host.compositionInfo) return\r\n const { elementList, startIndex, endIndex } = host.compositionInfo\r\n elementList.splice(startIndex + 1, endIndex - startIndex)\r\n const rangeManager = host.getDraw().getRange()\r\n rangeManager.setRange(startIndex, startIndex)\r\n host.compositionInfo = null\r\n}\r\n","import { CanvasEvent } from '../CanvasEvent'\r\nimport { writeElementList } from '../../plugin-stubs'\r\n\r\nexport function cut(host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n if (draw.isReadonly() || !rangeManager.canInput()) return\r\n\r\n const elementList = draw.getElementList()\r\n let start = startIndex\r\n let end = endIndex\r\n // 无选区则剪切一行\r\n if (startIndex === endIndex) {\r\n const position = draw.getPosition()\r\n const positionList = position.getPositionList()\r\n const startPosition = positionList[startIndex]\r\n const curRowNo = startPosition.rowNo\r\n const curPageNo = startPosition.pageNo\r\n const cutElementIndexList: number[] = []\r\n for (let p = 0; p < positionList.length; p++) {\r\n const position = positionList[p]\r\n if (position.pageNo > curPageNo) break\r\n if (position.pageNo === curPageNo && position.rowNo === curRowNo) {\r\n cutElementIndexList.push(p)\r\n }\r\n }\r\n const firstElementIndex = cutElementIndexList[0] - 1\r\n start = firstElementIndex < 0 ? 0 : firstElementIndex\r\n end = cutElementIndexList[cutElementIndexList.length - 1]\r\n }\r\n const options = draw.getOptions()\r\n // 写入粘贴板\r\n writeElementList(elementList.slice(start + 1, end + 1), options)\r\n const control = draw.getControl()\r\n let curIndex: number\r\n if (control.getActiveControl() && control.getIsRangeWithinControl()) {\r\n curIndex = control.cut()\r\n control.emitControlContentChange()\r\n } else {\r\n draw.spliceElementList(elementList, start + 1, end - start)\r\n curIndex = start\r\n }\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({ curIndex })\r\n}\r\n","import { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { ICopyOption } from '@vervedoc/docx-editor-schema'\r\nimport { ITr } from '@vervedoc/docx-editor-schema'\r\nimport { getTextFromElementList, zipElementList } from '@vervedoc/docx-editor-schema'\r\nimport { IOverrideResult } from '../../plugin/override/Override'\r\nimport { writeElementList } from '../../plugin-stubs'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\nexport function copy(host: CanvasEvent, options?: ICopyOption) {\r\n const draw = host.getDraw()\r\n // 自定义粘贴事件\r\n const { copy } = draw.getOverride()\r\n if (copy) {\r\n const overrideResult = copy()\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n const rangeManager = draw.getRange()\r\n // 光标闭合时复制整行\r\n let copyElementList: IElement[] | null = null\r\n const range = rangeManager.getRange()\r\n if (range.isCrossRowCol) {\r\n // 原始表格信息\r\n const tableElement = rangeManager.getRangeTableElement()\r\n if (!tableElement) return\r\n // 选区行列信息\r\n const rowCol = draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return\r\n // 构造表格\r\n const copyTableElement: IElement = {\r\n type: ElementType.TABLE,\r\n value: '',\r\n colgroup: [],\r\n trList: []\r\n }\r\n const firstRow = rowCol[0]\r\n const colStartIndex = firstRow[0].colIndex!\r\n const lastCol = firstRow[firstRow.length - 1]\r\n const colEndIndex = lastCol.colIndex! + lastCol.colspan - 1\r\n for (let c = colStartIndex; c <= colEndIndex; c++) {\r\n copyTableElement.colgroup!.push(tableElement.colgroup![c])\r\n }\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n const tr = tableElement.trList![row[0].rowIndex!]\r\n const coptTr: ITr = {\r\n tdList: [],\r\n height: tr.height,\r\n minHeight: tr.minHeight\r\n }\r\n for (let c = 0; c < row.length; c++) {\r\n coptTr.tdList.push(row[c])\r\n }\r\n copyTableElement.trList!.push(coptTr)\r\n }\r\n copyElementList = zipElementList([copyTableElement])\r\n } else {\r\n copyElementList = rangeManager.getIsCollapsed()\r\n ? rangeManager.getRangeRowElementList()\r\n : rangeManager.getSelectionElementList()\r\n }\r\n if (options?.isPlainText && copyElementList?.length) {\r\n copyElementList = [\r\n {\r\n value: getTextFromElementList(copyElementList)\r\n }\r\n ]\r\n }\r\n if (!copyElementList?.length) return\r\n writeElementList(copyElementList, draw.getOptions())\r\n}\r\n","import { IOverrideResult } from '../../plugin/override/Override'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\nimport { pasteImage } from './paste'\r\n\r\nexport function drop(evt: DragEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n // 自定义拖放事件\r\n const { drop } = draw.getOverride()\r\n if (drop) {\r\n const overrideResult = drop(evt)\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n evt.preventDefault()\r\n const data = evt.dataTransfer?.getData('text')\r\n if (data) {\r\n host.input(data)\r\n } else {\r\n const files = evt.dataTransfer?.files\r\n if (!files) return\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i]\r\n if (file.type.startsWith('image')) {\r\n pasteImage(host, file)\r\n }\r\n }\r\n }\r\n}\r\n","import { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport type { Draw } from '../../draw/Draw'\r\n\r\nexport function contextmenu(evt: MouseEvent, draw: Draw) {\r\n const position = draw.getPosition()\r\n const positionContext = position.getPositionContext()\r\n\r\n if (!positionContext.isTable) {\r\n return\r\n }\r\n\r\n const elementList = draw.getOriginalElementList()\r\n const { index } = positionContext\r\n let tableElement = null\r\n for (let i = index!; i >= 0; i--) {\r\n const el = elementList[i]\r\n if (el && el.type === ElementType.TABLE) {\r\n tableElement = el\r\n break\r\n }\r\n }\r\n\r\n if (!tableElement) {\r\n return\r\n }\r\n\r\n evt.preventDefault()\r\n evt.stopPropagation()\r\n\r\n const tableContextMenu = (draw as any).__tableContextMenu\r\n if (tableContextMenu) {\r\n tableContextMenu.show(evt.clientX, evt.clientY, tableElement)\r\n }\r\n}\r\n","import { ZERO, TEXTLIKE_ELEMENT_TYPE, NUMBER_LIKE_REG, ElementType, IRange, IElement, isParagraphSeparator } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\n// 通过分词器获取单词所在选区\r\nfunction getWordRangeBySegmenter(host: CanvasEvent): IRange | null {\r\n if (!Intl.Segmenter) return null\r\n const draw = host.getDraw()\r\n const cursorPosition = draw.getPosition().getCursorPosition()\r\n if (!cursorPosition) return null\r\n const rangeManager = draw.getRange()\r\n const paragraphInfo = rangeManager.getRangeParagraphInfo()\r\n if (!paragraphInfo) return null\r\n // 组装段落文本\r\n const paragraphText =\r\n paragraphInfo?.elementList\r\n ?.map((e: IElement) =>\r\n !e.type ||\r\n (e.type !== ElementType.CONTROL &&\r\n TEXTLIKE_ELEMENT_TYPE.includes(e.type))\r\n ? e.value\r\n : ZERO\r\n )\r\n .join('') || ''\r\n if (!paragraphText) return null\r\n // 光标所在位置\r\n const cursorStartIndex = cursorPosition.index\r\n // 段落首字符相对文档起始位置\r\n const offset = paragraphInfo.startIndex\r\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'word' })\r\n const segments = segmenter.segment(paragraphText)\r\n // 新的光标位置\r\n let startIndex = -1\r\n let endIndex = -1\r\n for (const { segment, index, isWordLike } of segments) {\r\n const realSegmentStartIndex = index + offset\r\n if (\r\n isWordLike &&\r\n cursorStartIndex >= realSegmentStartIndex &&\r\n cursorStartIndex < realSegmentStartIndex + segment.length\r\n ) {\r\n startIndex = realSegmentStartIndex - 1\r\n endIndex = startIndex + segment.length\r\n break\r\n }\r\n }\r\n return ~startIndex && ~endIndex ? { startIndex, endIndex } : null\r\n}\r\n\r\n// 通过光标位置获取单词所在选区\r\nfunction getWordRangeByCursor(host: CanvasEvent): IRange | null {\r\n const draw = host.getDraw()\r\n const cursorPosition = draw.getPosition().getCursorPosition()\r\n if (!cursorPosition) return null\r\n const { value, index } = cursorPosition\r\n // 判断是否是数字或英文\r\n const LETTER_REG = draw.getLetterReg()\r\n let upCount = 0\r\n let downCount = 0\r\n const isNumber = NUMBER_LIKE_REG.test(value)\r\n if (isNumber || LETTER_REG.test(value)) {\r\n const elementList = draw.getElementList()\r\n // 向上查询\r\n let upStartIndex = index - 1\r\n while (upStartIndex > 0) {\r\n const value = elementList[upStartIndex].value\r\n if (\r\n (isNumber && NUMBER_LIKE_REG.test(value)) ||\r\n (!isNumber && LETTER_REG.test(value))\r\n ) {\r\n upCount++\r\n upStartIndex--\r\n } else {\r\n break\r\n }\r\n }\r\n // 向下查询\r\n let downStartIndex = index + 1\r\n while (downStartIndex < elementList.length) {\r\n const value = elementList[downStartIndex].value\r\n if (\r\n (isNumber && NUMBER_LIKE_REG.test(value)) ||\r\n (!isNumber && LETTER_REG.test(value))\r\n ) {\r\n downCount++\r\n downStartIndex++\r\n } else {\r\n break\r\n }\r\n }\r\n }\r\n // 新的光标位置\r\n const startIndex = index - upCount - 1\r\n if (startIndex < 0) return null\r\n return {\r\n startIndex,\r\n endIndex: index + downCount\r\n }\r\n}\r\n\r\nfunction dblclick(host: CanvasEvent, evt: MouseEvent) {\r\n const draw = host.getDraw()\r\n const position = draw.getPosition()\r\n const positionContext = position.getPositionByXY({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n // 图片预览\r\n if (positionContext.isImage && positionContext.isDirectHit) {\r\n draw.getPreviewer().render()\r\n return\r\n }\r\n // 切换区域\r\n if (draw.getIsPagingMode()) {\r\n if (!~positionContext.index && positionContext.zone) {\r\n draw.getZone().setZone(positionContext.zone)\r\n draw.clearSideEffect()\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n // 设置光标到对应区域的起始位置\r\n const rangeManager = draw.getRange()\r\n rangeManager.setRange(0, 0)\r\n draw.render({\r\n curIndex: 0,\r\n isSubmitHistory: false\r\n })\r\n return\r\n }\r\n }\r\n // 复选/单选框双击时是切换选择状态,禁用扩选\r\n if (\r\n (positionContext.isCheckbox || positionContext.isRadio) &&\r\n positionContext.isDirectHit\r\n ) {\r\n return\r\n }\r\n // 自动扩选文字-分词处理,优先使用分词器否则降级使用光标所在位置\r\n const rangeManager = draw.getRange()\r\n const segmenterRange =\r\n getWordRangeBySegmenter(host) || getWordRangeByCursor(host)\r\n if (!segmenterRange) return\r\n rangeManager.setRange(segmenterRange.startIndex, segmenterRange.endIndex)\r\n // 刷新文档\r\n draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n // 更新选区\r\n rangeManager.setRangeStyle()\r\n}\r\n\r\nfunction handleTripleClick(host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n const elementList = draw.getElementList()\r\n // 判断是否是零宽字符\r\n let upCount = 0\r\n let downCount = 0\r\n // 向上查询\r\n let upStartIndex = index - 1\r\n while (upStartIndex > 0) {\r\n const element = elementList[upStartIndex]\r\n const preElement = elementList[upStartIndex - 1]\r\n if (\r\n isParagraphSeparator(element) ||\r\n element.listId !== preElement?.listId ||\r\n element.titleId !== preElement?.titleId\r\n ) {\r\n break\r\n }\r\n upCount++\r\n upStartIndex--\r\n }\r\n // 向下查询\r\n let downStartIndex = index + 1\r\n while (downStartIndex < elementList.length) {\r\n const element = elementList[downStartIndex]\r\n const nextElement = elementList[downStartIndex + 1]\r\n if (\r\n isParagraphSeparator(element) ||\r\n element.listId !== nextElement?.listId ||\r\n element.titleId !== nextElement?.titleId\r\n ) {\r\n break\r\n }\r\n downCount++\r\n downStartIndex++\r\n }\r\n // 设置选中区域-不选择段落首尾换行符\r\n const rangeManager = draw.getRange()\r\n let newStartIndex = index - upCount - 1\r\n if (elementList[newStartIndex]?.value !== ZERO) {\r\n newStartIndex -= 1\r\n }\r\n if (newStartIndex < 0) return\r\n let newEndIndex = index + downCount + 1\r\n if (\r\n elementList[newEndIndex]?.value === ZERO ||\r\n newEndIndex > elementList.length - 1\r\n ) {\r\n newEndIndex -= 1\r\n }\r\n rangeManager.setRange(newStartIndex, newEndIndex)\r\n // 刷新文档\r\n draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n}\r\n\r\nexport default {\r\n dblclick,\r\n handleTripleClick\r\n}\r\n","import { CanvasEvent } from '../CanvasEvent'\r\nimport { input, removeComposingInput } from './input'\r\n\r\nfunction compositionstart(host: CanvasEvent) {\r\n host.isComposing = true\r\n}\r\n\r\nfunction compositionend(host: CanvasEvent, evt: CompositionEvent) {\r\n host.isComposing = false\r\n // 处理输入框关闭\r\n const draw = host.getDraw()\r\n // 不存在值:删除合成输入\r\n if (!evt.data) {\r\n removeComposingInput(host)\r\n const rangeManager = draw.getRange()\r\n const { endIndex: curIndex } = rangeManager.getRange()\r\n draw.render({\r\n curIndex,\r\n isSubmitHistory: false\r\n })\r\n } else {\r\n // 存在值:无法触发input事件需手动检测并触发渲染\r\n if (host.compositionInfo) {\r\n input(evt.data, host)\r\n }\r\n }\r\n // 移除代理输入框数据\r\n const cursor = draw.getCursor()\r\n cursor.clearAgentDomValue()\r\n}\r\n\r\nexport default {\r\n compositionstart,\r\n compositionend\r\n}\r\n","import { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { findParent } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\nfunction dragover(evt: DragEvent | MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n evt.preventDefault()\r\n // 非编辑器区禁止拖放\r\n const pageContainer = draw.getPageContainer()\r\n const editorRegion = findParent(\r\n evt.target as Element,\r\n (node: Element) => node === pageContainer,\r\n true\r\n )\r\n if (!editorRegion) return\r\n const target = evt.target as HTMLDivElement\r\n const pageIndex = target.dataset.index\r\n // 设置pageNo\r\n if (pageIndex) {\r\n draw.setPageNo(Number(pageIndex))\r\n }\r\n const position = draw.getPosition()\r\n const positionContext = position.adjustPositionContext({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n if (!positionContext) return\r\n const { isTable, tdValueIndex, index } = positionContext\r\n // 设置选区及光标位置\r\n const positionList = position.getPositionList()\r\n const curIndex = isTable ? tdValueIndex! : index\r\n if (~index) {\r\n const rangeManager = draw.getRange()\r\n rangeManager.setRange(curIndex, curIndex)\r\n position.setCursorPosition(positionList[curIndex])\r\n }\r\n const cursor = draw.getCursor()\r\n const {\r\n cursor: { dragColor, dragWidth, dragFloatImageDisabled }\r\n } = draw.getOptions()\r\n // 拖拽图片是否定位光标\r\n if (dragFloatImageDisabled) {\r\n const dragElement = host.cacheElementList?.[host.cacheRange!.startIndex]\r\n if (\r\n dragElement?.type === ElementType.IMAGE &&\r\n (dragElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM ||\r\n dragElement.imgDisplay === ImageDisplay.SURROUND)\r\n ) {\r\n return\r\n }\r\n }\r\n cursor.drawCursor({\r\n width: dragWidth,\r\n color: dragColor,\r\n isBlink: false,\r\n isFocus: false\r\n })\r\n}\r\n\r\nexport default {\r\n dragover\r\n}\r\n","import { ElementStyleKey } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { ICurrentPosition, IPositionContext } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { Position } from '../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { handleTripleClick } from '@vervedoc/docx-editor-schema'\r\nimport { IRange, IRangeElementStyle } from '@vervedoc/docx-editor-schema'\r\nimport { mousedown } from './handlers/mousedown'\r\nimport { mouseup } from './handlers/mouseup'\r\nimport { mouseleave } from './handlers/mouseleave'\r\nimport { mousemove } from './handlers/mousemove'\r\nimport { keydown } from './handlers/keydown'\r\nimport { input } from './handlers/input'\r\nimport { cut } from './handlers/cut'\r\nimport { copy } from './handlers/copy'\r\nimport { drop } from './handlers/drop'\r\nimport { contextmenu } from './handlers/contextmenu'\r\nimport click from './handlers/click'\r\nimport composition from './handlers/composition'\r\nimport drag from './handlers/drag'\r\nimport { isIOS } from '@vervedoc/docx-editor-schema'\r\nimport { ICopyOption } from '@vervedoc/docx-editor-schema'\r\n\r\nexport interface ICompositionInfo {\r\n elementList: IElement[]\r\n startIndex: number\r\n endIndex: number\r\n value: string\r\n defaultStyle: IRangeElementStyle | null\r\n}\r\n\r\nexport class CanvasEvent {\r\n public isAllowSelection: boolean\r\n public isComposing: boolean\r\n public compositionInfo: ICompositionInfo | null\r\n\r\n public isAllowDrag: boolean\r\n public isAllowDrop: boolean\r\n public cacheRange: IRange | null\r\n public cacheElementList: IElement[] | null\r\n public cachePositionList: IElementPosition[] | null\r\n public cachePositionContext: IPositionContext | null\r\n public mouseDownStartPosition: ICurrentPosition | null\r\n\r\n private draw: Draw\r\n private pageContainer: HTMLDivElement\r\n private pageList: HTMLCanvasElement[]\r\n private range: RangeManager\r\n private position: Position\r\n\r\n private _clickHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mousedownHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mouseupHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mouseleaveHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mousemoveHandler: ((evt: MouseEvent) => void) | null = null\r\n private _dblclickHandler: ((evt: MouseEvent) => void) | null = null\r\n private _dragoverHandler: ((evt: DragEvent) => void) | null = null\r\n private _dropHandler: ((evt: DragEvent) => void) | null = null\r\n private _contextmenuHandler: ((evt: MouseEvent) => void) | null = null\r\n private _threeClickCleanup: (() => void) | null = null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.pageContainer = draw.getPageContainer()\r\n this.pageList = draw.getPageList()\r\n this.range = this.draw.getRange()\r\n this.position = this.draw.getPosition()\r\n\r\n this.isAllowSelection = false\r\n this.isComposing = false\r\n this.compositionInfo = null\r\n this.isAllowDrag = false\r\n this.isAllowDrop = false\r\n this.cacheRange = null\r\n this.cacheElementList = null\r\n this.cachePositionList = null\r\n this.cachePositionContext = null\r\n this.mouseDownStartPosition = null\r\n }\r\n\r\n public getDraw(): Draw {\r\n return this.draw\r\n }\r\n\r\n public register() {\r\n this._clickHandler = this.click.bind(this)\r\n this._mousedownHandler = this.mousedown.bind(this)\r\n this._mouseupHandler = this.mouseup.bind(this)\r\n this._mouseleaveHandler = this.mouseleave.bind(this)\r\n this._mousemoveHandler = this.mousemove.bind(this)\r\n this._dblclickHandler = this.dblclick.bind(this)\r\n this._dragoverHandler = this.dragover.bind(this)\r\n this._dropHandler = this.drop.bind(this)\r\n this._contextmenuHandler = this._contextmenu.bind(this)\r\n this.pageContainer.addEventListener('click', this._clickHandler)\r\n this.pageContainer.addEventListener('mousedown', this._mousedownHandler)\r\n this.pageContainer.addEventListener('mouseup', this._mouseupHandler)\r\n this.pageContainer.addEventListener('mouseleave', this._mouseleaveHandler)\r\n this.pageContainer.addEventListener('mousemove', this._mousemoveHandler)\r\n this.pageContainer.addEventListener('dblclick', this._dblclickHandler)\r\n this.pageContainer.addEventListener('dragover', this._dragoverHandler)\r\n this.pageContainer.addEventListener('drop', this._dropHandler)\r\n this.pageContainer.addEventListener('contextmenu', this._contextmenuHandler)\r\n this._threeClickCleanup = handleTripleClick(this.pageContainer, this.handleTripleClick.bind(this))\r\n }\r\n\r\n public removeEvent() {\r\n if (this._clickHandler) this.pageContainer.removeEventListener('click', this._clickHandler)\r\n if (this._mousedownHandler) this.pageContainer.removeEventListener('mousedown', this._mousedownHandler)\r\n if (this._mouseupHandler) this.pageContainer.removeEventListener('mouseup', this._mouseupHandler)\r\n if (this._mouseleaveHandler) this.pageContainer.removeEventListener('mouseleave', this._mouseleaveHandler)\r\n if (this._mousemoveHandler) this.pageContainer.removeEventListener('mousemove', this._mousemoveHandler)\r\n if (this._dblclickHandler) this.pageContainer.removeEventListener('dblclick', this._dblclickHandler)\r\n if (this._dragoverHandler) this.pageContainer.removeEventListener('dragover', this._dragoverHandler)\r\n if (this._dropHandler) this.pageContainer.removeEventListener('drop', this._dropHandler)\r\n if (this._contextmenuHandler) this.pageContainer.removeEventListener('contextmenu', this._contextmenuHandler)\r\n if (this._threeClickCleanup) this._threeClickCleanup()\r\n this._clickHandler = null\r\n this._mousedownHandler = null\r\n this._mouseupHandler = null\r\n this._mouseleaveHandler = null\r\n this._mousemoveHandler = null\r\n this._dblclickHandler = null\r\n this._dragoverHandler = null\r\n this._dropHandler = null\r\n this._contextmenuHandler = null\r\n this._threeClickCleanup = null\r\n }\r\n\r\n public setIsAllowSelection(payload: boolean) {\r\n this.isAllowSelection = payload\r\n if (!payload) {\r\n this.applyPainterStyle()\r\n }\r\n }\r\n\r\n public setIsAllowDrag(payload: boolean) {\r\n this.isAllowDrag = payload\r\n this.isAllowDrop = payload\r\n }\r\n\r\n public clearPainterStyle() {\r\n this.pageList.forEach(p => {\r\n p.style.cursor = 'text'\r\n })\r\n this.draw.setPainterStyle(null)\r\n }\r\n\r\n public applyPainterStyle() {\r\n const painterStyle = this.draw.getPainterStyle()\r\n if (!painterStyle) return\r\n const isDisabled = this.draw.isReadonly() || this.draw.isDisabled()\r\n if (isDisabled) return\r\n const selection = this.range.getSelection()\r\n if (!selection) return\r\n const painterStyleKeys = Object.keys(painterStyle)\r\n selection.forEach(s => {\r\n painterStyleKeys.forEach(pKey => {\r\n const key = pKey as keyof typeof ElementStyleKey\r\n s[key] = painterStyle[key] as any\r\n })\r\n })\r\n this.draw.render({ isSetCursor: false })\r\n // 清除格式刷\r\n const painterOptions = this.draw.getPainterOptions()\r\n if (!painterOptions || !painterOptions.isDblclick) {\r\n this.clearPainterStyle()\r\n }\r\n }\r\n\r\n public selectAll() {\r\n const position = this.position.getPositionList()\r\n this.range.setRange(0, position.length - 1)\r\n this.draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public mousemove(evt: MouseEvent) {\r\n mousemove(evt, this)\r\n }\r\n\r\n public mousedown(evt: MouseEvent) {\r\n mousedown(evt, this)\r\n }\r\n\r\n public click() {\r\n // IOS系统限制非用户主动触发事件的键盘弹出\r\n if (isIOS && !this.draw.isReadonly()) {\r\n this.draw.getCursor().getAgentDom().focus()\r\n }\r\n }\r\n\r\n public mouseup(evt: MouseEvent) {\r\n mouseup(evt, this)\r\n }\r\n\r\n public mouseleave(evt: MouseEvent) {\r\n mouseleave(evt, this)\r\n }\r\n\r\n public keydown(evt: KeyboardEvent) {\r\n keydown(evt, this)\r\n }\r\n\r\n public dblclick(evt: MouseEvent) {\r\n click.dblclick(this, evt)\r\n }\r\n\r\n public handleTripleClick() {\r\n click.handleTripleClick(this)\r\n }\r\n\r\n public input(data: string) {\r\n input(data, this)\r\n }\r\n\r\n public cut() {\r\n cut(this)\r\n }\r\n\r\n public copy(options?: ICopyOption) {\r\n copy(this, options)\r\n }\r\n\r\n public compositionstart() {\r\n composition.compositionstart(this)\r\n }\r\n\r\n public compositionend(evt: CompositionEvent) {\r\n composition.compositionend(this, evt)\r\n }\r\n\r\n public drop(evt: DragEvent) {\r\n drop(evt, this)\r\n }\r\n\r\n public dragover(evt: DragEvent | MouseEvent) {\r\n drag.dragover(evt, this)\r\n }\r\n\r\n private _contextmenu(evt: MouseEvent) {\r\n contextmenu(evt, this.draw)\r\n }\r\n}\r\n","import { EDITOR_COMPONENT } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { findParent } from '@vervedoc/docx-editor-schema'\r\nimport { Cursor } from '../cursor/Cursor'\r\nimport { Control } from '../control/Control'\r\nimport { Draw } from '../draw/Draw'\r\nimport { HyperlinkParticle } from '../particle/HyperlinkParticle'\r\nimport { DateParticle } from '../plugin-stubs'\r\nimport { Previewer } from '../particle/previewer/Previewer'\r\nimport { TableTool } from '../particle/table/TableTool'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { CanvasEvent } from './CanvasEvent'\r\nimport { ImageParticle } from '../particle/ImageParticle'\r\nimport { INTERNAL_SHORTCUT_KEY } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class GlobalEvent {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private cursor: Cursor | null\r\n private canvasEvent: CanvasEvent\r\n private range: RangeManager\r\n private previewer: Previewer\r\n private tableTool: TableTool\r\n private hyperlinkParticle: HyperlinkParticle\r\n private control: Control\r\n private dateParticle: DateParticle\r\n private imageParticle: ImageParticle\r\n private dprMediaQueryList: MediaQueryList\r\n\r\n constructor(draw: Draw, canvasEvent: CanvasEvent) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.canvasEvent = canvasEvent\r\n this.cursor = null\r\n this.range = draw.getRange()\r\n this.previewer = draw.getPreviewer()\r\n this.tableTool = draw.getTableTool()\r\n this.hyperlinkParticle = draw.getHyperlinkParticle()\r\n this.dateParticle = draw.getDateParticle()\r\n this.imageParticle = draw.getImageParticle()\r\n this.control = draw.getControl()\r\n this.dprMediaQueryList = window.matchMedia(\r\n `(resolution: ${window.devicePixelRatio}dppx)`\r\n )\r\n }\r\n\r\n public register() {\r\n this.cursor = this.draw.getCursor()\r\n this.addEvent()\r\n }\r\n\r\n private addEvent() {\r\n window.addEventListener('blur', this.clearSideEffect)\r\n document.addEventListener('mousedown', this.clearSideEffect)\r\n document.addEventListener('mouseup', this.setCanvasEventAbility)\r\n document.addEventListener('wheel', this.setPageScale, { passive: false })\r\n document.addEventListener('visibilitychange', this._handleVisibilityChange)\r\n this.dprMediaQueryList.addEventListener('change', this._handleDprChange)\r\n }\r\n\r\n public removeEvent() {\r\n window.removeEventListener('blur', this.clearSideEffect)\r\n document.removeEventListener('mousedown', this.clearSideEffect)\r\n document.removeEventListener('mouseup', this.setCanvasEventAbility)\r\n document.removeEventListener('wheel', this.setPageScale)\r\n document.removeEventListener(\r\n 'visibilitychange',\r\n this._handleVisibilityChange\r\n )\r\n this.dprMediaQueryList.removeEventListener('change', this._handleDprChange)\r\n }\r\n\r\n public clearSideEffect = (evt: Event) => {\r\n if (!this.cursor) return\r\n // 编辑器内部dom\r\n const target = <Element>(evt?.composedPath()[0] || evt.target)\r\n const pageList = this.draw.getPageList()\r\n const innerEditorDom = findParent(\r\n target,\r\n (node: any) => pageList.includes(node),\r\n true\r\n )\r\n if (innerEditorDom) return\r\n // 编辑器外部组件dom\r\n const outerEditorDom = findParent(\r\n target,\r\n (node: Node & Element) =>\r\n !!node && node.nodeType === 1 && !!node.getAttribute(EDITOR_COMPONENT),\r\n true\r\n )\r\n if (outerEditorDom) {\r\n this.watchCursorActive()\r\n return\r\n }\r\n this.cursor.recoveryCursor()\r\n this.range.recoveryRangeStyle()\r\n this.previewer.clearResizer()\r\n this.tableTool.dispose()\r\n this.hyperlinkParticle.clearHyperlinkPopup()\r\n this.control.destroyControl()\r\n this.dateParticle.clearDatePicker()\r\n this.imageParticle.destroyFloatImage()\r\n }\r\n\r\n public setCanvasEventAbility = () => {\r\n this.canvasEvent.setIsAllowDrag(false)\r\n this.canvasEvent.setIsAllowSelection(false)\r\n }\r\n\r\n public watchCursorActive() {\r\n // 选区闭合&实际光标移出光标代理\r\n if (!this.range.getIsCollapsed()) return\r\n setTimeout(() => {\r\n // 将模拟光标变成失活显示状态\r\n if (!this.cursor?.getAgentIsActive()) {\r\n this.cursor?.drawCursor({\r\n isFocus: false,\r\n isBlink: false\r\n })\r\n }\r\n })\r\n }\r\n\r\n public setPageScale = (evt: WheelEvent) => {\r\n // 设置禁用快捷键\r\n if (\r\n this.options.shortcutDisableKeys.includes(\r\n INTERNAL_SHORTCUT_KEY.PAGE_SCALE\r\n )\r\n ) {\r\n return\r\n }\r\n // 仅在按下Ctrl键时生效\r\n if (!evt.ctrlKey) return\r\n evt.preventDefault()\r\n const { scale } = this.options\r\n if (evt.deltaY < 0) {\r\n const nextScale = Math.round(scale * 10 + 1) / 10\r\n if (nextScale <= 3.0) {\r\n this.draw.setPageScale(nextScale)\r\n }\r\n } else {\r\n const nextScale = Math.round(scale * 10 - 1) / 10\r\n if (nextScale >= 0.5) {\r\n this.draw.setPageScale(nextScale)\r\n }\r\n }\r\n }\r\n\r\n private _handleVisibilityChange = () => {\r\n if (document.visibilityState === 'visible') {\r\n // 页面可见时重新渲染激活页面\r\n const range = this.range.getRange()\r\n const isSetCursor =\r\n !!~range.startIndex &&\r\n !!~range.endIndex &&\r\n range.startIndex === range.endIndex\r\n this.range.replaceRange(range)\r\n this.draw.render({\r\n isSetCursor,\r\n isCompute: false,\r\n isSubmitHistory: false,\r\n curIndex: range.startIndex\r\n })\r\n }\r\n }\r\n\r\n private _handleDprChange = () => {\r\n this.draw.setPageDevicePixel()\r\n }\r\n}\r\n","import { ListStyle, RowFlex, ElementType, VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IComputePageRowPositionPayload,\r\n IComputePageRowPositionResult,\r\n IComputeRowPositionPayload,\r\n IFloatPosition,\r\n IGetFloatPositionByXYPayload,\r\n ISetSurroundPositionPayload\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n ICurrentPosition,\r\n IGetPositionByXYPayload,\r\n IPositionContext\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { EditorMode, EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone, isRectIntersect } from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { getIsBlockElement, isTableElement, isImageElement } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Position {\r\n private cursorPosition: IElementPosition | null\r\n private positionContext: IPositionContext\r\n private positionList: IElementPosition[]\r\n private floatPositionList: IFloatPosition[]\r\n\r\n private draw: Draw\r\n private eventBus: EventBus<EventBusMap>\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.positionList = []\r\n this.floatPositionList = []\r\n this.cursorPosition = null\r\n this.positionContext = {\r\n isTable: false,\r\n isControl: false\r\n }\r\n\r\n this.draw = draw\r\n this.eventBus = draw.getEventBus()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public getFloatPositionList(): IFloatPosition[] {\r\n return this.floatPositionList\r\n }\r\n\r\n public getTablePositionList(\r\n sourceElementList: IElement[]\r\n ): IElementPosition[] {\r\n const { index, trIndex, tdIndex } = this.positionContext\r\n return (\r\n sourceElementList[index!].trList![trIndex!].tdList[tdIndex!]\r\n .positionList || []\r\n )\r\n }\r\n\r\n public getPositionList(): IElementPosition[] {\r\n return this.positionContext.isTable\r\n ? this.getTablePositionList(this.draw.getOriginalElementList())\r\n : this.getOriginalPositionList()\r\n }\r\n\r\n public getMainPositionList(): IElementPosition[] {\r\n return this.positionContext.isTable\r\n ? this.getTablePositionList(this.draw.getOriginalMainElementList())\r\n : this.positionList\r\n }\r\n\r\n public getOriginalPositionList(): IElementPosition[] {\r\n const zoneManager = this.draw.getZone()\r\n if (zoneManager.isHeaderActive()) {\r\n const header = this.draw.getHeader()\r\n return header.getPositionList()\r\n }\r\n if (zoneManager.isFooterActive()) {\r\n const footer = this.draw.getFooter()\r\n return footer.getPositionList()\r\n }\r\n return this.positionList\r\n }\r\n\r\n public getOriginalMainPositionList(): IElementPosition[] {\r\n return this.positionList\r\n }\r\n\r\n public getSelectionPositionList(): IElementPosition[] | null {\r\n const { startIndex, endIndex } = this.draw.getRange().getRange()\r\n if (startIndex === endIndex) return null\r\n const positionList = this.getPositionList()\r\n return positionList.slice(startIndex + 1, endIndex + 1)\r\n }\r\n\r\n public setPositionList(payload: IElementPosition[]) {\r\n this.positionList = payload\r\n }\r\n\r\n public setFloatPositionList(payload: IFloatPosition[]) {\r\n this.floatPositionList = payload\r\n }\r\n\r\n public computePageRowPosition(\r\n payload: IComputePageRowPositionPayload\r\n ): IComputePageRowPositionResult {\r\n const {\r\n positionList,\r\n rowList,\r\n pageNo,\r\n startX,\r\n startY,\r\n startRowIndex,\r\n startIndex,\r\n innerWidth,\r\n zone\r\n } = payload\r\n const {\r\n scale,\r\n table: { tdPadding }\r\n } = this.options\r\n let x = startX\r\n let y = startY\r\n let index = startIndex\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n // 分栏容器行:各列独立计算位置\r\n if (curRow.isColumnContainer && curRow.columnRowLists) {\r\n const colWidths = curRow.columnWidths || []\r\n const colGap = curRow.columnGap || 0\r\n let colX = x\r\n for (let c = 0; c < curRow.columnRowLists.length; c++) {\r\n const colRowList = curRow.columnRowLists[c]\r\n if (colRowList.length > 0) {\r\n this.computePageRowPosition({\r\n positionList,\r\n rowList: colRowList,\r\n pageNo,\r\n startX: colX,\r\n startY: y,\r\n startRowIndex: startRowIndex + i,\r\n startIndex: index,\r\n innerWidth: colWidths[c] || 0,\r\n zone\r\n })\r\n // 更新 index\r\n for (const colRow of colRowList) {\r\n index += colRow.elementList.length\r\n }\r\n }\r\n colX += (colWidths[c] || 0) + colGap\r\n }\r\n y += curRow.height\r\n continue\r\n }\r\n // 行存在环绕的可能性均不设置行布局\r\n if (!curRow.isSurround) {\r\n // 计算行偏移量(行居中、居右)\r\n const curRowWidth = curRow.width + (curRow.offsetX || 0)\r\n if (curRow.rowFlex === RowFlex.CENTER) {\r\n x += (innerWidth - curRowWidth) / 2\r\n } else if (curRow.rowFlex === RowFlex.RIGHT) {\r\n x += innerWidth - curRowWidth\r\n }\r\n }\r\n // 当前行X/Y轴偏移量\r\n x += curRow.offsetX || 0\r\n y += curRow.offsetY || 0\r\n // 当前td所在位置\r\n const tablePreX = x\r\n const tablePreY = y\r\n for (let j = 0; j < curRow.elementList.length; j++) {\r\n const element = curRow.elementList[j]\r\n const metrics = element.metrics\r\n const offsetY =\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ? curRow.ascent - metrics.height\r\n : curRow.ascent\r\n // 偏移量\r\n if (element.left) {\r\n x += element.left\r\n }\r\n const positionItem: IElementPosition = {\r\n pageNo,\r\n index,\r\n value: element.value,\r\n rowIndex: startRowIndex + i,\r\n rowNo: i,\r\n metrics,\r\n left: element.left || 0,\r\n ascent: offsetY,\r\n lineHeight: curRow.height,\r\n isFirstLetter: j === 0,\r\n isLastLetter: j === curRow.elementList.length - 1,\r\n coordinate: {\r\n leftTop: [x, y],\r\n leftBottom: [x, y + curRow.height],\r\n rightTop: [x + metrics.width, y],\r\n rightBottom: [x + metrics.width, y + curRow.height]\r\n }\r\n }\r\n // 缓存浮动元素信息\r\n if (\r\n element.imgDisplay === ImageDisplay.SURROUND ||\r\n element.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n element.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n // 浮动元素使用上一位置信息\r\n const prePosition = positionList[positionList.length - 1]\r\n if (prePosition) {\r\n positionItem.metrics = prePosition.metrics\r\n positionItem.coordinate = prePosition.coordinate\r\n }\r\n // 兼容浮动元素初始坐标为空的情况-默认使用左上坐标\r\n if (!element.imgFloatPosition) {\r\n element.imgFloatPosition = {\r\n x,\r\n y,\r\n pageNo\r\n }\r\n }\r\n this.floatPositionList.push({\r\n pageNo,\r\n element,\r\n position: positionItem,\r\n isTable: payload.isTable,\r\n index: payload.index,\r\n tdIndex: payload.tdIndex,\r\n trIndex: payload.trIndex,\r\n tdValueIndex: index,\r\n zone\r\n })\r\n }\r\n positionList.push(positionItem)\r\n index++\r\n x += metrics.width\r\n // 计算表格内元素位置\r\n if (isTableElement(element)) {\r\n const tableTdPadding = element.tdPadding || tdPadding\r\n for (let t = 0; t < element.trList!.length; t++) {\r\n const tr = element.trList![t]\r\n for (let d = 0; d < tr.tdList!.length; d++) {\r\n const td = tr.tdList[d]\r\n const effectiveTdPadding = td.padding || tableTdPadding\r\n const tdPaddingWidth = effectiveTdPadding[1] + effectiveTdPadding[3]\r\n const tdPaddingHeight = effectiveTdPadding[0] + effectiveTdPadding[2]\r\n td.positionList = []\r\n const rowList = td.rowList!\r\n const drawRowResult = this.computePageRowPosition({\r\n positionList: td.positionList,\r\n rowList,\r\n pageNo,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX: (td.x! + effectiveTdPadding[3]) * scale + tablePreX,\r\n startY: (td.y! + effectiveTdPadding[0]) * scale + tablePreY,\r\n innerWidth: (td.width! - tdPaddingWidth) * scale,\r\n isTable: true,\r\n index: index - 1,\r\n tdIndex: d,\r\n trIndex: t,\r\n zone\r\n })\r\n // 垂直对齐方式\r\n if (\r\n td.verticalAlign === VerticalAlign.MIDDLE ||\r\n td.verticalAlign === VerticalAlign.BOTTOM\r\n ) {\r\n const rowsHeight = rowList.reduce(\r\n (pre, cur) => pre + cur.height,\r\n 0\r\n )\r\n const blankHeight =\r\n (td.height! - tdPaddingHeight) * scale - rowsHeight\r\n const offsetHeight =\r\n td.verticalAlign === VerticalAlign.MIDDLE\r\n ? blankHeight / 2\r\n : blankHeight\r\n if (Math.floor(offsetHeight) > 0) {\r\n td.positionList.forEach(tdPosition => {\r\n const {\r\n coordinate: { leftTop, leftBottom, rightBottom, rightTop }\r\n } = tdPosition\r\n leftTop[1] += offsetHeight\r\n leftBottom[1] += offsetHeight\r\n rightBottom[1] += offsetHeight\r\n rightTop[1] += offsetHeight\r\n })\r\n }\r\n }\r\n x = drawRowResult.x\r\n y = drawRowResult.y\r\n }\r\n }\r\n // 恢复初始x、y\r\n x = tablePreX\r\n y = tablePreY\r\n }\r\n }\r\n x = startX\r\n y += curRow.height\r\n }\r\n return { x, y, index }\r\n }\r\n\r\n public computePositionList() {\r\n // 置空原位置信息\r\n this.positionList = []\r\n // 按每页行计算\r\n const innerWidth = this.draw.getInnerWidth()\r\n const pageRowList = this.draw.getPageRowList()\r\n const margins = this.draw.getMargins()\r\n const startX = margins[3]\r\n // 起始位置受页眉影响\r\n const header = this.draw.getHeader()\r\n const extraHeight = header.getExtraHeight()\r\n const startY = margins[0] + extraHeight\r\n let startRowIndex = 0\r\n for (let i = 0; i < pageRowList.length; i++) {\r\n const rowList = pageRowList[i]\r\n const startIndex = rowList[0]?.startIndex\r\n this.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList,\r\n pageNo: i,\r\n startRowIndex,\r\n startIndex,\r\n startX,\r\n startY,\r\n innerWidth\r\n })\r\n startRowIndex += rowList.length\r\n }\r\n }\r\n\r\n public computeRowPosition(\r\n payload: IComputeRowPositionPayload\r\n ): IElementPosition[] {\r\n const { row, innerWidth } = payload\r\n const positionList: IElementPosition[] = []\r\n this.computePageRowPosition({\r\n positionList,\r\n innerWidth,\r\n rowList: [deepClone(row)],\r\n pageNo: 0,\r\n startX: 0,\r\n startY: 0,\r\n startIndex: 0,\r\n startRowIndex: 0\r\n })\r\n return positionList\r\n }\r\n\r\n public setCursorPosition(position: IElementPosition | null) {\r\n this.cursorPosition = position\r\n }\r\n\r\n public getCursorPosition(): IElementPosition | null {\r\n return this.cursorPosition\r\n }\r\n\r\n public getPositionContext(): IPositionContext {\r\n return this.positionContext\r\n }\r\n\r\n public setPositionContext(payload: IPositionContext) {\r\n this.eventBus.emit('positionContextChange', {\r\n value: payload,\r\n oldValue: this.positionContext\r\n })\r\n this.positionContext = payload\r\n }\r\n\r\n public getPositionByXY(payload: IGetPositionByXYPayload): ICurrentPosition {\r\n const { x, y, isTable } = payload\r\n let { elementList, positionList } = payload\r\n if (!elementList) {\r\n elementList = this.draw.getOriginalElementList()\r\n }\r\n if (!positionList) {\r\n positionList = this.getOriginalPositionList()\r\n }\r\n const zoneManager = this.draw.getZone()\r\n const curPageNo = payload.pageNo ?? this.draw.getPageNo()\r\n const isMainActive = zoneManager.isMainActive()\r\n const positionNo = isMainActive ? curPageNo : 0\r\n // 验证浮于文字上方元素\r\n if (!isTable) {\r\n const floatTopPosition = this.getFloatPositionByXY({\r\n ...payload,\r\n imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]\r\n })\r\n if (floatTopPosition) return floatTopPosition\r\n }\r\n // 普通元素\r\n for (let j = 0; j < positionList.length; j++) {\r\n const {\r\n index,\r\n pageNo,\r\n left,\r\n isFirstLetter,\r\n coordinate: { leftTop, rightTop, leftBottom }\r\n } = positionList[j]\r\n if (positionNo !== pageNo) continue\r\n if (pageNo > positionNo) break\r\n // 命中元素\r\n if (\r\n leftTop[0] - left <= x &&\r\n rightTop[0] >= x &&\r\n leftTop[1] <= y &&\r\n leftBottom[1] >= y\r\n ) {\r\n let curPositionIndex = j\r\n const element = elementList[j]\r\n // 表格被命中\r\n if (isTableElement(element)) {\r\n for (let t = 0; t < element.trList!.length; t++) {\r\n const tr = element.trList![t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tablePosition = this.getPositionByXY({\r\n x,\r\n y,\r\n td,\r\n pageNo: curPageNo,\r\n tablePosition: positionList[j],\r\n isTable: true,\r\n elementList: td.value,\r\n positionList: td.positionList\r\n })\r\n if (~tablePosition.index) {\r\n const { index: tdValueIndex, hitLineStartIndex } = tablePosition\r\n const tdValueElement = td.value[tdValueIndex]\r\n return {\r\n index,\r\n isCheckbox:\r\n tablePosition.isCheckbox ||\r\n tdValueElement.type === ElementType.CHECKBOX ||\r\n tdValueElement.controlComponent ===\r\n ControlComponent.CHECKBOX,\r\n isRadio:\r\n tdValueElement.type === ElementType.RADIO ||\r\n tdValueElement.controlComponent === ControlComponent.RADIO,\r\n isControl: !!tdValueElement.controlId,\r\n isImage: tablePosition.isImage,\r\n isDirectHit: tablePosition.isDirectHit,\r\n isTable: true,\r\n tdIndex: d,\r\n trIndex: t,\r\n tdValueIndex,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.id,\r\n hitLineStartIndex\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 图片区域均为命中\r\n if (\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ) {\r\n return {\r\n index: curPositionIndex,\r\n isDirectHit: true,\r\n isImage: true\r\n }\r\n }\r\n if (\r\n element.type === ElementType.CHECKBOX ||\r\n element.controlComponent === ControlComponent.CHECKBOX\r\n ) {\r\n return {\r\n index: curPositionIndex,\r\n isDirectHit: true,\r\n isCheckbox: true\r\n }\r\n }\r\n if (\r\n element.type === ElementType.TAB &&\r\n element.listStyle === ListStyle.CHECKBOX\r\n ) {\r\n // 向前找checkbox元素\r\n let index = curPositionIndex - 1\r\n while (index > 0) {\r\n const element = elementList[index]\r\n if (\r\n element.value === ZERO &&\r\n element.listStyle === ListStyle.CHECKBOX\r\n ) {\r\n break\r\n }\r\n index--\r\n }\r\n return {\r\n index,\r\n isDirectHit: true,\r\n isCheckbox: true\r\n }\r\n }\r\n if (\r\n element.type === ElementType.RADIO ||\r\n element.controlComponent === ControlComponent.RADIO\r\n ) {\r\n return {\r\n index: curPositionIndex,\r\n isDirectHit: true,\r\n isRadio: true\r\n }\r\n }\r\n let hitLineStartIndex: number | undefined\r\n // 判断是否在文字中间前后\r\n if (elementList[index].value !== ZERO) {\r\n const valueWidth = rightTop[0] - leftTop[0]\r\n if (x < leftTop[0] + valueWidth / 2) {\r\n curPositionIndex = j - 1\r\n if (isFirstLetter) {\r\n hitLineStartIndex = j\r\n }\r\n }\r\n }\r\n return {\r\n isDirectHit: true,\r\n hitLineStartIndex,\r\n index: curPositionIndex,\r\n isControl: !!element.controlId\r\n }\r\n }\r\n }\r\n // 验证衬于文字下方元素\r\n if (!isTable) {\r\n const floatBottomPosition = this.getFloatPositionByXY({\r\n ...payload,\r\n imgDisplays: [ImageDisplay.FLOAT_BOTTOM]\r\n })\r\n if (floatBottomPosition) return floatBottomPosition\r\n }\r\n // 非命中区域\r\n let isLastArea = false\r\n let curPositionIndex = -1\r\n let hitLineStartIndex: number | undefined\r\n // 判断是否在表格内\r\n if (isTable) {\r\n const { scale } = this.options\r\n const { td, tablePosition } = payload\r\n if (td && tablePosition) {\r\n const { leftTop } = tablePosition.coordinate\r\n const tdX = td.x! * scale + leftTop[0]\r\n const tdY = td.y! * scale + leftTop[1]\r\n const tdWidth = td.width! * scale\r\n const tdHeight = td.height! * scale\r\n if (!(tdX < x && x < tdX + tdWidth && tdY < y && y < tdY + tdHeight)) {\r\n return {\r\n index: curPositionIndex\r\n }\r\n }\r\n }\r\n }\r\n // 判断所属行是否存在元素\r\n const lastLetterList = positionList.filter(\r\n p => p.isLastLetter && p.pageNo === positionNo\r\n )\r\n for (let j = 0; j < lastLetterList.length; j++) {\r\n const {\r\n index,\r\n rowNo,\r\n coordinate: { leftTop, leftBottom }\r\n } = lastLetterList[j]\r\n if (y > leftTop[1] && y <= leftBottom[1]) {\r\n const headIndex = positionList.findIndex(\r\n p => p.pageNo === positionNo && p.rowNo === rowNo\r\n )\r\n const headElement = elementList[headIndex]\r\n const headPosition = positionList[headIndex]\r\n // 是否在头部\r\n const headStartX =\r\n headElement.listStyle === ListStyle.CHECKBOX\r\n ? this.draw.getMargins()[3]\r\n : headPosition.coordinate.leftTop[0]\r\n if (x < headStartX) {\r\n // 头部元素为空元素时无需选中\r\n if (~headIndex) {\r\n if (headPosition.value === ZERO) {\r\n curPositionIndex = headIndex\r\n } else {\r\n curPositionIndex = headIndex - 1\r\n hitLineStartIndex = headIndex\r\n }\r\n } else {\r\n curPositionIndex = index\r\n }\r\n } else {\r\n // 是否是复选框列表\r\n if (headElement.listStyle === ListStyle.CHECKBOX && x < leftTop[0]) {\r\n return {\r\n index: headIndex,\r\n isDirectHit: true,\r\n isCheckbox: true\r\n }\r\n }\r\n curPositionIndex = index\r\n }\r\n isLastArea = true\r\n break\r\n }\r\n }\r\n if (!isLastArea) {\r\n // 页眉底部距离页面顶部距离\r\n const header = this.draw.getHeader()\r\n const headerBottomY = header.getExtraHeight() + this.draw.getMargins()[0]\r\n // 页脚上部距离页面顶部距离\r\n const footer = this.draw.getFooter()\r\n const pageHeight = this.draw.getHeight()\r\n const footerTopY =\r\n pageHeight - (footer.getExtraHeight() + this.draw.getMargins()[2])\r\n // 判断所属位置是否属于页眉页脚区域\r\n if (isMainActive) {\r\n // 页眉:当前位置小于页眉底部位置\r\n if (y < headerBottomY) {\r\n return {\r\n index: -1,\r\n zone: EditorZone.HEADER\r\n }\r\n }\r\n // 页脚:当前位置大于页脚顶部位置\r\n if (y > footerTopY) {\r\n return {\r\n index: -1,\r\n zone: EditorZone.FOOTER\r\n }\r\n }\r\n } else {\r\n // main区域:当前位置小于页眉底部位置 && 大于页脚顶部位置\r\n if (y <= footerTopY && y >= headerBottomY) {\r\n return {\r\n index: -1,\r\n zone: EditorZone.MAIN\r\n }\r\n }\r\n }\r\n // 正文上-循环首行\r\n const margins = this.draw.getMargins()\r\n if (y <= margins[0]) {\r\n for (let p = 0; p < positionList.length; p++) {\r\n const position = positionList[p]\r\n if (position.pageNo !== positionNo || position.rowNo !== 0) continue\r\n const { leftTop, rightTop } = position.coordinate\r\n // 小于左页边距 || 命中文字 || 首行最后元素\r\n if (\r\n x <= margins[3] ||\r\n (x >= leftTop[0] && x <= rightTop[0]) ||\r\n positionList[p + 1]?.rowNo !== 0\r\n ) {\r\n return {\r\n index: position.index\r\n }\r\n }\r\n }\r\n } else {\r\n // 正文下-循环尾行\r\n const lastLetter = lastLetterList[lastLetterList.length - 1]\r\n if (lastLetter) {\r\n const lastRowNo = lastLetter.rowNo\r\n for (let p = 0; p < positionList.length; p++) {\r\n const position = positionList[p]\r\n if (\r\n position.pageNo !== positionNo ||\r\n position.rowNo !== lastRowNo\r\n ) {\r\n continue\r\n }\r\n const { leftTop, rightTop } = position.coordinate\r\n // 小于左页边距 || 命中文字 || 尾行最后元素\r\n if (\r\n x <= margins[3] ||\r\n (x >= leftTop[0] && x <= rightTop[0]) ||\r\n positionList[p + 1]?.rowNo !== lastRowNo\r\n ) {\r\n return {\r\n index: position.index\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 当前页最后一行\r\n return {\r\n index:\r\n lastLetterList[lastLetterList.length - 1]?.index ||\r\n positionList.length - 1\r\n }\r\n }\r\n return {\r\n hitLineStartIndex,\r\n index: curPositionIndex,\r\n isControl: !!elementList[curPositionIndex]?.controlId\r\n }\r\n }\r\n\r\n public getFloatPositionByXY(\r\n payload: IGetFloatPositionByXYPayload\r\n ): ICurrentPosition | void {\r\n const { x, y } = payload\r\n const currentPageNo = payload.pageNo ?? this.draw.getPageNo()\r\n const currentZone = this.draw.getZone().getZone()\r\n const { scale } = this.options\r\n for (let f = 0; f < this.floatPositionList.length; f++) {\r\n const {\r\n position,\r\n element,\r\n isTable,\r\n index,\r\n trIndex,\r\n tdIndex,\r\n tdValueIndex,\r\n zone: floatElementZone,\r\n pageNo\r\n } = this.floatPositionList[f]\r\n if (\r\n currentPageNo === pageNo &&\r\n isImageElement(element) &&\r\n element.imgDisplay &&\r\n payload.imgDisplays.includes(element.imgDisplay) &&\r\n (!floatElementZone || floatElementZone === currentZone)\r\n ) {\r\n const imgFloatPosition = element.imgFloatPosition!\r\n const imgFloatPositionX = imgFloatPosition.x * scale\r\n const imgFloatPositionY = imgFloatPosition.y * scale\r\n const elementWidth = element.width! * scale\r\n const elementHeight = element.height! * scale\r\n if (\r\n x >= imgFloatPositionX &&\r\n x <= imgFloatPositionX + elementWidth &&\r\n y >= imgFloatPositionY &&\r\n y <= imgFloatPositionY + elementHeight\r\n ) {\r\n if (isTable) {\r\n return {\r\n index: index!,\r\n isDirectHit: true,\r\n isImage: true,\r\n isTable,\r\n trIndex,\r\n tdIndex,\r\n tdValueIndex,\r\n tdId: element.tdId,\r\n trId: element.trId,\r\n tableId: element.tableId\r\n }\r\n }\r\n return {\r\n index: position.index,\r\n isDirectHit: true,\r\n isImage: true\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public adjustPositionContext(\r\n payload: IGetPositionByXYPayload\r\n ): ICurrentPosition | null {\r\n const positionResult = this.getPositionByXY(payload)\r\n if (!~positionResult.index) return null\r\n // 移动控件内光标\r\n if (\r\n positionResult.isControl &&\r\n this.draw.getMode() !== EditorMode.READONLY\r\n ) {\r\n const { index, isTable, trIndex, tdIndex, tdValueIndex } = positionResult\r\n const control = this.draw.getControl()\r\n const { newIndex } = control.moveCursor({\r\n index,\r\n isTable,\r\n trIndex,\r\n tdIndex,\r\n tdValueIndex\r\n })\r\n if (isTable) {\r\n positionResult.tdValueIndex = newIndex\r\n } else {\r\n positionResult.index = newIndex\r\n }\r\n }\r\n const {\r\n index,\r\n isCheckbox,\r\n isRadio,\r\n isControl,\r\n isImage,\r\n isDirectHit,\r\n isTable,\r\n trIndex,\r\n tdIndex,\r\n tdId,\r\n trId,\r\n tableId\r\n } = positionResult\r\n // 设置位置上下文\r\n this.setPositionContext({\r\n isTable: isTable || false,\r\n isCheckbox: isCheckbox || false,\r\n isRadio: isRadio || false,\r\n isControl: isControl || false,\r\n isImage: isImage || false,\r\n isDirectHit: isDirectHit || false,\r\n index,\r\n trIndex,\r\n tdIndex,\r\n tdId,\r\n trId,\r\n tableId\r\n })\r\n return positionResult\r\n }\r\n\r\n public setSurroundPosition(payload: ISetSurroundPositionPayload) {\r\n const {\r\n pageNo,\r\n row,\r\n rowElement,\r\n rowElementRect,\r\n surroundElementList,\r\n availableWidth\r\n } = payload\r\n let x = rowElementRect.x\r\n let rowIncreaseWidth = 0\r\n if (\r\n surroundElementList.length &&\r\n !getIsBlockElement(rowElement) &&\r\n !rowElement.control?.minWidth\r\n ) {\r\n for (let s = 0; s < surroundElementList.length; s++) {\r\n const surroundElement = surroundElementList[s]\r\n const floatPosition = surroundElement.imgFloatPosition!\r\n if (floatPosition.pageNo !== pageNo) continue\r\n const surroundRect = {\r\n ...floatPosition,\r\n width: surroundElement.width!,\r\n height: surroundElement.height!\r\n }\r\n if (isRectIntersect(rowElementRect, surroundRect)) {\r\n row.isSurround = true\r\n // 需向左移动距离:浮动元素宽度 + 浮动元素左上坐标 - 元素左上坐标\r\n const translateX =\r\n surroundRect.width + surroundRect.x - rowElementRect.x\r\n rowElement.left = translateX\r\n // 增加行宽\r\n row.width += translateX\r\n rowIncreaseWidth += translateX\r\n // 下个元素起始位置:浮动元素右坐标 - 元素宽度\r\n x = surroundRect.x + surroundRect.width\r\n // 检测宽度是否足够,不够则移动到下一行,并还原状态\r\n if (row.width + rowElement.metrics.width > availableWidth) {\r\n rowElement.left = 0\r\n row.width -= rowIncreaseWidth\r\n break\r\n }\r\n }\r\n }\r\n }\r\n return { x, rowIncreaseWidth }\r\n }\r\n}\r\n","var ae = Object.defineProperty;\nvar ce = (e, t, o) => t in e ? ae(e, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : e[t] = o;\nvar A = (e, t, o) => ce(e, typeof t != \"symbol\" ? t + \"\" : t, o);\nclass Re {\n constructor() {\n A(this, \"rangeStyleChange\");\n A(this, \"visiblePageNoListChange\");\n A(this, \"intersectionPageNoChange\");\n A(this, \"pageSizeChange\");\n A(this, \"pageScaleChange\");\n A(this, \"saved\");\n A(this, \"contentChange\");\n A(this, \"controlChange\");\n A(this, \"controlContentChange\");\n A(this, \"pageModeChange\");\n A(this, \"zoneChange\");\n A(this, \"catalogChange\");\n this.rangeStyleChange = null, this.visiblePageNoListChange = null, this.intersectionPageNoChange = null, this.pageSizeChange = null, this.pageScaleChange = null, this.saved = null, this.contentChange = null, this.controlChange = null, this.controlContentChange = null, this.pageModeChange = null, this.zoneChange = null, this.catalogChange = null;\n }\n}\nvar U = /* @__PURE__ */ ((e) => (e.CONTAIN = \"contain\", e.COVER = \"cover\", e))(U || {}), K = /* @__PURE__ */ ((e) => (e.REPEAT = \"repeat\", e.NO_REPEAT = \"no-repeat\", e.REPEAT_X = \"repeat-x\", e.REPEAT_Y = \"repeat-y\", e))(K || {}), _ = /* @__PURE__ */ ((e) => (e.HALF = \"half\", e.ONE_THIRD = \"one-third\", e.QUARTER = \"quarter\", e))(_ || {}), O = /* @__PURE__ */ ((e) => (e.ARABIC = \"arabic\", e.CHINESE = \"chinese\", e))(O || {}), C = /* @__PURE__ */ ((e) => (e.PREFIX = \"prefix\", e.POSTFIX = \"postfix\", e.PRE_TEXT = \"preText\", e.POST_TEXT = \"postText\", e.PLACEHOLDER = \"placeholder\", e.VALUE = \"value\", e.CHECKBOX = \"checkbox\", e.RADIO = \"radio\", e))(C || {}), W = /* @__PURE__ */ ((e) => (e.PAGE = \"page\", e.TABLE = \"table\", e))(W || {}), R = /* @__PURE__ */ ((e) => (e.TEXT = \"text\", e.IMAGE = \"image\", e.TABLE = \"table\", e.HYPERLINK = \"hyperlink\", e.SUPERSCRIPT = \"superscript\", e.SUBSCRIPT = \"subscript\", e.SEPARATOR = \"separator\", e.PAGE_BREAK = \"pageBreak\", e.CONTROL = \"control\", e.AREA = \"area\", e.CHECKBOX = \"checkbox\", e.RADIO = \"radio\", e.LATEX = \"latex\", e.TAB = \"tab\", e.DATE = \"date\", e.BLOCK = \"block\", e.TITLE = \"title\", e.LIST = \"list\", e.PLACEHOLDER = \"placeholder\", e.FOOTNOTE_MARK = \"footnoteMark\", e.FOOTNOTE_CONTENT = \"footnoteContent\", e.FOOTNOTE_SEPARATOR = \"footnoteSeparator\", e.COLUMN_BREAK = \"columnBreak\", e.REVISION_INSERT = \"revisionInsert\", e.REVISION_DELETE = \"revisionDelete\", e))(R || {}), G = /* @__PURE__ */ ((e) => (e.PAGE = \"page\", e.CONTINUITY = \"continuity\", e))(G || {}), M = /* @__PURE__ */ ((e) => (e.UL = \"ul\", e.OL = \"ol\", e))(M || {}), E = /* @__PURE__ */ ((e) => (e.DISC = \"disc\", e.CIRCLE = \"circle\", e.SQUARE = \"square\", e.CHECKBOX = \"checkbox\", e.DIAMOND = \"diamond\", e.DASH = \"dash\", e.CHECK = \"check\", e.TRIANGLE = \"triangle\", e.STAR = \"star\", e.ARROW = \"arrow\", e.DIAMOND_SOLID = \"diamond-solid\", e.ANGLE = \"angle\", e.HOLLOW_CIRCLE = \"hollow-circle\", e.HOLLOW_SQUARE = \"hollow-square\", e.HEART_HOLLOW = \"heart-hollow\", e.HASH = \"hash\", e.TRIANGLE_SOLID = \"triangle-solid\", e.STAR_SOLID = \"star-solid\", e.HEART_SOLID = \"heart-solid\", e.FLOWER = \"flower\", e.ASTERISK = \"asterisk\", e.HOLLOW_DIAMOND = \"hollow-diamond\", e.HOLLOW_TRIANGLE = \"hollow-triangle\", e))(E || {}), S = /* @__PURE__ */ ((e) => (e.DISC = \"disc\", e.CIRCLE = \"circle\", e.SQUARE = \"square\", e.CHECKBOX = \"checkbox\", e.DIAMOND = \"diamond\", e.DASH = \"dash\", e.CHECK = \"check\", e.DECIMAL = \"decimal\", e.DECIMAL_DOT = \"decimal-dot\", e.DECIMAL_PAREN = \"decimal-paren\", e.DECIMAL_CIRCLE = \"decimal-circle\", e.DECIMAL_BRACKET = \"decimal-bracket\", e.CHINESE = \"chinese\", e.CHINESE_BRACKET = \"chinese-bracket\", e.UPPER_ALPHA = \"upper-alpha\", e.LOWER_ALPHA_DOT = \"lower-alpha-dot\", e))(S || {}), z = /* @__PURE__ */ ((e) => (e.LEFT = \"left\", e.CENTER = \"center\", e.RIGHT = \"right\", e.ALIGNMENT = \"alignment\", e.JUSTIFY = \"justify\", e))(z || {}), L = /* @__PURE__ */ ((e) => (e.FIRST = \"first\", e.SECOND = \"second\", e.THIRD = \"third\", e.FOURTH = \"fourth\", e.FIFTH = \"fifth\", e.SIXTH = \"sixth\", e))(L || {}), B = /* @__PURE__ */ ((e) => (e.TOP = \"top\", e.MIDDLE = \"middle\", e.BOTTOM = \"bottom\", e))(B || {}), V = /* @__PURE__ */ ((e) => (e.TEXT = \"text\", e.IMAGE = \"image\", e))(V || {});\nconst N = \"\";\n_.HALF + \"\", 1 / 2, _.ONE_THIRD + \"\", 1 / 3, _.QUARTER + \"\", 1 / 4;\nconst j = [\n R.TEXT,\n R.HYPERLINK,\n R.SUBSCRIPT,\n R.SUPERSCRIPT,\n R.CONTROL,\n R.DATE,\n R.PLACEHOLDER\n];\nR.IMAGE, R.LATEX;\nR.BLOCK, R.PAGE_BREAK, R.SEPARATOR, R.TABLE;\nR.TITLE, R.LIST;\nz.CENTER, O.ARABIC;\nO.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.CHINESE, O.CHINESE;\nV.TEXT, O.ARABIC;\nL.FIRST + \"\", L.SECOND + \"\", L.THIRD + \"\", L.FOURTH + \"\", L.FIFTH + \"\", L.SIXTH + \"\";\nL.FIRST + \"\", L.SECOND + \"\", L.THIRD + \"\", L.FOURTH + \"\", L.FIFTH + \"\", L.SIXTH + \"\";\nL.FIRST, L.SECOND, L.THIRD, L.FOURTH, L.FIFTH, L.SIXTH;\nE.DISC + \"\", E.CIRCLE + \"\", E.SQUARE + \"\", E.CHECKBOX + \"\", E.DIAMOND + \"\", E.DASH + \"\", E.CHECK + \"\", E.TRIANGLE + \"\", E.STAR + \"\", E.ARROW + \"\", E.DIAMOND_SOLID + \"\", E.ANGLE + \"\", E.HOLLOW_CIRCLE + \"\", E.HOLLOW_SQUARE + \"\", E.HEART_HOLLOW + \"\", E.HASH + \"\", E.TRIANGLE_SOLID + \"\", E.STAR_SOLID + \"\", E.HEART_SOLID + \"\", E.FLOWER + \"\", E.ASTERISK + \"\", E.HOLLOW_DIAMOND + \"\", E.HOLLOW_TRIANGLE + \"\";\nM.OL + \"\", M.UL + \"\";\nS.DISC + \"\", S.CIRCLE + \"\", S.SQUARE + \"\", S.DECIMAL + \"\", S.DECIMAL_DOT + \"\", S.DECIMAL_PAREN + \"\", S.DECIMAL_CIRCLE + \"\", S.DECIMAL_BRACKET + \"\", S.CHINESE + \"\", S.CHINESE_BRACKET + \"\", S.UPPER_ALPHA + \"\", S.LOWER_ALPHA_DOT + \"\", S.CHECKBOX + \"\", S.DIAMOND + \"\", S.DASH + \"\", S.CHECK + \"\";\nU.COVER, K.NO_REPEAT;\nB.BOTTOM;\n_.HALF;\n_.HALF;\nB.BOTTOM;\nG.CONTINUITY;\nfunction he(e) {\n return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, \"default\") ? e.default : e;\n}\nvar ge = fe;\nfunction H(e) {\n return e instanceof Buffer ? Buffer.from(e) : new e.constructor(e.buffer.slice(), e.byteOffset, e.length);\n}\nfunction fe(e) {\n if (e = e || {}, e.circles) return de(e);\n const t = /* @__PURE__ */ new Map();\n if (t.set(Date, (s) => new Date(s)), t.set(Map, (s, h) => new Map(a(Array.from(s), h))), t.set(Set, (s, h) => new Set(a(Array.from(s), h))), e.constructorHandlers)\n for (const s of e.constructorHandlers)\n t.set(s[0], s[1]);\n let o = null;\n return e.proto ? g : c;\n function a(s, h) {\n const n = Object.keys(s), r = new Array(n.length);\n for (let l = 0; l < n.length; l++) {\n const i = n[l], f = s[i];\n typeof f != \"object\" || f === null ? r[i] = f : f.constructor !== Object && (o = t.get(f.constructor)) ? r[i] = o(f, h) : ArrayBuffer.isView(f) ? r[i] = H(f) : r[i] = h(f);\n }\n return r;\n }\n function c(s) {\n if (typeof s != \"object\" || s === null) return s;\n if (Array.isArray(s)) return a(s, c);\n if (s.constructor !== Object && (o = t.get(s.constructor)))\n return o(s, c);\n const h = {};\n for (const n in s) {\n if (Object.hasOwnProperty.call(s, n) === !1) continue;\n const r = s[n];\n typeof r != \"object\" || r === null ? h[n] = r : r.constructor !== Object && (o = t.get(r.constructor)) ? h[n] = o(r, c) : ArrayBuffer.isView(r) ? h[n] = H(r) : h[n] = c(r);\n }\n return h;\n }\n function g(s) {\n if (typeof s != \"object\" || s === null) return s;\n if (Array.isArray(s)) return a(s, g);\n if (s.constructor !== Object && (o = t.get(s.constructor)))\n return o(s, g);\n const h = {};\n for (const n in s) {\n const r = s[n];\n typeof r != \"object\" || r === null ? h[n] = r : r.constructor !== Object && (o = t.get(r.constructor)) ? h[n] = o(r, g) : ArrayBuffer.isView(r) ? h[n] = H(r) : h[n] = g(r);\n }\n return h;\n }\n}\nfunction de(e) {\n const t = [], o = [], a = /* @__PURE__ */ new Map();\n if (a.set(Date, (n) => new Date(n)), a.set(Map, (n, r) => new Map(g(Array.from(n), r))), a.set(Set, (n, r) => new Set(g(Array.from(n), r))), e.constructorHandlers)\n for (const n of e.constructorHandlers)\n a.set(n[0], n[1]);\n let c = null;\n return e.proto ? h : s;\n function g(n, r) {\n const l = Object.keys(n), i = new Array(l.length);\n for (let f = 0; f < l.length; f++) {\n const d = l[f], p = n[d];\n if (typeof p != \"object\" || p === null)\n i[d] = p;\n else if (p.constructor !== Object && (c = a.get(p.constructor)))\n i[d] = c(p, r);\n else if (ArrayBuffer.isView(p))\n i[d] = H(p);\n else {\n const y = t.indexOf(p);\n y !== -1 ? i[d] = o[y] : i[d] = r(p);\n }\n }\n return i;\n }\n function s(n) {\n if (typeof n != \"object\" || n === null) return n;\n if (Array.isArray(n)) return g(n, s);\n if (n.constructor !== Object && (c = a.get(n.constructor)))\n return c(n, s);\n const r = {};\n t.push(n), o.push(r);\n for (const l in n) {\n if (Object.hasOwnProperty.call(n, l) === !1) continue;\n const i = n[l];\n if (typeof i != \"object\" || i === null)\n r[l] = i;\n else if (i.constructor !== Object && (c = a.get(i.constructor)))\n r[l] = c(i, s);\n else if (ArrayBuffer.isView(i))\n r[l] = H(i);\n else {\n const f = t.indexOf(i);\n f !== -1 ? r[l] = o[f] : r[l] = s(i);\n }\n }\n return t.pop(), o.pop(), r;\n }\n function h(n) {\n if (typeof n != \"object\" || n === null) return n;\n if (Array.isArray(n)) return g(n, h);\n if (n.constructor !== Object && (c = a.get(n.constructor)))\n return c(n, h);\n const r = {};\n t.push(n), o.push(r);\n for (const l in n) {\n const i = n[l];\n if (typeof i != \"object\" || i === null)\n r[l] = i;\n else if (i.constructor !== Object && (c = a.get(i.constructor)))\n r[l] = c(i, h);\n else if (ArrayBuffer.isView(i))\n r[l] = H(i);\n else {\n const f = t.indexOf(i);\n f !== -1 ? r[l] = o[f] : r[l] = h(i);\n }\n }\n return t.pop(), o.pop(), r;\n }\n}\nconst ue = /* @__PURE__ */ he(ge);\nue();\nfunction pe(e, t) {\n const o = e[t];\n if (!o) return null;\n const a = e[t + 1];\n return !o.listId && o.value === N && a && a.value !== N && o.areaId === a.areaId ? a : o;\n}\nfunction D(e) {\n return e.value === N && !e.listWrap;\n}\nconst Ee = new RegExp(N, \"g\");\nclass Se {\n constructor(t) {\n A(this, \"draw\");\n A(this, \"range\");\n A(this, \"defaultStyle\");\n this.draw = t, this.range = {\n startIndex: -1,\n endIndex: -1\n }, this.defaultStyle = null;\n }\n get options() {\n return this.draw.getOptions();\n }\n get listener() {\n return this.draw.getListener();\n }\n get eventBus() {\n return this.draw.getEventBus();\n }\n get position() {\n return this.draw.getPosition();\n }\n get historyManager() {\n return this.draw.getHistoryManager();\n }\n getRange() {\n return this.range;\n }\n getRangeClone() {\n return { ...this.range };\n }\n clearRange() {\n this.setRange(-1, -1);\n }\n setDefaultStyle(t) {\n t ? this.defaultStyle = {\n ...this.defaultStyle,\n ...t\n } : this.defaultStyle = null;\n }\n getDefaultStyle() {\n return this.defaultStyle;\n }\n getRangeAnchorStyle(t, o) {\n const a = pe(t, o);\n return a ? {\n ...a,\n ...this.defaultStyle\n } : null;\n }\n getIsRangeChange(t, o, a, c, g, s, h) {\n return this.range.startIndex !== t || this.range.endIndex !== o || this.range.tableId !== a || this.range.startTdIndex !== c || this.range.endTdIndex !== g || this.range.startTrIndex !== s || this.range.endTrIndex !== h;\n }\n getIsCollapsed() {\n const { startIndex: t, endIndex: o } = this.range;\n return t === o;\n }\n getIsSelection() {\n const { startIndex: t, endIndex: o } = this.range;\n return !~t && !~o ? !1 : t !== o;\n }\n getSelection() {\n const { startIndex: t, endIndex: o } = this.range;\n return t === o ? null : this.draw.getElementList().slice(t + 1, o + 1);\n }\n getSelectionElementList() {\n if (this.range.isCrossRowCol) {\n const t = this.draw.getTableParticle().getRangeRowCol();\n if (!t) return null;\n const o = [];\n for (let a = 0; a < t.length; a++) {\n const c = t[a];\n for (let g = 0; g < c.length; g++) {\n const s = c[g];\n o.push(...s.value);\n }\n }\n return o;\n }\n return this.getSelection();\n }\n getTextLikeSelection() {\n const t = this.getSelection();\n return t ? t.filter(\n (o) => !o.type || j.includes(o.type)\n ) : null;\n }\n getTextLikeSelectionElementList() {\n const t = this.getSelectionElementList();\n return t ? t.filter(\n (o) => !o.type || j.includes(o.type)\n ) : null;\n }\n getRangeRow() {\n const { startIndex: t, endIndex: o } = this.range;\n if (!~t && !~o) return null;\n const a = this.position.getPositionList(), c = /* @__PURE__ */ new Map();\n for (let g = t; g < o + 1; g++) {\n const { pageNo: s, rowNo: h } = a[g], n = c.get(s);\n n ? n.has(h) || n.add(h) : c.set(s, /* @__PURE__ */ new Set([h]));\n }\n return c;\n }\n getRangeRowElementList() {\n const { startIndex: t, endIndex: o, isCrossRowCol: a } = this.range;\n if (!~t && !~o) return null;\n if (a)\n return this.getSelectionElementList();\n const c = this.getRangeRow();\n if (!c) return null;\n const g = this.position.getPositionList(), s = this.draw.getElementList(), h = [];\n for (let n = 0; n < g.length; n++) {\n const r = g[n], l = c.get(r.pageNo);\n l && l.has(r.rowNo) && h.push(s[n]);\n }\n return h;\n }\n getRangeParagraph() {\n const { startIndex: t, endIndex: o } = this.range;\n if (!~t && !~o) return null;\n const a = this.position.getPositionList(), c = this.draw.getElementList(), g = /* @__PURE__ */ new Map();\n let s = t;\n for (; s >= 0; ) {\n const { pageNo: r, rowNo: l } = a[s];\n let i = g.get(r);\n i || (i = [], g.set(r, i)), i.includes(l) || i.unshift(l);\n const f = c[s], d = c[s - 1];\n if (D(f) || f.listId !== (d == null ? void 0 : d.listId) || f.titleId !== (d == null ? void 0 : d.titleId))\n break;\n s--;\n }\n const h = t === o;\n if (!h) {\n let r = t + 1;\n for (; r < o; ) {\n const { pageNo: l, rowNo: i } = a[r];\n let f = g.get(l);\n f || (f = [], g.set(l, f)), f.includes(i) || f.push(i), r++;\n }\n }\n let n = o;\n for (h && c[t].value === N && (n += 1); n < a.length; ) {\n const r = c[n], l = c[n + 1];\n if (D(r) || r.listId !== (l == null ? void 0 : l.listId) || r.titleId !== (l == null ? void 0 : l.titleId))\n break;\n const { pageNo: i, rowNo: f } = a[n];\n let d = g.get(i);\n d || (d = [], g.set(i, d)), d.includes(f) || d.push(f), n++;\n }\n return g;\n }\n getRangeParagraphInfo() {\n const { startIndex: t, endIndex: o } = this.range;\n if (!~t && !~o) return null;\n let a = -1;\n const c = [], g = this.getRangeParagraph();\n if (!g) return null;\n const s = this.draw.getElementList(), h = this.position.getPositionList();\n for (let n = 0; n < h.length; n++) {\n const r = h[n], l = g.get(r.pageNo);\n l && l.includes(r.rowNo) && (~a || (a = r.index), c.push(s[n]));\n }\n return c.length ? {\n elementList: c,\n startIndex: a\n } : null;\n }\n getRangeParagraphElementList() {\n var t;\n return ((t = this.getRangeParagraphInfo()) == null ? void 0 : t.elementList) || null;\n }\n getRangeTableElement() {\n const t = this.position.getPositionContext();\n return t.isTable ? this.draw.getOriginalElementList()[t.index] : null;\n }\n getIsSelectAll() {\n const t = this.draw.getElementList(), { startIndex: o, endIndex: a } = this.range;\n return o === 0 && t.length - 1 === a && !this.position.getPositionContext().isTable;\n }\n getIsPointInRange(t, o) {\n const { startIndex: a, endIndex: c } = this.range, g = this.position.getPositionList();\n for (let s = a + 1; s <= c && g[s]; s++) {\n const {\n coordinate: { leftTop: n, rightBottom: r }\n } = g[s];\n if (t >= n[0] && t <= r[0] && o >= n[1] && o <= r[1])\n return !0;\n }\n return !1;\n }\n getKeywordRangeList(t) {\n const o = this.draw.getSearch().getMatchList(t, this.draw.getOriginalElementList()), a = /* @__PURE__ */ new Map();\n for (const g of o) {\n const s = a.get(g.groupId);\n if (s)\n s.endIndex += 1;\n else {\n const { type: h, groupId: n, tableId: r, index: l, tdIndex: i, trIndex: f } = g, d = {\n startIndex: l,\n endIndex: l\n };\n h === W.TABLE && (d.tableId = r, d.startTdIndex = i, d.endTdIndex = i, d.startTrIndex = f, d.endTrIndex = f), a.set(n, d);\n }\n }\n const c = [];\n return a.forEach((g) => {\n c.push(g);\n }), c;\n }\n canInput() {\n var s;\n const { startIndex: t, endIndex: o } = this.getRange();\n if (!~t && !~o) return !1;\n const a = this.draw.getElementList(), c = a[t];\n if (t === o)\n return (c.controlComponent !== C.PRE_TEXT || ((s = a[t + 1]) == null ? void 0 : s.controlComponent) !== C.PRE_TEXT) && c.controlComponent !== C.POST_TEXT;\n const g = a[o];\n return !c.controlId && !g.controlId || (!c.controlId || c.controlComponent === C.POSTFIX) && (!g.controlId || g.controlComponent === C.POSTFIX) || !!c.controlId && g.controlId === c.controlId && g.controlComponent !== C.PRE_TEXT && g.controlComponent !== C.POST_TEXT && g.controlComponent !== C.POSTFIX;\n }\n setRange(t, o, a, c, g, s, h) {\n this.getIsRangeChange(\n t,\n o,\n a,\n c,\n g,\n s,\n h\n ) && (this.range.startIndex = t, this.range.endIndex = o, this.range.tableId = a, this.range.startTdIndex = c, this.range.endTdIndex = g, this.range.startTrIndex = s, this.range.endTrIndex = h, this.range.isCrossRowCol = c !== void 0 || g !== void 0 || s !== void 0 || h !== void 0, this.setDefaultStyle(null)), this.range.zone = this.draw.getZone().getZone();\n const r = this.draw.getControl();\n if (~t && ~o) {\n const i = this.draw.getElementList()[t];\n if (i != null && i.controlId) {\n r.initControl();\n return;\n }\n }\n r.destroyControl();\n }\n replaceRange(t) {\n this.setRange(\n t.startIndex,\n t.endIndex,\n t.tableId,\n t.startTdIndex,\n t.endTdIndex,\n t.startTrIndex,\n t.endTrIndex\n );\n }\n shrinkRange() {\n const { startIndex: t, endIndex: o } = this.range;\n t === o || !~t && !~o || this.replaceRange({\n ...this.range,\n startIndex: o\n });\n }\n setRangeStyle() {\n var X;\n const t = this.listener.rangeStyleChange, o = this.eventBus.hasSubscribers(\"rangeStyleChange\");\n if (!t && !o) return;\n const { startIndex: a, endIndex: c, isCrossRowCol: g } = this.range;\n if (!~a && !~c) return;\n let s;\n if (g) {\n const T = this.draw.getOriginalElementList(), m = this.position.getPositionContext();\n s = T[m.index];\n } else {\n const T = ~c ? c : 0, m = this.draw.getElementList();\n s = this.getRangeAnchorStyle(m, T);\n }\n if (!s) return;\n const h = !!((X = this.getSelectionElementList()) != null && X.length), n = this.getSelection() || [s], r = s.type || R.TEXT, l = s.font || this.options.defaultFont, i = s.size || this.options.defaultSize, f = s.characterScale ?? 100, d = !~n.findIndex((T) => !T.bold), p = !~n.findIndex((T) => !T.italic), y = !~n.findIndex(\n (T) => {\n var m;\n return !T.underline && !((m = T.control) != null && m.underline);\n }\n ), u = !~n.findIndex((T) => !T.strikeout), b = s.color || null, w = s.highlight || null, I = s.paragraphColor || null;\n let P = 0;\n {\n const T = this.draw.getElementList();\n for (let m = ~c ? c : 0; m >= 0; m--) {\n const k = T[m];\n if (k.paragraphFirstLineIndent !== void 0) {\n P = k.paragraphFirstLineIndent;\n break;\n }\n if (m > 0 && D(T[m - 1]))\n break;\n }\n }\n const x = s.rowFlex || null, q = s.rowMargin ?? this.options.defaultRowMargin, Y = s.lineHeight ?? this.options.defaultLineHeight, Z = s.dashArray || [], $ = s.separatorType || null, J = s.separatorLineWidth ?? null, ee = s.level || null, te = s.listType || null, ne = s.listStyle || null, re = y && s.textDecoration || null, oe = !!this.draw.getPainterStyle(), se = this.historyManager.isCanUndo(), ie = this.historyManager.isCanRedo(), le = s.groupIds || null;\n let v = s.extension ?? null;\n if (r === R.TABLE) {\n const T = {\n borderType: s.borderType ?? null,\n borderColor: s.borderColor ?? null,\n borderWidth: s.borderWidth ?? null,\n borderExternalWidth: s.borderExternalWidth ?? null\n };\n v && typeof v == \"object\" && !Array.isArray(v) ? v = { ...v, table: T } : v = { table: T };\n }\n const F = {\n type: r,\n hasSelection: h,\n undo: se,\n redo: ie,\n painter: oe,\n font: l,\n size: i,\n characterScale: f,\n bold: d,\n italic: p,\n underline: y,\n strikeout: u,\n color: b,\n highlight: w,\n paragraphColor: I,\n rowFlex: x,\n rowMargin: q,\n lineHeight: Y,\n dashArray: Z,\n separatorType: $,\n separatorLineWidth: J,\n level: ee,\n listType: te,\n listStyle: ne,\n groupIds: le,\n textDecoration: re,\n paragraphFirstLineIndent: P,\n extension: v\n };\n t && t(F), o && this.eventBus.emit(\"rangeStyleChange\", F);\n }\n recoveryRangeStyle() {\n const t = this.listener.rangeStyleChange, o = this.eventBus.hasSubscribers(\"rangeStyleChange\");\n if (!t && !o) return;\n const a = this.options.defaultFont, c = this.options.defaultSize, g = this.options.defaultRowMargin, s = this.options.defaultLineHeight, h = !!this.draw.getPainterStyle(), n = this.historyManager.isCanUndo(), r = this.historyManager.isCanRedo(), l = {\n type: null,\n hasSelection: !1,\n undo: n,\n redo: r,\n painter: h,\n font: a,\n size: c,\n characterScale: 100,\n bold: !1,\n italic: !1,\n underline: !1,\n strikeout: !1,\n color: null,\n highlight: null,\n paragraphColor: null,\n rowFlex: null,\n rowMargin: g,\n lineHeight: s,\n dashArray: [],\n separatorType: null,\n separatorLineWidth: null,\n level: null,\n listType: null,\n listStyle: null,\n groupIds: null,\n textDecoration: null,\n paragraphFirstLineIndent: 0,\n extension: null\n };\n t && t(l), o && this.eventBus.emit(\"rangeStyleChange\", l);\n }\n shrinkBoundary(t = {}) {\n const o = t.elementList || this.draw.getElementList(), a = t.range || this.getRange(), { startIndex: c, endIndex: g } = a;\n if (!~c && !~g) return;\n const s = o[c], h = o[g];\n if (c === g) {\n if (s.controlComponent === C.PLACEHOLDER) {\n let n = c - 1;\n for (; n > 0; ) {\n const r = o[n];\n if (r.controlId !== s.controlId || r.controlComponent === C.PREFIX || r.controlComponent === C.PRE_TEXT) {\n a.startIndex = n, a.endIndex = n;\n break;\n }\n n--;\n }\n }\n } else {\n if (s.controlComponent === C.PLACEHOLDER || h.controlComponent === C.PLACEHOLDER) {\n let n = g - 1;\n for (; n > 0; ) {\n const r = o[n];\n if (r.controlId !== h.controlId || r.controlComponent === C.PREFIX || r.controlComponent === C.PRE_TEXT) {\n a.startIndex = n, a.endIndex = n;\n return;\n }\n n--;\n }\n }\n if (s.controlComponent === C.PREFIX) {\n let n = c + 1;\n for (; n < o.length; ) {\n const r = o[n];\n if (r.controlId !== s.controlId || r.controlComponent === C.VALUE) {\n a.startIndex = n - 1;\n break;\n } else if (r.controlComponent === C.PLACEHOLDER) {\n a.startIndex = n - 1, a.endIndex = n - 1;\n return;\n }\n n++;\n }\n }\n if (h.controlComponent !== C.VALUE) {\n let n = g;\n for (; n > 0; ) {\n const r = o[n];\n if (r.controlId !== s.controlId || r.controlComponent === C.VALUE) {\n a.startIndex = n;\n break;\n } else if (r.controlComponent === C.PLACEHOLDER) {\n a.startIndex = n, a.endIndex = n;\n return;\n }\n n--;\n }\n }\n }\n }\n render(t, o, a, c, g) {\n t.save(), t.globalAlpha = this.options.rangeAlpha, t.fillStyle = this.options.rangeColor, t.fillRect(o, a, c, g), t.restore();\n }\n toString() {\n const t = this.getTextLikeSelection();\n return t ? t.map((o) => o.value).join(\"\").replace(Ee, \"\") : \"\";\n }\n}\nfunction Ie(e) {\n return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, \"default\") ? e.default : e;\n}\nvar Q = { exports: {} };\n(function(e) {\n var t = Object.prototype.hasOwnProperty, o = \"~\";\n function a() {\n }\n Object.create && (a.prototype = /* @__PURE__ */ Object.create(null), new a().__proto__ || (o = !1));\n function c(n, r, l) {\n this.fn = n, this.context = r, this.once = l || !1;\n }\n function g(n, r, l, i, f) {\n if (typeof l != \"function\")\n throw new TypeError(\"The listener must be a function\");\n var d = new c(l, i || n, f), p = o ? o + r : r;\n return n._events[p] ? n._events[p].fn ? n._events[p] = [n._events[p], d] : n._events[p].push(d) : (n._events[p] = d, n._eventsCount++), n;\n }\n function s(n, r) {\n --n._eventsCount === 0 ? n._events = new a() : delete n._events[r];\n }\n function h() {\n this._events = new a(), this._eventsCount = 0;\n }\n h.prototype.eventNames = function() {\n var r = [], l, i;\n if (this._eventsCount === 0) return r;\n for (i in l = this._events)\n t.call(l, i) && r.push(o ? i.slice(1) : i);\n return Object.getOwnPropertySymbols ? r.concat(Object.getOwnPropertySymbols(l)) : r;\n }, h.prototype.listeners = function(r) {\n var l = o ? o + r : r, i = this._events[l];\n if (!i) return [];\n if (i.fn) return [i.fn];\n for (var f = 0, d = i.length, p = new Array(d); f < d; f++)\n p[f] = i[f].fn;\n return p;\n }, h.prototype.listenerCount = function(r) {\n var l = o ? o + r : r, i = this._events[l];\n return i ? i.fn ? 1 : i.length : 0;\n }, h.prototype.emit = function(r, l, i, f, d, p) {\n var y = o ? o + r : r;\n if (!this._events[y]) return !1;\n var u = this._events[y], b = arguments.length, w, I;\n if (u.fn) {\n switch (u.once && this.removeListener(r, u.fn, void 0, !0), b) {\n case 1:\n return u.fn.call(u.context), !0;\n case 2:\n return u.fn.call(u.context, l), !0;\n case 3:\n return u.fn.call(u.context, l, i), !0;\n case 4:\n return u.fn.call(u.context, l, i, f), !0;\n case 5:\n return u.fn.call(u.context, l, i, f, d), !0;\n case 6:\n return u.fn.call(u.context, l, i, f, d, p), !0;\n }\n for (I = 1, w = new Array(b - 1); I < b; I++)\n w[I - 1] = arguments[I];\n u.fn.apply(u.context, w);\n } else {\n var P = u.length, x;\n for (I = 0; I < P; I++)\n switch (u[I].once && this.removeListener(r, u[I].fn, void 0, !0), b) {\n case 1:\n u[I].fn.call(u[I].context);\n break;\n case 2:\n u[I].fn.call(u[I].context, l);\n break;\n case 3:\n u[I].fn.call(u[I].context, l, i);\n break;\n case 4:\n u[I].fn.call(u[I].context, l, i, f);\n break;\n default:\n if (!w) for (x = 1, w = new Array(b - 1); x < b; x++)\n w[x - 1] = arguments[x];\n u[I].fn.apply(u[I].context, w);\n }\n }\n return !0;\n }, h.prototype.on = function(r, l, i) {\n return g(this, r, l, i, !1);\n }, h.prototype.once = function(r, l, i) {\n return g(this, r, l, i, !0);\n }, h.prototype.removeListener = function(r, l, i, f) {\n var d = o ? o + r : r;\n if (!this._events[d]) return this;\n if (!l)\n return s(this, d), this;\n var p = this._events[d];\n if (p.fn)\n p.fn === l && (!f || p.once) && (!i || p.context === i) && s(this, d);\n else {\n for (var y = 0, u = [], b = p.length; y < b; y++)\n (p[y].fn !== l || f && !p[y].once || i && p[y].context !== i) && u.push(p[y]);\n u.length ? this._events[d] = u.length === 1 ? u[0] : u : s(this, d);\n }\n return this;\n }, h.prototype.removeAllListeners = function(r) {\n var l;\n return r ? (l = o ? o + r : r, this._events[l] && s(this, l)) : (this._events = new a(), this._eventsCount = 0), this;\n }, h.prototype.off = h.prototype.removeListener, h.prototype.addListener = h.prototype.on, h.prefixed = o, h.EventEmitter = h, e.exports = h;\n})(Q);\nvar Ce = Q.exports;\nconst Le = /* @__PURE__ */ Ie(Ce), Te = 50;\nclass ye {\n constructor(t = Te) {\n A(this, \"emitter\");\n A(this, \"_maxListeners\");\n this.emitter = new Le(), this._maxListeners = t;\n }\n on(t, o) {\n if (!(!t || typeof o != \"function\")) {\n if (this._maxListeners > 0 && this.emitter.listeners(t).length >= this._maxListeners) {\n console.warn(\n `[EventBus] Max listeners (${this._maxListeners}) reached for event \"${String(t)}\". Subsequent listeners are ignored.`\n );\n return;\n }\n this.emitter.on(t, o);\n }\n }\n emit(t, ...o) {\n t && this.emitter.emit(t, ...o);\n }\n off(t, o) {\n !t || typeof o != \"function\" || this.emitter.off(t, o);\n }\n hasSubscribers(t) {\n return this.emitter.listeners(t).length > 0;\n }\n destroy() {\n this.emitter.removeAllListeners();\n }\n}\nexport {\n C as ControlComponent,\n W as EditorContext,\n R as ElementType,\n ye as EventBus,\n Re as Listener,\n Se as RangeManager\n};\n//# sourceMappingURL=docx-editor-state.js.map\n","import {\r\n BackgroundRepeat,\r\n BackgroundSize\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Background {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private imageCache: Map<string, HTMLImageElement>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.imageCache = new Map()\r\n }\r\n\r\n private _renderBackgroundColor(\r\n ctx: CanvasRenderingContext2D,\r\n color: string,\r\n width: number,\r\n height: number\r\n ) {\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.fillRect(0, 0, width, height)\r\n ctx.restore()\r\n }\r\n\r\n private _drawImage(\r\n ctx: CanvasRenderingContext2D,\r\n imageElement: HTMLImageElement,\r\n width: number,\r\n height: number\r\n ) {\r\n const { background, scale } = this.options\r\n // contain\r\n if (background.size === BackgroundSize.CONTAIN) {\r\n const imageWidth = imageElement.width * scale\r\n const imageHeight = imageElement.height * scale\r\n if (\r\n !background.repeat ||\r\n background.repeat === BackgroundRepeat.NO_REPEAT\r\n ) {\r\n ctx.drawImage(imageElement, 0, 0, imageWidth, imageHeight)\r\n } else {\r\n let startX = 0\r\n let startY = 0\r\n const repeatXCount =\r\n background.repeat === BackgroundRepeat.REPEAT ||\r\n background.repeat === BackgroundRepeat.REPEAT_X\r\n ? Math.ceil((width * scale) / imageWidth)\r\n : 1\r\n const repeatYCount =\r\n background.repeat === BackgroundRepeat.REPEAT ||\r\n background.repeat === BackgroundRepeat.REPEAT_Y\r\n ? Math.ceil((height * scale) / imageHeight)\r\n : 1\r\n for (let x = 0; x < repeatXCount; x++) {\r\n for (let y = 0; y < repeatYCount; y++) {\r\n ctx.drawImage(imageElement, startX, startY, imageWidth, imageHeight)\r\n startY += imageHeight\r\n }\r\n startY = 0\r\n startX += imageWidth\r\n }\r\n }\r\n } else {\r\n // cover\r\n ctx.drawImage(imageElement, 0, 0, width * scale, height * scale)\r\n }\r\n }\r\n\r\n private _renderBackgroundImage(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number\r\n ) {\r\n const { background } = this.options\r\n const imageElementCache = this.imageCache.get(background.image)\r\n if (imageElementCache) {\r\n this._drawImage(ctx, imageElementCache, width, height)\r\n } else {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = background.image\r\n img.onload = () => {\r\n this.imageCache.set(background.image, img)\r\n this._drawImage(ctx, img, width, height)\r\n // 避免层级上浮,触发编辑器二次渲染\r\n this.draw.render({\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n }\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n background: { image, color, applyPageNumbers }\r\n } = this.options\r\n if (\r\n image &&\r\n (!applyPageNumbers?.length || applyPageNumbers.includes(pageNo))\r\n ) {\r\n const { width, height } = this.options\r\n this._renderBackgroundImage(ctx, width, height)\r\n } else {\r\n const width = this.draw.getCanvasWidth(pageNo)\r\n const height = this.draw.getCanvasHeight(pageNo)\r\n this._renderBackgroundColor(ctx, color, width, height)\r\n }\r\n }\r\n}\r\n","import { IElement, IRowElement, SeparatorType } from '@vervedoc/docx-editor-schema'\r\n\r\ntype SeparatorLikeElement = Pick<IElement, 'dashArray' | 'separatorType' | 'separatorLineWidth'> | Pick<IRowElement, 'dashArray' | 'separatorType' | 'separatorLineWidth'>\r\n\r\nconst DEFAULT_SEPARATOR_TYPE: SeparatorType = 'solid'\r\nconst DEFAULT_DASH_ARRAY: number[] = [0, 0]\r\n\r\nexport function getSeparatorType(element: SeparatorLikeElement): SeparatorType {\r\n return element.separatorType || DEFAULT_SEPARATOR_TYPE\r\n}\r\n\r\nexport function getSeparatorLineWidth(element: SeparatorLikeElement, defaultLineWidth: number): number {\r\n const lineWidth = Number(element.separatorLineWidth)\r\n if (Number.isFinite(lineWidth) && lineWidth > 0) {\r\n return lineWidth\r\n }\r\n return defaultLineWidth\r\n}\r\n\r\nexport function getSeparatorDashArray(element: SeparatorLikeElement, type = getSeparatorType(element)): number[] {\r\n if (Array.isArray(element.dashArray) && element.dashArray.length) {\r\n return element.dashArray\r\n }\r\n if (type === 'dotted') return [1, 1]\r\n if (type === 'dashed') return [6, 3]\r\n return DEFAULT_DASH_ARRAY\r\n}\r\n\r\nexport function getSeparatorRenderHeight(element: SeparatorLikeElement, defaultLineWidth: number): number {\r\n const lineWidth = getSeparatorLineWidth(element, defaultLineWidth)\r\n const type = getSeparatorType(element)\r\n switch (type) {\r\n case 'double':\r\n return lineWidth * 3 + 2\r\n case 'triple':\r\n return lineWidth * 5 + 4\r\n case 'wavy':\r\n return Math.max(lineWidth * 4, 8)\r\n case 'shadow':\r\n return lineWidth + 3\r\n case 'emboss':\r\n return lineWidth * 2 + 3\r\n default:\r\n return Math.max(lineWidth, 1)\r\n }\r\n}\r\n","import { TextDecorationStyle } from '@vervedoc/docx-editor-schema'\r\nimport { IElementFillRect } from '@vervedoc/docx-editor-schema'\r\n\r\nexport abstract class AbstractRichText {\r\n protected fillRect: IElementFillRect\r\n protected fillColor?: string\r\n protected fillDecorationStyle?: TextDecorationStyle\r\n\r\n constructor() {\r\n this.fillRect = this.clearFillInfo()\r\n }\r\n\r\n public clearFillInfo() {\r\n this.fillColor = undefined\r\n this.fillDecorationStyle = undefined\r\n this.fillRect = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n return this.fillRect\r\n }\r\n\r\n public recordFillInfo(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height?: number,\r\n color?: string,\r\n decorationStyle?: TextDecorationStyle\r\n ) {\r\n const isFirstRecord = !this.fillRect.width\r\n // 颜色不同时立即绘制\r\n if (\r\n !isFirstRecord &&\r\n (this.fillColor !== color || this.fillDecorationStyle !== decorationStyle)\r\n ) {\r\n this.render(ctx)\r\n this.clearFillInfo()\r\n // 重新记录\r\n this.recordFillInfo(ctx, x, y, width, height, color, decorationStyle)\r\n return\r\n }\r\n if (isFirstRecord) {\r\n this.fillRect.x = x\r\n this.fillRect.y = y\r\n }\r\n if (height && this.fillRect.height < height) {\r\n this.fillRect.height = height\r\n }\r\n this.fillRect.width += width\r\n this.fillColor = color\r\n this.fillDecorationStyle = decorationStyle\r\n }\r\n\r\n public abstract render(ctx: CanvasRenderingContext2D): void\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Highlight extends AbstractRichText {\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n super()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { highlightAlpha } = this.options\r\n const { x, y, width, height } = this.fillRect\r\n ctx.save()\r\n ctx.globalAlpha = highlightAlpha\r\n ctx.fillStyle = this.fillColor!\r\n ctx.fillRect(x, y, width, height)\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\n\r\nexport class ParagraphColor extends AbstractRichText {\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { x, y, width, height } = this.fillRect\r\n ctx.save()\r\n ctx.fillStyle = this.fillColor!\r\n ctx.fillRect(x, y, width, height)\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { PageMode } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Margin {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n if (this.options.marginIndicatorDisabled) return\r\n const { marginIndicatorColor, pageMode } = this.options\r\n const width = this.draw.getWidth()\r\n const height =\r\n pageMode === PageMode.CONTINUITY\r\n ? this.draw.getCanvasHeight(pageNo) / this.draw.getPagePixelRatio()\r\n : this.draw.getHeight()\r\n const margins = this.draw.getMargins()\r\n const marginIndicatorSize = this.draw.getMarginIndicatorSize()\r\n ctx.save()\r\n ctx.translate(0.5, 0.5)\r\n ctx.strokeStyle = marginIndicatorColor\r\n ctx.beginPath()\r\n const leftTopPoint: [number, number] = [margins[3], margins[0]]\r\n const rightTopPoint: [number, number] = [width - margins[1], margins[0]]\r\n const leftBottomPoint: [number, number] = [margins[3], height - margins[2]]\r\n const rightBottomPoint: [number, number] = [\r\n width - margins[1],\r\n height - margins[2]\r\n ]\r\n // 上左\r\n ctx.moveTo(leftTopPoint[0] - marginIndicatorSize, leftTopPoint[1])\r\n ctx.lineTo(...leftTopPoint)\r\n ctx.lineTo(leftTopPoint[0], leftTopPoint[1] - marginIndicatorSize)\r\n // 上右\r\n ctx.moveTo(rightTopPoint[0] + marginIndicatorSize, rightTopPoint[1])\r\n ctx.lineTo(...rightTopPoint)\r\n ctx.lineTo(rightTopPoint[0], rightTopPoint[1] - marginIndicatorSize)\r\n // 下左\r\n ctx.moveTo(leftBottomPoint[0] - marginIndicatorSize, leftBottomPoint[1])\r\n ctx.lineTo(...leftBottomPoint)\r\n ctx.lineTo(leftBottomPoint[0], leftBottomPoint[1] + marginIndicatorSize)\r\n // 下右\r\n ctx.moveTo(rightBottomPoint[0] + marginIndicatorSize, rightBottomPoint[1])\r\n ctx.lineTo(...rightBottomPoint)\r\n ctx.lineTo(rightBottomPoint[0], rightBottomPoint[1] + marginIndicatorSize)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { TEXTLIKE_ELEMENT_TYPE } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { EditorContext } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IReplaceOption,\r\n ISearchResult,\r\n ISearchResultRestArgs\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { getUUID, isNumber } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport interface INavigateInfo {\r\n index: number\r\n count: number\r\n}\r\n\r\nexport class Search {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private position: Position\r\n private searchKeyword: string | null\r\n private searchNavigateIndex: number | null\r\n private searchMatchList: ISearchResult[]\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.position = draw.getPosition()\r\n this.searchNavigateIndex = null\r\n this.searchKeyword = null\r\n this.searchMatchList = []\r\n }\r\n\r\n public getSearchKeyword(): string | null {\r\n return this.searchKeyword\r\n }\r\n\r\n public setSearchKeyword(payload: string | null) {\r\n this.searchKeyword = payload\r\n this.searchNavigateIndex = null\r\n }\r\n\r\n public searchNavigatePre(): number | null {\r\n if (!this.searchMatchList.length || !this.searchKeyword) return null\r\n if (this.searchNavigateIndex === null) {\r\n this.searchNavigateIndex = 0\r\n } else {\r\n let index = this.searchNavigateIndex - 1\r\n let isExistPre = false\r\n const searchNavigateId =\r\n this.searchMatchList[this.searchNavigateIndex].groupId\r\n while (index >= 0) {\r\n const match = this.searchMatchList[index]\r\n if (searchNavigateId !== match.groupId) {\r\n isExistPre = true\r\n this.searchNavigateIndex = index - (this.searchKeyword.length - 1)\r\n break\r\n }\r\n index--\r\n }\r\n if (!isExistPre) {\r\n const lastSearchMatch =\r\n this.searchMatchList[this.searchMatchList.length - 1]\r\n if (lastSearchMatch.groupId === searchNavigateId) return null\r\n this.searchNavigateIndex =\r\n this.searchMatchList.length - 1 - (this.searchKeyword.length - 1)\r\n }\r\n }\r\n return this.searchNavigateIndex\r\n }\r\n\r\n public searchNavigateNext(): number | null {\r\n if (!this.searchMatchList.length || !this.searchKeyword) return null\r\n if (this.searchNavigateIndex === null) {\r\n this.searchNavigateIndex = 0\r\n } else {\r\n let index = this.searchNavigateIndex + 1\r\n let isExistNext = false\r\n const searchNavigateId =\r\n this.searchMatchList[this.searchNavigateIndex].groupId\r\n while (index < this.searchMatchList.length) {\r\n const match = this.searchMatchList[index]\r\n if (searchNavigateId !== match.groupId) {\r\n isExistNext = true\r\n this.searchNavigateIndex = index\r\n break\r\n }\r\n index++\r\n }\r\n if (!isExistNext) {\r\n const firstSearchMatch = this.searchMatchList[0]\r\n if (firstSearchMatch.groupId === searchNavigateId) return null\r\n this.searchNavigateIndex = 0\r\n }\r\n }\r\n return this.searchNavigateIndex\r\n }\r\n\r\n public searchNavigateScrollIntoView(position: IElementPosition) {\r\n const {\r\n coordinate: { leftTop, leftBottom, rightTop },\r\n pageNo\r\n } = position\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = pageNo * (height + pageGap)\r\n // 创建定位锚点\r\n const anchor = document.createElement('div')\r\n anchor.style.position = 'absolute'\r\n // 扩大搜索词尺寸,使可视范围更广\r\n const ANCHOR_OVERFLOW_SIZE = 50\r\n anchor.style.width = `${rightTop[0] - leftTop[0] + ANCHOR_OVERFLOW_SIZE}px`\r\n anchor.style.height = `${\r\n leftBottom[1] - leftTop[1] + ANCHOR_OVERFLOW_SIZE\r\n }px`\r\n anchor.style.left = `${leftTop[0]}px`\r\n anchor.style.top = `${leftTop[1] + preY}px`\r\n this.draw.getContainer().append(anchor)\r\n // 移动到可视范围\r\n anchor.scrollIntoView(false)\r\n anchor.remove()\r\n }\r\n\r\n public getSearchNavigateIndexList() {\r\n if (this.searchNavigateIndex === null || !this.searchKeyword) return []\r\n return new Array(this.searchKeyword.length)\r\n .fill(this.searchNavigateIndex)\r\n .map((navigate, index) => navigate + index)\r\n }\r\n\r\n public getSearchMatchList(): ISearchResult[] {\r\n return this.searchMatchList\r\n }\r\n\r\n public getSearchNavigateInfo(): null | INavigateInfo {\r\n if (!this.searchKeyword || !this.searchMatchList.length) return null\r\n const index =\r\n this.searchNavigateIndex !== null\r\n ? this.searchNavigateIndex / this.searchKeyword.length + 1\r\n : 0\r\n let count = 0\r\n let groupId = null\r\n for (let s = 0; s < this.searchMatchList.length; s++) {\r\n const match = this.searchMatchList[s]\r\n if (groupId === match.groupId) continue\r\n groupId = match.groupId\r\n count += 1\r\n }\r\n return {\r\n index,\r\n count\r\n }\r\n }\r\n\r\n public getMatchList(\r\n payload: string,\r\n originalElementList: IElement[]\r\n ): ISearchResult[] {\r\n const keyword = payload.toLocaleLowerCase()\r\n const searchMatchList: ISearchResult[] = []\r\n // 分组\r\n const elementListGroup: {\r\n type: EditorContext\r\n elementList: IElement[]\r\n index: number\r\n }[] = []\r\n const originalElementListLength = originalElementList.length\r\n // 查找表格所在位置\r\n const tableIndexList = []\r\n for (let e = 0; e < originalElementListLength; e++) {\r\n const element = originalElementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n tableIndexList.push(e)\r\n }\r\n }\r\n let i = 0\r\n let elementIndex = 0\r\n while (elementIndex < originalElementListLength - 1) {\r\n const endIndex = tableIndexList.length\r\n ? tableIndexList[i]\r\n : originalElementListLength\r\n const pageElement = originalElementList.slice(elementIndex, endIndex)\r\n if (pageElement.length) {\r\n elementListGroup.push({\r\n index: elementIndex,\r\n type: EditorContext.PAGE,\r\n elementList: pageElement\r\n })\r\n }\r\n const tableElement = originalElementList[endIndex]\r\n if (tableElement) {\r\n elementListGroup.push({\r\n index: endIndex,\r\n type: EditorContext.TABLE,\r\n elementList: [tableElement]\r\n })\r\n }\r\n elementIndex = endIndex + 1\r\n i++\r\n }\r\n // 搜索文本\r\n function searchClosure(\r\n payload: string | null,\r\n type: EditorContext,\r\n elementList: IElement[],\r\n restArgs?: ISearchResultRestArgs\r\n ) {\r\n if (!payload) return\r\n const text = elementList\r\n .map(e =>\r\n !e.type ||\r\n (TEXTLIKE_ELEMENT_TYPE.includes(e.type) &&\r\n e.controlComponent !== ControlComponent.CHECKBOX &&\r\n !e.control?.hide &&\r\n !e.area?.hide)\r\n ? e.value\r\n : ZERO\r\n )\r\n .filter(Boolean)\r\n .join('')\r\n .toLocaleLowerCase()\r\n const matchStartIndexList = []\r\n let index = text.indexOf(payload)\r\n while (index !== -1) {\r\n matchStartIndexList.push(index)\r\n index = text.indexOf(payload, index + payload.length)\r\n }\r\n for (let m = 0; m < matchStartIndexList.length; m++) {\r\n const startIndex = matchStartIndexList[m]\r\n const groupId = getUUID()\r\n for (let i = 0; i < payload.length; i++) {\r\n const index = startIndex + i + (restArgs?.startIndex || 0)\r\n searchMatchList.push({\r\n type,\r\n index,\r\n groupId,\r\n ...restArgs\r\n })\r\n }\r\n }\r\n }\r\n for (let e = 0; e < elementListGroup.length; e++) {\r\n const group = elementListGroup[e]\r\n if (group.type === EditorContext.TABLE) {\r\n const tableElement = group.elementList[0]\r\n for (let t = 0; t < tableElement.trList!.length; t++) {\r\n const tr = tableElement.trList![t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const restArgs: ISearchResultRestArgs = {\r\n tableId: tableElement.id,\r\n tableIndex: group.index,\r\n trIndex: t,\r\n tdIndex: d,\r\n tdId: td.id\r\n }\r\n searchClosure(keyword, group.type, td.value, restArgs)\r\n }\r\n }\r\n } else {\r\n searchClosure(keyword, group.type, group.elementList, {\r\n startIndex: group.index\r\n })\r\n }\r\n }\r\n return searchMatchList\r\n }\r\n\r\n public compute(payload: string) {\r\n this.searchMatchList = this.getMatchList(\r\n payload,\r\n this.draw.getOriginalElementList()\r\n )\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageIndex: number) {\r\n if (\r\n !this.searchMatchList ||\r\n !this.searchMatchList.length ||\r\n !this.searchKeyword\r\n ) {\r\n return\r\n }\r\n const { searchMatchAlpha, searchMatchColor, searchNavigateMatchColor } =\r\n this.options\r\n const positionList = this.position.getOriginalPositionList()\r\n const elementList = this.draw.getOriginalElementList()\r\n ctx.save()\r\n ctx.globalAlpha = searchMatchAlpha\r\n for (let s = 0; s < this.searchMatchList.length; s++) {\r\n const searchMatch = this.searchMatchList[s]\r\n let position: IElementPosition | null = null\r\n if (searchMatch.type === EditorContext.TABLE) {\r\n const { tableIndex, trIndex, tdIndex, index } = searchMatch\r\n position =\r\n elementList[tableIndex!]?.trList![trIndex!].tdList[tdIndex!]\r\n ?.positionList![index]\r\n } else {\r\n position = positionList[searchMatch.index]\r\n }\r\n if (!position) continue\r\n const {\r\n coordinate: { leftTop, leftBottom, rightTop },\r\n pageNo\r\n } = position\r\n if (pageNo !== pageIndex) continue\r\n // 高亮并定位当前搜索词\r\n const searchMatchIndexList = this.getSearchNavigateIndexList()\r\n if (searchMatchIndexList.includes(s)) {\r\n ctx.fillStyle = searchNavigateMatchColor\r\n // 是否是第一个字符,则移动到可视范围\r\n const preSearchMatch = this.searchMatchList[s - 1]\r\n if (!preSearchMatch || preSearchMatch.groupId !== searchMatch.groupId) {\r\n this.searchNavigateScrollIntoView(position)\r\n }\r\n } else {\r\n ctx.fillStyle = searchMatchColor\r\n }\r\n const x = leftTop[0]\r\n const y = leftTop[1]\r\n const width = rightTop[0] - leftTop[0]\r\n const height = leftBottom[1] - leftTop[1]\r\n ctx.fillRect(x, y, width, height)\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public replace(payload: string, option?: IReplaceOption) {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n if (!payload || new RegExp(`${ZERO}`, 'g').test(payload)) return\r\n let matchList = this.getSearchMatchList()\r\n // 替换搜索项\r\n const replaceIndex = option?.index\r\n if (isNumber(replaceIndex)) {\r\n const matchGroup: ISearchResult[][] = []\r\n matchList.forEach(match => {\r\n const last = matchGroup[matchGroup.length - 1]\r\n if (!last || last[0].groupId !== match.groupId) {\r\n matchGroup.push([match])\r\n } else {\r\n last.push(match)\r\n }\r\n })\r\n matchList = matchGroup[replaceIndex]\r\n }\r\n if (!matchList?.length) return\r\n const isDesignMode = this.draw.isDesignMode()\r\n // 匹配index变化的差值\r\n let pageDiffCount = 0\r\n let tableDiffCount = 0\r\n // 匹配搜索词的组标识\r\n let curGroupId = ''\r\n // 表格上下文\r\n let curTdId = ''\r\n // 搜索值 > 替换值:增加元素;搜索值 < 替换值:减少元素\r\n let firstMatchIndex = -1\r\n const elementList = this.draw.getOriginalElementList()\r\n for (let m = 0; m < matchList.length; m++) {\r\n const match = matchList[m]\r\n if (match.type === EditorContext.TABLE) {\r\n const { tableIndex, trIndex, tdIndex, index, tdId } = match\r\n if (curTdId && tdId !== curTdId) {\r\n tableDiffCount = 0\r\n }\r\n curTdId = tdId!\r\n const curTableIndex = tableIndex! + pageDiffCount\r\n const tableElementList =\r\n elementList[curTableIndex].trList![trIndex!].tdList[tdIndex!].value\r\n // 表格内元素\r\n const curIndex = index + tableDiffCount\r\n const tableElement = tableElementList[curIndex]\r\n // 非设计模式下设置元素不可删除 || 控件结构元素 => 禁止替换\r\n if (\r\n !isDesignMode &&\r\n (tableElement?.control?.deletable === false ||\r\n tableElement?.title?.deletable === false)\r\n ) {\r\n continue\r\n }\r\n if (curGroupId === match.groupId) {\r\n this.draw.spliceElementList(tableElementList, curIndex, 1)\r\n tableDiffCount--\r\n continue\r\n }\r\n if (!~firstMatchIndex) {\r\n firstMatchIndex = m\r\n }\r\n for (let p = 0; p < payload.length; p++) {\r\n const value = payload[p]\r\n if (p === 0) {\r\n tableElement.value = value\r\n } else {\r\n this.draw.spliceElementList(tableElementList, curIndex + p, 0, [\r\n {\r\n ...tableElement,\r\n value\r\n }\r\n ])\r\n tableDiffCount++\r\n }\r\n }\r\n } else {\r\n const curIndex = match.index + pageDiffCount\r\n const element = elementList[curIndex]\r\n // 非设计模式下设置元素不可删除 || 控件结构元素 => 禁止替换\r\n if (\r\n (!isDesignMode &&\r\n (element?.control?.deletable === false ||\r\n element?.title?.deletable === false)) ||\r\n (element.type === ElementType.CONTROL &&\r\n element.controlComponent !== ControlComponent.VALUE)\r\n ) {\r\n continue\r\n }\r\n if (!~firstMatchIndex) {\r\n firstMatchIndex = m\r\n }\r\n if (curGroupId === match.groupId) {\r\n this.draw.spliceElementList(elementList, curIndex, 1)\r\n pageDiffCount--\r\n continue\r\n }\r\n for (let p = 0; p < payload.length; p++) {\r\n const value = payload[p]\r\n if (p === 0) {\r\n element.value = value\r\n } else {\r\n this.draw.spliceElementList(elementList, curIndex + p, 0, [\r\n {\r\n ...element,\r\n value\r\n }\r\n ])\r\n pageDiffCount++\r\n }\r\n }\r\n }\r\n curGroupId = match.groupId\r\n }\r\n if (!~firstMatchIndex) return\r\n // 定位-首个被匹配关键词后\r\n const firstMatch = matchList[firstMatchIndex]\r\n const firstIndex = firstMatch.index + (payload.length - 1)\r\n if (firstMatch.type === EditorContext.TABLE) {\r\n const { tableIndex, trIndex, tdIndex, index } = firstMatch\r\n const element =\r\n elementList[tableIndex!].trList![trIndex!].tdList[tdIndex!].value[index]\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index: tableIndex,\r\n trIndex,\r\n tdIndex,\r\n tdId: element.tdId,\r\n trId: element.trId,\r\n tableId: element.tableId\r\n })\r\n } else {\r\n this.position.setPositionContext({\r\n isTable: false\r\n })\r\n }\r\n this.draw.getRange().setRange(firstIndex, firstIndex)\r\n // 重新渲染\r\n this.draw.render({\r\n curIndex: firstIndex\r\n })\r\n }\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Strikeout extends AbstractRichText {\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n super()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { scale, strikeoutColor } = this.options\r\n const { x, y, width } = this.fillRect\r\n ctx.save()\r\n ctx.lineWidth = scale\r\n ctx.strokeStyle = this.fillColor || strikeoutColor\r\n const adjustY = y + 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x, adjustY)\r\n ctx.lineTo(x + width, adjustY)\r\n ctx.stroke()\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { DashType, TextDecorationStyle } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Underline extends AbstractRichText {\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n super()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n // 下划线\r\n private _drawLine(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n startY: number,\r\n width: number,\r\n dashType?: DashType\r\n ) {\r\n const endX = startX + width\r\n ctx.beginPath()\r\n switch (dashType) {\r\n case DashType.DASHED:\r\n // 长虚线- - - - - -\r\n ctx.setLineDash([3, 1])\r\n break\r\n case DashType.DOTTED:\r\n // 点虚线 . . . . . .\r\n ctx.setLineDash([1, 1])\r\n break\r\n }\r\n ctx.moveTo(startX, startY)\r\n ctx.lineTo(endX, startY)\r\n ctx.stroke()\r\n }\r\n\r\n // 双实线\r\n private _drawDouble(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n startY: number,\r\n width: number\r\n ) {\r\n const SPACING = 3 // 双实线间距\r\n const endX = startX + width\r\n const endY = startY + SPACING * this.options.scale\r\n ctx.beginPath()\r\n ctx.moveTo(startX, startY)\r\n ctx.lineTo(endX, startY)\r\n ctx.stroke()\r\n ctx.beginPath()\r\n ctx.moveTo(startX, endY)\r\n ctx.lineTo(endX, endY)\r\n ctx.stroke()\r\n }\r\n\r\n // 波浪线\r\n private _drawWave(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n startY: number,\r\n width: number\r\n ) {\r\n const { scale } = this.options\r\n const AMPLITUDE = 1.2 * scale // 振幅\r\n const FREQUENCY = 1 / scale // 频率\r\n const adjustY = startY + 2 * AMPLITUDE // 增加2倍振幅\r\n ctx.beginPath()\r\n for (let x = 0; x < width; x++) {\r\n const y = AMPLITUDE * Math.sin(FREQUENCY * x)\r\n ctx.lineTo(startX + x, adjustY + y)\r\n }\r\n ctx.stroke()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { underlineColor, scale } = this.options\r\n const { x, y, width } = this.fillRect\r\n ctx.save()\r\n ctx.strokeStyle = this.fillColor || underlineColor\r\n ctx.lineWidth = scale\r\n const adjustY = Math.floor(y + 2 * ctx.lineWidth) + 0.5 // +0.5从1处渲染,避免线宽度等于3\r\n switch (this.fillDecorationStyle) {\r\n case TextDecorationStyle.WAVY:\r\n this._drawWave(ctx, x, adjustY, width)\r\n break\r\n case TextDecorationStyle.DOUBLE:\r\n this._drawDouble(ctx, x, adjustY, width)\r\n break\r\n case TextDecorationStyle.DASHED:\r\n this._drawLine(ctx, x, adjustY, width, DashType.DASHED)\r\n break\r\n case TextDecorationStyle.DOTTED:\r\n this._drawLine(ctx, x, adjustY, width, DashType.DOTTED)\r\n break\r\n default:\r\n this._drawLine(ctx, x, adjustY, width)\r\n break\r\n }\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { convertStringToBase64 } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class ImageParticle {\r\n private draw: Draw\r\n protected options: Required<IEditorOption>\r\n protected imageCache: Map<string, HTMLImageElement>\r\n private container: HTMLDivElement\r\n private floatImageContainer: HTMLDivElement | null\r\n private floatImage: HTMLImageElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n this.imageCache = new Map()\r\n this.floatImageContainer = null\r\n this.floatImage = null\r\n }\r\n\r\n public getOriginalMainImageList(): IElement[] {\r\n const imageList: IElement[] = []\r\n const getImageList = (elementList: IElement[]) => {\r\n for (const element of elementList) {\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n getImageList(td.value)\r\n }\r\n }\r\n } else if (element.type === ElementType.IMAGE) {\r\n imageList.push(element)\r\n }\r\n }\r\n }\r\n // 获取正文图片列表\r\n getImageList(this.draw.getOriginalMainElementList())\r\n return imageList\r\n }\r\n\r\n public createFloatImage(element: IElement) {\r\n const { scale } = this.options\r\n // 复用浮动元素\r\n let floatImageContainer = this.floatImageContainer\r\n let floatImage = this.floatImage\r\n if (!floatImageContainer) {\r\n floatImageContainer = document.createElement('div')\r\n floatImageContainer.classList.add(`${EDITOR_PREFIX}-float-image`)\r\n this.container.append(floatImageContainer)\r\n this.floatImageContainer = floatImageContainer\r\n }\r\n if (!floatImage) {\r\n floatImage = document.createElement('img')\r\n floatImageContainer.append(floatImage)\r\n this.floatImage = floatImage\r\n }\r\n floatImageContainer.style.display = 'none'\r\n floatImage.style.width = `${element.width! * scale}px`\r\n floatImage.style.height = `${element.height! * scale}px`\r\n // 浮动图片初始信息\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = this.draw.getPageNo() * (height + pageGap)\r\n const imgFloatPosition = element.imgFloatPosition!\r\n floatImageContainer.style.left = `${imgFloatPosition.x * scale}px`\r\n floatImageContainer.style.top = `${preY + imgFloatPosition.y * scale}px`\r\n floatImage.setAttribute('crossOrigin', 'Anonymous')\r\n floatImage.src = element.value\r\n }\r\n\r\n public dragFloatImage(movementX: number, movementY: number) {\r\n if (!this.floatImageContainer) return\r\n this.floatImageContainer.style.display = 'block'\r\n // 之前的坐标加移动长度\r\n const x = parseFloat(this.floatImageContainer.style.left) + movementX\r\n const y = parseFloat(this.floatImageContainer.style.top) + movementY\r\n this.floatImageContainer.style.left = `${x}px`\r\n this.floatImageContainer.style.top = `${y}px`\r\n }\r\n\r\n public destroyFloatImage() {\r\n if (this.floatImageContainer) {\r\n this.floatImageContainer.style.display = 'none'\r\n }\r\n }\r\n\r\n protected addImageObserver(promise: Promise<unknown>) {\r\n this.draw.getImageObserver().add(promise)\r\n }\r\n\r\n protected getFallbackImage(width: number, height: number): HTMLImageElement {\r\n const tileSize = 8\r\n const x = (width - Math.ceil(width / tileSize) * tileSize) / 2\r\n const y = (height - Math.ceil(height / tileSize) * tileSize) / 2\r\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\r\n <rect width=\"${width}\" height=\"${height}\" fill=\"url(#mosaic)\" />\r\n <defs>\r\n <pattern id=\"mosaic\" x=\"${x}\" y=\"${y}\" width=\"${\r\n tileSize * 2\r\n }\" height=\"${tileSize * 2}\" patternUnits=\"userSpaceOnUse\">\r\n <rect width=\"${tileSize}\" height=\"${tileSize}\" fill=\"#cccccc\" />\r\n <rect width=\"${tileSize}\" height=\"${tileSize}\" fill=\"#cccccc\" transform=\"translate(${tileSize}, ${tileSize})\" />\r\n </pattern>\r\n </defs>\r\n </svg>`\r\n const fallbackImage = new Image()\r\n fallbackImage.src = `data:image/svg+xml;base64,${convertStringToBase64(\r\n svg\r\n )}`\r\n return fallbackImage\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n x: number,\r\n y: number\r\n ) {\r\n const { scale } = this.options\r\n const width = element.width! * scale\r\n const height = element.height! * scale\r\n if (this.imageCache.has(element.value)) {\r\n const img = this.imageCache.get(element.value)!\r\n ctx.drawImage(img, x, y, width, height)\r\n } else {\r\n const cacheRenderCount = this.draw.getRenderCount()\r\n const imageLoadPromise = new Promise((resolve) => {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = element.value\r\n img.onload = () => {\r\n this.imageCache.set(element.value, img)\r\n resolve(element)\r\n // 因图片加载异步,图片加载后可能属于上一次渲染方法\r\n if (cacheRenderCount !== this.draw.getRenderCount()) return\r\n // 衬于文字下方图片需要重新首先绘制\r\n if (element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\r\n this.draw.render({\r\n isCompute: false,\r\n isSetCursor: false,\r\n isSubmitHistory: false\r\n })\r\n } else {\r\n ctx.drawImage(img, x, y, width, height)\r\n }\r\n }\r\n img.onerror = () => {\r\n const fallbackImage = this.getFallbackImage(width, height)\r\n fallbackImage.onload = () => {\r\n ctx.drawImage(fallbackImage, x, y, width, height)\r\n this.imageCache.set(element.value, fallbackImage)\r\n resolve(element)\r\n }\r\n fallbackImage.onerror = () => {\r\n resolve(element)\r\n }\r\n }\r\n })\r\n this.addImageObserver(imageLoadPromise)\r\n }\r\n }\r\n}\r\n","import { IEditorOption, IElement, ElementType, RenderMode } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n PUNCTUATION_LIST,\r\n METRICS_BASIS_TEXT\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { ITextMetrics } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport interface IMeasureWordResult {\r\n width: number\r\n endElement: IElement\r\n}\r\n\r\nexport class TextParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private ctx: CanvasRenderingContext2D\r\n private curX: number\r\n private curY: number\r\n private text: string\r\n private curStyle: string\r\n private curColor?: string\r\n private curCharacterScale: number\r\n public cacheMeasureText: Map<string, TextMetrics>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.ctx = draw.getCtx()\r\n this.curX = -1\r\n this.curY = -1\r\n this.text = ''\r\n this.curStyle = ''\r\n this.curCharacterScale = 100\r\n this.cacheMeasureText = new Map()\r\n }\r\n\r\n public static getCharacterScaleRatio(characterScale?: number): number {\r\n const nextCharacterScale = Math.round(characterScale ?? 100)\r\n return nextCharacterScale > 0 ? nextCharacterScale / 100 : 1\r\n }\r\n\r\n public static fillScaledText(\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n x: number,\r\n y: number,\r\n characterScale?: number\r\n ) {\r\n const ratio = TextParticle.getCharacterScaleRatio(characterScale)\r\n if (ratio === 1) {\r\n ctx.fillText(text, x, y)\r\n return\r\n }\r\n ctx.save()\r\n ctx.translate(x, y)\r\n ctx.scale(ratio, 1)\r\n ctx.fillText(text, 0, 0)\r\n ctx.restore()\r\n }\r\n\r\n public measureBasisWord(\r\n ctx: CanvasRenderingContext2D,\r\n font: string\r\n ): ITextMetrics {\r\n ctx.save()\r\n ctx.font = font\r\n const textMetrics = this.measureText(ctx, {\r\n value: METRICS_BASIS_TEXT\r\n })\r\n ctx.restore()\r\n return textMetrics\r\n }\r\n\r\n public measureWord(\r\n ctx: CanvasRenderingContext2D,\r\n elementList: IElement[],\r\n curIndex: number\r\n ): IMeasureWordResult {\r\n const LETTER_REG = this.draw.getLetterReg()\r\n let width = 0\r\n let endElement: IElement = elementList[curIndex]\r\n let i = curIndex\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n if (\r\n (element.type && element.type !== ElementType.TEXT) ||\r\n !LETTER_REG.test(element.value)\r\n ) {\r\n endElement = element\r\n break\r\n }\r\n width += this.measureText(ctx, element).width\r\n i++\r\n }\r\n return {\r\n width,\r\n endElement\r\n }\r\n }\r\n\r\n public measurePunctuationWidth(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement\r\n ): number {\r\n if (!element || !PUNCTUATION_LIST.includes(element.value)) return 0\r\n return this.measureText(ctx, element).width\r\n }\r\n\r\n public measureText(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement\r\n ): ITextMetrics {\r\n // 优先使用自定义字宽设置\r\n if (element.width) {\r\n const textMetrics = ctx.measureText(element.value)\r\n // TextMetrics是类无法解构\r\n return {\r\n width: element.width,\r\n actualBoundingBoxAscent: textMetrics.actualBoundingBoxAscent,\r\n actualBoundingBoxDescent: textMetrics.actualBoundingBoxDescent,\r\n actualBoundingBoxLeft: textMetrics.actualBoundingBoxLeft,\r\n actualBoundingBoxRight: textMetrics.actualBoundingBoxRight,\r\n fontBoundingBoxAscent: textMetrics.fontBoundingBoxAscent,\r\n fontBoundingBoxDescent: textMetrics.fontBoundingBoxDescent\r\n }\r\n }\r\n const id = `${element.value}${ctx.font}`\r\n const cacheTextMetrics = this.cacheMeasureText.get(id)\r\n if (cacheTextMetrics) {\r\n return cacheTextMetrics\r\n }\r\n const textMetrics = ctx.measureText(element.value)\r\n this.cacheMeasureText.set(id, textMetrics)\r\n return textMetrics\r\n }\r\n\r\n public complete() {\r\n this._render()\r\n this.text = ''\r\n }\r\n\r\n public record(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n this.ctx = ctx\r\n // 兼容模式立即绘制\r\n if (this.options.renderMode === RenderMode.COMPATIBILITY) {\r\n this._setCurXY(x, y)\r\n this.text = element.value\r\n this.curStyle = element.style\r\n this.curColor = element.color\r\n this.complete()\r\n return\r\n }\r\n // 主动完成的重设起始点\r\n if (!this.text) {\r\n this._setCurXY(x, y)\r\n }\r\n // 样式发生改变\r\n if (\r\n (this.curStyle && element.style !== this.curStyle) ||\r\n element.color !== this.curColor ||\r\n (element.characterScale ?? 100) !== this.curCharacterScale\r\n ) {\r\n this.complete()\r\n this._setCurXY(x, y)\r\n }\r\n this.text += element.value\r\n this.curStyle = element.style\r\n this.curColor = element.color\r\n this.curCharacterScale = element.characterScale ?? 100\r\n }\r\n\r\n private _setCurXY(x: number, y: number) {\r\n this.curX = x\r\n this.curY = y\r\n }\r\n\r\n private _render() {\r\n if (!this.text || !~this.curX || !~this.curX) return\r\n this.ctx.save()\r\n this.ctx.font = this.curStyle\r\n this.ctx.fillStyle = this.curColor || this.options.defaultColor\r\n TextParticle.fillScaledText(\r\n this.ctx,\r\n this.text,\r\n this.curX,\r\n this.curY,\r\n this.curCharacterScale\r\n )\r\n this.ctx.restore()\r\n }\r\n}\r\n","import { FORMAT_PLACEHOLDER } from '@vervedoc/docx-editor-schema'\r\nimport { NumberType } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { convertNumberToChinese } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class PageNumber {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n static formatNumberPlaceholder(\r\n text: string,\r\n pageNo: number,\r\n replaceReg: RegExp,\r\n numberType: NumberType\r\n ) {\r\n const pageNoText =\r\n numberType === NumberType.CHINESE\r\n ? convertNumberToChinese(pageNo)\r\n : `${pageNo}`\r\n return text.replace(replaceReg, pageNoText)\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n scale,\r\n pageNumber: {\r\n size,\r\n font,\r\n color,\r\n rowFlex,\r\n numberType,\r\n format,\r\n startPageNo,\r\n fromPageNo\r\n }\r\n } = this.options\r\n if (pageNo < fromPageNo) return\r\n // 处理页码格式\r\n let text = format\r\n const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO)\r\n if (pageNoReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n pageNo + startPageNo - fromPageNo,\r\n pageNoReg,\r\n numberType\r\n )\r\n }\r\n const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT)\r\n if (pageCountReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n this.draw.getPageCount() - fromPageNo,\r\n pageCountReg,\r\n numberType\r\n )\r\n }\r\n const width = this.draw.getWidth()\r\n // 计算y位置\r\n const height = this.draw.getHeight()\r\n const pageNumberBottom = this.draw.getPageNumberBottom()\r\n const y = height - pageNumberBottom\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.font = `${size * scale}px ${font}`\r\n // 计算x位置-居左、居中、居右\r\n let x = 0\r\n const margins = this.draw.getMargins()\r\n const { width: textWidth } = ctx.measureText(text)\r\n if (rowFlex === RowFlex.CENTER) {\r\n x = (width - textWidth) / 2\r\n } else if (rowFlex === RowFlex.RIGHT) {\r\n x = width - textWidth - margins[1]\r\n } else {\r\n x = margins[3]\r\n }\r\n ctx.fillText(text, x, y)\r\n ctx.restore()\r\n }\r\n}\r\n","import { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { debounce } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport interface IElementVisibleInfo {\r\n intersectionHeight: number\r\n}\r\n\r\nexport interface IPageVisibleInfo {\r\n intersectionPageNo: number\r\n visiblePageNoList: number[]\r\n}\r\n\r\nexport class ScrollObserver {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private scrollContainer: Element | Document\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.scrollContainer = this.getScrollContainer()\r\n // 监听滚轮\r\n setTimeout(() => {\r\n if (!window.scrollY) {\r\n this._observer()\r\n }\r\n })\r\n this._addEvent()\r\n }\r\n\r\n public getScrollContainer(): Element | Document {\r\n return this.options.scrollContainerSelector\r\n ? document.querySelector(this.options.scrollContainerSelector) || document\r\n : document\r\n }\r\n\r\n private _addEvent() {\r\n this.scrollContainer.addEventListener('scroll', this._observer)\r\n }\r\n\r\n public removeEvent() {\r\n this.scrollContainer.removeEventListener('scroll', this._observer)\r\n }\r\n\r\n public getElementVisibleInfo(element: Element): IElementVisibleInfo {\r\n const rect = element.getBoundingClientRect()\r\n const viewHeight =\r\n this.scrollContainer === document\r\n ? Math.max(document.documentElement.clientHeight, window.innerHeight)\r\n : (<Element>this.scrollContainer).clientHeight\r\n const visibleHeight =\r\n Math.min(rect.bottom, viewHeight) - Math.max(rect.top, 0)\r\n return {\r\n intersectionHeight: visibleHeight > 0 ? visibleHeight : 0\r\n }\r\n }\r\n\r\n public getPageVisibleInfo(): IPageVisibleInfo {\r\n const pageList = this.draw.getPageList()\r\n const visiblePageNoList: number[] = []\r\n let intersectionPageNo = 0\r\n let intersectionMaxHeight = 0\r\n for (let i = 0; i < pageList.length; i++) {\r\n const curPage = pageList[i]\r\n const { intersectionHeight } = this.getElementVisibleInfo(curPage)\r\n // 之前页存在交叉 && 当前页不交叉则后续均不交叉,结束循环\r\n if (intersectionMaxHeight && !intersectionHeight) break\r\n if (intersectionHeight) {\r\n visiblePageNoList.push(i)\r\n }\r\n if (intersectionHeight > intersectionMaxHeight) {\r\n intersectionMaxHeight = intersectionHeight\r\n intersectionPageNo = i\r\n }\r\n }\r\n return {\r\n intersectionPageNo,\r\n visiblePageNoList\r\n }\r\n }\r\n\r\n private _observer = debounce(() => {\r\n const { intersectionPageNo, visiblePageNoList } = this.getPageVisibleInfo()\r\n this.draw.setIntersectionPageNo(intersectionPageNo)\r\n this.draw.setVisiblePageNoList(visiblePageNoList)\r\n }, 150)\r\n}\r\n","import { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\n\r\nexport class SelectionObserver {\r\n // 每次滚动长度\r\n private readonly step: number = 5\r\n // 触发滚动阀值\r\n private readonly thresholdPoints: [\r\n top: number,\r\n down: number,\r\n left: number,\r\n right: number\r\n ] = [70, 40, 10, 20]\r\n\r\n private selectionContainer: Element | Document\r\n private rangeManager: RangeManager\r\n private requestAnimationFrameId: number | null\r\n private isMousedown: boolean\r\n private isMoving: boolean\r\n private clientWidth: number\r\n private clientHeight: number\r\n private containerRect: DOMRect | null\r\n\r\n constructor(draw: Draw) {\r\n this.rangeManager = draw.getRange()\r\n // 优先使用配置的滚动容器dom\r\n const { scrollContainerSelector } = draw.getOptions()\r\n this.selectionContainer = scrollContainerSelector\r\n ? document.querySelector(scrollContainerSelector) || document\r\n : document\r\n this.requestAnimationFrameId = null\r\n this.isMousedown = false\r\n this.isMoving = false\r\n // 缓存尺寸\r\n this.clientWidth = 0\r\n this.clientHeight = 0\r\n this.containerRect = null\r\n // 添加监听\r\n this._addEvent()\r\n }\r\n\r\n private _addEvent() {\r\n const container = <Document>this.selectionContainer\r\n container.addEventListener('mousedown', this._mousedown)\r\n container.addEventListener('mousemove', this._mousemove)\r\n container.addEventListener('mouseup', this._mouseup)\r\n document.addEventListener('mouseleave', this._mouseup)\r\n }\r\n\r\n public removeEvent() {\r\n const container = <Document>this.selectionContainer\r\n container.removeEventListener('mousedown', this._mousedown)\r\n container.removeEventListener('mousemove', this._mousemove)\r\n container.removeEventListener('mouseup', this._mouseup)\r\n document.removeEventListener('mouseleave', this._mouseup)\r\n }\r\n\r\n private _mousedown = () => {\r\n this.isMousedown = true\r\n // 更新容器宽高\r\n this.clientWidth =\r\n this.selectionContainer instanceof Document\r\n ? document.documentElement.clientWidth\r\n : this.selectionContainer.clientWidth\r\n this.clientHeight =\r\n this.selectionContainer instanceof Document\r\n ? document.documentElement.clientHeight\r\n : this.selectionContainer.clientHeight\r\n // 更新容器位置信息\r\n if (!(this.selectionContainer instanceof Document)) {\r\n const rect = this.selectionContainer.getBoundingClientRect()\r\n this.containerRect = rect\r\n }\r\n }\r\n\r\n private _mouseup = () => {\r\n this.isMousedown = false\r\n this._stopMove()\r\n }\r\n\r\n private _mousemove = (evt: MouseEvent) => {\r\n if (!this.isMousedown || this.rangeManager.getIsCollapsed()) return\r\n let { x, y } = evt\r\n if (this.containerRect) {\r\n x = x - this.containerRect.x\r\n y = y - this.containerRect.y\r\n }\r\n if (y < this.thresholdPoints[0]) {\r\n this._startMove(MoveDirection.UP)\r\n } else if (this.clientHeight - y <= this.thresholdPoints[1]) {\r\n this._startMove(MoveDirection.DOWN)\r\n } else if (x < this.thresholdPoints[2]) {\r\n this._startMove(MoveDirection.LEFT)\r\n } else if (this.clientWidth - x < this.thresholdPoints[3]) {\r\n this._startMove(MoveDirection.RIGHT)\r\n } else {\r\n this._stopMove()\r\n }\r\n }\r\n\r\n private _move(direction: MoveDirection) {\r\n // Document使用window\r\n const container =\r\n this.selectionContainer instanceof Document\r\n ? window\r\n : this.selectionContainer\r\n const x =\r\n this.selectionContainer instanceof Document\r\n ? window.scrollX\r\n : (<Element>container).scrollLeft\r\n const y =\r\n this.selectionContainer instanceof Document\r\n ? window.scrollY\r\n : (<Element>container).scrollTop\r\n if (direction === MoveDirection.DOWN) {\r\n container.scrollTo(x, y + this.step)\r\n } else if (direction === MoveDirection.UP) {\r\n container.scrollTo(x, y - this.step)\r\n } else if (direction === MoveDirection.LEFT) {\r\n container.scrollTo(x - this.step, y)\r\n } else {\r\n container.scrollTo(x + this.step, y)\r\n }\r\n this.requestAnimationFrameId = window.requestAnimationFrame(\r\n this._move.bind(this, direction)\r\n )\r\n }\r\n\r\n private _startMove(direction: MoveDirection) {\r\n if (this.isMoving) return\r\n this.isMoving = true\r\n this._move(direction)\r\n }\r\n\r\n private _stopMove() {\r\n if (this.requestAnimationFrameId) {\r\n window.cancelAnimationFrame(this.requestAnimationFrameId)\r\n this.requestAnimationFrameId = null\r\n this.isMoving = false\r\n }\r\n }\r\n}\r\n","import { ElementType, IElement, TableBorder } from '@vervedoc/docx-editor-schema'\r\nimport { TdBorder, TdSlash } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { ITd } from '@vervedoc/docx-editor-schema'\r\nimport { ITr } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\nexport class TableParticle {\r\n private draw: Draw\r\n private range: RangeManager\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public getTrListGroupByCol(payload: ITr[]): ITr[] {\r\n const trList = deepClone(payload)\r\n for (let t = 0; t < payload.length; t++) {\r\n const tr = trList[t]\r\n for (let d = tr.tdList.length - 1; d >= 0; d--) {\r\n const td = tr.tdList[d]\r\n const { rowspan, rowIndex, colIndex } = td\r\n const curRowIndex = rowIndex! + rowspan - 1\r\n if (curRowIndex !== d) {\r\n const changeTd = tr.tdList.splice(d, 1)[0]\r\n trList[curRowIndex]?.tdList.splice(colIndex!, 0, changeTd)\r\n }\r\n }\r\n }\r\n return trList\r\n }\r\n\r\n public getRangeRowCol(): ITd[][] | null {\r\n const { isTable, index, trIndex, tdIndex } = this.draw\r\n .getPosition()\r\n .getPositionContext()\r\n if (!isTable) return null\r\n const {\r\n isCrossRowCol,\r\n startTdIndex,\r\n endTdIndex,\r\n startTrIndex,\r\n endTrIndex\r\n } = this.range.getRange()\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n // 非跨列直接返回光标所在单元格\r\n if (!isCrossRowCol) {\r\n return [[curTrList[trIndex!].tdList[tdIndex!]]]\r\n }\r\n let startTd = curTrList[startTrIndex!].tdList[startTdIndex!]\r\n let endTd = curTrList[endTrIndex!].tdList[endTdIndex!]\r\n // 交换起始位置\r\n if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {\r\n // prettier-ignore\r\n [startTd, endTd] = [endTd, startTd]\r\n }\r\n const startColIndex = startTd.colIndex!\r\n const endColIndex = endTd.colIndex! + (endTd.colspan - 1)\r\n const startRowIndex = startTd.rowIndex!\r\n const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)\r\n // 选区行列\r\n const rowCol: ITd[][] = []\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdList: ITd[] = []\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdColIndex = td.colIndex!\r\n const tdRowIndex = td.rowIndex!\r\n if (\r\n tdColIndex >= startColIndex &&\r\n tdColIndex <= endColIndex &&\r\n tdRowIndex >= startRowIndex &&\r\n tdRowIndex <= endRowIndex\r\n ) {\r\n tdList.push(td)\r\n }\r\n }\r\n if (tdList.length) {\r\n rowCol.push(tdList)\r\n }\r\n }\r\n return rowCol.length ? rowCol : null\r\n }\r\n\r\n private _drawSlash(\r\n ctx: CanvasRenderingContext2D,\r\n td: ITd,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const { scale } = this.options\r\n ctx.save()\r\n const width = td.width! * scale\r\n const height = td.height! * scale\r\n const x = Math.round(td.x! * scale + startX)\r\n const y = Math.round(td.y! * scale + startY)\r\n ctx.beginPath()\r\n // 正斜线 /\r\n if (td.slashTypes?.includes(TdSlash.FORWARD)) {\r\n ctx.moveTo(x + width, y)\r\n ctx.lineTo(x, y + height)\r\n }\r\n // 反斜线 \\\r\n if (td.slashTypes?.includes(TdSlash.BACK)) {\r\n ctx.moveTo(x, y)\r\n ctx.lineTo(x + width, y + height)\r\n }\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n\r\n private _drawBorder(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const {\r\n colgroup,\r\n trList,\r\n borderType,\r\n borderColor,\r\n borderWidth = 0.5,\r\n borderExternalWidth\r\n } = element\r\n if (!colgroup || !trList) return\r\n const {\r\n scale,\r\n table: { defaultBorderColor }\r\n } = this.options\r\n const colCount = colgroup.length\r\n const rowCount = trList.length\r\n const baseColor = borderColor || defaultBorderColor\r\n const baseWidth = borderWidth\r\n const outerWidth = borderExternalWidth || baseWidth\r\n const baseStyle = borderType === TableBorder.DASH ? 'dashed' : 'solid'\r\n const isEmpty = borderType === TableBorder.EMPTY\r\n const isExternal = borderType === TableBorder.EXTERNAL\r\n const isInternal = borderType === TableBorder.INTERNAL\r\n const drawOuter = !isEmpty && !isInternal\r\n const drawInner = !isEmpty && !isExternal\r\n\r\n const styleRank = (s: string) => {\r\n if (s === 'double') return 4\r\n if (s === 'solid') return 3\r\n if (s === 'dashed') return 2\r\n if (s === 'dotted') return 1\r\n return 0\r\n }\r\n\r\n const normalizeLine = (line: any) => {\r\n const w = Number(line?.width)\r\n const width = Number.isFinite(w) ? w : baseWidth\r\n const color = typeof line?.color === 'string' && line.color ? line.color : baseColor\r\n const style =\r\n line?.style === 'dashed' || line?.style === 'dotted' || line?.style === 'double'\r\n ? line.style\r\n : baseStyle\r\n return { width, color, style }\r\n }\r\n\r\n const pickLine = (a: any, b: any) => {\r\n if (!a) return b\r\n if (!b) return a\r\n if (a.width !== b.width) return a.width > b.width ? a : b\r\n if (a.style !== b.style) return styleRank(a.style) >= styleRank(b.style) ? a : b\r\n return a\r\n }\r\n\r\n type Seg = { x1: number; y1: number; x2: number; y2: number; width: number; color: string; style: string }\r\n const segMap = new Map<string, Seg>()\r\n\r\n const addSeg = (key: string, seg: Seg) => {\r\n const exist = segMap.get(key)\r\n if (!exist) {\r\n segMap.set(key, seg)\r\n return\r\n }\r\n const chosen = pickLine(exist, seg)\r\n segMap.set(key, chosen)\r\n }\r\n\r\n const addH = (x1: number, x2: number, y: number, line: any) => {\r\n const sx1 = Math.min(x1, x2)\r\n const sx2 = Math.max(x1, x2)\r\n const key = `H:${y}:${sx1}-${sx2}`\r\n const l = normalizeLine(line)\r\n addSeg(key, { x1: sx1, y1: y, x2: sx2, y2: y, ...l })\r\n }\r\n\r\n const addV = (x: number, y1: number, y2: number, line: any) => {\r\n const sy1 = Math.min(y1, y2)\r\n const sy2 = Math.max(y1, y2)\r\n const key = `V:${x}:${sy1}-${sy2}`\r\n const l = normalizeLine(line)\r\n addSeg(key, { x1: x, y1: sy1, x2: x, y2: sy2, ...l })\r\n }\r\n\r\n const getImplicitLine = (isOuterLine: boolean) => ({\r\n width: isOuterLine ? outerWidth : baseWidth,\r\n color: baseColor,\r\n style: baseStyle\r\n })\r\n\r\n const getTdLine = (td: any, side: TdBorder, implicit: any | null) => {\r\n const styleLine = td.borderStyle?.[side]\r\n if (styleLine) return styleLine\r\n if (td.borderTypes?.includes(side)) {\r\n return {\r\n width: baseWidth,\r\n color: baseColor,\r\n style: baseStyle\r\n }\r\n }\r\n return implicit\r\n }\r\n\r\n ctx.save()\r\n ctx.translate(0.5, 0.5)\r\n\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d] as any\r\n if (td.slashTypes?.length) {\r\n this._drawSlash(ctx, td, startX, startY)\r\n }\r\n\r\n const left = Math.round(td.x! * scale + startX)\r\n const top = Math.round(td.y! * scale + startY)\r\n const right = Math.round((td.x! + td.width!) * scale + startX)\r\n const bottom = Math.round((td.y! + td.height!) * scale + startY)\r\n\r\n const isLeftOuter = td.colIndex === 0\r\n const isRightOuter = td.colIndex! + td.colspan === colCount\r\n const isTopOuter = td.rowIndex === 0\r\n const isBottomOuter = td.rowIndex! + td.rowspan === rowCount\r\n\r\n const implicitTop = drawOuter && isTopOuter ? getImplicitLine(true) : null\r\n const implicitBottom = drawOuter && isBottomOuter ? getImplicitLine(true) : null\r\n const implicitLeft = drawOuter && isLeftOuter ? getImplicitLine(true) : null\r\n const implicitRight = drawOuter && isRightOuter ? getImplicitLine(true) : null\r\n\r\n const implicitInnerRight =\r\n drawInner && td.colIndex! + td.colspan < colCount\r\n ? getImplicitLine(false)\r\n : null\r\n const implicitInnerBottom =\r\n drawInner && td.rowIndex! + td.rowspan < rowCount\r\n ? getImplicitLine(false)\r\n : null\r\n\r\n const topLine = getTdLine(td, TdBorder.TOP, implicitTop)\r\n const bottomLine = getTdLine(td, TdBorder.BOTTOM, implicitBottom || implicitInnerBottom)\r\n const leftLine = getTdLine(td, TdBorder.LEFT, implicitLeft)\r\n const rightLine = getTdLine(td, TdBorder.RIGHT, implicitRight || implicitInnerRight)\r\n\r\n if (topLine && topLine.style !== 'none') addH(left, right, top, topLine)\r\n if (bottomLine && bottomLine.style !== 'none') addH(left, right, bottom, bottomLine)\r\n if (leftLine && leftLine.style !== 'none') addV(left, top, bottom, leftLine)\r\n if (rightLine && rightLine.style !== 'none') addV(right, top, bottom, rightLine)\r\n }\r\n }\r\n\r\n const groupKey = (s: Seg) => `${s.color}|${s.width}|${s.style}`\r\n const groups = new Map<string, Seg[]>()\r\n for (const seg of segMap.values()) {\r\n const k = groupKey(seg)\r\n const arr = groups.get(k)\r\n if (arr) arr.push(seg)\r\n else groups.set(k, [seg])\r\n }\r\n\r\n for (const [k, segs] of groups) {\r\n const [color, widthStr, style] = k.split('|')\r\n const lw = Number(widthStr)\r\n ctx.strokeStyle = color\r\n const scaledWidth = (Number.isFinite(lw) ? lw : baseWidth) * scale\r\n if (style === 'double') {\r\n const singleWidth = Math.max(0.5 * scale, Math.round((scaledWidth / 3) * 10) / 10)\r\n const gap = Math.max(0.5 * scale, Math.round(singleWidth * 1.2 * 10) / 10)\r\n const offset = (singleWidth + gap) / 2\r\n ctx.setLineDash([])\r\n ctx.lineWidth = singleWidth\r\n ctx.beginPath()\r\n for (const s of segs) {\r\n const isH = s.y1 === s.y2\r\n const isV = s.x1 === s.x2\r\n if (isH) {\r\n ctx.moveTo(s.x1, s.y1 - offset)\r\n ctx.lineTo(s.x2, s.y2 - offset)\r\n ctx.moveTo(s.x1, s.y1 + offset)\r\n ctx.lineTo(s.x2, s.y2 + offset)\r\n } else if (isV) {\r\n ctx.moveTo(s.x1 - offset, s.y1)\r\n ctx.lineTo(s.x2 - offset, s.y2)\r\n ctx.moveTo(s.x1 + offset, s.y1)\r\n ctx.lineTo(s.x2 + offset, s.y2)\r\n } else {\r\n ctx.moveTo(s.x1, s.y1)\r\n ctx.lineTo(s.x2, s.y2)\r\n }\r\n }\r\n ctx.stroke()\r\n } else {\r\n ctx.lineWidth = scaledWidth\r\n if (style === 'dashed') ctx.setLineDash([3 * scale, 3 * scale])\r\n else if (style === 'dotted') ctx.setLineDash([1 * scale, 2 * scale])\r\n else ctx.setLineDash([])\r\n ctx.beginPath()\r\n for (const s of segs) {\r\n ctx.moveTo(s.x1, s.y1)\r\n ctx.lineTo(s.x2, s.y2)\r\n }\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n ctx.setLineDash([])\r\n ctx.translate(-0.5, -0.5)\r\n ctx.restore()\r\n }\r\n\r\n private _drawBackgroundColor(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const { trList } = element\r\n if (!trList) return\r\n const { scale } = this.options\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (!td.backgroundColor) continue\r\n ctx.save()\r\n const width = td.width! * scale\r\n const height = td.height! * scale\r\n const x = Math.round(td.x! * scale + startX)\r\n const y = Math.round(td.y! * scale + startY)\r\n ctx.fillStyle = td.backgroundColor\r\n ctx.fillRect(x, y, width, height)\r\n ctx.restore()\r\n }\r\n }\r\n }\r\n\r\n public getTableWidth(element: IElement): number {\r\n return element.colgroup!.reduce((pre, cur) => pre + cur.width, 0)\r\n }\r\n\r\n public getTableHeight(element: IElement): number {\r\n const trList = element.trList\r\n if (!trList?.length) return 0\r\n return this.getTdListByColIndex(trList, 0).reduce(\r\n (pre, cur) => pre + cur.height!,\r\n 0\r\n )\r\n }\r\n\r\n public getRowCountByColIndex(trList: ITr[], colIndex: number): number {\r\n return this.getTdListByColIndex(trList, colIndex).reduce(\r\n (pre, cur) => pre + cur.rowspan,\r\n 0\r\n )\r\n }\r\n\r\n public getTdListByColIndex(trList: ITr[], colIndex: number): ITd[] {\r\n const data: ITd[] = []\r\n for (let r = 0; r < trList.length; r++) {\r\n const tdList = trList[r].tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const min = td.colIndex!\r\n const max = min + td.colspan - 1\r\n if (colIndex >= min && colIndex <= max) {\r\n data.push(td)\r\n }\r\n }\r\n }\r\n return data\r\n }\r\n\r\n public getTdListByRowIndex(trList: ITr[], rowIndex: number) {\r\n const data: ITd[] = []\r\n for (let r = 0; r < trList.length; r++) {\r\n const tdList = trList[r].tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const min = td.rowIndex!\r\n const max = min + td.rowspan - 1\r\n if (rowIndex >= min && rowIndex <= max) {\r\n data.push(td)\r\n }\r\n }\r\n }\r\n return data\r\n }\r\n\r\n public computeRowColInfo(element: IElement) {\r\n const { colgroup, trList } = element\r\n if (!colgroup || !trList) return\r\n const colCount = colgroup.length\r\n const rowCount = trList.length\r\n if (!colCount || !rowCount) return\r\n\r\n const colOffsetList: number[] = new Array(colCount).fill(0)\r\n let colOffset = 0\r\n for (let c = 0; c < colCount; c++) {\r\n colOffsetList[c] = colOffset\r\n colOffset += colgroup[c].width\r\n }\r\n\r\n const rowOffsetList: number[] = new Array(rowCount).fill(0)\r\n let rowOffset = 0\r\n for (let r = 0; r < rowCount; r++) {\r\n rowOffsetList[r] = rowOffset\r\n rowOffset += trList[r].height\r\n }\r\n\r\n const occupiedRowSpan: number[] = new Array(colCount).fill(0)\r\n const canPlaceAt = (startColIndex: number, colspan: number) => {\r\n if (startColIndex < 0) return false\r\n if (startColIndex + colspan > colCount) return false\r\n for (let c = startColIndex; c < startColIndex + colspan; c++) {\r\n if (occupiedRowSpan[c] > 0) return false\r\n }\r\n return true\r\n }\r\n\r\n for (let t = 0; t < rowCount; t++) {\r\n for (let c = 0; c < colCount; c++) {\r\n if (occupiedRowSpan[c] > 0) occupiedRowSpan[c] -= 1\r\n }\r\n\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const colspan = Math.max(1, td.colspan || 1)\r\n const rowspan = Math.max(1, td.rowspan || 1)\r\n\r\n let colIndex = 0\r\n let isFound = false\r\n const maxStart = Math.max(0, colCount - colspan)\r\n for (let startColIndex = 0; startColIndex <= maxStart; startColIndex++) {\r\n if (canPlaceAt(startColIndex, colspan)) {\r\n colIndex = startColIndex\r\n isFound = true\r\n break\r\n }\r\n }\r\n if (!isFound) {\r\n colIndex = Math.max(0, Math.min(colCount - 1, colCount - colspan))\r\n }\r\n\r\n for (let c = colIndex; c < colIndex + colspan && c < colCount; c++) {\r\n occupiedRowSpan[c] = Math.max(occupiedRowSpan[c], rowspan)\r\n }\r\n\r\n let width = 0\r\n for (let col = 0; col < colspan; col++) {\r\n const colItem = colgroup[colIndex + col]\r\n if (!colItem) break\r\n width += colItem.width\r\n }\r\n\r\n let height = 0\r\n for (let row = 0; row < rowspan; row++) {\r\n const curTr = trList[t + row]\r\n if (!curTr) break\r\n height += curTr.height\r\n }\r\n\r\n const isLastRowTd = tr.tdList.length - 1 === d\r\n const isLastColTd = t + rowspan === rowCount\r\n const isLastTd = isLastRowTd && isLastColTd && colIndex + colspan === colCount\r\n\r\n td.isLastRowTd = isLastRowTd\r\n td.isLastColTd = isLastColTd\r\n td.isLastTd = isLastTd\r\n\r\n td.x = colOffsetList[colIndex]\r\n td.y = rowOffsetList[t]\r\n td.width = width\r\n td.height = height\r\n td.rowIndex = t\r\n td.colIndex = colIndex\r\n td.trIndex = t\r\n td.tdIndex = d\r\n }\r\n }\r\n }\r\n\r\n public drawRange(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const { scale, rangeAlpha, rangeColor } = this.options\r\n const { type, trList } = element\r\n if (!trList || type !== ElementType.TABLE) return\r\n const {\r\n isCrossRowCol,\r\n startTdIndex,\r\n endTdIndex,\r\n startTrIndex,\r\n endTrIndex\r\n } = this.range.getRange()\r\n // 存在跨行/列\r\n if (!isCrossRowCol) return\r\n let startTd = trList[startTrIndex!].tdList[startTdIndex!]\r\n let endTd = trList[endTrIndex!].tdList[endTdIndex!]\r\n // 交换起始位置\r\n if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {\r\n // prettier-ignore\r\n [startTd, endTd] = [endTd, startTd]\r\n }\r\n const startColIndex = startTd.colIndex!\r\n const endColIndex = endTd.colIndex! + (endTd.colspan - 1)\r\n const startRowIndex = startTd.rowIndex!\r\n const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)\r\n ctx.save()\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdColIndex = td.colIndex!\r\n const tdRowIndex = td.rowIndex!\r\n if (\r\n tdColIndex >= startColIndex &&\r\n tdColIndex <= endColIndex &&\r\n tdRowIndex >= startRowIndex &&\r\n tdRowIndex <= endRowIndex\r\n ) {\r\n const x = td.x! * scale\r\n const y = td.y! * scale\r\n const width = td.width! * scale\r\n const height = td.height! * scale\r\n ctx.globalAlpha = rangeAlpha\r\n ctx.fillStyle = rangeColor\r\n ctx.fillRect(x + startX, y + startY, width, height)\r\n }\r\n }\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n this._drawBackgroundColor(ctx, element, startX, startY)\r\n this._drawBorder(ctx, element, startX, startY)\r\n }\r\n}\r\n","import { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { TableOrder } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\ninterface IAnchorMouseDown {\r\n evt: MouseEvent\r\n order: TableOrder\r\n index: number\r\n element: IElement\r\n}\r\n\r\nexport class TableTool {\r\n // 单元格最小宽度\r\n private readonly MIN_TD_WIDTH = 20\r\n // 行列工具相对表格偏移值\r\n private readonly ROW_COL_OFFSET = 18\r\n // 快速添加行列工具宽度\r\n private readonly ROW_COL_QUICK_WIDTH = 16\r\n // 快速添加行列工具偏移值\r\n private readonly ROW_COL_QUICK_OFFSET = 5\r\n // 快速添加行列工具相对表格位置\r\n private readonly ROW_COL_QUICK_POSITION =\r\n this.ROW_COL_OFFSET + (this.ROW_COL_OFFSET - this.ROW_COL_QUICK_WIDTH) / 2\r\n // 边框工具宽/高度\r\n private readonly BORDER_VALUE = 4\r\n // 快速选择工具偏移值\r\n private readonly TABLE_SELECT_OFFSET = 20\r\n\r\n private draw: Draw\r\n private canvas: HTMLCanvasElement\r\n private options: DeepRequired<IEditorOption>\r\n private position: Position\r\n private range: RangeManager\r\n private container: HTMLDivElement\r\n private toolRowContainer: HTMLDivElement | null\r\n private toolRowAddBtn: HTMLDivElement | null\r\n private toolColAddBtn: HTMLDivElement | null\r\n private toolTableSelectBtn: HTMLDivElement | null\r\n private toolColContainer: HTMLDivElement | null\r\n private toolBorderContainer: HTMLDivElement | null\r\n private anchorLine: HTMLDivElement | null\r\n private mousedownX: number\r\n private mousedownY: number\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.canvas = draw.getPage()\r\n this.options = draw.getOptions()\r\n this.position = draw.getPosition()\r\n this.range = draw.getRange()\r\n this.container = draw.getContainer()\r\n // x、y轴\r\n this.toolRowContainer = null\r\n this.toolRowAddBtn = null\r\n this.toolColAddBtn = null\r\n this.toolTableSelectBtn = null\r\n this.toolColContainer = null\r\n this.toolBorderContainer = null\r\n this.anchorLine = null\r\n this.mousedownX = 0\r\n this.mousedownY = 0\r\n }\r\n\r\n public dispose() {\r\n this.toolRowContainer?.remove()\r\n this.toolRowAddBtn?.remove()\r\n this.toolColAddBtn?.remove()\r\n this.toolTableSelectBtn?.remove()\r\n this.toolColContainer?.remove()\r\n this.toolBorderContainer?.remove()\r\n this.toolRowContainer = null\r\n this.toolRowAddBtn = null\r\n this.toolColAddBtn = null\r\n this.toolTableSelectBtn = null\r\n this.toolColContainer = null\r\n this.toolBorderContainer = null\r\n }\r\n\r\n public render() {\r\n const { isTable, index, trIndex, tdIndex } =\r\n this.position.getPositionContext()\r\n if (!isTable) return\r\n // 销毁之前工具\r\n this.dispose()\r\n const elementList = this.draw.getOriginalElementList()\r\n const positionList = this.position.getOriginalPositionList()\r\n const element = elementList[index!]\r\n // 表格工具配置禁用又非设计模式时不渲染\r\n if (element.tableToolDisabled && !this.draw.isDesignMode()) return\r\n // 渲染所需数据\r\n const { scale } = this.options\r\n const position = positionList[index!]\r\n const { colgroup, trList } = element\r\n const {\r\n coordinate: { leftTop }\r\n } = position\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const prePageHeight = this.draw.getPageNo() * (height + pageGap)\r\n const tableX = leftTop[0]\r\n const tableY = leftTop[1] + prePageHeight\r\n const td = element.trList![trIndex!].tdList[tdIndex!]\r\n const rowIndex = td.rowIndex\r\n const colIndex = td.colIndex\r\n const tableHeight = element.height! * scale\r\n const tableWidth = element.width! * scale\r\n // 表格选择工具\r\n const tableSelectBtn = document.createElement('div')\r\n tableSelectBtn.classList.add(`${EDITOR_PREFIX}-table-tool__select`)\r\n tableSelectBtn.style.height = `${tableHeight * scale}`\r\n tableSelectBtn.style.left = `${tableX}px`\r\n tableSelectBtn.style.top = `${tableY}px`\r\n tableSelectBtn.style.transform = `translate(-${\r\n this.TABLE_SELECT_OFFSET * scale\r\n }px, ${-this.TABLE_SELECT_OFFSET * scale}px)`\r\n // 快捷全选\r\n tableSelectBtn.onclick = () => {\r\n this.draw.getTableOperate().tableSelectAll()\r\n }\r\n this.container.append(tableSelectBtn)\r\n this.toolTableSelectBtn = tableSelectBtn\r\n // 渲染行工具\r\n const rowHeightList = trList!.map(tr => tr.height)\r\n const rowContainer = document.createElement('div')\r\n rowContainer.classList.add(`${EDITOR_PREFIX}-table-tool__row`)\r\n rowContainer.style.transform = `translateX(-${\r\n this.ROW_COL_OFFSET * scale\r\n }px)`\r\n for (let r = 0; r < rowHeightList.length; r++) {\r\n const rowHeight = rowHeightList[r] * scale\r\n const rowItem = document.createElement('div')\r\n rowItem.classList.add(`${EDITOR_PREFIX}-table-tool__row__item`)\r\n if (r === rowIndex) {\r\n rowItem.classList.add('active')\r\n }\r\n // 快捷行选择\r\n rowItem.onclick = () => {\r\n const tdList = this.draw\r\n .getTableParticle()\r\n .getTdListByRowIndex(trList!, r)\r\n const firstTd = tdList[0]\r\n const lastTd = tdList[tdList.length - 1]\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: firstTd.trIndex,\r\n tdIndex: firstTd.tdIndex,\r\n tableId: element.id\r\n })\r\n this.range.setRange(\r\n 0,\r\n 0,\r\n element.id,\r\n firstTd.tdIndex,\r\n lastTd.tdIndex,\r\n firstTd.trIndex,\r\n lastTd.trIndex\r\n )\r\n this.draw.render({\r\n curIndex: 0,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n this._setAnchorActive(rowContainer, r)\r\n }\r\n const rowItemAnchor = document.createElement('div')\r\n rowItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`)\r\n // 行高度拖拽开始\r\n rowItemAnchor.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: r,\r\n order: TableOrder.ROW\r\n })\r\n }\r\n rowItem.append(rowItemAnchor)\r\n rowItem.style.height = `${rowHeight}px`\r\n rowContainer.append(rowItem)\r\n }\r\n rowContainer.style.left = `${tableX}px`\r\n rowContainer.style.top = `${tableY}px`\r\n this.container.append(rowContainer)\r\n this.toolRowContainer = rowContainer\r\n // 添加行按钮\r\n const rowAddBtn = document.createElement('div')\r\n rowAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`)\r\n rowAddBtn.style.left = `${tableX + tableWidth / 2}px`\r\n rowAddBtn.style.top = `${tableY + tableHeight}px`\r\n rowAddBtn.style.transform = `translate(-50%, ${this.ROW_COL_QUICK_OFFSET * scale}px)`\r\n // 快捷添加行\r\n rowAddBtn.onclick = () => {\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: trList!.length - 1,\r\n tdIndex: 0,\r\n tableId: element.id\r\n })\r\n this.draw.getTableOperate().insertTableBottomRow()\r\n }\r\n this.container.append(rowAddBtn)\r\n this.toolRowAddBtn = rowAddBtn\r\n // 渲染列工具\r\n const colWidthList = colgroup!.map(col => col.width)\r\n const colContainer = document.createElement('div')\r\n colContainer.classList.add(`${EDITOR_PREFIX}-table-tool__col`)\r\n colContainer.style.transform = `translateY(-${\r\n this.ROW_COL_OFFSET * scale\r\n }px)`\r\n for (let c = 0; c < colWidthList.length; c++) {\r\n const colWidth = colWidthList[c] * scale\r\n const colItem = document.createElement('div')\r\n colItem.classList.add(`${EDITOR_PREFIX}-table-tool__col__item`)\r\n if (c === colIndex) {\r\n colItem.classList.add('active')\r\n }\r\n // 快捷列选择\r\n colItem.onclick = () => {\r\n const tdList = this.draw\r\n .getTableParticle()\r\n .getTdListByColIndex(trList!, c)\r\n const firstTd = tdList[0]\r\n const lastTd = tdList[tdList.length - 1]\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: firstTd.trIndex,\r\n tdIndex: firstTd.tdIndex,\r\n tableId: element.id\r\n })\r\n this.range.setRange(\r\n 0,\r\n 0,\r\n element.id,\r\n firstTd.tdIndex,\r\n lastTd.tdIndex,\r\n firstTd.trIndex,\r\n lastTd.trIndex\r\n )\r\n this.draw.render({\r\n curIndex: 0,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n this._setAnchorActive(colContainer, c)\r\n }\r\n const colItemAnchor = document.createElement('div')\r\n colItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`)\r\n // 列高度拖拽开始\r\n colItemAnchor.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: c,\r\n order: TableOrder.COL\r\n })\r\n }\r\n colItem.append(colItemAnchor)\r\n colItem.style.width = `${colWidth}px`\r\n colContainer.append(colItem)\r\n }\r\n colContainer.style.left = `${tableX}px`\r\n colContainer.style.top = `${tableY}px`\r\n this.container.append(colContainer)\r\n this.toolColContainer = colContainer\r\n // 添加列按钮\r\n const colAddBtn = document.createElement('div')\r\n colAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`)\r\n colAddBtn.style.height = `${tableHeight * scale}`\r\n colAddBtn.style.left = `${tableX + tableWidth}px`\r\n colAddBtn.style.top = `${tableY}px`\r\n colAddBtn.style.transform = `translate(${\r\n this.ROW_COL_QUICK_OFFSET * scale\r\n }px, -${this.ROW_COL_QUICK_POSITION * scale}px)`\r\n // 快捷添加列\r\n colAddBtn.onclick = () => {\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: 0,\r\n tdIndex: trList![0].tdList.length - 1 || 0,\r\n tableId: element.id\r\n })\r\n this.draw.getTableOperate().insertTableRightCol()\r\n }\r\n this.container.append(colAddBtn)\r\n this.toolColAddBtn = colAddBtn\r\n // 渲染单元格边框拖拽工具\r\n const borderContainer = document.createElement('div')\r\n borderContainer.classList.add(`${EDITOR_PREFIX}-table-tool__border`)\r\n borderContainer.style.height = `${tableHeight}px`\r\n borderContainer.style.width = `${tableWidth}px`\r\n borderContainer.style.left = `${tableX}px`\r\n borderContainer.style.top = `${tableY}px`\r\n for (let r = 0; r < trList!.length; r++) {\r\n const tr = trList![r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const rowBorder = document.createElement('div')\r\n rowBorder.classList.add(`${EDITOR_PREFIX}-table-tool__border__row`)\r\n rowBorder.style.width = `${td.width! * scale}px`\r\n rowBorder.style.height = `${this.BORDER_VALUE}px`\r\n rowBorder.style.top = `${\r\n (td.y! + td.height!) * scale - this.BORDER_VALUE / 2\r\n }px`\r\n rowBorder.style.left = `${td.x! * scale}px`\r\n // 行宽度拖拽开始\r\n rowBorder.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: td.rowIndex! + td.rowspan - 1,\r\n order: TableOrder.ROW\r\n })\r\n }\r\n borderContainer.appendChild(rowBorder)\r\n const colBorder = document.createElement('div')\r\n colBorder.classList.add(`${EDITOR_PREFIX}-table-tool__border__col`)\r\n colBorder.style.width = `${this.BORDER_VALUE}px`\r\n colBorder.style.height = `${td.height! * scale}px`\r\n colBorder.style.top = `${td.y! * scale}px`\r\n colBorder.style.left = `${\r\n (td.x! + td.width!) * scale - this.BORDER_VALUE / 2\r\n }px`\r\n // 列高度拖拽开始\r\n colBorder.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: td.colIndex! + td.colspan - 1,\r\n order: TableOrder.COL\r\n })\r\n }\r\n borderContainer.appendChild(colBorder)\r\n }\r\n }\r\n this.container.append(borderContainer)\r\n this.toolBorderContainer = borderContainer\r\n }\r\n\r\n private _setAnchorActive(container: HTMLDivElement, index: number) {\r\n const children = container.children\r\n for (let c = 0; c < children.length; c++) {\r\n const child = children[c]\r\n if (c === index) {\r\n child.classList.add('active')\r\n } else {\r\n child.classList.remove('active')\r\n }\r\n }\r\n }\r\n\r\n private _mousedown(payload: IAnchorMouseDown) {\r\n const { evt, index, order, element } = payload\r\n this.canvas = this.draw.getPage()\r\n const { scale } = this.options\r\n const width = this.draw.getWidth()\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const prePageHeight = this.draw.getPageNo() * (height + pageGap)\r\n this.mousedownX = evt.x\r\n this.mousedownY = evt.y\r\n const target = evt.target as HTMLDivElement\r\n const canvasRect = this.canvas.getBoundingClientRect()\r\n // 改变光标\r\n const cursor = window.getComputedStyle(target).cursor\r\n document.body.style.cursor = cursor\r\n this.canvas.style.cursor = cursor\r\n // 拖拽线\r\n let startX = 0\r\n let startY = 0\r\n const anchorLine = document.createElement('div')\r\n anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line`)\r\n if (order === TableOrder.ROW) {\r\n anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line__row`)\r\n anchorLine.style.width = `${width}px`\r\n startX = 0\r\n startY = prePageHeight + this.mousedownY - canvasRect.top\r\n } else {\r\n anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line__col`)\r\n anchorLine.style.height = `${height}px`\r\n startX = this.mousedownX - canvasRect.left\r\n startY = prePageHeight\r\n }\r\n anchorLine.style.left = `${startX}px`\r\n anchorLine.style.top = `${startY}px`\r\n this.container.append(anchorLine)\r\n this.anchorLine = anchorLine\r\n // 追加全局事件\r\n let dx = 0\r\n let dy = 0\r\n const mousemoveFn = (evt: MouseEvent) => {\r\n const movePosition = this._mousemove(evt, order, startX, startY)\r\n if (movePosition) {\r\n dx = movePosition.dx\r\n dy = movePosition.dy\r\n }\r\n }\r\n document.addEventListener('mousemove', mousemoveFn)\r\n document.addEventListener(\r\n 'mouseup',\r\n () => {\r\n let isChangeSize = false\r\n // 改变尺寸\r\n if (order === TableOrder.ROW) {\r\n const trList = element.trList!\r\n const tr = trList[index] || trList[index - 1]\r\n // 最大移动高度-向上移动超出最小高度限定,则减少移动量\r\n const { defaultTrMinHeight } = this.options.table\r\n if (dy < 0 && tr.height + dy < defaultTrMinHeight) {\r\n dy = defaultTrMinHeight - tr.height\r\n }\r\n if (dy) {\r\n tr.height += dy\r\n tr.minHeight = tr.height\r\n isChangeSize = true\r\n }\r\n } else {\r\n const { colgroup } = element\r\n if (colgroup && dx) {\r\n // 宽度分配\r\n const innerWidth = this.draw.getInnerWidth()\r\n const curColWidth = colgroup[index].width\r\n // 最小移动距离计算-如果向左移动:使单元格小于最小宽度,则减少移动量\r\n if (dx < 0 && curColWidth + dx < this.MIN_TD_WIDTH) {\r\n dx = this.MIN_TD_WIDTH - curColWidth\r\n }\r\n // 最大移动距离计算-如果向右移动:使后面一个单元格小于最小宽度,则减少移动量\r\n const nextColWidth = colgroup[index + 1]?.width\r\n if (\r\n dx > 0 &&\r\n nextColWidth &&\r\n nextColWidth - dx < this.MIN_TD_WIDTH\r\n ) {\r\n dx = nextColWidth - this.MIN_TD_WIDTH\r\n }\r\n const moveColWidth = curColWidth + dx\r\n // 开始移动,只有表格的最后一列线才会改变表格的宽度,其他场景不用计算表格超出\r\n if (index === colgroup.length - 1) {\r\n let moveTableWidth = 0\r\n for (let c = 0; c < colgroup.length; c++) {\r\n const group = colgroup[c]\r\n // 下一列减去偏移量\r\n if (c === index + 1) {\r\n moveTableWidth -= dx\r\n }\r\n // 当前列加上偏移量\r\n if (c === index) {\r\n moveTableWidth += moveColWidth\r\n }\r\n if (c !== index) {\r\n moveTableWidth += group.width\r\n }\r\n }\r\n if (moveTableWidth > innerWidth) {\r\n const tableWidth = element.width!\r\n dx = innerWidth - tableWidth\r\n }\r\n }\r\n if (dx) {\r\n // 当前列增加,后列减少\r\n if (colgroup.length - 1 !== index) {\r\n colgroup[index + 1].width -= dx / scale\r\n }\r\n colgroup[index].width += dx / scale\r\n isChangeSize = true\r\n }\r\n }\r\n }\r\n if (isChangeSize) {\r\n this.draw.render({ isSetCursor: false })\r\n }\r\n // 还原副作用\r\n anchorLine.remove()\r\n document.removeEventListener('mousemove', mousemoveFn)\r\n document.body.style.cursor = ''\r\n this.canvas.style.cursor = 'text'\r\n },\r\n {\r\n once: true\r\n }\r\n )\r\n evt.preventDefault()\r\n }\r\n\r\n private _mousemove(\r\n evt: MouseEvent,\r\n tableOrder: TableOrder,\r\n startX: number,\r\n startY: number\r\n ): { dx: number; dy: number } | null {\r\n if (!this.anchorLine) return null\r\n const dx = evt.x - this.mousedownX\r\n const dy = evt.y - this.mousedownY\r\n if (tableOrder === TableOrder.ROW) {\r\n this.anchorLine.style.top = `${startY + dy}px`\r\n } else {\r\n this.anchorLine.style.left = `${startX + dx}px`\r\n }\r\n evt.preventDefault()\r\n return { dx, dy }\r\n }\r\n}\r\n","import { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { TextParticle } from './TextParticle'\r\n\r\nexport class HyperlinkParticle {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private container: HTMLDivElement\r\n private hyperlinkPopupContainer: HTMLDivElement\r\n private hyperlinkDom: HTMLAnchorElement\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n const { hyperlinkPopupContainer, hyperlinkDom } =\r\n this._createHyperlinkPopupDom()\r\n this.hyperlinkDom = hyperlinkDom\r\n this.hyperlinkPopupContainer = hyperlinkPopupContainer\r\n }\r\n\r\n private _createHyperlinkPopupDom() {\r\n const hyperlinkPopupContainer = document.createElement('div')\r\n hyperlinkPopupContainer.classList.add(`${EDITOR_PREFIX}-hyperlink-popup`)\r\n const hyperlinkDom = document.createElement('a')\r\n hyperlinkDom.target = '_blank'\r\n hyperlinkDom.rel = 'noopener'\r\n hyperlinkPopupContainer.append(hyperlinkDom)\r\n this.container.append(hyperlinkPopupContainer)\r\n return { hyperlinkPopupContainer, hyperlinkDom }\r\n }\r\n\r\n private _isSafeUrl(url: string): boolean {\r\n try {\r\n const parsed = new URL(url, 'https://placeholder.local')\r\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\r\n } catch {\r\n return url.startsWith('#') || url.startsWith('/')\r\n }\r\n }\r\n\r\n public drawHyperlinkPopup(element: IElement, position: IElementPosition) {\r\n const {\r\n coordinate: {\r\n leftTop: [left, top]\r\n },\r\n lineHeight\r\n } = position\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = this.draw.getPageNo() * (height + pageGap)\r\n // 位置\r\n this.hyperlinkPopupContainer.style.display = 'block'\r\n this.hyperlinkPopupContainer.style.left = `${left}px`\r\n this.hyperlinkPopupContainer.style.top = `${top + preY + lineHeight}px`\r\n // 标签\r\n const url = element.url || '#'\r\n if (this._isSafeUrl(url)) {\r\n this.hyperlinkDom.href = url\r\n } else {\r\n this.hyperlinkDom.removeAttribute('href')\r\n }\r\n this.hyperlinkDom.title = url\r\n this.hyperlinkDom.innerText = url\r\n }\r\n\r\n public clearHyperlinkPopup() {\r\n this.hyperlinkPopupContainer.style.display = 'none'\r\n }\r\n\r\n public openHyperlink(element: IElement) {\r\n const url = element.url\r\n if (!url || !this._isSafeUrl(url)) {\r\n console.warn(`[HyperlinkParticle] Blocked unsafe URL protocol: ${url}`)\r\n return\r\n }\r\n const newTab = window.open(url, '_blank', 'noopener')\r\n if (newTab) {\r\n newTab.opener = null\r\n }\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n ctx.font = element.style\r\n if (!element.color) {\r\n element.color = this.options.defaultHyperlinkColor\r\n }\r\n ctx.fillStyle = element.color\r\n if (element.underline === undefined) {\r\n element.underline = true\r\n }\r\n TextParticle.fillScaledText(\r\n ctx,\r\n element.value,\r\n x,\r\n y,\r\n element.characterScale\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { maxHeightRadioMapping } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRow } from '@vervedoc/docx-editor-schema'\r\nimport { pickSurroundElementList } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Header {\r\n private draw: Draw\r\n private position: Position\r\n private zone: Zone\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private elementList: IElement[]\r\n private rowList: IRow[]\r\n private positionList: IElementPosition[]\r\n\r\n constructor(draw: Draw, data?: IElement[]) {\r\n this.draw = draw\r\n this.position = draw.getPosition()\r\n this.zone = draw.getZone()\r\n this.options = draw.getOptions()\r\n\r\n this.elementList = data || []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n public getRowList(): IRow[] {\r\n return this.rowList\r\n }\r\n\r\n public setElementList(elementList: IElement[]) {\r\n this.elementList = elementList\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n return this.elementList\r\n }\r\n\r\n public getPositionList(): IElementPosition[] {\r\n return this.positionList\r\n }\r\n\r\n public compute() {\r\n this.recovery()\r\n this._computeRowList()\r\n this._computePositionList()\r\n }\r\n\r\n public recovery() {\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n private _computeRowList() {\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n const surroundElementList = pickSurroundElementList(this.elementList)\r\n this.rowList = this.draw.computeRowList({\r\n startX: margins[3],\r\n startY: this.getHeaderTop(),\r\n innerWidth,\r\n elementList: this.elementList,\r\n surroundElementList\r\n })\r\n }\r\n\r\n private _computePositionList() {\r\n const headerTop = this.getHeaderTop()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n const startX = margins[3]\r\n const startY = headerTop\r\n this.position.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX,\r\n startY,\r\n innerWidth,\r\n zone: EditorZone.HEADER\r\n })\r\n }\r\n\r\n public getHeaderTop(): number {\r\n const {\r\n header: { top, disabled },\r\n scale\r\n } = this.options\r\n if (disabled) return 0\r\n return Math.floor(top * scale)\r\n }\r\n\r\n public getMaxHeight(): number {\r\n const {\r\n header: { maxHeightRadio }\r\n } = this.options\r\n const height = this.draw.getHeight()\r\n return Math.floor(height * maxHeightRadioMapping[maxHeightRadio])\r\n }\r\n\r\n public getHeight(): number {\r\n const maxHeight = this.getMaxHeight()\r\n const rowHeight = this.getRowHeight()\r\n return rowHeight > maxHeight ? maxHeight : rowHeight\r\n }\r\n\r\n public getRowHeight(): number {\r\n return this.rowList.reduce((pre, cur) => pre + cur.height, 0)\r\n }\r\n\r\n public getExtraHeight(): number {\r\n // 页眉上边距 + 实际高 - 页面上边距\r\n const margins = this.draw.getMargins()\r\n const headerHeight = this.getHeight()\r\n const headerTop = this.getHeaderTop()\r\n const extraHeight = headerTop + headerHeight - margins[0]\r\n return extraHeight <= 0 ? 0 : extraHeight\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n ctx.save()\r\n ctx.globalAlpha = this.zone.isHeaderActive()\r\n ? 1\r\n : this.options.header.inactiveAlpha\r\n const innerWidth = this.draw.getInnerWidth()\r\n const maxHeight = this.getMaxHeight()\r\n // 超出最大高度不渲染\r\n const rowList: IRow[] = []\r\n let curRowHeight = 0\r\n for (let r = 0; r < this.rowList.length; r++) {\r\n const row = this.rowList[r]\r\n if (curRowHeight + row.height > maxHeight) {\r\n break\r\n }\r\n rowList.push(row)\r\n curRowHeight += row.height\r\n }\r\n this.draw.drawRow(ctx, {\r\n elementList: this.elementList,\r\n positionList: this.positionList,\r\n rowList,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth,\r\n zone: EditorZone.HEADER,\r\n isDrawLineBreak: false\r\n })\r\n ctx.restore()\r\n }\r\n}\r\n","import { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { TextParticle } from './TextParticle'\r\n\r\nexport class SuperscriptParticle {\r\n // 向上偏移字高的一半\r\n public getOffsetY(element: IRowElement): number {\r\n return -element.metrics.height / 2\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n ctx.font = element.style\r\n if (element.color) {\r\n ctx.fillStyle = element.color\r\n }\r\n TextParticle.fillScaledText(\r\n ctx,\r\n element.value,\r\n x,\r\n y + this.getOffsetY(element),\r\n element.characterScale\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { TextParticle } from './TextParticle'\r\n\r\nexport class SubscriptParticle {\r\n // 向下偏移字高的一半\r\n public getOffsetY(element: IRowElement): number {\r\n return element.metrics.height / 2\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n ctx.font = element.style\r\n if (element.color) {\r\n ctx.fillStyle = element.color\r\n }\r\n TextParticle.fillScaledText(\r\n ctx,\r\n element.value,\r\n x,\r\n y + this.getOffsetY(element),\r\n element.characterScale\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { getSeparatorDashArray, getSeparatorLineWidth, getSeparatorRenderHeight, getSeparatorType } from '../utils/separator'\r\n\r\nexport class SeparatorParticle {\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.options = draw.getOptions()\r\n }\r\n\r\n private withAlpha(color: string, alpha: number) {\r\n const normalizedAlpha = Math.max(0, Math.min(1, alpha))\r\n if (color.startsWith('#')) {\r\n const hex = color.slice(1)\r\n const fullHex =\r\n hex.length === 3\r\n ? hex.split('').map(char => char + char).join('')\r\n : hex.length === 6\r\n ? hex\r\n : ''\r\n if (fullHex) {\r\n const r = Number.parseInt(fullHex.slice(0, 2), 16)\r\n const g = Number.parseInt(fullHex.slice(2, 4), 16)\r\n const b = Number.parseInt(fullHex.slice(4, 6), 16)\r\n return `rgba(${r}, ${g}, ${b}, ${normalizedAlpha})`\r\n }\r\n }\r\n const rgbMatch = color.match(/^rgba?\\(([^)]+)\\)$/i)\r\n if (rgbMatch) {\r\n const [r = '0', g = '0', b = '0'] = rgbMatch[1].split(',').map(item => item.trim())\r\n return `rgba(${r}, ${g}, ${b}, ${normalizedAlpha})`\r\n }\r\n return color\r\n }\r\n\r\n private scaleDashArray(dashArray: number[], scale: number, lineWidth: number) {\r\n if (!dashArray.some(item => item > 0)) return []\r\n return dashArray.map(item => {\r\n if (item <= 0) return 0\r\n return Math.max(item * Math.max(scale * Math.max(lineWidth, 1), 1), 1)\r\n })\r\n }\r\n\r\n private drawStraightLine(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n endX: number,\r\n y: number,\r\n lineWidth: number,\r\n color: string | CanvasGradient,\r\n dashArray: number[] = []\r\n ) {\r\n ctx.save()\r\n ctx.lineWidth = lineWidth\r\n ctx.strokeStyle = color\r\n ctx.lineCap = dashArray.length ? 'round' : 'butt'\r\n ctx.setLineDash(dashArray)\r\n ctx.beginPath()\r\n ctx.moveTo(startX, y)\r\n ctx.lineTo(endX, y)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n\r\n private drawWavyLine(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n endX: number,\r\n centerY: number,\r\n lineWidth: number,\r\n color: string\r\n ) {\r\n const amplitude = Math.max(lineWidth, 2)\r\n const wavelength = Math.max(lineWidth * 6, 12)\r\n ctx.save()\r\n ctx.lineWidth = lineWidth\r\n ctx.strokeStyle = color\r\n ctx.lineCap = 'round'\r\n ctx.lineJoin = 'round'\r\n ctx.beginPath()\r\n ctx.moveTo(startX, centerY)\r\n let currentX = startX\r\n while (currentX < endX) {\r\n const midX = Math.min(currentX + wavelength / 2, endX)\r\n const nextX = Math.min(currentX + wavelength, endX)\r\n ctx.quadraticCurveTo(\r\n currentX + wavelength / 4,\r\n centerY - amplitude,\r\n midX,\r\n centerY\r\n )\r\n if (midX < endX) {\r\n ctx.quadraticCurveTo(\r\n currentX + (wavelength * 3) / 4,\r\n centerY + amplitude,\r\n nextX,\r\n centerY\r\n )\r\n }\r\n currentX = nextX\r\n }\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n const {\r\n scale,\r\n separator: { lineWidth, strokeStyle }\r\n } = this.options\r\n const startX = x\r\n const endX = x + (element.width || 0) * scale\r\n const type = getSeparatorType(element)\r\n const actualLineWidth = getSeparatorLineWidth(element, lineWidth) * scale\r\n const actualDashArray = this.scaleDashArray(getSeparatorDashArray(element, type), scale, actualLineWidth)\r\n const color = element.color || strokeStyle\r\n const renderHeight = getSeparatorRenderHeight(element, lineWidth) * scale\r\n const centerY = Math.round(y + renderHeight / 2)\r\n\r\n if (endX <= startX) {\r\n ctx.restore()\r\n return\r\n }\r\n\r\n if (type === 'double') {\r\n const gap = Math.max(actualLineWidth + scale, 2)\r\n this.drawStraightLine(ctx, startX, endX, centerY - gap / 2, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY + gap / 2, actualLineWidth, color, actualDashArray)\r\n } else if (type === 'triple') {\r\n const gap = Math.max(actualLineWidth + scale, 2)\r\n this.drawStraightLine(ctx, startX, endX, centerY - gap, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY + gap, actualLineWidth, color, actualDashArray)\r\n } else if (type === 'wavy') {\r\n this.drawWavyLine(ctx, startX, endX, centerY, actualLineWidth, color)\r\n } else if (type === 'gradient') {\r\n const gradient = ctx.createLinearGradient(startX, centerY, endX, centerY)\r\n gradient.addColorStop(0, this.withAlpha(color, 0))\r\n gradient.addColorStop(0.2, this.withAlpha(color, 0.4))\r\n gradient.addColorStop(0.5, this.withAlpha(color, 1))\r\n gradient.addColorStop(0.8, this.withAlpha(color, 0.4))\r\n gradient.addColorStop(1, this.withAlpha(color, 0))\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, gradient as unknown as string, actualDashArray)\r\n } else if (type === 'shadow') {\r\n this.drawStraightLine(ctx, startX + scale, endX + scale, centerY + scale, actualLineWidth, this.withAlpha('#000000', 0.18), actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n } else if (type === 'emboss') {\r\n this.drawStraightLine(ctx, startX, endX, centerY - scale, Math.max(actualLineWidth / 2, 1), this.withAlpha('#ffffff', 0.85), actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY + scale, Math.max(actualLineWidth / 2, 1), this.withAlpha('#000000', 0.25), actualDashArray)\r\n } else {\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n }\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class PageBreakParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private i18n: I18n\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.i18n = draw.getI18n()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n const {\r\n pageBreak: { font, fontSize, lineDash }\r\n } = this.draw.getOptions()\r\n \r\n const displayName = this.i18n.t('pageBreak.displayName')\r\n const { scale, defaultRowMargin } = this.options\r\n const size = fontSize * scale\r\n const elementWidth = element.width! * scale\r\n const offsetY =\r\n this.draw.getDefaultBasicRowMarginHeight() * defaultRowMargin\r\n ctx.save()\r\n ctx.font = `${size}px ${font}`\r\n const textMeasure = ctx.measureText(displayName)\r\n const halfX = (elementWidth - textMeasure.width) / 2\r\n // 线段\r\n ctx.setLineDash(lineDash)\r\n ctx.translate(0, 0.5 + offsetY)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y)\r\n ctx.lineTo(x + halfX, y)\r\n ctx.moveTo(x + halfX + textMeasure.width, y)\r\n ctx.lineTo(x + elementWidth, y)\r\n ctx.stroke()\r\n // 文字\r\n ctx.fillText(\r\n displayName,\r\n x + halfX,\r\n y + textMeasure.actualBoundingBoxAscent - size / 2\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { FORMAT_PLACEHOLDER } from '@vervedoc/docx-editor-schema'\r\nimport { WatermarkType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { PageNumber } from './PageNumber'\r\n\r\nexport class Watermark {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private imageCache: Map<string, HTMLImageElement>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = <DeepRequired<IEditorOption>>draw.getOptions()\r\n this.imageCache = new Map()\r\n }\r\n\r\n public renderText(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n watermark: { data, opacity, font, size, color, repeat, gap, numberType },\r\n scale\r\n } = this.options\r\n const width = this.draw.getWidth()\r\n const height = this.draw.getHeight()\r\n // 开始绘制\r\n ctx.save()\r\n ctx.globalAlpha = opacity\r\n ctx.font = `${size * scale}px ${font}`\r\n // 格式化文本\r\n let text = data\r\n const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO)\r\n if (pageNoReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n pageNo + 1,\r\n pageNoReg,\r\n numberType\r\n )\r\n }\r\n const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT)\r\n if (pageCountReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n this.draw.getPageCount(),\r\n pageCountReg,\r\n numberType\r\n )\r\n }\r\n // 测量长度并绘制\r\n const measureText = ctx.measureText(text)\r\n if (repeat) {\r\n // 使用 OffscreenCanvas 进行水印渲染(性能更好)\r\n let temporaryCanvas: HTMLCanvasElement | OffscreenCanvas\r\n let temporaryCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\r\n if (typeof OffscreenCanvas !== 'undefined') {\r\n temporaryCanvas = new OffscreenCanvas(1, 1)\r\n temporaryCtx = temporaryCanvas.getContext('2d') as OffscreenCanvasRenderingContext2D\r\n } else {\r\n temporaryCanvas = document.createElement('canvas')\r\n temporaryCtx = temporaryCanvas.getContext('2d')!\r\n }\r\n // 勾股定理计算旋转后的宽高对角线尺寸 a^2 + b^2 = c^2\r\n const textWidth = measureText.width\r\n const textHeight =\r\n measureText.actualBoundingBoxAscent +\r\n measureText.actualBoundingBoxDescent\r\n const diagonalLength = Math.sqrt(\r\n Math.pow(textWidth, 2) + Math.pow(textHeight, 2)\r\n )\r\n // 加上 gap 间距\r\n const patternWidth = diagonalLength + 2 * gap[0] * scale\r\n const patternHeight = diagonalLength + 2 * gap[1] * scale\r\n // 宽高设置\r\n temporaryCanvas.width = patternWidth\r\n temporaryCanvas.height = patternHeight\r\n // 旋转45度\r\n temporaryCtx.translate(patternWidth / 2, patternHeight / 2)\r\n temporaryCtx.rotate((-45 * Math.PI) / 180)\r\n temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2)\r\n // 绘制文本\r\n temporaryCtx.font = `${size * scale}px ${font}`\r\n temporaryCtx.fillStyle = color\r\n temporaryCtx.fillText(\r\n text,\r\n (patternWidth - textWidth) / 2,\r\n (patternHeight - textHeight) / 2 + measureText.actualBoundingBoxAscent\r\n )\r\n // 创建平铺模式\r\n const pattern = ctx.createPattern(temporaryCanvas, 'repeat')\r\n if (pattern) {\r\n ctx.fillStyle = pattern\r\n ctx.fillRect(0, 0, width, height)\r\n }\r\n } else {\r\n const x = width / 2\r\n const y = height / 2\r\n ctx.fillStyle = color\r\n ctx.translate(x, y)\r\n ctx.rotate((-45 * Math.PI) / 180)\r\n ctx.fillText(\r\n text,\r\n -measureText.width / 2,\r\n measureText.actualBoundingBoxAscent - (size * scale) / 2\r\n )\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public renderImage(ctx: CanvasRenderingContext2D) {\r\n const {\r\n watermark: { width, height, data, opacity, repeat, gap },\r\n scale\r\n } = this.options\r\n if (!this.imageCache.has(data)) {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = data\r\n img.onload = () => {\r\n this.imageCache.set(data, img)\r\n // 避免层级上浮,触发编辑器二次渲染\r\n this.draw.render({\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n return\r\n }\r\n const docWidth = this.draw.getWidth()\r\n const docHeight = this.draw.getHeight()\r\n const imageWidth = width * scale\r\n const imageHeight = height * scale\r\n // 开始绘制\r\n ctx.save()\r\n ctx.globalAlpha = opacity\r\n if (repeat) {\r\n // 使用 OffscreenCanvas 进行水印渲染(性能更好)\r\n let temporaryCanvas: HTMLCanvasElement | OffscreenCanvas\r\n let temporaryCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\r\n if (typeof OffscreenCanvas !== 'undefined') {\r\n temporaryCanvas = new OffscreenCanvas(1, 1)\r\n temporaryCtx = temporaryCanvas.getContext('2d') as OffscreenCanvasRenderingContext2D\r\n } else {\r\n temporaryCanvas = document.createElement('canvas')\r\n temporaryCtx = temporaryCanvas.getContext('2d')!\r\n }\r\n // 勾股定理计算旋转后的宽高对角线尺寸 a^2 + b^2 = c^2\r\n const diagonalLength = Math.sqrt(\r\n Math.pow(imageWidth, 2) + Math.pow(imageHeight, 2)\r\n )\r\n // 加上 gap 间距\r\n const patternWidth = diagonalLength + 2 * gap[0] * scale\r\n const patternHeight = diagonalLength + 2 * gap[1] * scale\r\n // 宽高设置\r\n temporaryCanvas.width = patternWidth\r\n temporaryCanvas.height = patternHeight\r\n // 旋转45度\r\n temporaryCtx.translate(patternWidth / 2, patternHeight / 2)\r\n temporaryCtx.rotate((-45 * Math.PI) / 180)\r\n temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2)\r\n // 绘制图片\r\n temporaryCtx.drawImage(\r\n this.imageCache.get(data)!,\r\n (patternWidth - imageWidth) / 2,\r\n (patternHeight - imageHeight) / 2,\r\n imageWidth,\r\n imageHeight\r\n )\r\n // 创建平铺模式\r\n const pattern = ctx.createPattern(temporaryCanvas, 'repeat')\r\n if (pattern) {\r\n ctx.fillStyle = pattern\r\n ctx.fillRect(0, 0, docWidth, docHeight)\r\n }\r\n } else {\r\n const x = docWidth / 2\r\n const y = docHeight / 2\r\n ctx.translate(x, y)\r\n ctx.rotate((-45 * Math.PI) / 180)\r\n ctx.drawImage(\r\n this.imageCache.get(data)!,\r\n -imageWidth / 2,\r\n -imageHeight / 2,\r\n imageWidth,\r\n imageHeight\r\n )\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n if (this.options.watermark.type === WatermarkType.IMAGE) {\r\n this.renderImage(ctx)\r\n } else {\r\n this.renderText(ctx, pageNo)\r\n }\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlHighlight,\r\n IControlHighlightRule\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n ISearchResult,\r\n ISearchResultRestArgs\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { Control } from './Control'\r\n\r\ntype IHighlightMatchResult = (ISearchResult & IControlHighlightRule)[]\r\n\r\nexport class ControlSearch {\r\n private draw: Draw\r\n private control: Control\r\n private options: DeepRequired<IEditorOption>\r\n private highlightList: IControlHighlight[]\r\n private highlightMatchResult: IHighlightMatchResult\r\n\r\n constructor(control: Control) {\r\n this.draw = control.getDraw()\r\n this.control = control\r\n this.options = this.draw.getOptions()\r\n\r\n this.highlightList = []\r\n this.highlightMatchResult = []\r\n }\r\n\r\n // 获取控件设置高亮信息\r\n public getControlHighlight(elementList: IElement[], index: number) {\r\n const {\r\n control: {\r\n activeBackgroundColor,\r\n disabledBackgroundColor,\r\n existValueBackgroundColor,\r\n noValueBackgroundColor\r\n }\r\n } = this.options\r\n const element = elementList[index]\r\n const isPrintMode = this.draw.isPrintMode()\r\n const activeControlElement = this.control.getActiveControl()?.getElement()\r\n // 颜色配置:元素 > 控件激活 > 控件禁用 > 控件存在值 > 控件不存在值\r\n let isActiveControlHighlight = false\r\n let isDisabledControlHighlight = false\r\n let isExitsValueControlHighlight = false\r\n let isNoValueControlHighlight = false\r\n if (!element.highlight) {\r\n // 控件激活时高亮色\r\n isActiveControlHighlight =\r\n !isPrintMode &&\r\n !!activeBackgroundColor &&\r\n !!activeControlElement &&\r\n element.controlId === activeControlElement.controlId &&\r\n !this.control.getIsRangeInPostfix()\r\n }\r\n if (!isActiveControlHighlight) {\r\n // 控件禁用时高亮色\r\n isDisabledControlHighlight =\r\n !isPrintMode && !!disabledBackgroundColor && !!element.control?.disabled\r\n }\r\n if (!isDisabledControlHighlight) {\r\n // 控件存在值时高亮色\r\n isExitsValueControlHighlight =\r\n !isPrintMode &&\r\n !!existValueBackgroundColor &&\r\n !!element.controlId &&\r\n this.control.getIsExistValueByElementListIndex(elementList, index)\r\n }\r\n if (!isExitsValueControlHighlight) {\r\n // 控件不存在值时高亮色\r\n isNoValueControlHighlight =\r\n !isPrintMode &&\r\n !!noValueBackgroundColor &&\r\n !!element.controlId &&\r\n !this.control.getIsExistValueByElementListIndex(elementList, index)\r\n }\r\n return (\r\n (isActiveControlHighlight ? activeBackgroundColor : '') ||\r\n (isDisabledControlHighlight ? disabledBackgroundColor : '') ||\r\n (isExitsValueControlHighlight ? existValueBackgroundColor : '') ||\r\n (isNoValueControlHighlight ? noValueBackgroundColor : '')\r\n )\r\n }\r\n\r\n public getHighlightMatchResult(): IHighlightMatchResult {\r\n return this.highlightMatchResult\r\n }\r\n\r\n public getHighlightList(): IControlHighlight[] {\r\n return this.highlightList\r\n }\r\n\r\n public setHighlightList(payload: IControlHighlight[]) {\r\n this.highlightList = payload\r\n }\r\n\r\n public computeHighlightList() {\r\n const search = this.draw.getSearch()\r\n const computeHighlight = (\r\n elementList: IElement[],\r\n restArgs?: ISearchResultRestArgs\r\n ) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const restArgs: ISearchResultRestArgs = {\r\n tableId: element.id,\r\n tableIndex: i - 1,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id\r\n }\r\n computeHighlight(td.value, restArgs)\r\n }\r\n }\r\n }\r\n const currentControl = element?.control\r\n if (!currentControl) continue\r\n const highlightIndex = this.highlightList.findIndex(\r\n highlight =>\r\n highlight.id === element.controlId ||\r\n (currentControl.conceptId &&\r\n currentControl.conceptId === highlight.conceptId)\r\n )\r\n if (!~highlightIndex) continue\r\n // 搜索后控件结束索引\r\n const startIndex = i\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n // 高亮信息\r\n const controlElementList = elementList\r\n .slice(startIndex, newEndIndex)\r\n .map(element =>\r\n element.controlComponent === ControlComponent.VALUE\r\n ? element\r\n : { value: ZERO }\r\n )\r\n const highlight = this.highlightList[highlightIndex]\r\n const { ruleList } = highlight\r\n for (let r = 0; r < ruleList.length; r++) {\r\n const rule = ruleList[r]\r\n const searchResult = search.getMatchList(\r\n rule.keyword,\r\n controlElementList\r\n )\r\n this.highlightMatchResult.push(\r\n ...searchResult.map(result => ({\r\n ...result,\r\n ...rule,\r\n ...restArgs,\r\n index: result.index + startIndex // 实际索引\r\n }))\r\n )\r\n }\r\n }\r\n }\r\n this.highlightMatchResult = []\r\n computeHighlight(this.draw.getOriginalMainElementList())\r\n }\r\n\r\n public renderHighlightList(ctx: CanvasRenderingContext2D, pageIndex: number) {\r\n if (!this.highlightMatchResult?.length) return\r\n const { searchMatchAlpha, searchMatchColor } = this.options\r\n const positionList = this.draw.getPosition().getOriginalPositionList()\r\n const elementList = this.draw.getOriginalElementList()\r\n ctx.save()\r\n for (let s = 0; s < this.highlightMatchResult.length; s++) {\r\n const searchMatch = this.highlightMatchResult[s]\r\n let position: IElementPosition | null = null\r\n if (searchMatch.tableId) {\r\n const { tableIndex, trIndex, tdIndex, index } = searchMatch\r\n position =\r\n elementList[tableIndex!]?.trList![trIndex!].tdList[tdIndex!]\r\n ?.positionList![index]\r\n } else {\r\n position = positionList[searchMatch.index]\r\n }\r\n if (!position) continue\r\n const {\r\n coordinate: { leftTop, leftBottom, rightTop },\r\n pageNo\r\n } = position\r\n if (pageNo !== pageIndex) continue\r\n ctx.fillStyle = searchMatch.backgroundColor || searchMatchColor\r\n ctx.globalAlpha = searchMatch.alpha || searchMatchAlpha\r\n const x = leftTop[0]\r\n const y = leftTop[1]\r\n const width = rightTop[0] - leftTop[0]\r\n const height = leftBottom[1] - leftTop[1]\r\n ctx.fillRect(x, y, width, height)\r\n }\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElementFillRect } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class ControlBorder {\r\n protected borderRect: IElementFillRect\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.borderRect = this.clearBorderInfo()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public clearBorderInfo() {\r\n this.borderRect = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n return this.borderRect\r\n }\r\n\r\n public recordBorderInfo(x: number, y: number, width: number, height: number) {\r\n const isFirstRecord = !this.borderRect.width\r\n if (isFirstRecord) {\r\n this.borderRect.x = x\r\n this.borderRect.y = y\r\n this.borderRect.height = height\r\n }\r\n this.borderRect.width += width\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.borderRect.width) return\r\n const {\r\n scale,\r\n control: { borderWidth, borderColor }\r\n } = this.options\r\n const { x, y, width, height } = this.borderRect\r\n ctx.save()\r\n ctx.translate(0, 1 * scale)\r\n ctx.lineWidth = borderWidth * scale\r\n ctx.strokeStyle = borderColor\r\n ctx.beginPath()\r\n ctx.rect(x, y, width, height)\r\n ctx.stroke()\r\n ctx.restore()\r\n this.clearBorderInfo()\r\n }\r\n}\r\n","import {\r\n EDITOR_COMPONENT,\r\n EDITOR_PREFIX\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n CONTROL_STYLE_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { EditorComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n isArrayEqual,\r\n isNonValue,\r\n omitObject,\r\n pickObject,\r\n splitText\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { Control } from './Control'\r\n\r\nexport class SelectControl implements IControlInstance {\r\n private element: IElement\r\n private control: Control\r\n private isPopup: boolean\r\n private selectDom: HTMLDivElement | null\r\n private options: DeepRequired<IEditorOption>\r\n private VALUE_DELIMITER = ','\r\n private DEFAULT_MULTI_SELECT_DELIMITER = ','\r\n\r\n constructor(element: IElement, control: Control) {\r\n const draw = control.getDraw()\r\n this.options = draw.getOptions()\r\n this.element = element\r\n this.control = control\r\n this.isPopup = false\r\n this.selectDom = null\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getIsPopup(): boolean {\r\n return this.isPopup\r\n }\r\n\r\n public getCodes(): string[] {\r\n return this.element?.control?.code\r\n ? this.element.control.code.split(',')\r\n : []\r\n }\r\n\r\n public getText(codes: string[]): string | null {\r\n if (!this.element?.control) return null\r\n const control = this.element.control\r\n if (!control.valueSets?.length) return null\r\n const multiSelectDelimiter =\r\n control?.multiSelectDelimiter || this.DEFAULT_MULTI_SELECT_DELIMITER\r\n const valueSets = control.valueSets\r\n const valueList: string[] = []\r\n codes.forEach(code => {\r\n const valueSet = valueSets.find(v => v.code === code)\r\n if (valueSet && !isNonValue(valueSet.value)) {\r\n valueList.push(valueSet.value)\r\n }\r\n })\r\n return valueList.join(multiSelectDelimiter) || null\r\n }\r\n\r\n public getValue(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n data.unshift(preElement)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n data.push(nextElement)\r\n }\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public setValue(\r\n data: IElement[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !this.element.control?.selectExclusiveOptions?.inputAble ||\r\n (!options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context))\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary(context)\r\n const { startIndex, endIndex } = range\r\n const draw = this.control.getDraw()\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n } else {\r\n // 移除空白占位符\r\n this.control.removePlaceholder(startIndex, context)\r\n }\r\n // 非文本类元素或前缀过渡掉样式属性\r\n const startElement = elementList[startIndex]\r\n const anchorElement =\r\n (startElement.type &&\r\n !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) ||\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT\r\n ? pickObject(startElement, [\r\n 'control',\r\n 'controlId',\r\n ...CONTROL_STYLE_ATTR\r\n ])\r\n : omitObject(startElement, ['type'])\r\n // 插入起始位置\r\n const start = range.startIndex + 1\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...anchorElement,\r\n ...data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n return start + data.length - 1\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const elementList = this.control.getElementList()\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n // backspace\r\n if (evt.key === KeyMap.Backspace) {\r\n // 清空选项\r\n if (startIndex !== endIndex) {\r\n return this.clearSelect()\r\n } else {\r\n if (\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT ||\r\n endElement.controlComponent === ControlComponent.POSTFIX ||\r\n endElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 清空选项\r\n return this.clearSelect()\r\n }\r\n }\r\n } else if (evt.key === KeyMap.Delete) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n // 清空选项\r\n return this.clearSelect()\r\n } else {\r\n const endNextElement = elementList[endIndex + 1]\r\n if (\r\n ((startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT) &&\r\n endNextElement.controlComponent === ControlComponent.PLACEHOLDER) ||\r\n endNextElement.controlComponent === ControlComponent.POSTFIX ||\r\n endNextElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 清空选项\r\n return this.clearSelect()\r\n }\r\n }\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n if (this.control.getIsDisabledControl()) {\r\n return -1\r\n }\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = this.control.getRange()\r\n if (startIndex === endIndex) {\r\n return startIndex\r\n }\r\n // 清空选项\r\n return this.clearSelect()\r\n }\r\n\r\n public clearSelect(\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n const { isIgnoreDisabledRule = false, isAddPlaceholder = true } = options\r\n // 校验是否可以设置\r\n if (!isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n let leftIndex = -1\r\n let rightIndex = -1\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n leftIndex = preIndex\r\n break\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n rightIndex = nextIndex - 1\r\n break\r\n }\r\n nextIndex++\r\n }\r\n if (!~leftIndex || !~rightIndex) return -1\r\n // 删除元素\r\n const draw = this.control.getDraw()\r\n draw.spliceElementList(\r\n elementList,\r\n leftIndex + 1,\r\n rightIndex - leftIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n // 增加占位符\r\n if (isAddPlaceholder) {\r\n this.control.addPlaceholder(preIndex, context)\r\n }\r\n this.control.setControlProperties(\r\n {\r\n code: null\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: preIndex, endIndex: preIndex }\r\n }\r\n )\r\n return preIndex\r\n }\r\n\r\n public setSelect(\r\n code: string,\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n const control = this.element.control!\r\n const newCodes = code?.split(this.VALUE_DELIMITER) || []\r\n // 缓存旧值\r\n const oldCode = control.code\r\n const oldCodes = control.code?.split(this.VALUE_DELIMITER) || []\r\n // 选项相同时无需重复渲染\r\n const isMultiSelect = control.isMultiSelect\r\n if (\r\n (!isMultiSelect && code === oldCode) ||\r\n (isMultiSelect && isArrayEqual(oldCodes, newCodes))\r\n ) {\r\n this.control.repaintControl({\r\n curIndex: range.startIndex,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n this.destroy()\r\n return\r\n }\r\n const valueSets = control.valueSets\r\n if (!Array.isArray(valueSets) || !valueSets.length) return\r\n // 转换文本\r\n const text = this.getText(newCodes)\r\n if (!text) {\r\n // 之前存在内容时清空文本\r\n if (oldCode) {\r\n const prefixIndex = this.clearSelect(context, {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n })\r\n if (~prefixIndex) {\r\n this.control.repaintControl({\r\n curIndex: prefixIndex\r\n })\r\n this.control.emitControlContentChange({\r\n controlValue: []\r\n })\r\n }\r\n }\r\n return\r\n }\r\n // 样式赋值元素-默认值的第一个字符样式,否则取默认样式\r\n const valueElement = this.getValue(context)[0]\r\n const styleElement = valueElement\r\n ? pickObject(valueElement, EDITOR_ELEMENT_STYLE_ATTR)\r\n : pickObject(elementList[range.startIndex], CONTROL_STYLE_ATTR)\r\n // 清空选项\r\n const prefixIndex = this.clearSelect(context, {\r\n isAddPlaceholder: false,\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n })\r\n if (!~prefixIndex) return\r\n // 当前无值时清空占位符\r\n if (!oldCode) {\r\n this.control.removePlaceholder(prefixIndex, context)\r\n }\r\n // 属性赋值元素-默认为前缀属性\r\n const propertyElement = omitObject(\r\n elementList[prefixIndex],\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n )\r\n const start = prefixIndex + 1\r\n const data = splitText(text)\r\n const draw = this.control.getDraw()\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...styleElement,\r\n ...propertyElement,\r\n type: ElementType.TEXT,\r\n value: data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], prefixIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n // 设置状态\r\n this.control.setControlProperties(\r\n {\r\n code\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: prefixIndex, endIndex: prefixIndex }\r\n }\r\n )\r\n // 重新渲染控件\r\n if (!context.range) {\r\n const newIndex = start + data.length - 1\r\n this.control.repaintControl({\r\n curIndex: newIndex\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n if (!isMultiSelect) {\r\n this.destroy()\r\n }\r\n }\r\n }\r\n\r\n private _createSelectPopupDom() {\r\n const control = this.element.control!\r\n const valueSets = control.valueSets\r\n if (!Array.isArray(valueSets) || !valueSets.length) return\r\n const position = this.control.getPosition()\r\n if (!position) return\r\n // dom树:<div><ul><li>item</li></ul></div>\r\n const selectPopupContainer = document.createElement('div')\r\n selectPopupContainer.classList.add(`${EDITOR_PREFIX}-select-control-popup`)\r\n selectPopupContainer.setAttribute(EDITOR_COMPONENT, EditorComponent.POPUP)\r\n const ul = document.createElement('ul')\r\n for (let v = 0; v < valueSets.length; v++) {\r\n const valueSet = valueSets[v]\r\n const li = document.createElement('li')\r\n let codes = this.getCodes()\r\n if (codes.includes(valueSet.code)) {\r\n li.classList.add('active')\r\n }\r\n li.onclick = () => {\r\n const codeIndex = codes.findIndex(code => code === valueSet.code)\r\n if (control.isMultiSelect) {\r\n if (~codeIndex) {\r\n codes.splice(codeIndex, 1)\r\n } else {\r\n codes.push(valueSet.code)\r\n }\r\n } else {\r\n if (~codeIndex) {\r\n codes = []\r\n } else {\r\n codes = [valueSet.code]\r\n }\r\n }\r\n this.setSelect(codes.join(this.VALUE_DELIMITER))\r\n }\r\n li.append(document.createTextNode(valueSet.value))\r\n ul.append(li)\r\n }\r\n selectPopupContainer.append(ul)\r\n // 定位\r\n const {\r\n coordinate: {\r\n leftTop: [left, top]\r\n },\r\n lineHeight\r\n } = position\r\n const preY = this.control.getPreY()\r\n selectPopupContainer.style.left = `${left}px`\r\n selectPopupContainer.style.top = `${top + preY + lineHeight}px`\r\n // 追加至container\r\n const container = this.control.getContainer()\r\n container.append(selectPopupContainer)\r\n this.selectDom = selectPopupContainer\r\n }\r\n\r\n public awake() {\r\n if (\r\n this.isPopup ||\r\n this.control.getIsDisabledControl() ||\r\n !this.control.getIsRangeWithinControl()\r\n ) {\r\n return\r\n }\r\n const { startIndex } = this.control.getRange()\r\n const elementList = this.control.getElementList()\r\n if (elementList[startIndex + 1]?.controlId !== this.element.controlId) {\r\n return\r\n }\r\n this._createSelectPopupDom()\r\n this.isPopup = true\r\n }\r\n\r\n public destroy() {\r\n if (!this.isPopup) return\r\n this.selectDom?.remove()\r\n this.isPopup = false\r\n }\r\n}\r\n","import {\r\n CONTROL_STYLE_ATTR,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { omitObject, pickObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { Control } from './Control'\r\n\r\nexport class TextControl implements IControlInstance {\r\n private element: IElement\r\n private control: Control\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(element: IElement, control: Control) {\r\n const draw = control.getDraw()\r\n this.options = draw.getOptions()\r\n this.element = element\r\n this.control = control\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getValue(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n data.unshift(preElement)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n data.push(nextElement)\r\n }\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public setValue(\r\n data: IElement[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary(context)\r\n const { startIndex, endIndex } = range\r\n const draw = this.control.getDraw()\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n } else {\r\n // 移除空白占位符\r\n this.control.removePlaceholder(startIndex, context)\r\n }\r\n // 非文本类元素或前缀过渡掉样式属性\r\n const startElement = elementList[startIndex]\r\n const anchorElement =\r\n (startElement.type &&\r\n !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) ||\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT\r\n ? pickObject(startElement, [\r\n 'control',\r\n 'controlId',\r\n ...CONTROL_STYLE_ATTR\r\n ])\r\n : omitObject(startElement, ['type'])\r\n // 插入起始位置\r\n const start = range.startIndex + 1\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...anchorElement,\r\n ...data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n return start + data.length - 1\r\n }\r\n\r\n public clearValue(\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n const { startIndex, endIndex } = range\r\n this.control\r\n .getDraw()\r\n .spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n const value = this.getValue(context)\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex, context)\r\n }\r\n return startIndex\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const elementList = this.control.getElementList()\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n const draw = this.control.getDraw()\r\n // backspace\r\n if (evt.key === KeyMap.Backspace) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n if (\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT ||\r\n endElement.controlComponent === ControlComponent.POSTFIX ||\r\n endElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex - 1)\r\n }\r\n return startIndex - 1\r\n }\r\n }\r\n } else if (evt.key === KeyMap.Delete) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n const endNextElement = elementList[endIndex + 1]\r\n if (\r\n ((startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT) &&\r\n endNextElement.controlComponent === ControlComponent.PLACEHOLDER) ||\r\n endNextElement.controlComponent === ControlComponent.POSTFIX ||\r\n endNextElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex + 1, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n }\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n if (this.control.getIsDisabledControl()) {\r\n return -1\r\n }\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = this.control.getRange()\r\n if (startIndex === endIndex) {\r\n return startIndex\r\n }\r\n const draw = this.control.getDraw()\r\n const elementList = this.control.getElementList()\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n}\r\n","import {\r\n CONTROL_STYLE_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { omitObject, pickObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../../draw/Draw'\r\nimport { DatePicker } from '../../plugin-stubs'\r\nimport { Control } from '../Control'\r\n\r\nexport class DateControl implements IControlInstance {\r\n private draw: Draw\r\n private element: IElement\r\n private control: Control\r\n private isPopup: boolean\r\n private datePicker: DatePicker | null\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(element: IElement, control: Control) {\r\n const draw = control.getDraw()\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.element = element\r\n this.control = control\r\n this.isPopup = false\r\n this.datePicker = null\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getIsPopup(): boolean {\r\n return this.isPopup\r\n }\r\n\r\n public getValueRange(context: IControlContext = {}): [number, number] | null {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n nextIndex++\r\n }\r\n if (preIndex === nextIndex) return null\r\n return [preIndex, nextIndex - 1]\r\n }\r\n\r\n public getValue(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = this.getValueRange(context)\r\n if (!range) return []\r\n const data: IElement[] = []\r\n const [startIndex, endIndex] = range\r\n for (let i = startIndex; i <= endIndex; i++) {\r\n const element = elementList[i]\r\n if (element.controlComponent === ControlComponent.VALUE) {\r\n data.push(element)\r\n }\r\n }\r\n return data\r\n }\r\n\r\n public setValue(\r\n data: IElement[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary(context)\r\n const { startIndex, endIndex } = range\r\n const draw = this.control.getDraw()\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n } else {\r\n // 移除空白占位符\r\n this.control.removePlaceholder(startIndex, context)\r\n }\r\n // 非文本类元素或前缀过渡掉样式属性\r\n const startElement = elementList[startIndex]\r\n const anchorElement =\r\n (startElement.type &&\r\n !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) ||\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT\r\n ? pickObject(startElement, [\r\n 'control',\r\n 'controlId',\r\n ...CONTROL_STYLE_ATTR\r\n ])\r\n : omitObject(startElement, ['type'])\r\n // 插入起始位置\r\n const start = range.startIndex + 1\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...anchorElement,\r\n ...data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n return start + data.length - 1\r\n }\r\n\r\n public clearSelect(\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n const { isIgnoreDisabledRule = false, isAddPlaceholder = true } = options\r\n // 校验是否可以设置\r\n if (!isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\r\n return -1\r\n }\r\n const range = this.getValueRange(context)\r\n if (!range) return -1\r\n const [leftIndex, rightIndex] = range\r\n if (!~leftIndex || !~rightIndex) return -1\r\n const elementList = context.elementList || this.control.getElementList()\r\n // 删除元素\r\n const draw = this.control.getDraw()\r\n draw.spliceElementList(\r\n elementList,\r\n leftIndex + 1,\r\n rightIndex - leftIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n // 增加占位符\r\n if (isAddPlaceholder) {\r\n this.control.addPlaceholder(leftIndex, context)\r\n }\r\n return leftIndex\r\n }\r\n\r\n public setSelect(\r\n date: string,\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 样式赋值元素-默认值的第一个字符样式,否则取默认样式\r\n const valueElement = this.getValue(context)[0]\r\n const styleElement = valueElement\r\n ? pickObject(valueElement, EDITOR_ELEMENT_STYLE_ATTR)\r\n : pickObject(elementList[range.startIndex], CONTROL_STYLE_ATTR)\r\n // 清空选项\r\n const prefixIndex = this.clearSelect(context, {\r\n isAddPlaceholder: false,\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n })\r\n if (!~prefixIndex) return\r\n // 属性赋值元素-默认为前缀属性\r\n const propertyElement = omitObject(\r\n elementList[prefixIndex],\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n )\r\n const start = prefixIndex + 1\r\n const draw = this.control.getDraw()\r\n for (let i = 0; i < date.length; i++) {\r\n const newElement: IElement = {\r\n ...styleElement,\r\n ...propertyElement,\r\n type: ElementType.TEXT,\r\n value: date[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], prefixIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n // 重新渲染控件\r\n if (!context.range) {\r\n const newIndex = start + date.length - 1\r\n this.control.repaintControl({\r\n curIndex: newIndex\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n this.destroy()\r\n }\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const elementList = this.control.getElementList()\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n const draw = this.control.getDraw()\r\n // backspace\r\n if (evt.key === KeyMap.Backspace) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n if (\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT ||\r\n endElement.controlComponent === ControlComponent.POSTFIX ||\r\n endElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex - 1)\r\n }\r\n return startIndex - 1\r\n }\r\n }\r\n } else if (evt.key === KeyMap.Delete) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n const endNextElement = elementList[endIndex + 1]\r\n if (\r\n ((startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT) &&\r\n endNextElement.controlComponent === ControlComponent.PLACEHOLDER) ||\r\n endNextElement.controlComponent === ControlComponent.POSTFIX ||\r\n endNextElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex + 1, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n }\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n if (this.control.getIsDisabledControl()) {\r\n return -1\r\n }\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = this.control.getRange()\r\n if (startIndex === endIndex) {\r\n return startIndex\r\n }\r\n const draw = this.control.getDraw()\r\n const elementList = this.control.getElementList()\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n\r\n public awake() {\r\n if (\r\n this.isPopup ||\r\n this.control.getIsDisabledControl() ||\r\n !this.control.getIsRangeWithinControl()\r\n ) {\r\n return\r\n }\r\n const position = this.control.getPosition()\r\n if (!position) return\r\n const elementList = this.draw.getElementList()\r\n const { startIndex } = this.control.getRange()\r\n if (elementList[startIndex + 1]?.controlId !== this.element.controlId) {\r\n return\r\n }\r\n // 渲染日期控件\r\n this.datePicker = new DatePicker(this.draw, {\r\n onSubmit: this._setDate.bind(this)\r\n })\r\n const value =\r\n this.getValue()\r\n .map(el => el.value)\r\n .join('') || ''\r\n const dateFormat = this.element.control?.dateFormat\r\n this.datePicker.render({\r\n value,\r\n position,\r\n dateFormat\r\n })\r\n // 弹窗状态\r\n this.isPopup = true\r\n }\r\n\r\n public destroy() {\r\n if (!this.isPopup) return\r\n this.datePicker?.destroy()\r\n this.isPopup = false\r\n }\r\n\r\n private _setDate(date: string) {\r\n if (!date) {\r\n this.clearSelect()\r\n } else {\r\n this.setSelect(date)\r\n }\r\n this.destroy()\r\n }\r\n}\r\n","import { TextControl } from './TextControl'\r\n\r\nexport class NumberControl extends TextControl {}\r\n","import {\r\n ControlComponent,\r\n ControlState,\r\n ControlType\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode, EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControl,\r\n IControlChangeOption,\r\n IControlChangeResult,\r\n IControlContentChangeResult,\r\n IControlContext,\r\n IControlHighlight,\r\n IControlInitOption,\r\n IControlInstance,\r\n IControlOption,\r\n IControlRuleOption,\r\n IDestroyControlOption,\r\n IGetControlValueOption,\r\n IGetControlValueResult,\r\n IInitNextControlOption,\r\n INextControlContext,\r\n IRepaintControlOption,\r\n ISetControlExtensionOption,\r\n ISetControlProperties,\r\n ISetControlRowFlexOption,\r\n ISetControlValueOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorData, IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { IRange } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n deepClone,\r\n isArray,\r\n isString,\r\n omitObject,\r\n pickObject,\r\n splitText\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n formatElementContext,\r\n formatElementList,\r\n getNonHideElementIndex,\r\n pickElementAttr,\r\n zipElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { Listener } from '@vervedoc/docx-editor-state'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../draw/Draw'\r\nimport { CheckboxControl } from './CheckboxControl'\r\nimport { RadioControl } from './radio/RadioControl'\r\nimport { ControlSearch } from './ControlSearch'\r\nimport { ControlBorder } from './Border'\r\nimport { SelectControl } from './SelectControl'\r\nimport { TextControl } from './TextControl'\r\nimport { DateControl } from './date/DateControl'\r\nimport { NumberControl } from './NumberControl'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n CONTROL_CONTEXT_ATTR,\r\n CONTROL_STYLE_ATTR,\r\n LIST_CONTEXT_ATTR,\r\n TITLE_CONTEXT_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport { ZERO } from '@vervedoc/docx-editor-schema'\r\n\r\ninterface IMoveCursorResult {\r\n newIndex: number\r\n newElement: IElement\r\n}\r\nexport class Control {\r\n private controlBorder: ControlBorder\r\n private draw: Draw\r\n private range: RangeManager\r\n private listener: Listener\r\n private eventBus: EventBus<EventBusMap>\r\n private controlSearch: ControlSearch\r\n private options: DeepRequired<IEditorOption>\r\n private controlOptions: IControlOption\r\n private activeControl: IControlInstance | null\r\n private activeControlValue: IElement[]\r\n private preElement: IElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.controlBorder = new ControlBorder(draw)\r\n\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.listener = draw.getListener()\r\n this.eventBus = draw.getEventBus()\r\n this.controlSearch = new ControlSearch(this)\r\n\r\n this.options = draw.getOptions()\r\n this.controlOptions = this.options.control\r\n this.activeControl = null\r\n this.activeControlValue = []\r\n this.preElement = null\r\n }\r\n\r\n // 搜索高亮匹配\r\n public setHighlightList(payload: IControlHighlight[]) {\r\n this.controlSearch.setHighlightList(payload)\r\n }\r\n\r\n public computeHighlightList() {\r\n const highlightList = this.controlSearch.getHighlightList()\r\n if (highlightList.length) {\r\n this.controlSearch.computeHighlightList()\r\n }\r\n }\r\n\r\n public renderHighlightList(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const highlightMatchResult = this.controlSearch.getHighlightMatchResult()\r\n if (highlightMatchResult.length) {\r\n this.controlSearch.renderHighlightList(ctx, pageNo)\r\n }\r\n }\r\n\r\n public getDraw(): Draw {\r\n return this.draw\r\n }\r\n\r\n // 过滤控件辅助元素(前后缀、背景提示)\r\n public filterAssistElement(elementList: IElement[]): IElement[] {\r\n return elementList.filter((element, index) => {\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n td.value = this.filterAssistElement(td.value)\r\n }\r\n }\r\n }\r\n if (!element.controlId) return true\r\n if (element.control?.minWidth) {\r\n if (\r\n element.controlComponent === ControlComponent.PREFIX ||\r\n element.controlComponent === ControlComponent.POSTFIX\r\n ) {\r\n element.value = ''\r\n return true\r\n }\r\n } else {\r\n // 控件存在值时无需过滤前后文本\r\n if (\r\n element.control?.preText &&\r\n element.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n let isExistValue = false\r\n let start = index + 1\r\n while (start < elementList.length) {\r\n const nextElement = elementList[start]\r\n if (element.controlId !== nextElement.controlId) break\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n isExistValue = true\r\n break\r\n }\r\n start++\r\n }\r\n return isExistValue\r\n }\r\n if (\r\n element.control?.postText &&\r\n element.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n let isExistValue = false\r\n let start = index - 1\r\n while (start < elementList.length) {\r\n const preElement = elementList[start]\r\n if (element.controlId !== preElement.controlId) break\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n isExistValue = true\r\n break\r\n }\r\n start--\r\n }\r\n return isExistValue\r\n }\r\n }\r\n return (\r\n element.controlComponent !== ControlComponent.PREFIX &&\r\n element.controlComponent !== ControlComponent.POSTFIX &&\r\n element.controlComponent !== ControlComponent.PLACEHOLDER\r\n )\r\n })\r\n }\r\n\r\n // 是否属于控件可以捕获事件的选区\r\n public getIsRangeCanCaptureEvent(): boolean {\r\n if (!this.activeControl) return false\r\n const { startIndex, endIndex } = this.getRange()\r\n if (!~startIndex && !~endIndex) return false\r\n const elementList = this.getElementList()\r\n const startElement = elementList[startIndex]\r\n // 闭合光标在后缀处\r\n if (\r\n startIndex === endIndex &&\r\n startElement.controlComponent === ControlComponent.POSTFIX\r\n ) {\r\n return true\r\n }\r\n // 在控件内\r\n const endElement = elementList[endIndex]\r\n if (\r\n startElement.controlId &&\r\n startElement.controlId === endElement.controlId &&\r\n endElement.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // 判断选区是否在后缀处\r\n public getIsRangeInPostfix(): boolean {\r\n if (!this.activeControl) return false\r\n const { startIndex, endIndex } = this.getRange()\r\n if (startIndex !== endIndex) return false\r\n const elementList = this.getElementList()\r\n const element = elementList[startIndex]\r\n return element.controlComponent === ControlComponent.POSTFIX\r\n }\r\n\r\n // 判断选区是否在控件内\r\n public getIsRangeWithinControl(): boolean {\r\n const { startIndex, endIndex } = this.getRange()\r\n if (!~startIndex && !~endIndex) return false\r\n const elementList = this.getElementList()\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n if (\r\n startElement?.controlId &&\r\n startElement.controlId === endElement.controlId &&\r\n endElement.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // 是否元素包含完整控件元素\r\n public getIsElementListContainFullControl(elementList: IElement[]): boolean {\r\n if (!elementList.some(element => element.controlId)) return false\r\n let prefixCount = 0\r\n let postfixCount = 0\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.controlComponent === ControlComponent.PREFIX) {\r\n prefixCount++\r\n } else if (element.controlComponent === ControlComponent.POSTFIX) {\r\n postfixCount++\r\n }\r\n }\r\n if (!prefixCount || !postfixCount) return false\r\n return prefixCount === postfixCount\r\n }\r\n\r\n public getIsDisabledControl(context: IControlContext = {}): boolean {\r\n if (this.draw.isDesignMode() || !this.activeControl) return false\r\n const { startIndex, endIndex } = context.range || this.range.getRange()\r\n if (startIndex === endIndex && ~startIndex && ~endIndex) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n if (startElement.controlComponent === ControlComponent.POSTFIX) {\r\n return false\r\n }\r\n }\r\n return !!this.activeControl.getElement()?.control?.disabled\r\n }\r\n\r\n public getIsDisabledPasteControl(context: IControlContext = {}): boolean {\r\n if (this.draw.isDesignMode() || !this.activeControl) return false\r\n const { startIndex, endIndex } = context.range || this.range.getRange()\r\n if (startIndex === endIndex && ~startIndex && ~endIndex) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n if (startElement.controlComponent === ControlComponent.POSTFIX) {\r\n return false\r\n }\r\n }\r\n return !!this.activeControl.getElement()?.control?.pasteDisabled\r\n }\r\n\r\n // 通过索引找到控件并判断控件是否存在值\r\n public getIsExistValueByElementListIndex(\r\n elementList: IElement[],\r\n index: number\r\n ): boolean {\r\n const element = elementList[index]\r\n // 是否是控件\r\n if (!element.controlId) return false\r\n // 单选框、复选框仅需验证控件值\r\n if (\r\n element.control?.type === ControlType.CHECKBOX ||\r\n element.control?.type === ControlType.RADIO\r\n ) {\r\n return !!element.control?.code\r\n }\r\n // 其他控件需校验文本\r\n if (element.controlComponent === ControlComponent.VALUE) {\r\n return true\r\n }\r\n if (element.controlComponent === ControlComponent.PLACEHOLDER) {\r\n return false\r\n }\r\n // 向后查找值元素\r\n if (\r\n element.controlComponent === ControlComponent.PREFIX ||\r\n element.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n let i = index + 1\r\n while (i < elementList.length) {\r\n const nextElement = elementList[i]\r\n if (nextElement.controlId !== element.controlId) {\r\n return false\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n return true\r\n }\r\n if (nextElement.controlComponent === ControlComponent.PLACEHOLDER) {\r\n return false\r\n }\r\n i++\r\n }\r\n }\r\n // 向前查找值元素\r\n if (\r\n element.controlComponent === ControlComponent.POSTFIX ||\r\n element.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n let i = index - 1\r\n while (i >= 0) {\r\n const preElement = elementList[i]\r\n if (preElement.controlId !== element.controlId) {\r\n return false\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n return true\r\n }\r\n if (preElement.controlComponent === ControlComponent.PLACEHOLDER) {\r\n return false\r\n }\r\n i--\r\n }\r\n }\r\n return false\r\n }\r\n\r\n public getControlHighlight(elementList: IElement[], index: number) {\r\n return this.controlSearch.getControlHighlight(elementList, index)\r\n }\r\n\r\n public getContainer(): HTMLDivElement {\r\n return this.draw.getContainer()\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n return this.draw.getElementList()\r\n }\r\n\r\n public getPosition(): IElementPosition | null {\r\n const positionList = this.draw.getPosition().getPositionList()\r\n const { endIndex } = this.range.getRange()\r\n return positionList[endIndex] || null\r\n }\r\n\r\n public getPreY(): number {\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const pageNo = this.getPosition()?.pageNo ?? this.draw.getPageNo()\r\n return pageNo * (height + pageGap)\r\n }\r\n\r\n public getRange(): IRange {\r\n return this.range.getRange()\r\n }\r\n\r\n public shrinkBoundary(context: IControlContext = {}) {\r\n this.range.shrinkBoundary(context)\r\n }\r\n\r\n public getActiveControl(): IControlInstance | null {\r\n return this.activeControl\r\n }\r\n\r\n public getControlElementList(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.getElementList()\r\n const { startIndex } = context.range || this.getRange()\r\n const startElement = elementList[startIndex]\r\n if (!startElement?.controlId) return []\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlId !== startElement.controlId) break\r\n data.unshift(preElement)\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.controlId !== startElement.controlId) break\r\n data.push(nextElement)\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public updateActiveControlValue() {\r\n if (this.activeControl) {\r\n this.activeControlValue = this.getControlElementList()\r\n }\r\n }\r\n\r\n public emitControlChange(state: ControlState) {\r\n if (!this.activeControl) return\r\n const isSubscribeControlChange = this.eventBus.hasSubscribers('controlChange')\r\n if (!this.listener.controlChange && !isSubscribeControlChange) return\r\n let control: IControl\r\n const value = this.activeControlValue\r\n const activeElement = this.activeControl.getElement()\r\n if (value?.length) {\r\n control = zipElementList(value)[0].control!\r\n } else {\r\n control = pickElementAttr(deepClone(activeElement)).control!\r\n control.value = []\r\n }\r\n const payload: IControlChangeResult = {\r\n state,\r\n control,\r\n controlId: activeElement.controlId!\r\n }\r\n this.listener.controlChange?.(payload)\r\n if (isSubscribeControlChange) {\r\n this.eventBus.emit('controlChange', payload)\r\n }\r\n }\r\n\r\n public initControl() {\r\n const elementList = this.getElementList()\r\n const range = this.getRange()\r\n const element = elementList[range.startIndex]\r\n // 判断控件是否已经激活\r\n if (this.activeControl) {\r\n // 弹窗类控件唤醒弹窗,后缀处移除弹窗\r\n if (\r\n this.activeControl instanceof SelectControl ||\r\n this.activeControl instanceof DateControl\r\n ) {\r\n if (element.controlComponent === ControlComponent.POSTFIX) {\r\n this.activeControl.destroy()\r\n } else {\r\n this.activeControl.awake()\r\n }\r\n }\r\n // 相同控件元素\r\n if (this.preElement?.controlId === element.controlId) {\r\n // 当前元素在尾部:控件失活事件\r\n if (element.controlComponent === ControlComponent.POSTFIX) {\r\n this.emitControlChange(ControlState.INACTIVE)\r\n } else if (\r\n // 之前元素在尾部 && 当前不在尾部:控件激活事件\r\n this.preElement?.controlComponent === ControlComponent.POSTFIX\r\n ) {\r\n this.emitControlChange(ControlState.ACTIVE)\r\n }\r\n }\r\n // 更新缓存控件数据\r\n const controlElement = this.activeControl.getElement()\r\n if (element.controlId === controlElement.controlId) {\r\n this.updateActiveControlValue()\r\n this.preElement = element\r\n return\r\n }\r\n }\r\n // 销毁旧激活控件\r\n this.destroyControl()\r\n // 激活控件\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const control = element.control!\r\n if (control.type === ControlType.TEXT) {\r\n this.activeControl = new TextControl(element, this)\r\n } else if (control.type === ControlType.SELECT) {\r\n const selectControl = new SelectControl(element, this)\r\n this.activeControl = selectControl\r\n selectControl.awake()\r\n } else if (control.type === ControlType.CHECKBOX) {\r\n this.activeControl = new CheckboxControl(element, this)\r\n } else if (control.type === ControlType.RADIO) {\r\n this.activeControl = new RadioControl(element, this)\r\n } else if (control.type === ControlType.DATE) {\r\n const dateControl = new DateControl(element, this)\r\n this.activeControl = dateControl\r\n dateControl.awake()\r\n } else if (control.type === ControlType.NUMBER) {\r\n this.activeControl = new NumberControl(element, this)\r\n }\r\n // 缓存控件数据\r\n this.updateActiveControlValue()\r\n this.preElement = element\r\n // 激活控件回调\r\n if (element.controlComponent !== ControlComponent.POSTFIX) {\r\n this.emitControlChange(ControlState.ACTIVE)\r\n }\r\n }\r\n\r\n public destroyControl(options: IDestroyControlOption = {}) {\r\n if (!this.activeControl) return\r\n const { isEmitEvent = true } = options\r\n if (\r\n this.activeControl instanceof SelectControl ||\r\n this.activeControl instanceof DateControl\r\n ) {\r\n this.activeControl.destroy()\r\n }\r\n // 销毁控件回调\r\n if (\r\n isEmitEvent &&\r\n this.preElement?.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n this.emitControlChange(ControlState.INACTIVE)\r\n }\r\n // 清空变量\r\n this.preElement = null\r\n this.activeControl = null\r\n this.activeControlValue = []\r\n }\r\n\r\n public repaintControl(options: IRepaintControlOption = {}) {\r\n const {\r\n curIndex,\r\n isCompute = true,\r\n isSubmitHistory = true,\r\n isSetCursor = true\r\n } = options\r\n // 重新渲染\r\n if (curIndex === undefined) {\r\n this.range.clearRange()\r\n this.draw.render({\r\n isCompute,\r\n isSubmitHistory,\r\n isSetCursor: false\r\n })\r\n } else {\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render({\r\n curIndex,\r\n isCompute,\r\n isSetCursor,\r\n isSubmitHistory\r\n })\r\n }\r\n }\r\n\r\n public emitControlContentChange(options?: IControlChangeOption) {\r\n const isSubscribeControlContentChange = this.eventBus.hasSubscribers(\r\n 'controlContentChange'\r\n )\r\n if (\r\n !isSubscribeControlContentChange &&\r\n !this.listener.controlContentChange\r\n ) {\r\n return\r\n }\r\n const controlElement =\r\n options?.controlElement || this.activeControl?.getElement()\r\n if (!controlElement) return\r\n // 控件被删除不触发事件\r\n const elementList = options?.context?.elementList || this.getElementList()\r\n const { startIndex } = options?.context?.range || this.getRange()\r\n if (!elementList[startIndex]?.controlId) return\r\n // 格式化回调数据\r\n const controlValue =\r\n options?.controlValue || this.getControlElementList(options?.context)\r\n let control: IControl\r\n if (controlValue?.length) {\r\n control = zipElementList(controlValue)[0].control!\r\n } else {\r\n control = controlElement.control!\r\n control.value = []\r\n }\r\n if (!control) return\r\n const payload: IControlContentChangeResult = {\r\n control,\r\n controlId: controlElement.controlId!\r\n }\r\n this.listener.controlContentChange?.(payload)\r\n if (isSubscribeControlContentChange) {\r\n this.eventBus.emit('controlContentChange', payload)\r\n }\r\n }\r\n\r\n public reAwakeControl() {\r\n if (!this.activeControl) return\r\n const elementList = this.getElementList()\r\n const range = this.getRange()\r\n const element = elementList[range.startIndex]\r\n this.activeControl.setElement(element)\r\n if (\r\n (this.activeControl instanceof DateControl ||\r\n this.activeControl instanceof SelectControl) &&\r\n this.activeControl.getIsPopup()\r\n ) {\r\n this.activeControl.destroy()\r\n this.activeControl.awake()\r\n }\r\n }\r\n\r\n public moveCursor(position: IControlInitOption): IMoveCursorResult {\r\n const { index, trIndex, tdIndex, tdValueIndex } = position\r\n let elementList = this.draw.getOriginalElementList()\r\n let element: IElement\r\n const newIndex = position.isTable ? tdValueIndex! : index\r\n if (position.isTable) {\r\n elementList = elementList[index!].trList![trIndex!].tdList[tdIndex!].value\r\n element = elementList[tdValueIndex!]\r\n } else {\r\n element = elementList[index]\r\n }\r\n // 隐藏元素移动光标\r\n if (element.control?.hide || element.area?.hide) {\r\n const nonHideIndex = getNonHideElementIndex(elementList, newIndex)\r\n return {\r\n newIndex: nonHideIndex,\r\n newElement: elementList[nonHideIndex]\r\n }\r\n }\r\n // 控件内移动光标\r\n if (element.controlComponent === ControlComponent.VALUE) {\r\n // VALUE-无需移动\r\n return {\r\n newIndex,\r\n newElement: element\r\n }\r\n } else if (element.controlComponent === ControlComponent.POSTFIX) {\r\n // POSTFIX-移动到最后一个后缀字符后\r\n let startIndex = newIndex + 1\r\n while (startIndex < elementList.length) {\r\n const nextElement = elementList[startIndex]\r\n if (nextElement.controlId !== element.controlId) {\r\n return {\r\n newIndex: startIndex - 1,\r\n newElement: elementList[startIndex - 1]\r\n }\r\n }\r\n startIndex++\r\n }\r\n } else if (\r\n element.controlComponent === ControlComponent.PREFIX ||\r\n element.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n // PREFIX或前文本-移动到最后一个前缀字符后\r\n let startIndex = newIndex + 1\r\n while (startIndex < elementList.length) {\r\n const nextElement = elementList[startIndex]\r\n if (\r\n nextElement.controlId !== element.controlId ||\r\n (nextElement.controlComponent !== ControlComponent.PREFIX &&\r\n nextElement.controlComponent !== ControlComponent.PRE_TEXT)\r\n ) {\r\n return {\r\n newIndex: startIndex - 1,\r\n newElement: elementList[startIndex - 1]\r\n }\r\n }\r\n startIndex++\r\n }\r\n } else if (\r\n element.controlComponent === ControlComponent.PLACEHOLDER ||\r\n element.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n // PLACEHOLDER或后文本-移动到第一个前缀或内容后\r\n let startIndex = newIndex - 1\r\n while (startIndex > 0) {\r\n const preElement = elementList[startIndex]\r\n if (\r\n preElement.controlId !== element.controlId ||\r\n preElement.controlComponent === ControlComponent.VALUE ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n return {\r\n newIndex: startIndex,\r\n newElement: elementList[startIndex]\r\n }\r\n }\r\n startIndex--\r\n }\r\n }\r\n return {\r\n newIndex,\r\n newElement: element\r\n }\r\n }\r\n\r\n public removeControl(\r\n startIndex: number,\r\n context: IControlContext = {}\r\n ): number | null {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n // 设计模式 || 元素隐藏 => 不验证删除权限\r\n if (\r\n !this.draw.isDesignMode() &&\r\n !startElement?.control?.hide &&\r\n !startElement?.area?.hide\r\n ) {\r\n const { deletable = true } = startElement.control!\r\n if (!deletable) return null\r\n // 表单模式控件删除权限验证\r\n const mode = this.draw.getMode()\r\n if (\r\n mode === EditorMode.FORM &&\r\n this.options.modeRule[mode].controlDeletableDisabled\r\n ) {\r\n return null\r\n }\r\n }\r\n let leftIndex = -1\r\n let rightIndex = -1\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlId !== startElement.controlId) {\r\n leftIndex = preIndex\r\n break\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.controlId !== startElement.controlId) {\r\n rightIndex = nextIndex - 1\r\n break\r\n }\r\n nextIndex++\r\n }\r\n // 控件在最后\r\n if (nextIndex === elementList.length) {\r\n rightIndex = nextIndex - 1\r\n }\r\n if (!~leftIndex && !~rightIndex) return startIndex\r\n leftIndex = ~leftIndex ? leftIndex : 0\r\n // 删除元素\r\n this.draw.spliceElementList(\r\n elementList,\r\n leftIndex + 1,\r\n rightIndex - leftIndex\r\n )\r\n return leftIndex\r\n }\r\n\r\n public removePlaceholder(startIndex: number, context: IControlContext = {}) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n const nextElement = elementList[startIndex + 1]\r\n if (\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER ||\r\n nextElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n let isHasSubmitHistory = false\r\n let index = startIndex\r\n while (index < elementList.length) {\r\n const curElement = elementList[index]\r\n if (curElement.controlId !== startElement.controlId) break\r\n if (curElement.controlComponent === ControlComponent.PLACEHOLDER) {\r\n // 删除占位符时替换前一个历史记录\r\n if (!isHasSubmitHistory) {\r\n isHasSubmitHistory = true\r\n this.draw.getHistoryManager().popUndo()\r\n this.draw.submitHistory(startIndex)\r\n }\r\n elementList.splice(index, 1)\r\n } else {\r\n index++\r\n }\r\n }\r\n }\r\n }\r\n\r\n public addPlaceholder(startIndex: number, context: IControlContext = {}) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n const control = startElement.control!\r\n if (!control.placeholder) return\r\n const placeholderStrList = splitText(control.placeholder)\r\n // 优先使用默认控件样式\r\n const anchorElementStyleAttr = pickObject(startElement, CONTROL_STYLE_ATTR)\r\n for (let p = 0; p < placeholderStrList.length; p++) {\r\n const value = placeholderStrList[p]\r\n const newElement: IElement = {\r\n ...anchorElementStyleAttr,\r\n value: value === '\\n' ? ZERO : value,\r\n controlId: startElement.controlId,\r\n type: ElementType.CONTROL,\r\n control: startElement.control,\r\n controlComponent: ControlComponent.PLACEHOLDER,\r\n color: this.controlOptions.placeholderColor\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n this.draw.spliceElementList(elementList, startIndex + p + 1, 0, [\r\n newElement\r\n ])\r\n }\r\n }\r\n\r\n public setValue(data: IElement[]): number {\r\n if (!this.activeControl) {\r\n throw new Error('active control is null')\r\n }\r\n return this.activeControl.setValue(data)\r\n }\r\n\r\n public setControlProperties(\r\n properties: Partial<IControl>,\r\n context: IControlContext = {}\r\n ) {\r\n const elementList = context.elementList || this.getElementList()\r\n const { startIndex } = context.range || this.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlId !== startElement.controlId) break\r\n preElement.control = {\r\n ...preElement.control!,\r\n ...properties\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.controlId !== startElement.controlId) break\r\n nextElement.control = {\r\n ...nextElement.control!,\r\n ...properties\r\n }\r\n nextIndex++\r\n }\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (!this.activeControl) {\r\n throw new Error('active control is null')\r\n }\r\n return this.activeControl.keydown(evt)\r\n }\r\n\r\n public cut(): number {\r\n if (!this.activeControl) {\r\n throw new Error('active control is null')\r\n }\r\n return this.activeControl.cut()\r\n }\r\n\r\n public getValueById(payload: IGetControlValueOption): IGetControlValueResult {\r\n const { id, conceptId, areaId } = payload\r\n const result: IGetControlValueResult = []\r\n if (!id && !conceptId) return result\r\n const getValue = (elementList: IElement[], zone: EditorZone) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n getValue(td.value, zone)\r\n }\r\n }\r\n }\r\n if (\r\n !element.control ||\r\n (id && element.controlId !== id) ||\r\n (conceptId && element.control.conceptId !== conceptId) ||\r\n (areaId && element.areaId !== areaId)\r\n ) {\r\n continue\r\n }\r\n const { type, code, valueSets } = element.control\r\n let j = i\r\n let textControlValue = ''\r\n const textControlElementList = []\r\n while (j < elementList.length) {\r\n const nextElement = elementList[j]\r\n if (nextElement.controlId !== element.controlId) break\r\n if (\r\n (type === ControlType.TEXT ||\r\n type === ControlType.DATE ||\r\n type === ControlType.NUMBER) &&\r\n nextElement.controlComponent === ControlComponent.VALUE\r\n ) {\r\n textControlValue += nextElement.value\r\n textControlElementList.push(\r\n omitObject(nextElement, CONTROL_CONTEXT_ATTR)\r\n )\r\n }\r\n j++\r\n }\r\n if (\r\n type === ControlType.TEXT ||\r\n type === ControlType.DATE ||\r\n type === ControlType.NUMBER\r\n ) {\r\n result.push({\r\n ...element.control,\r\n zone,\r\n value: textControlValue || null,\r\n innerText: textControlValue || null,\r\n elementList: zipElementList(textControlElementList)\r\n })\r\n } else if (\r\n type === ControlType.SELECT ||\r\n type === ControlType.CHECKBOX ||\r\n type === ControlType.RADIO\r\n ) {\r\n const innerText = code\r\n ?.split(',')\r\n .map(\r\n selectCode =>\r\n valueSets?.find(valueSet => valueSet.code === selectCode)?.value\r\n )\r\n .filter(Boolean)\r\n .join('')\r\n result.push({\r\n ...element.control,\r\n zone,\r\n value: code || null,\r\n innerText: innerText || null\r\n })\r\n }\r\n i = j\r\n }\r\n }\r\n const data = [\r\n {\r\n zone: EditorZone.HEADER,\r\n elementList: this.draw.getHeaderElementList()\r\n },\r\n {\r\n zone: EditorZone.MAIN,\r\n elementList: this.draw.getOriginalMainElementList()\r\n },\r\n {\r\n zone: EditorZone.FOOTER,\r\n elementList: this.draw.getFooterElementList()\r\n }\r\n ]\r\n for (const { zone, elementList } of data) {\r\n getValue(elementList, zone)\r\n }\r\n return result\r\n }\r\n\r\n public setValueListById(payload: ISetControlValueOption[]) {\r\n if (!payload.length) return\r\n let isExistSet = false\r\n let isExistSubmitHistory = false\r\n // 设置值\r\n const setValue = (elementList: IElement[]) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n setValue(td.value)\r\n }\r\n }\r\n }\r\n if (!element.control) continue\r\n // 获取设置值优先id、conceptId、areaId\r\n const payloadItem = payload.find(\r\n p =>\r\n (p.id && element.controlId === p.id) ||\r\n (p.conceptId && element.control!.conceptId === p.conceptId) ||\r\n (p.areaId && element.areaId === p.areaId)\r\n )\r\n if (!payloadItem) continue\r\n const { value, isSubmitHistory = true } = payloadItem\r\n // 只要存在一次保存历史均记录\r\n isExistSet = true\r\n if (isSubmitHistory) {\r\n isExistSubmitHistory = true\r\n }\r\n const { type } = element.control!\r\n // 当前控件结束索引\r\n let currentEndIndex = i\r\n while (currentEndIndex < elementList.length) {\r\n const nextElement = elementList[currentEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n currentEndIndex++\r\n }\r\n // 模拟光标选区上下文\r\n const fakeRange = {\r\n startIndex: i - 1,\r\n endIndex: currentEndIndex - 2\r\n }\r\n const controlContext: IControlContext = {\r\n range: fakeRange,\r\n elementList\r\n }\r\n const controlRule: IControlRuleOption = {\r\n isIgnoreDisabledRule: true,\r\n isIgnoreDeletedRule: true\r\n }\r\n if (type === ControlType.TEXT) {\r\n const formatValue = Array.isArray(value)\r\n ? value\r\n : value\r\n ? [{ value }]\r\n : []\r\n if (formatValue.length) {\r\n formatElementList(formatValue, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n }\r\n const text = new TextControl(element, this)\r\n this.activeControl = text\r\n if (formatValue.length) {\r\n text.setValue(formatValue, controlContext, controlRule)\r\n } else {\r\n text.clearValue(controlContext, controlRule)\r\n }\r\n } else if (type === ControlType.SELECT) {\r\n if (Array.isArray(value)) continue\r\n const select = new SelectControl(element, this)\r\n this.activeControl = select\r\n if (value) {\r\n select.setSelect(value, controlContext, controlRule)\r\n } else {\r\n select.clearSelect(controlContext, controlRule)\r\n }\r\n } else if (type === ControlType.CHECKBOX) {\r\n if (Array.isArray(value)) continue\r\n const checkbox = new CheckboxControl(element, this)\r\n this.activeControl = checkbox\r\n const codes = value ? value.split(',') : []\r\n checkbox.setSelect(codes, controlContext, controlRule)\r\n } else if (type === ControlType.RADIO) {\r\n if (Array.isArray(value)) continue\r\n const radio = new RadioControl(element, this)\r\n this.activeControl = radio\r\n const codes = value ? [value] : []\r\n radio.setSelect(codes, controlContext, controlRule)\r\n } else if (type === ControlType.DATE) {\r\n const date = new DateControl(element, this)\r\n this.activeControl = date\r\n if (isArray(value)) {\r\n if (value.length) {\r\n formatElementList(value, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n }\r\n date.setValue(value, controlContext, controlRule)\r\n } else if (isString(value)) {\r\n date.setSelect(value, controlContext, controlRule)\r\n } else {\r\n date.clearSelect(controlContext, controlRule)\r\n }\r\n } else if (type === ControlType.NUMBER) {\r\n const formatValue = Array.isArray(value)\r\n ? value\r\n : value\r\n ? [{ value }]\r\n : []\r\n if (formatValue.length) {\r\n formatElementList(formatValue, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n }\r\n const text = new NumberControl(element, this)\r\n this.activeControl = text\r\n if (formatValue.length) {\r\n text.setValue(formatValue, controlContext, controlRule)\r\n } else {\r\n text.clearValue(controlContext, controlRule)\r\n }\r\n }\r\n // 控件值变更事件\r\n this.emitControlContentChange({\r\n context: controlContext\r\n })\r\n // 模拟控件激活后销毁\r\n this.activeControl = null\r\n // 修改后控件结束索引\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n }\r\n }\r\n // 销毁旧控件\r\n this.destroyControl({\r\n isEmitEvent: false\r\n })\r\n // 页眉、内容区、页脚同时处理\r\n const data = [\r\n this.draw.getHeaderElementList(),\r\n this.draw.getOriginalMainElementList(),\r\n this.draw.getFooterElementList()\r\n ]\r\n for (const elementList of data) {\r\n setValue(elementList)\r\n }\r\n if (isExistSet) {\r\n // 不保存历史时需清空之前记录,避免还原\r\n if (!isExistSubmitHistory) {\r\n this.draw.getHistoryManager().recovery()\r\n }\r\n this.draw.render({\r\n isSubmitHistory: isExistSubmitHistory,\r\n isSetCursor: false\r\n })\r\n }\r\n }\r\n\r\n public setExtensionListById(payload: ISetControlExtensionOption[]) {\r\n if (!payload.length) return\r\n const setExtension = (elementList: IElement[]) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n setExtension(td.value)\r\n }\r\n }\r\n }\r\n if (!element.control) continue\r\n // 获取设置值优先id、conceptId、areaId\r\n const payloadItem = payload.find(\r\n p =>\r\n (p.id && element.controlId === p.id) ||\r\n (p.conceptId && element.control!.conceptId === p.conceptId) ||\r\n (p.areaId && element.areaId === p.areaId)\r\n )\r\n if (!payloadItem) continue\r\n const { extension } = payloadItem\r\n // 设置值\r\n this.setControlProperties(\r\n {\r\n extension\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: i, endIndex: i }\r\n }\r\n )\r\n // 修改后控件结束索引\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n }\r\n }\r\n const data = [\r\n this.draw.getHeaderElementList(),\r\n this.draw.getOriginalMainElementList(),\r\n this.draw.getFooterElementList()\r\n ]\r\n for (const elementList of data) {\r\n setExtension(elementList)\r\n }\r\n }\r\n\r\n public setPropertiesListById(payload: ISetControlProperties[]) {\r\n if (!payload.length) return\r\n let isExistUpdate = false\r\n let isExistSubmitHistory = false\r\n const setProperties = (elementList: IElement[]) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n setProperties(td.value)\r\n }\r\n }\r\n }\r\n if (!element.control) continue\r\n // 获取设置值优先id、conceptId、areaId\r\n const payloadItem = payload.find(\r\n p =>\r\n (p.id && element.controlId === p.id) ||\r\n (p.conceptId && element.control!.conceptId === p.conceptId) ||\r\n (p.areaId && element.areaId === p.areaId)\r\n )\r\n if (!payloadItem) continue\r\n const { properties, isSubmitHistory = true } = payloadItem\r\n isExistUpdate = true\r\n if (isSubmitHistory) {\r\n isExistSubmitHistory = true\r\n }\r\n // 设置属性\r\n this.setControlProperties(\r\n {\r\n ...element.control,\r\n ...properties,\r\n value: element.control.value\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: i, endIndex: i }\r\n }\r\n )\r\n // 控件默认样式\r\n CONTROL_STYLE_ATTR.forEach(key => {\r\n const controlStyleProperty = properties[key]\r\n if (controlStyleProperty) {\r\n Reflect.set(element, key, controlStyleProperty)\r\n }\r\n })\r\n // 修改后控件结束索引\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n }\r\n }\r\n // 页眉页脚正文启动搜索\r\n const pageComponentData: IEditorData = {\r\n header: this.draw.getHeaderElementList(),\r\n main: this.draw.getOriginalMainElementList(),\r\n footer: this.draw.getFooterElementList()\r\n }\r\n for (const key in pageComponentData) {\r\n const elementList = pageComponentData[<keyof IEditorData>key]!\r\n setProperties(elementList)\r\n }\r\n if (!isExistUpdate) return\r\n // 强制更新\r\n for (const key in pageComponentData) {\r\n const pageComponentKey = <keyof IEditorData>key\r\n const elementList = zipElementList(pageComponentData[pageComponentKey]!, {\r\n isClassifyArea: true,\r\n extraPickAttrs: ['id']\r\n })\r\n pageComponentData[pageComponentKey] = elementList\r\n formatElementList(elementList, {\r\n editorOptions: this.options,\r\n isForceCompensation: true\r\n })\r\n }\r\n this.draw.setEditorData(pageComponentData)\r\n // 不保存历史时需清空之前记录,避免还原\r\n if (!isExistSubmitHistory) {\r\n this.draw.getHistoryManager().recovery()\r\n }\r\n this.draw.render({\r\n isSubmitHistory: isExistSubmitHistory,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public getList(): IElement[] {\r\n const controlElementList: IElement[] = []\r\n function getControlElementList(elementList: IElement[]) {\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdElement = td.value\r\n getControlElementList(tdElement)\r\n }\r\n }\r\n }\r\n if (element.controlId) {\r\n // 移除控件所在标题及列表上下文信息\r\n const controlElement = omitObject(element, [\r\n ...TITLE_CONTEXT_ATTR,\r\n ...LIST_CONTEXT_ATTR\r\n ])\r\n controlElementList.push(controlElement)\r\n }\r\n }\r\n }\r\n const data = [\r\n this.draw.getHeader().getElementList(),\r\n this.draw.getOriginalMainElementList(),\r\n this.draw.getFooter().getElementList()\r\n ]\r\n for (const elementList of data) {\r\n getControlElementList(elementList)\r\n }\r\n return zipElementList(controlElementList, {\r\n extraPickAttrs: ['controlId']\r\n })\r\n }\r\n\r\n public recordBorderInfo(x: number, y: number, width: number, height: number) {\r\n this.controlBorder.recordBorderInfo(x, y, width, height)\r\n }\r\n\r\n public drawBorder(ctx: CanvasRenderingContext2D) {\r\n this.controlBorder.render(ctx)\r\n }\r\n\r\n public getPreControlContext(): INextControlContext | null {\r\n if (!this.activeControl) return null\r\n const position = this.draw.getPosition()\r\n const positionContext = position.getPositionContext()\r\n if (!positionContext) return null\r\n const controlElement = this.activeControl.getElement()\r\n // 获取上一个控件上下文本信息\r\n function getPreContext(\r\n elementList: IElement[],\r\n start: number\r\n ): INextControlContext | null {\r\n for (let e = start; e > 0; e--) {\r\n const element = elementList[e]\r\n // 表格元素\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList || []\r\n for (let r = trList.length - 1; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = tdList.length - 1; d >= 0; d--) {\r\n const td = tdList[d]\r\n const context = getPreContext(td.value, td.value.length - 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: e,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.id\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n !element.controlId ||\r\n element.controlId === controlElement.controlId\r\n ) {\r\n continue\r\n }\r\n // 找到尾部第一个非占位符元素\r\n let nextIndex = e\r\n while (nextIndex > 0) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlComponent === ControlComponent.VALUE ||\r\n nextElement.controlComponent === ControlComponent.PREFIX ||\r\n nextElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n nextIndex--\r\n }\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex\r\n }\r\n }\r\n return null\r\n }\r\n // 当前上下文控件信息\r\n const { startIndex } = this.range.getRange()\r\n const elementList = this.getElementList()\r\n const context = getPreContext(elementList, startIndex)\r\n if (context) {\r\n return {\r\n positionContext: positionContext.isTable\r\n ? positionContext\r\n : context.positionContext,\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n // 控件在单元内时继续循环\r\n if (controlElement.tableId) {\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const { index, trIndex, tdIndex } = positionContext\r\n const trList = originalElementList[index!].trList!\r\n for (let r = trIndex!; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = tdList.length - 1; d >= 0; d--) {\r\n if (trIndex === r && d >= tdIndex!) continue\r\n const td = tdList[d]\r\n const context = getPreContext(td.value, td.value.length - 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: controlElement.tableId\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n // 跳出表格继续循环\r\n const context = getPreContext(originalElementList, index! - 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public getNextControlContext(): INextControlContext | null {\r\n if (!this.activeControl) return null\r\n const position = this.draw.getPosition()\r\n const positionContext = position.getPositionContext()\r\n if (!positionContext) return null\r\n const controlElement = this.activeControl.getElement()\r\n // 获取下一个控件上下文本信息\r\n function getNextContext(\r\n elementList: IElement[],\r\n start: number\r\n ): INextControlContext | null {\r\n for (let e = start; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n // 表格元素\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList || []\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const context = getNextContext(td.value!, 0)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: e,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.id\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n !element.controlId ||\r\n element.controlId === controlElement.controlId ||\r\n elementList[e + 1]?.controlComponent === ControlComponent.PREFIX ||\r\n elementList[e + 1]?.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n continue\r\n }\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex: e\r\n }\r\n }\r\n return null\r\n }\r\n // 当前上下文控件信息\r\n const { endIndex } = this.range.getRange()\r\n const elementList = this.getElementList()\r\n const context = getNextContext(elementList, endIndex)\r\n if (context) {\r\n return {\r\n positionContext: positionContext.isTable\r\n ? positionContext\r\n : context.positionContext,\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n // 控件在单元内时继续循环\r\n if (controlElement.tableId) {\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const { index, trIndex, tdIndex } = positionContext\r\n const trList = originalElementList[index!].trList!\r\n for (let r = trIndex!; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n if (trIndex === r && d <= tdIndex!) continue\r\n const td = tdList[d]\r\n const context = getNextContext(td.value, 0)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: controlElement.tableId\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n // 跳出表格继续循环\r\n const context = getNextContext(originalElementList, index! + 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public initNextControl(option: IInitNextControlOption = {}) {\r\n const { direction = MoveDirection.DOWN } = option\r\n let context: INextControlContext | null = null\r\n if (direction === MoveDirection.UP) {\r\n context = this.getPreControlContext()\r\n } else {\r\n context = this.getNextControlContext()\r\n }\r\n if (!context) return\r\n const { nextIndex, positionContext } = context\r\n const position = this.draw.getPosition()\r\n // 设置上下文\r\n position.setPositionContext(positionContext)\r\n this.draw.getRange().replaceRange({\r\n startIndex: nextIndex,\r\n endIndex: nextIndex\r\n })\r\n // 重新渲染并定位\r\n this.draw.render({\r\n curIndex: nextIndex,\r\n isCompute: false,\r\n isSetCursor: true,\r\n isSubmitHistory: false\r\n })\r\n const positionList = position.getPositionList()\r\n this.draw.getCursor().moveCursorToVisible({\r\n cursorPosition: positionList[nextIndex],\r\n direction\r\n })\r\n }\r\n\r\n public setMinWidthControlInfo(option: ISetControlRowFlexOption) {\r\n const { row, rowElement, controlRealWidth, availableWidth } = option\r\n if (!rowElement.control?.minWidth) return\r\n const { scale } = this.options\r\n const controlMinWidth = rowElement.control.minWidth * scale\r\n // 设置首字符偏移量:如果控件内设置对齐方式&&存在设置最小宽度\r\n let controlFirstElement: IRowElement | null = null\r\n if (\r\n rowElement.control?.minWidth &&\r\n (rowElement.control?.rowFlex === RowFlex.CENTER ||\r\n rowElement.control?.rowFlex === RowFlex.RIGHT)\r\n ) {\r\n // 计算当前控件内容宽度是否超出最小宽度设置\r\n let controlContentWidth = rowElement.metrics.width\r\n let controlElementIndex = row.elementList.length - 1\r\n while (controlElementIndex >= 0) {\r\n const controlRowElement = row.elementList[controlElementIndex]\r\n controlContentWidth += controlRowElement.metrics.width\r\n // 找到首字符结束循环\r\n if (\r\n row.elementList[controlElementIndex - 1]?.controlComponent ===\r\n ControlComponent.PREFIX\r\n ) {\r\n controlFirstElement = controlRowElement\r\n break\r\n }\r\n controlElementIndex--\r\n }\r\n // 计算首字符偏移量\r\n if (controlFirstElement) {\r\n if (controlContentWidth < controlMinWidth) {\r\n if (rowElement.control.rowFlex === RowFlex.CENTER) {\r\n controlFirstElement.left =\r\n (controlMinWidth - controlContentWidth) / 2\r\n } else if (rowElement.control.rowFlex === RowFlex.RIGHT) {\r\n // 最小宽度 - 实际宽度 - 后缀元素宽度\r\n controlFirstElement.left =\r\n controlMinWidth - controlContentWidth - rowElement.metrics.width\r\n }\r\n }\r\n }\r\n }\r\n // 设置后缀偏移量:消费小于实际最小宽度\r\n const extraWidth = controlMinWidth - controlRealWidth\r\n if (extraWidth > 0) {\r\n const controlFirstElementLeft = controlFirstElement?.left || 0\r\n // 超出行宽时截断\r\n const rowRemainingWidth =\r\n availableWidth - row.width - rowElement.metrics.width\r\n const left = Math.min(rowRemainingWidth, extraWidth)\r\n // 后缀偏移量需减去首字符的偏移量,避免重复偏移\r\n rowElement.left = left - controlFirstElementLeft\r\n row.width += left - controlFirstElementLeft\r\n }\r\n }\r\n}\r\n","import { NBSP, ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\ninterface ICheckboxRenderOption {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n row: IRow\r\n index: number\r\n}\r\n\r\nexport class CheckboxParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public setSelect(element: IElement) {\r\n const { checkbox } = element\r\n if (checkbox) {\r\n checkbox.value = !checkbox.value\r\n } else {\r\n element.checkbox = {\r\n value: true\r\n }\r\n }\r\n this.draw.render({\r\n isCompute: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public render(payload: ICheckboxRenderOption) {\r\n const { ctx, x, index, row } = payload\r\n let { y } = payload\r\n const {\r\n checkbox: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign },\r\n scale\r\n } = this.options\r\n const { metrics, checkbox } = row.elementList[index]\r\n // 垂直布局设置\r\n if (\r\n verticalAlign === VerticalAlign.TOP ||\r\n verticalAlign === VerticalAlign.MIDDLE\r\n ) {\r\n let nextIndex = index + 1\r\n let nextElement: IRowElement | null = null\r\n while (nextIndex < row.elementList.length) {\r\n nextElement = row.elementList[nextIndex]\r\n if (nextElement.value !== ZERO && nextElement.value !== NBSP) break\r\n nextIndex++\r\n }\r\n // 以后一个非空格元素为基准\r\n if (nextElement) {\r\n const {\r\n metrics: { boundingBoxAscent, boundingBoxDescent }\r\n } = nextElement\r\n const textHeight = boundingBoxAscent + boundingBoxDescent\r\n if (textHeight > metrics.height) {\r\n if (verticalAlign === VerticalAlign.TOP) {\r\n y -= boundingBoxAscent - metrics.height\r\n } else if (verticalAlign === VerticalAlign.MIDDLE) {\r\n y -= (textHeight - metrics.height) / 2\r\n }\r\n }\r\n }\r\n }\r\n // left top 四舍五入避免1像素问题\r\n const left = Math.round(x + gap * scale)\r\n const top = Math.round(y - metrics.height + lineWidth)\r\n const width = metrics.width - gap * 2 * scale\r\n const height = metrics.height\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.translate(0.5, 0.5)\r\n // 绘制勾选状态\r\n if (checkbox?.value) {\r\n // 边框\r\n ctx.lineWidth = lineWidth\r\n ctx.strokeStyle = fillStyle\r\n ctx.rect(left, top, width, height)\r\n ctx.stroke()\r\n // 背景色\r\n ctx.beginPath()\r\n ctx.fillStyle = fillStyle\r\n ctx.fillRect(left, top, width, height)\r\n // 勾选对号\r\n ctx.beginPath()\r\n ctx.strokeStyle = strokeStyle\r\n ctx.lineWidth = lineWidth * 2 * scale\r\n ctx.moveTo(left + 2 * scale, top + height / 2)\r\n ctx.lineTo(left + width / 2, top + height - 3 * scale)\r\n ctx.lineTo(left + width - 2 * scale, top + 3 * scale)\r\n ctx.stroke()\r\n } else {\r\n ctx.lineWidth = lineWidth\r\n ctx.rect(left, top, width, height)\r\n ctx.stroke()\r\n }\r\n ctx.closePath()\r\n ctx.restore()\r\n }\r\n}\r\n","import { NBSP, ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\ninterface IRadioRenderOption {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n row: IRow\r\n index: number\r\n}\r\n\r\nexport class RadioParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public setSelect(element: IElement) {\r\n const { radio } = element\r\n if (radio) {\r\n radio.value = !radio.value\r\n } else {\r\n element.radio = {\r\n value: true\r\n }\r\n }\r\n this.draw.render({\r\n isCompute: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public render(payload: IRadioRenderOption) {\r\n const { ctx, x, index, row } = payload\r\n let { y } = payload\r\n const {\r\n radio: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign },\r\n scale\r\n } = this.options\r\n const { metrics, radio } = row.elementList[index]\r\n // 垂直布局设置\r\n if (\r\n verticalAlign === VerticalAlign.TOP ||\r\n verticalAlign === VerticalAlign.MIDDLE\r\n ) {\r\n let nextIndex = index + 1\r\n let nextElement: IRowElement | null = null\r\n while (nextIndex < row.elementList.length) {\r\n nextElement = row.elementList[nextIndex]\r\n if (nextElement.value !== ZERO && nextElement.value !== NBSP) break\r\n nextIndex++\r\n }\r\n // 以后一个非空格元素为基准\r\n if (nextElement) {\r\n const {\r\n metrics: { boundingBoxAscent, boundingBoxDescent }\r\n } = nextElement\r\n const textHeight = boundingBoxAscent + boundingBoxDescent\r\n if (textHeight > metrics.height) {\r\n if (verticalAlign === VerticalAlign.TOP) {\r\n y -= boundingBoxAscent - metrics.height\r\n } else if (verticalAlign === VerticalAlign.MIDDLE) {\r\n y -= (textHeight - metrics.height) / 2\r\n }\r\n }\r\n }\r\n }\r\n // left top 四舍五入避免1像素问题\r\n const left = Math.round(x + gap * scale)\r\n const top = Math.round(y - metrics.height + lineWidth)\r\n const width = metrics.width - gap * 2 * scale\r\n const height = metrics.height\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.translate(0.5, 0.5)\r\n // 边框\r\n ctx.strokeStyle = radio?.value ? fillStyle : strokeStyle\r\n ctx.lineWidth = lineWidth\r\n ctx.arc(left + width / 2, top + height / 2, width / 2, 0, Math.PI * 2)\r\n ctx.stroke()\r\n // 填充选中色\r\n if (radio?.value) {\r\n ctx.beginPath()\r\n ctx.fillStyle = fillStyle\r\n ctx.arc(left + width / 2, top + height / 2, width / 3, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n ctx.closePath()\r\n ctx.restore()\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IPreviewerCreateResult,\r\n IPreviewerDrawOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { downloadFile } from '@vervedoc/docx-editor-schema'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\nexport class Previewer {\r\n private container: HTMLDivElement\r\n private canvas: HTMLCanvasElement\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private curElement: IElement | null\r\n private curElementSrc: string\r\n private previewerDrawOption: IPreviewerDrawOption\r\n private curPosition: IElementPosition | null\r\n private eventBus: EventBus<EventBusMap>\r\n // 图片列表\r\n private imageList: IElement[]\r\n private curShowElement: IElement | null\r\n private imageCount: HTMLSpanElement | null\r\n private imagePre: HTMLElement | null\r\n private imageNext: HTMLElement | null\r\n // 拖拽改变尺寸\r\n private resizerSelection: HTMLDivElement\r\n private resizerHandleList: HTMLDivElement[]\r\n private resizerImageContainer: HTMLDivElement\r\n private resizerImage: HTMLImageElement\r\n private resizerSize: HTMLSpanElement\r\n private width: number\r\n private height: number\r\n private mousedownX: number\r\n private mousedownY: number\r\n private curHandleIndex: number\r\n // 预览选区\r\n private previewerContainer: HTMLDivElement | null\r\n private previewerImage: HTMLImageElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.container = draw.getContainer()\r\n this.canvas = draw.getPage()\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.curElement = null\r\n this.curElementSrc = ''\r\n this.previewerDrawOption = {}\r\n this.curPosition = null\r\n this.eventBus = draw.getEventBus()\r\n this.imageList = []\r\n this.curShowElement = null\r\n this.imageCount = null\r\n this.imagePre = null\r\n this.imageNext = null\r\n // 图片尺寸缩放\r\n const {\r\n resizerSelection,\r\n resizerHandleList,\r\n resizerImageContainer,\r\n resizerImage,\r\n resizerSize\r\n } = this._createResizerDom()\r\n this.resizerSelection = resizerSelection\r\n this.resizerHandleList = resizerHandleList\r\n this.resizerImageContainer = resizerImageContainer\r\n this.resizerImage = resizerImage\r\n this.resizerSize = resizerSize\r\n this.width = 0\r\n this.height = 0\r\n this.mousedownX = 0\r\n this.mousedownY = 0\r\n this.curHandleIndex = 0 // 默认右下角\r\n this.previewerContainer = null\r\n this.previewerImage = null\r\n }\r\n\r\n private _getElementPosition(\r\n element: IElement,\r\n position: IElementPosition | null = null\r\n ): { x: number; y: number } {\r\n const { scale } = this.options\r\n let x = 0\r\n let y = 0\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const pageNo = position?.pageNo ?? this.draw.getPageNo()\r\n const preY = pageNo * (height + pageGap)\r\n // 优先使用浮动位置\r\n if (element.imgFloatPosition) {\r\n x = element.imgFloatPosition.x! * scale\r\n y = element.imgFloatPosition.y * scale + preY\r\n } else if (position) {\r\n const {\r\n coordinate: {\r\n leftTop: [left, top]\r\n },\r\n ascent\r\n } = position\r\n x = left\r\n y = top + preY + ascent\r\n }\r\n return { x, y }\r\n }\r\n\r\n private _createResizerDom(): IPreviewerCreateResult {\r\n const { scale } = this.options\r\n // 拖拽边框\r\n const resizerSelection = document.createElement('div')\r\n resizerSelection.classList.add(`${EDITOR_PREFIX}-resizer-selection`)\r\n resizerSelection.style.display = 'none'\r\n resizerSelection.style.borderColor = this.options.resizerColor\r\n resizerSelection.style.borderWidth = `${scale}px`\r\n // 拖拽点\r\n const resizerHandleList: HTMLDivElement[] = []\r\n for (let i = 0; i < 8; i++) {\r\n const handleDom = document.createElement('div')\r\n handleDom.style.background = this.options.resizerColor\r\n handleDom.classList.add(`resizer-handle`)\r\n handleDom.classList.add(`handle-${i}`)\r\n handleDom.setAttribute('data-index', String(i))\r\n handleDom.onmousedown = this._mousedown.bind(this)\r\n resizerSelection.append(handleDom)\r\n resizerHandleList.push(handleDom)\r\n }\r\n this.container.append(resizerSelection)\r\n // 尺寸查看\r\n const resizerSizeView = document.createElement('div')\r\n resizerSizeView.classList.add(`${EDITOR_PREFIX}-resizer-size-view`)\r\n const resizerSize = document.createElement('span')\r\n resizerSizeView.append(resizerSize)\r\n resizerSelection.append(resizerSizeView)\r\n // 拖拽镜像\r\n const resizerImageContainer = document.createElement('div')\r\n resizerImageContainer.classList.add(`${EDITOR_PREFIX}-resizer-image`)\r\n resizerImageContainer.style.display = 'none'\r\n const resizerImage = document.createElement('img')\r\n resizerImage.setAttribute('crossOrigin', 'Anonymous')\r\n resizerImageContainer.append(resizerImage)\r\n this.container.append(resizerImageContainer)\r\n return {\r\n resizerSelection,\r\n resizerHandleList,\r\n resizerImageContainer,\r\n resizerImage,\r\n resizerSize\r\n }\r\n }\r\n\r\n private _keydown = () => {\r\n // 有键盘事件触发时,主动销毁拖拽选区\r\n if (this.resizerSelection.style.display === 'block') {\r\n this.clearResizer()\r\n document.removeEventListener('keydown', this._keydown)\r\n }\r\n }\r\n\r\n private _mousedown(evt: MouseEvent) {\r\n this.canvas = this.draw.getPage()\r\n if (!this.curElement) return\r\n const { scale } = this.options\r\n this.mousedownX = evt.x\r\n this.mousedownY = evt.y\r\n const target = evt.target as HTMLDivElement\r\n this.curHandleIndex = Number(target.dataset.index)\r\n // 改变光标\r\n const cursor = window.getComputedStyle(target).cursor\r\n document.body.style.cursor = cursor\r\n this.canvas.style.cursor = cursor\r\n // 拖拽图片镜像\r\n this.resizerImage.src = this.curElementSrc\r\n this.resizerImageContainer.style.display = 'block'\r\n // 优先使用浮动位置信息\r\n const { x: resizerLeft, y: resizerTop } = this._getElementPosition(\r\n this.curElement,\r\n this.curPosition\r\n )\r\n this.resizerImageContainer.style.left = `${resizerLeft}px`\r\n this.resizerImageContainer.style.top = `${resizerTop}px`\r\n this.resizerImage.style.width = `${this.curElement.width! * scale}px`\r\n this.resizerImage.style.height = `${this.curElement.height! * scale}px`\r\n // 追加全局事件\r\n const mousemoveFn = this._mousemove.bind(this)\r\n document.addEventListener('mousemove', mousemoveFn)\r\n document.addEventListener(\r\n 'mouseup',\r\n () => {\r\n // 改变尺寸\r\n if (this.curElement && !this.previewerDrawOption.dragDisable) {\r\n this.curElement.width = this.width\r\n this.curElement.height = this.height\r\n this.draw.render({\r\n isSetCursor: true,\r\n curIndex: this.curPosition?.index\r\n })\r\n }\r\n // 还原副作用\r\n this.resizerImageContainer.style.display = 'none'\r\n document.removeEventListener('mousemove', mousemoveFn)\r\n document.body.style.cursor = ''\r\n this.canvas.style.cursor = 'text'\r\n },\r\n {\r\n once: true\r\n }\r\n )\r\n evt.preventDefault()\r\n }\r\n\r\n private _mousemove(evt: MouseEvent) {\r\n if (!this.curElement || this.previewerDrawOption.dragDisable) return\r\n const { scale } = this.options\r\n let dx = 0\r\n let dy = 0\r\n switch (this.curHandleIndex) {\r\n case 0:\r\n {\r\n const offsetX = this.mousedownX - evt.x\r\n const offsetY = this.mousedownY - evt.y\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 1:\r\n dy = this.mousedownY - evt.y\r\n break\r\n case 2:\r\n {\r\n const offsetX = evt.x - this.mousedownX\r\n const offsetY = this.mousedownY - evt.y\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 4:\r\n {\r\n const offsetX = evt.x - this.mousedownX\r\n const offsetY = evt.y - this.mousedownY\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 3:\r\n dx = evt.x - this.mousedownX\r\n break\r\n case 5:\r\n dy = evt.y - this.mousedownY\r\n break\r\n case 6:\r\n {\r\n const offsetX = this.mousedownX - evt.x\r\n const offsetY = evt.y - this.mousedownY\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 7:\r\n dx = this.mousedownX - evt.x\r\n break\r\n }\r\n // 图片实际宽高(变化大小除掉缩放比例)\r\n const dw = this.curElement.width! + dx / scale\r\n const dh = this.curElement.height! + dy / scale\r\n if (dw <= 0 || dh <= 0) return\r\n this.width = dw\r\n this.height = dh\r\n // 图片显示宽高\r\n const elementWidth = dw * scale\r\n const elementHeight = dh * scale\r\n // 更新影子图片尺寸\r\n this.resizerImage.style.width = `${elementWidth}px`\r\n this.resizerImage.style.height = `${elementHeight}px`\r\n // 更新预览包围框尺寸\r\n this._updateResizerRect(elementWidth, elementHeight)\r\n // 尺寸预览\r\n this._updateResizerSizeView(elementWidth, elementHeight)\r\n evt.preventDefault()\r\n // 图片尺寸发生改变事件\r\n if (this.eventBus.hasSubscribers('imageSizeChange')) {\r\n this.eventBus.emit('imageSizeChange', {\r\n element: this.curElement\r\n })\r\n }\r\n }\r\n\r\n private _drawPreviewer() {\r\n const previewerContainer = document.createElement('div')\r\n previewerContainer.classList.add(`${EDITOR_PREFIX}-image-previewer`)\r\n // 关闭按钮\r\n const closeBtn = document.createElement('i')\r\n closeBtn.classList.add('image-close')\r\n closeBtn.onclick = () => {\r\n this._clearPreviewer()\r\n }\r\n previewerContainer.append(closeBtn)\r\n // 图片\r\n const imgContainer = document.createElement('div')\r\n imgContainer.classList.add(`${EDITOR_PREFIX}-image-container`)\r\n const img = document.createElement('img')\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = this.curElementSrc\r\n img.draggable = false\r\n imgContainer.append(img)\r\n this.previewerImage = img\r\n previewerContainer.append(imgContainer)\r\n // 操作栏\r\n let x = 0\r\n let y = 0\r\n let scaleSize = 1\r\n let rotateSize = 0\r\n const menuContainer = document.createElement('div')\r\n menuContainer.classList.add(`${EDITOR_PREFIX}-image-menu`)\r\n // 切换上下张图片\r\n const navigateContainer = document.createElement('div')\r\n navigateContainer.classList.add('image-navigate')\r\n const imagePre = document.createElement('i')\r\n imagePre.classList.add('image-pre')\r\n imagePre.onclick = () => {\r\n const curIndex = this.imageList.findIndex(\r\n el => el.id === this.curShowElement?.id\r\n )\r\n if (curIndex <= 0) return\r\n this.curShowElement = this.imageList[curIndex - 1]\r\n img.src = this.curShowElement.value\r\n this._updateImageNavigate()\r\n }\r\n navigateContainer.append(imagePre)\r\n this.imagePre = imagePre\r\n const imageCount = document.createElement('span')\r\n imageCount.classList.add('image-count')\r\n this.imageCount = imageCount\r\n navigateContainer.append(imageCount)\r\n const imageNext = document.createElement('i')\r\n imageNext.classList.add('image-next')\r\n imageNext.onclick = () => {\r\n const curIndex = this.imageList.findIndex(\r\n el => el.id === this.curShowElement?.id\r\n )\r\n if (curIndex >= this.imageList.length - 1) return\r\n this.curShowElement = this.imageList[curIndex + 1]\r\n img.src = this.curShowElement.value\r\n this._updateImageNavigate()\r\n }\r\n this.imageNext = imageNext\r\n navigateContainer.append(imageNext)\r\n menuContainer.append(navigateContainer)\r\n // 缩放\r\n const zoomIn = document.createElement('i')\r\n zoomIn.classList.add('zoom-in')\r\n zoomIn.onclick = () => {\r\n scaleSize += 0.1\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n menuContainer.append(zoomIn)\r\n const zoomOut = document.createElement('i')\r\n zoomOut.onclick = () => {\r\n if (scaleSize - 0.1 <= 0.1) return\r\n scaleSize -= 0.1\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n zoomOut.classList.add('zoom-out')\r\n menuContainer.append(zoomOut)\r\n // 旋转\r\n const rotate = document.createElement('i')\r\n rotate.classList.add('rotate')\r\n rotate.onclick = () => {\r\n rotateSize += 1\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n menuContainer.append(rotate)\r\n // 恢复原始大小\r\n const originalSize = document.createElement('i')\r\n originalSize.classList.add('original-size')\r\n originalSize.onclick = () => {\r\n x = 0\r\n y = 0\r\n scaleSize = 1\r\n rotateSize = 0\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n menuContainer.append(originalSize)\r\n // 下载图片\r\n const imageDownload = document.createElement('i')\r\n imageDownload.classList.add('image-download')\r\n imageDownload.onclick = () => {\r\n const { mime } = this.previewerDrawOption\r\n downloadFile(img.src, `${this.curElement?.id}.${mime || 'png'}`)\r\n }\r\n menuContainer.append(imageDownload)\r\n previewerContainer.append(menuContainer)\r\n this.previewerContainer = previewerContainer\r\n document.body.append(previewerContainer)\r\n // 拖拽调整位置\r\n let startX = 0\r\n let startY = 0\r\n let isAllowDrag = false\r\n img.onmousedown = evt => {\r\n isAllowDrag = true\r\n startX = evt.x\r\n startY = evt.y\r\n previewerContainer.style.cursor = 'move'\r\n }\r\n previewerContainer.onmousemove = (evt: MouseEvent) => {\r\n if (!isAllowDrag) return\r\n x += evt.x - startX\r\n y += evt.y - startY\r\n startX = evt.x\r\n startY = evt.y\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n previewerContainer.onmouseup = () => {\r\n isAllowDrag = false\r\n previewerContainer.style.cursor = 'auto'\r\n }\r\n previewerContainer.onwheel = evt => {\r\n evt.preventDefault()\r\n evt.stopPropagation()\r\n if (evt.deltaY < 0) {\r\n // 放大\r\n scaleSize += 0.1\r\n } else {\r\n // 缩小\r\n if (scaleSize - 0.1 <= 0.1) return\r\n scaleSize -= 0.1\r\n }\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n // 更新图片索引信息\r\n this._updateImageNavigate()\r\n }\r\n\r\n private _updateImageNavigate() {\r\n // 更新当前图片位置索引\r\n const currentIndex = this.imageList.findIndex(\r\n el => el.id === this.curShowElement?.id\r\n )\r\n this.imageCount!.innerText = `${currentIndex + 1} / ${\r\n this.imageList.length\r\n }`\r\n // 更新按钮权限\r\n if (currentIndex <= 0) {\r\n this.imagePre!.classList.add('disabled')\r\n } else {\r\n this.imagePre!.classList.remove('disabled')\r\n }\r\n if (currentIndex >= this.imageList.length - 1) {\r\n this.imageNext!.classList.add('disabled')\r\n } else {\r\n this.imageNext!.classList.remove('disabled')\r\n }\r\n }\r\n\r\n public _setPreviewerTransform(\r\n scale: number,\r\n rotate: number,\r\n x: number,\r\n y: number\r\n ) {\r\n if (!this.previewerImage) return\r\n this.previewerImage.style.left = `${x}px`\r\n this.previewerImage.style.top = `${y}px`\r\n this.previewerImage.style.transform = `scale(${scale}) rotate(${\r\n rotate * 90\r\n }deg)`\r\n }\r\n\r\n private _clearPreviewer() {\r\n this.previewerContainer?.remove()\r\n this.previewerContainer = null\r\n document.body.style.overflow = 'auto'\r\n }\r\n\r\n public _updateResizerRect(width: number, height: number) {\r\n const { resizerSize: handleSize, scale } = this.options\r\n const isReadonly = this.draw.isReadonly()\r\n this.resizerSelection.style.width = `${width}px`\r\n this.resizerSelection.style.height = `${height}px`\r\n // handle\r\n for (let i = 0; i < 8; i++) {\r\n const left =\r\n i === 0 || i === 6 || i === 7\r\n ? -handleSize\r\n : i === 1 || i === 5\r\n ? width / 2\r\n : width - handleSize\r\n const top =\r\n i === 0 || i === 1 || i === 2\r\n ? -handleSize\r\n : i === 3 || i === 7\r\n ? height / 2 - handleSize\r\n : height - handleSize\r\n this.resizerHandleList[i].style.transform = `scale(${scale})`\r\n this.resizerHandleList[i].style.left = `${left}px`\r\n this.resizerHandleList[i].style.top = `${top}px`\r\n this.resizerHandleList[i].style.display = isReadonly ? 'none' : 'block'\r\n }\r\n }\r\n\r\n public _updateResizerSizeView(width: number, height: number) {\r\n this.resizerSize.innerText = `${Math.round(width)} × ${Math.round(height)}`\r\n }\r\n\r\n public render() {\r\n // 图片工具配置禁用又非设计模式时不渲染\r\n const mode = this.draw.getMode()\r\n if (\r\n !this.curElement ||\r\n (this.curElement.imgToolDisabled && !this.draw.isDesignMode()) ||\r\n (mode === EditorMode.PRINT &&\r\n this.options.modeRule[EditorMode.PRINT]?.imagePreviewerDisabled) ||\r\n (mode === EditorMode.READONLY &&\r\n this.options.modeRule[EditorMode.READONLY]?.imagePreviewerDisabled)\r\n ) {\r\n return\r\n }\r\n // 获取所有图片\r\n this.imageList = this.draw.getImageParticle().getOriginalMainImageList()\r\n this.curShowElement = this.curElement\r\n // 渲染预览框\r\n this._drawPreviewer()\r\n document.body.style.overflow = 'hidden'\r\n }\r\n\r\n public drawResizer(\r\n element: IElement,\r\n position: IElementPosition | null = null,\r\n options: IPreviewerDrawOption = {}\r\n ) {\r\n // 图片工具配置禁用又非设计模式时不渲染\r\n const mode = this.draw.getMode()\r\n if (\r\n (element.imgToolDisabled && !this.draw.isDesignMode()) ||\r\n (mode === EditorMode.PRINT &&\r\n this.options.modeRule[EditorMode.PRINT]?.imagePreviewerDisabled) ||\r\n (mode === EditorMode.READONLY &&\r\n this.options.modeRule[EditorMode.READONLY]?.imagePreviewerDisabled)\r\n ) {\r\n return\r\n }\r\n // 缓存配置\r\n this.previewerDrawOption = options\r\n this.curElementSrc = element[options.srcKey || 'value'] || ''\r\n // 更新渲染尺寸及位置\r\n this.updateResizer(element, position)\r\n // 监听事件\r\n document.addEventListener('keydown', this._keydown)\r\n }\r\n\r\n public updateResizer(\r\n element: IElement,\r\n position: IElementPosition | null = null\r\n ) {\r\n const { scale } = this.options\r\n const elementWidth = element.width! * scale\r\n const elementHeight = element.height! * scale\r\n // 尺寸预览\r\n this._updateResizerSizeView(elementWidth, elementHeight)\r\n // 优先使用浮动位置信息\r\n const { x: resizerLeft, y: resizerTop } = this._getElementPosition(\r\n element,\r\n position\r\n )\r\n this.resizerSelection.style.left = `${resizerLeft}px`\r\n this.resizerSelection.style.top = `${resizerTop}px`\r\n this.resizerSelection.style.borderWidth = `${scale}px`\r\n // 更新预览包围框尺寸\r\n this._updateResizerRect(elementWidth, elementHeight)\r\n this.resizerSelection.style.display = 'block'\r\n // 缓存基础信息\r\n this.curElement = element\r\n this.curPosition = position\r\n this.width = elementWidth\r\n this.height = elementHeight\r\n }\r\n\r\n public clearResizer() {\r\n this.resizerSelection.style.display = 'none'\r\n document.removeEventListener('keydown', this._keydown)\r\n }\r\n}\r\n","export class ImageObserver {\r\n private promiseList: Promise<unknown>[]\r\n\r\n constructor() {\r\n this.promiseList = []\r\n }\r\n\r\n public add(payload: Promise<unknown>) {\r\n this.promiseList.push(payload)\r\n }\r\n\r\n public clearAll() {\r\n this.promiseList = []\r\n }\r\n\r\n public allSettled() {\r\n return Promise.allSettled(this.promiseList)\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { throttle } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { Zone } from './Zone'\r\n\r\nexport class ZoneTip {\r\n private draw: Draw\r\n private zone: Zone\r\n private i18n: I18n\r\n private container: HTMLDivElement\r\n private pageContainer: HTMLDivElement\r\n\r\n private isDisableMouseMove: boolean\r\n private tipContainer: HTMLDivElement\r\n private tipContent: HTMLSpanElement\r\n private currentMoveZone: EditorZone | undefined\r\n\r\n constructor(draw: Draw, zone: Zone) {\r\n this.draw = draw\r\n this.zone = zone\r\n this.i18n = draw.getI18n()\r\n this.container = draw.getContainer()\r\n this.pageContainer = draw.getPageContainer()\r\n\r\n const { tipContainer, tipContent } = this._drawZoneTip()\r\n this.tipContainer = tipContainer\r\n this.tipContent = tipContent\r\n this.isDisableMouseMove = true\r\n this.currentMoveZone = EditorZone.MAIN\r\n // 监听区域\r\n const watchZones: EditorZone[] = []\r\n const { header, footer } = draw.getOptions()\r\n if (!header.disabled) {\r\n watchZones.push(EditorZone.HEADER)\r\n }\r\n if (!footer.disabled) {\r\n watchZones.push(EditorZone.FOOTER)\r\n }\r\n if (watchZones.length) {\r\n this._watchMouseMoveZoneChange(watchZones)\r\n }\r\n }\r\n\r\n private _watchMouseMoveZoneChange(watchZones: EditorZone[]) {\r\n this.pageContainer.addEventListener(\r\n 'mousemove',\r\n throttle((evt: MouseEvent) => {\r\n if (this.isDisableMouseMove || !this.draw.getIsPagingMode()) return\r\n if (!evt.offsetY) return\r\n if (evt.target instanceof HTMLCanvasElement) {\r\n const mousemoveZone = this.zone.getZoneByY(evt.offsetY)\r\n if (!watchZones.includes(mousemoveZone)) {\r\n this._updateZoneTip(false)\r\n return\r\n }\r\n this.currentMoveZone = mousemoveZone\r\n // 激活区域是正文,移动区域是页眉、页脚时绘制\r\n this._updateZoneTip(\r\n this.zone.getZone() === EditorZone.MAIN &&\r\n (mousemoveZone === EditorZone.HEADER ||\r\n mousemoveZone === EditorZone.FOOTER),\r\n evt.x,\r\n evt.y\r\n )\r\n } else {\r\n this._updateZoneTip(false)\r\n }\r\n }, 250)\r\n )\r\n // mouseenter后mousemove有效,避免因节流导致的mouseleave后继续执行逻辑\r\n this.pageContainer.addEventListener('mouseenter', () => {\r\n this.isDisableMouseMove = false\r\n })\r\n this.pageContainer.addEventListener('mouseleave', () => {\r\n this.isDisableMouseMove = true\r\n this._updateZoneTip(false)\r\n })\r\n }\r\n\r\n private _drawZoneTip() {\r\n const tipContainer = document.createElement('div')\r\n tipContainer.classList.add(`${EDITOR_PREFIX}-zone-tip`)\r\n const tipContent = document.createElement('span')\r\n tipContainer.append(tipContent)\r\n this.container.append(tipContainer)\r\n return {\r\n tipContainer,\r\n tipContent\r\n }\r\n }\r\n\r\n private _updateZoneTip(visible: boolean, left?: number, top?: number) {\r\n if (visible) {\r\n this.tipContainer.classList.add('show')\r\n this.tipContainer.style.left = `${left}px`\r\n this.tipContainer.style.top = `${top}px`\r\n this.tipContent.innerText = this.i18n.t(\r\n `zone.${\r\n this.currentMoveZone === EditorZone.HEADER ? 'headerTip' : 'footerTip'\r\n }`\r\n )\r\n } else {\r\n this.tipContainer.classList.remove('show')\r\n }\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { nextTick } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { ZoneTip } from './ZoneTip'\r\nimport { PAGE_NUMBER_STYLES } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Zone {\r\n private readonly INDICATOR_PADDING = 2\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private i18n: I18n\r\n private container: HTMLDivElement\r\n\r\n private currentZone: EditorZone\r\n private indicatorContainer: HTMLDivElement | null\r\n private pageNumberMenu: HTMLDivElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.i18n = draw.getI18n()\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n this.currentZone = EditorZone.MAIN\r\n this.indicatorContainer = null\r\n this.pageNumberMenu = null\r\n // 区域提示\r\n if (!this.options.zone.tipDisabled) {\r\n new ZoneTip(draw, this)\r\n }\r\n }\r\n\r\n public isHeaderActive(): boolean {\r\n return this.getZone() === EditorZone.HEADER\r\n }\r\n\r\n public isMainActive(): boolean {\r\n return this.getZone() === EditorZone.MAIN\r\n }\r\n\r\n public isFooterActive(): boolean {\r\n return this.getZone() === EditorZone.FOOTER\r\n }\r\n\r\n public getZone(): EditorZone {\r\n return this.currentZone\r\n }\r\n\r\n public setZone(payload: EditorZone) {\r\n const { header, footer } = this.options\r\n if (\r\n (!header.editable && payload === EditorZone.HEADER) ||\r\n (!footer.editable && payload === EditorZone.FOOTER)\r\n ) {\r\n return\r\n }\r\n if (this.currentZone === payload) return\r\n this.currentZone = payload\r\n this.draw.getRange().clearRange()\r\n this.draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n // 指示器\r\n this.drawZoneIndicator()\r\n // 回调\r\n nextTick(() => {\r\n const listener = this.draw.getListener()\r\n if (listener.zoneChange) {\r\n listener.zoneChange(payload)\r\n }\r\n const eventBus = this.draw.getEventBus()\r\n if (eventBus.hasSubscribers('zoneChange')) {\r\n eventBus.emit('zoneChange', payload)\r\n }\r\n })\r\n }\r\n\r\n public getZoneByY(y: number): EditorZone {\r\n // 页眉底部距离页面顶部距离\r\n const header = this.draw.getHeader()\r\n const headerBottomY = header.getExtraHeight() + this.draw.getMargins()[0]\r\n // 页脚上部距离页面顶部距离\r\n const footer = this.draw.getFooter()\r\n const pageHeight = this.draw.getHeight()\r\n const footerTopY =\r\n pageHeight - (footer.getExtraHeight() + this.draw.getMargins()[2])\r\n // 页眉:当前位置小于页眉底部位置\r\n if (y < headerBottomY) {\r\n return EditorZone.HEADER\r\n }\r\n // 页脚:当前位置大于页脚顶部位置\r\n if (y > footerTopY) {\r\n return EditorZone.FOOTER\r\n }\r\n return EditorZone.MAIN\r\n }\r\n\r\n public drawZoneIndicator() {\r\n this._clearZoneIndicator()\r\n if (!this.isHeaderActive() && !this.isFooterActive()) return\r\n const { scale } = this.options\r\n const isHeaderActive = this.isHeaderActive()\r\n const pageList = this.draw.getPageList()\r\n const margins = this.draw.getMargins()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const pageHeight = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = pageHeight + pageGap\r\n // 创建指示器容器\r\n this.indicatorContainer = document.createElement('div')\r\n this.indicatorContainer.classList.add(`${EDITOR_PREFIX}-zone-indicator`)\r\n // 指示器位置\r\n const header = this.draw.getHeader()\r\n const footer = this.draw.getFooter()\r\n const indicatorHeight = isHeaderActive\r\n ? header.getHeight()\r\n : footer.getHeight()\r\n const indicatorTop = isHeaderActive\r\n ? header.getHeaderTop()\r\n : pageHeight - footer.getFooterBottom() - indicatorHeight\r\n for (let p = 0; p < pageList.length; p++) {\r\n const startY = preY * p + indicatorTop\r\n const indicatorLeftX = margins[3] - this.INDICATOR_PADDING\r\n const indicatorRightX = margins[3] + innerWidth + this.INDICATOR_PADDING\r\n const indicatorTopY = isHeaderActive\r\n ? startY - this.INDICATOR_PADDING\r\n : startY + indicatorHeight + this.INDICATOR_PADDING\r\n const indicatorBottomY = isHeaderActive\r\n ? startY + indicatorHeight + this.INDICATOR_PADDING\r\n : startY - this.INDICATOR_PADDING\r\n\r\n // 工具栏行\r\n const toolbar = document.createElement('div')\r\n toolbar.classList.add(`${EDITOR_PREFIX}-zone-toolbar`)\r\n toolbar.style.top = `${indicatorBottomY}px`\r\n toolbar.style.left = `${margins[3]}px`\r\n toolbar.style.width = `${innerWidth}px`\r\n toolbar.style.transform = `scale(${scale})`\r\n toolbar.style.transformOrigin = '0 0'\r\n\r\n // 左侧标签\r\n const labelLeft = document.createElement('div')\r\n labelLeft.classList.add(`${EDITOR_PREFIX}-zone-toolbar-label`)\r\n const zoneName = this._getZoneName(isHeaderActive)\r\n labelLeft.innerText = `${zoneName} - 第 ${p + 1} 节-`\r\n toolbar.append(labelLeft)\r\n\r\n // 右侧插入页码按钮\r\n const btnInsertPageNo = document.createElement('div')\r\n btnInsertPageNo.classList.add(`${EDITOR_PREFIX}-zone-toolbar-btn`)\r\n btnInsertPageNo.innerHTML = `<svg viewBox=\"0 0 1024 1024\" width=\"14\" height=\"14\"><path d=\"M896 896H128V128h576v64H192v640h640V448h64v448z\" fill=\"#0078d4\"></path><path d=\"M640 192h192v64H640zM704 128h64v192h-64z\" fill=\"#0078d4\"></path><path d=\"M352 448h320v64H352zM352 576h256v64H352zM352 320h192v64H352z\" fill=\"#0078d4\"></path></svg><span>插入页码</span><svg viewBox=\"0 0 1024 1024\" width=\"12\" height=\"12\"><path d=\"M512 714.667l-298.667-298.667h597.333z\" fill=\"currentColor\"></path></svg>`\r\n btnInsertPageNo.onclick = (e) => {\r\n e.stopPropagation()\r\n this._showPageNumberMenu(btnInsertPageNo)\r\n }\r\n toolbar.append(btnInsertPageNo)\r\n\r\n this.indicatorContainer.append(toolbar)\r\n\r\n // 上边线\r\n const lineTop = document.createElement('span')\r\n lineTop.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__top`)\r\n lineTop.style.top = `${indicatorTopY}px`\r\n lineTop.style.width = `${innerWidth}px`\r\n lineTop.style.marginLeft = `${margins[3]}px`\r\n this.indicatorContainer.append(lineTop)\r\n\r\n // 左边线\r\n const lineLeft = document.createElement('span')\r\n lineLeft.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__left`)\r\n lineLeft.style.top = `${startY}px`\r\n lineLeft.style.height = `${indicatorHeight}px`\r\n lineLeft.style.left = `${indicatorLeftX}px`\r\n this.indicatorContainer.append(lineLeft)\r\n\r\n // 下边线\r\n const lineBottom = document.createElement('span')\r\n lineBottom.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__bottom`)\r\n lineBottom.style.top = `${indicatorBottomY}px`\r\n this.indicatorContainer.append(lineBottom)\r\n\r\n // 右边线\r\n const lineRight = document.createElement('span')\r\n lineRight.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__right`)\r\n lineRight.style.top = `${startY}px`\r\n lineRight.style.height = `${indicatorHeight}px`\r\n lineRight.style.left = `${indicatorRightX}px`\r\n this.indicatorContainer.append(lineRight)\r\n }\r\n this.container.append(this.indicatorContainer)\r\n }\r\n\r\n private _showPageNumberMenu(target: HTMLElement) {\r\n // 移除已有菜单\r\n this._hidePageNumberMenu()\r\n\r\n const rect = target.getBoundingClientRect()\r\n const menu = document.createElement('div')\r\n menu.classList.add(`${EDITOR_PREFIX}-zone-pagenumber-menu`)\r\n menu.style.top = `${rect.bottom + 2}px`\r\n menu.style.left = `${rect.left}px`\r\n\r\n PAGE_NUMBER_STYLES.forEach(item => {\r\n const menuItem = document.createElement('div')\r\n menuItem.classList.add(`${EDITOR_PREFIX}-zone-pagenumber-menu-item`)\r\n menuItem.innerText = item.label\r\n menuItem.onclick = (e) => {\r\n e.stopPropagation()\r\n this._insertPageNumber(item.value, item.numberType)\r\n this._hidePageNumberMenu()\r\n }\r\n menu.append(menuItem)\r\n })\r\n\r\n document.body.append(menu)\r\n this.pageNumberMenu = menu\r\n\r\n // 滚动时关闭菜单\r\n const scrollHandler = () => this._hidePageNumberMenu()\r\n window.addEventListener('scroll', scrollHandler, true)\r\n ;(menu as any)._scrollHandler = scrollHandler\r\n\r\n // 点击其他地方关闭菜单\r\n const closeHandler = (e: MouseEvent) => {\r\n if (!menu.contains(e.target as Node)) {\r\n this._hidePageNumberMenu()\r\n }\r\n }\r\n setTimeout(() => {\r\n document.addEventListener('click', closeHandler)\r\n }, 0)\r\n ;(menu as any)._closeHandler = closeHandler\r\n }\r\n\r\n private _hidePageNumberMenu() {\r\n if (this.pageNumberMenu) {\r\n // 移除滚动监听\r\n const scrollHandler = (this.pageNumberMenu as any)._scrollHandler\r\n if (scrollHandler) {\r\n window.removeEventListener('scroll', scrollHandler, true)\r\n }\r\n // 移除点击监听\r\n const closeHandler = (this.pageNumberMenu as any)._closeHandler\r\n if (closeHandler) {\r\n document.removeEventListener('click', closeHandler)\r\n }\r\n this.pageNumberMenu.remove()\r\n this.pageNumberMenu = null\r\n }\r\n }\r\n\r\n private _insertPageNumber(format: string, numberType?: any) {\r\n const options = this.draw.getOptions()\r\n // 设置页码格式\r\n options.pageNumber = options.pageNumber || {}\r\n const pageNumberOptions = options.pageNumber as any\r\n pageNumberOptions.format = format\r\n if (numberType) {\r\n pageNumberOptions.numberType = numberType\r\n }\r\n // 重新渲染\r\n this.draw.render({\r\n isSubmitHistory: true,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n private _getZoneName(isHeader: boolean) {\r\n const key = `frame.${isHeader ? 'header' : 'footer'}`\r\n const zoneName = this.i18n.t(key)\r\n if (zoneName && zoneName !== key) {\r\n return zoneName\r\n }\r\n return isHeader ? '页眉' : '页脚'\r\n }\r\n\r\n private _clearZoneIndicator() {\r\n this.indicatorContainer?.remove()\r\n this.indicatorContainer = null\r\n this._hidePageNumberMenu()\r\n }\r\n}\r\n","import { maxHeightRadioMapping } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRow } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Footer {\r\n private draw: Draw\r\n private position: Position\r\n private zone: Zone\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private elementList: IElement[]\r\n private rowList: IRow[]\r\n private positionList: IElementPosition[]\r\n\r\n constructor(draw: Draw, data?: IElement[]) {\r\n this.draw = draw\r\n this.position = draw.getPosition()\r\n this.zone = draw.getZone()\r\n this.options = draw.getOptions()\r\n\r\n this.elementList = data || []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n public getRowList(): IRow[] {\r\n return this.rowList\r\n }\r\n\r\n public setElementList(elementList: IElement[]) {\r\n this.elementList = elementList\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n return this.elementList\r\n }\r\n\r\n public getPositionList(): IElementPosition[] {\r\n return this.positionList\r\n }\r\n\r\n public compute() {\r\n this.recovery()\r\n this._computeRowList()\r\n this._computePositionList()\r\n }\r\n\r\n public recovery() {\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n private _computeRowList() {\r\n const innerWidth = this.draw.getInnerWidth()\r\n this.rowList = this.draw.computeRowList({\r\n innerWidth,\r\n elementList: this.elementList\r\n })\r\n }\r\n\r\n private _computePositionList() {\r\n const footerBottom = this.getFooterBottom()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n const startX = margins[3]\r\n // 页面高度 - 页脚顶部距离页面底部高度\r\n const pageHeight = this.draw.getHeight()\r\n const footerHeight = this.getHeight()\r\n const startY = pageHeight - footerBottom - footerHeight\r\n this.position.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX,\r\n startY,\r\n innerWidth,\r\n zone: EditorZone.FOOTER\r\n })\r\n }\r\n\r\n public getFooterBottom(): number {\r\n const {\r\n footer: { bottom, disabled },\r\n scale\r\n } = this.options\r\n if (disabled) return 0\r\n return Math.floor(bottom * scale)\r\n }\r\n\r\n public getMaxHeight(): number {\r\n const {\r\n footer: { maxHeightRadio }\r\n } = this.options\r\n const height = this.draw.getHeight()\r\n return Math.floor(height * maxHeightRadioMapping[maxHeightRadio])\r\n }\r\n\r\n public getHeight(): number {\r\n const maxHeight = this.getMaxHeight()\r\n const rowHeight = this.getRowHeight()\r\n return rowHeight > maxHeight ? maxHeight : rowHeight\r\n }\r\n\r\n public getRowHeight(): number {\r\n return this.rowList.reduce((pre, cur) => pre + cur.height, 0)\r\n }\r\n\r\n public getExtraHeight(): number {\r\n // 页脚下边距 + 实际高 - 页面上边距\r\n const margins = this.draw.getMargins()\r\n const footerHeight = this.getHeight()\r\n const footerBottom = this.getFooterBottom()\r\n const extraHeight = footerBottom + footerHeight - margins[2]\r\n return extraHeight <= 0 ? 0 : extraHeight\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n ctx.save()\r\n ctx.globalAlpha = this.zone.isFooterActive()\r\n ? 1\r\n : this.options.footer.inactiveAlpha\r\n const innerWidth = this.draw.getInnerWidth()\r\n const maxHeight = this.getMaxHeight()\r\n // 超出最大高度不渲染\r\n const rowList: IRow[] = []\r\n let curRowHeight = 0\r\n for (let r = 0; r < this.rowList.length; r++) {\r\n const row = this.rowList[r]\r\n if (curRowHeight + row.height > maxHeight) {\r\n break\r\n }\r\n rowList.push(row)\r\n curRowHeight += row.height\r\n }\r\n this.draw.drawRow(ctx, {\r\n elementList: this.elementList,\r\n positionList: this.positionList,\r\n rowList,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth,\r\n zone: EditorZone.FOOTER,\r\n isDrawLineBreak: false\r\n })\r\n ctx.restore()\r\n }\r\n}\r\n","import { UlStyle } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class ListSymbolDrawer {\r\n public drawSymbol(\r\n ctx: CanvasRenderingContext2D,\r\n style: UlStyle,\r\n x: number,\r\n y: number,\r\n fontSize: number,\r\n color: string\r\n ): void {\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.strokeStyle = color\r\n ctx.lineWidth = Math.max(1.5, fontSize * 0.08)\r\n\r\n const size = fontSize * 0.6\r\n const centerY = y\r\n\r\n switch (style) {\r\n case UlStyle.DISC:\r\n this.drawDisc(ctx, x, centerY, size)\r\n break\r\n case UlStyle.CIRCLE:\r\n this.drawCircle(ctx, x, centerY, size)\r\n break\r\n case UlStyle.SQUARE:\r\n this.drawSquare(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.DIAMOND:\r\n case UlStyle.DIAMOND_SOLID:\r\n this.drawDiamond(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.DASH:\r\n this.drawDash(ctx, x, centerY, size)\r\n break\r\n case UlStyle.CHECK:\r\n this.drawCheck(ctx, x, centerY, size)\r\n break\r\n case UlStyle.TRIANGLE:\r\n case UlStyle.TRIANGLE_SOLID:\r\n this.drawTriangle(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.STAR:\r\n case UlStyle.STAR_SOLID:\r\n this.drawStar(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.ARROW:\r\n this.drawArrow(ctx, x, centerY, size)\r\n break\r\n case UlStyle.ANGLE:\r\n this.drawAngle(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HOLLOW_CIRCLE:\r\n this.drawCircle(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HOLLOW_SQUARE:\r\n this.drawSquare(ctx, x, centerY, size, false)\r\n break\r\n case UlStyle.HEART_HOLLOW:\r\n this.drawHeart(ctx, x, centerY, size, false)\r\n break\r\n case UlStyle.HASH:\r\n this.drawHash(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HEART_SOLID:\r\n this.drawHeart(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.FLOWER:\r\n this.drawFlower(ctx, x, centerY, size)\r\n break\r\n case UlStyle.ASTERISK:\r\n this.drawAsterisk(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HOLLOW_DIAMOND:\r\n this.drawDiamond(ctx, x, centerY, size, false)\r\n break\r\n case UlStyle.HOLLOW_TRIANGLE:\r\n this.drawTriangle(ctx, x, centerY, size, false)\r\n break\r\n default:\r\n this.drawDisc(ctx, x, centerY, size)\r\n }\r\n\r\n ctx.restore()\r\n }\r\n\r\n private drawDisc(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n ctx.beginPath()\r\n ctx.arc(x, y, size * 0.5, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n\r\n private drawCircle(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n ctx.beginPath()\r\n ctx.arc(x, y, size * 0.5, 0, Math.PI * 2)\r\n ctx.stroke()\r\n }\r\n\r\n private drawSquare(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const half = size * 0.5\r\n ctx.beginPath()\r\n ctx.rect(x - half, y - half, size, size)\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawDiamond(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const half = size * 0.6\r\n ctx.beginPath()\r\n ctx.moveTo(x, y - half)\r\n ctx.lineTo(x + half, y)\r\n ctx.lineTo(x, y + half)\r\n ctx.lineTo(x - half, y)\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawDash(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.6\r\n ctx.beginPath()\r\n ctx.moveTo(x - half, y)\r\n ctx.lineTo(x + half, y)\r\n ctx.stroke()\r\n }\r\n\r\n private drawCheck(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const scale = size * 0.04\r\n ctx.beginPath()\r\n ctx.moveTo(x - size * 0.3, y)\r\n ctx.lineTo(x - size * 0.1, y + size * 0.25)\r\n ctx.lineTo(x + size * 0.35, y - size * 0.25)\r\n ctx.lineWidth = Math.max(1.5, scale * 4)\r\n ctx.stroke()\r\n }\r\n\r\n private drawTriangle(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const half = size * 0.55\r\n ctx.beginPath()\r\n ctx.moveTo(x - half, y - half * 0.6)\r\n ctx.lineTo(x + half, y)\r\n ctx.lineTo(x - half, y + half * 0.6)\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawStar(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const outerRadius = size * 0.55\r\n const innerRadius = outerRadius * 0.4\r\n const points = 5\r\n const step = Math.PI / points\r\n\r\n ctx.beginPath()\r\n for (let i = 0; i < 2 * points; i++) {\r\n const radius = i % 2 === 0 ? outerRadius : innerRadius\r\n const angle = i * step - Math.PI / 2\r\n const px = x + radius * Math.cos(angle)\r\n const py = y + radius * Math.sin(angle)\r\n if (i === 0) {\r\n ctx.moveTo(px, py)\r\n } else {\r\n ctx.lineTo(px, py)\r\n }\r\n }\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawArrow(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x - half * 0.3, y - half)\r\n ctx.lineTo(x + half, y)\r\n ctx.lineTo(x - half * 0.3, y + half)\r\n ctx.lineTo(x - half * 0.3, y)\r\n ctx.closePath()\r\n ctx.fill()\r\n }\r\n\r\n private drawAngle(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x - half, y - half * 0.8)\r\n ctx.lineTo(x + half * 0.3, y)\r\n ctx.lineTo(x - half, y + half * 0.8)\r\n ctx.lineWidth = Math.max(1.5, size * 0.08)\r\n ctx.stroke()\r\n }\r\n\r\n private drawHeart(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const scale = size * 0.025\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + scale * 4)\r\n ctx.bezierCurveTo(\r\n x - scale * 5,\r\n y + scale * 1,\r\n x - scale * 6,\r\n y - scale * 4,\r\n x,\r\n y - scale * 2\r\n )\r\n ctx.bezierCurveTo(\r\n x + scale * 6,\r\n y - scale * 4,\r\n x + scale * 5,\r\n y + scale * 1,\r\n x,\r\n y + scale * 4\r\n )\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawHash(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n const offset = size * 0.2\r\n ctx.beginPath()\r\n ctx.moveTo(x - half * 0.5, y - half)\r\n ctx.lineTo(x + half * 0.5, y + half)\r\n ctx.moveTo(x + half * 0.5, y - half)\r\n ctx.lineTo(x - half * 0.5, y + half)\r\n ctx.moveTo(x - half, y - offset)\r\n ctx.lineTo(x + half, y - offset)\r\n ctx.moveTo(x - half, y + offset)\r\n ctx.lineTo(x + half, y + offset)\r\n ctx.lineWidth = Math.max(1, size * 0.06)\r\n ctx.stroke()\r\n }\r\n\r\n private drawFlower(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const petalRadius = size * 0.25\r\n const centerOffset = size * 0.2\r\n const petals = 5\r\n\r\n for (let i = 0; i < petals; i++) {\r\n const angle = (i * 2 * Math.PI) / petals - Math.PI / 2\r\n const px = x + centerOffset * Math.cos(angle)\r\n const py = y + centerOffset * Math.sin(angle)\r\n ctx.beginPath()\r\n ctx.arc(px, py, petalRadius, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n\r\n ctx.beginPath()\r\n ctx.arc(x, y, petalRadius * 0.6, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n\r\n private drawAsterisk(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n const lines = 4\r\n ctx.beginPath()\r\n for (let i = 0; i < lines; i++) {\r\n const angle = (i * Math.PI) / lines\r\n const dx = half * Math.cos(angle)\r\n const dy = half * Math.sin(angle)\r\n ctx.moveTo(x - dx, y - dy)\r\n ctx.lineTo(x + dx, y + dy)\r\n }\r\n ctx.lineWidth = Math.max(1.5, size * 0.08)\r\n ctx.stroke()\r\n }\r\n\r\n public getSymbolWidth(style: UlStyle, fontSize: number): number {\r\n const size = fontSize * 0.6\r\n switch (style) {\r\n case UlStyle.DISC:\r\n case UlStyle.CIRCLE:\r\n case UlStyle.HOLLOW_CIRCLE:\r\n return size\r\n case UlStyle.SQUARE:\r\n case UlStyle.HOLLOW_SQUARE:\r\n return size\r\n case UlStyle.DIAMOND:\r\n case UlStyle.DIAMOND_SOLID:\r\n case UlStyle.HOLLOW_DIAMOND:\r\n return size * 1.2\r\n case UlStyle.DASH:\r\n return size * 1.2\r\n case UlStyle.CHECK:\r\n return size * 0.7\r\n case UlStyle.TRIANGLE:\r\n case UlStyle.TRIANGLE_SOLID:\r\n case UlStyle.HOLLOW_TRIANGLE:\r\n return size * 1.1\r\n case UlStyle.STAR:\r\n case UlStyle.STAR_SOLID:\r\n return size * 1.1\r\n case UlStyle.ARROW:\r\n return size * 1.5\r\n case UlStyle.ANGLE:\r\n return size * 1.3\r\n case UlStyle.HEART_HOLLOW:\r\n case UlStyle.HEART_SOLID:\r\n return size * 1.2\r\n case UlStyle.HASH:\r\n return size\r\n case UlStyle.FLOWER:\r\n return size * 0.9\r\n case UlStyle.ASTERISK:\r\n return size\r\n default:\r\n return size\r\n }\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { ListStyle, ListType, OlStyle, UlStyle } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { getUUID } from '@vervedoc/docx-editor-schema'\r\nimport { isParagraphSeparator } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../draw/Draw'\r\nimport { ListSymbolDrawer } from './ListSymbolDrawer'\r\n\r\nexport class ListParticle {\r\n private draw: Draw\r\n private range: RangeManager\r\n private options: DeepRequired<IEditorOption>\r\n private symbolDrawer: ListSymbolDrawer\r\n\r\n private readonly MEASURE_BASE_TEXT = '0'\r\n private readonly LIST_GAP = 10\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.options = draw.getOptions()\r\n this.symbolDrawer = new ListSymbolDrawer()\r\n }\r\n\r\n public setList(listType: ListType | null, listStyle?: ListStyle) {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n // 需要改变的元素列表\r\n const changeElementList = this.range.getRangeParagraphElementList()\r\n if (!changeElementList || !changeElementList.length) return\r\n // 如果包含列表则设置为取消列表\r\n const isUnsetList = changeElementList.find(\r\n el => el.listType === listType && el.listStyle === listStyle\r\n )\r\n if (isUnsetList || !listType) {\r\n this.unsetList()\r\n return\r\n }\r\n // 设置值\r\n const listId = getUUID()\r\n changeElementList.forEach(el => {\r\n el.listId = listId\r\n el.listType = listType\r\n el.listStyle = listStyle\r\n })\r\n // 光标定位\r\n const isSetCursor = startIndex === endIndex\r\n const curIndex = isSetCursor ? endIndex : startIndex\r\n this.draw.render({ curIndex, isSetCursor })\r\n }\r\n\r\n public unsetList() {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n // 需要改变的元素列表\r\n const changeElementList = this.range\r\n .getRangeParagraphElementList()\r\n ?.filter(el => el.listId)\r\n if (!changeElementList || !changeElementList.length) return\r\n // 如果列表最后字符不是换行符则需插入换行符\r\n const elementList = this.draw.getElementList()\r\n const endElement = elementList[endIndex]\r\n if (endElement.listId) {\r\n let start = endIndex + 1\r\n while (start < elementList.length) {\r\n const element = elementList[start]\r\n if (isParagraphSeparator(element)) break\r\n if (element.listId !== endElement.listId) {\r\n this.draw.spliceElementList(elementList, start, 0, [\r\n {\r\n value: ZERO\r\n }\r\n ])\r\n break\r\n }\r\n start++\r\n }\r\n }\r\n // 取消设置\r\n changeElementList.forEach(el => {\r\n delete el.listId\r\n delete el.listType\r\n delete el.listStyle\r\n delete el.listWrap\r\n })\r\n // 光标定位\r\n const isSetCursor = startIndex === endIndex\r\n const curIndex = isSetCursor ? endIndex : startIndex\r\n this.draw.render({ curIndex, isSetCursor })\r\n }\r\n\r\n public computeListStyle(\r\n ctx: CanvasRenderingContext2D,\r\n elementList: IElement[]\r\n ): Map<string, number> {\r\n const listStyleMap = new Map<string, number>()\r\n let start = 0\r\n let curListId = elementList[start].listId\r\n let curElementList: IElement[] = []\r\n const elementLength = elementList.length\r\n while (start < elementLength) {\r\n const curElement = elementList[start]\r\n if (curListId && curListId === curElement.listId) {\r\n curElementList.push(curElement)\r\n } else {\r\n if (curElement.listId && curElement.listId !== curListId) {\r\n // 列表结束\r\n if (curElementList.length) {\r\n const width = this.getListStyleWidth(ctx, curElementList)\r\n listStyleMap.set(curListId!, width)\r\n }\r\n curListId = curElement.listId\r\n curElementList = curListId ? [curElement] : []\r\n }\r\n }\r\n start++\r\n }\r\n if (curElementList.length) {\r\n const width = this.getListStyleWidth(ctx, curElementList)\r\n listStyleMap.set(curListId!, width)\r\n }\r\n return listStyleMap\r\n }\r\n\r\n public getListStyleWidth(\r\n ctx: CanvasRenderingContext2D,\r\n listElementList: IElement[]\r\n ): number {\r\n const { scale, checkbox, defaultSize, defaultFont } = this.options\r\n const startElement = listElementList[0]\r\n // 获取元素实际字号和字体(优先从第一个非换行符元素获取)\r\n let referenceElement = startElement\r\n for (let i = 1; i < listElementList.length; i++) {\r\n const el = listElementList[i]\r\n if (el.value !== ZERO && el.value !== '\\t') {\r\n referenceElement = el\r\n break\r\n }\r\n }\r\n const elementSize = referenceElement.actualSize || referenceElement.size || defaultSize\r\n const elementFont = referenceElement.font || defaultFont\r\n const fontSize = elementSize * scale\r\n // 非递增样式(UL项目符号等)基于字号计算宽度\r\n if (\r\n startElement.listStyle &&\r\n startElement.listStyle !== ListStyle.DECIMAL\r\n ) {\r\n if (startElement.listStyle === ListStyle.CHECKBOX) {\r\n return (checkbox.width + this.LIST_GAP) * scale\r\n }\r\n if (startElement.listType === ListType.UL) {\r\n const symbolWidth = this.symbolDrawer.getSymbolWidth(\r\n <UlStyle>(<unknown>startElement.listStyle),\r\n fontSize\r\n )\r\n return Math.ceil(symbolWidth + this.LIST_GAP * scale)\r\n }\r\n // 有序列表固定样式\r\n ctx.save()\r\n ctx.font = `${fontSize}px ${elementFont}`\r\n const symbolText = this.getOlValue(<OlStyle>(<unknown>startElement.listStyle), 1)\r\n const symbolMetrics = ctx.measureText(symbolText)\r\n ctx.restore()\r\n return Math.ceil((symbolMetrics.width + this.LIST_GAP) * scale)\r\n }\r\n // 计算列表数量\r\n const count = listElementList.reduce((pre, cur) => {\r\n if (cur.value === ZERO) {\r\n pre += 1\r\n }\r\n return pre\r\n }, 0)\r\n if (!count) return 0\r\n // 以递增样式最大宽度为准,使用元素字号测量\r\n const text = `${this.MEASURE_BASE_TEXT.repeat(String(count).length)}${\r\n KeyMap.PERIOD\r\n }`\r\n ctx.save()\r\n ctx.font = `${fontSize}px ${elementFont}`\r\n const textMetrics = ctx.measureText(text)\r\n ctx.restore()\r\n return Math.ceil((textMetrics.width + this.LIST_GAP) * scale)\r\n }\r\n\r\n public drawListStyle(\r\n ctx: CanvasRenderingContext2D,\r\n row: IRow,\r\n position: IElementPosition\r\n ) {\r\n const { elementList, offsetX, listIndex, ascent, height } = row\r\n const startElement = elementList[0]\r\n if (startElement.value !== ZERO || startElement.listWrap) return\r\n // tab width\r\n let tabWidth = 0\r\n const { defaultTabWidth, scale, defaultFont, defaultSize } = this.options\r\n for (let i = 1; i < elementList.length; i++) {\r\n const element = elementList[i]\r\n if (element?.type !== ElementType.TAB) break\r\n tabWidth += defaultTabWidth * scale\r\n }\r\n // 列表样式渲染\r\n const {\r\n coordinate: {\r\n leftTop: [startX, startY]\r\n }\r\n } = position\r\n const x =\r\n startX - offsetX! + tabWidth - (startElement.listHanging || 0) * this.options.scale\r\n // 复选框样式特殊处理\r\n if (startElement.listStyle === ListStyle.CHECKBOX) {\r\n const { width, height: checkboxHeight, gap } = this.options.checkbox\r\n const checkboxRowElement: IRowElement = {\r\n ...startElement,\r\n checkbox: {\r\n value: !!startElement.checkbox?.value\r\n },\r\n metrics: {\r\n ...startElement.metrics,\r\n width: (width + gap * 2) * scale,\r\n height: checkboxHeight * scale\r\n }\r\n }\r\n this.draw.getCheckboxParticle().render({\r\n ctx,\r\n x: x - gap * scale,\r\n y: startY + ascent,\r\n index: 0,\r\n row: {\r\n ...row,\r\n elementList: [checkboxRowElement, ...row.elementList]\r\n }\r\n })\r\n return\r\n }\r\n // 获取元素字号和颜色(优先从第一个非换行符元素获取)\r\n let referenceElement = startElement\r\n for (let i = 1; i < elementList.length; i++) {\r\n const el = elementList[i]\r\n if (el.value !== ZERO && el.value !== '\\t') {\r\n referenceElement = el\r\n break\r\n }\r\n }\r\n const elementSize = referenceElement.actualSize || referenceElement.size || defaultSize\r\n const fontSize = elementSize * scale\r\n const color = referenceElement.color || this.options.defaultColor\r\n // 计算垂直居中位置:使用行高的一半作为垂直中心\r\n const baselineY = startY + ascent\r\n const rowCenterY = startY + height / 2\r\n // 无序列表使用 Canvas Path 绘制符号\r\n if (startElement.listType === ListType.UL) {\r\n const style = <UlStyle>(<unknown>startElement.listStyle) || UlStyle.DISC\r\n const symbolWidth = this.symbolDrawer.getSymbolWidth(style, fontSize)\r\n const symbolX = x + symbolWidth / 2\r\n this.symbolDrawer.drawSymbol(ctx, style, symbolX, rowCenterY, fontSize, color)\r\n } else {\r\n // 有序列表使用文字绘制\r\n const elementFont = referenceElement.font || defaultFont\r\n const text = this.getOlValue(\r\n <OlStyle>(<unknown>startElement.listStyle),\r\n listIndex! + 1\r\n )\r\n if (!text) return\r\n ctx.save()\r\n ctx.font = `${referenceElement.italic ? 'italic ' : ''}${referenceElement.bold ? 'bold ' : ''}${fontSize}px ${elementFont}`\r\n ctx.fillStyle = color\r\n ctx.fillText(text, x, baselineY)\r\n ctx.restore()\r\n }\r\n }\r\n\r\n private getOlValue(style: OlStyle, n: number): string {\r\n switch (style) {\r\n case OlStyle.CHINESE:\r\n return `${this.chineseFromNumber(n)}、`\r\n case OlStyle.CHINESE_BRACKET:\r\n return `(${this.chineseFromNumber(n)})`\r\n case OlStyle.DECIMAL_DOT:\r\n case OlStyle.DECIMAL:\r\n return `${n}${KeyMap.PERIOD}`\r\n case OlStyle.DECIMAL_PAREN:\r\n return `(${n})`\r\n case OlStyle.DECIMAL_BRACKET:\r\n return `${n})`\r\n case OlStyle.DECIMAL_CIRCLE:\r\n return this.circleFromNumber(n)\r\n case OlStyle.UPPER_ALPHA:\r\n return this.alphaFromNumber(n, true)\r\n case OlStyle.LOWER_ALPHA_DOT:\r\n return `${this.alphaFromNumber(n, false)}${KeyMap.PERIOD}`\r\n default:\r\n return `${n}${KeyMap.PERIOD}`\r\n }\r\n }\r\n\r\n private chineseFromNumber(n: number): string {\r\n const chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']\r\n const chineseUnits = ['', '十', '百', '千']\r\n if (n === 0) return chineseNumbers[0]\r\n if (n < 10) return chineseNumbers[n]\r\n if (n === 10) return '十'\r\n if (n < 20) return `十${chineseNumbers[n % 10]}`\r\n\r\n let result = ''\r\n let unitIndex = 0\r\n while (n > 0) {\r\n const digit = n % 10\r\n if (digit !== 0) {\r\n result = chineseNumbers[digit] + chineseUnits[unitIndex] + result\r\n } else if (result !== '' && !result.startsWith(chineseNumbers[0])) {\r\n result = chineseNumbers[0] + result\r\n }\r\n n = Math.floor(n / 10)\r\n unitIndex++\r\n }\r\n return result.replace(/零+$/, '')\r\n }\r\n\r\n private circleFromNumber(n: number): string {\r\n const circles = [\r\n '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩',\r\n '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳'\r\n ]\r\n return circles[n - 1] || String(n)\r\n }\r\n\r\n private alphaFromNumber(n: number, isUpper: boolean): string {\r\n let result = ''\r\n const base = isUpper ? 65 : 97\r\n while (n > 0) {\r\n n--\r\n result = String.fromCharCode(base + (n % 26)) + result\r\n n = Math.floor(n / 26)\r\n }\r\n return result\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class LineBreakParticle {\r\n private options: DeepRequired<IEditorOption>\r\n public static readonly WIDTH = 12\r\n public static readonly HEIGHT = 9\r\n public static readonly GAP = 3 // 距离左边间隙\r\n\r\n constructor(draw: Draw) {\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n const {\r\n scale,\r\n lineBreak: { color, lineWidth }\r\n } = this.options\r\n ctx.save()\r\n ctx.beginPath()\r\n // 换行符尺寸设置为9像素\r\n const top = y - (LineBreakParticle.HEIGHT * scale) / 2\r\n const left = x + element.metrics.width\r\n // 移动位置并设置缩放\r\n ctx.translate(left, top)\r\n ctx.scale(scale, scale)\r\n // 样式设置\r\n ctx.strokeStyle = color\r\n ctx.lineWidth = lineWidth\r\n ctx.lineCap = 'round'\r\n ctx.lineJoin = 'round'\r\n ctx.beginPath()\r\n // 回车折线\r\n ctx.moveTo(8, 0)\r\n ctx.lineTo(12, 0)\r\n ctx.lineTo(12, 6)\r\n ctx.lineTo(3, 6)\r\n // 箭头向上\r\n ctx.moveTo(3, 6)\r\n ctx.lineTo(6, 3)\r\n // 箭头向下\r\n ctx.moveTo(3, 6)\r\n ctx.lineTo(6, 9)\r\n ctx.stroke()\r\n ctx.closePath()\r\n ctx.restore()\r\n }\r\n}\r\n","import { IEditorOption, IElement } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IPlaceholder } from '@vervedoc/docx-editor-schema'\r\nimport { IRow } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementList } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Draw } from '../draw/Draw'\r\nimport { LineBreakParticle } from '../particle/LineBreakParticle'\r\n\r\nexport interface IPlaceholderRenderOption {\r\n placeholder: Required<IPlaceholder>\r\n startY?: number\r\n}\r\n\r\nexport class Placeholder {\r\n private draw: Draw\r\n private position: Position\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private elementList: IElement[]\r\n private rowList: IRow[]\r\n private positionList: IElementPosition[]\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.position = draw.getPosition()\r\n this.options = <DeepRequired<IEditorOption>>draw.getOptions()\r\n\r\n this.elementList = []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n private _recovery() {\r\n this.elementList = []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n public _compute(options?: IPlaceholderRenderOption) {\r\n this._computeRowList()\r\n this._computePositionList(options)\r\n }\r\n\r\n private _computeRowList() {\r\n const innerWidth = this.draw.getInnerWidth()\r\n this.rowList = this.draw.computeRowList({\r\n innerWidth,\r\n elementList: this.elementList\r\n })\r\n }\r\n\r\n private _computePositionList(options?: IPlaceholderRenderOption) {\r\n const { lineBreak, scale } = this.options\r\n const headerExtraHeight = this.draw.getHeader().getExtraHeight()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n let startX = margins[3]\r\n // 换行符绘制开启时,移动起始位置\r\n if (!lineBreak.disabled) {\r\n startX += (LineBreakParticle.WIDTH + LineBreakParticle.GAP) * scale\r\n }\r\n const startY = options?.startY || margins[0] + headerExtraHeight\r\n this.position.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX,\r\n startY,\r\n innerWidth\r\n })\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n options?: IPlaceholderRenderOption\r\n ) {\r\n const { placeholder = this.options.placeholder } = options || {}\r\n const { data, font, size, color, opacity } = placeholder\r\n this._recovery()\r\n // 构建元素列表并格式化\r\n this.elementList = [\r\n {\r\n value: data,\r\n font,\r\n size,\r\n color\r\n }\r\n ]\r\n formatElementList(this.elementList, {\r\n editorOptions: this.options,\r\n isForceCompensation: true\r\n })\r\n // 计算\r\n this._compute(options)\r\n const innerWidth = this.draw.getInnerWidth()\r\n // 绘制\r\n ctx.save()\r\n ctx.globalAlpha = opacity\r\n this.draw.drawRow(ctx, {\r\n elementList: this.elementList,\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startIndex: 0,\r\n innerWidth,\r\n isDrawLineBreak: false\r\n })\r\n ctx.restore()\r\n }\r\n}\r\n","import { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IPositionContext } from '@vervedoc/docx-editor-schema'\r\nimport { IRange } from '@vervedoc/docx-editor-schema'\r\nimport { getUUID } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../draw/Draw'\r\n\r\ninterface IGroupLineRange {\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n}\r\n\r\ninterface IGroupFillRect {\r\n lineRanges: IGroupLineRange[]\r\n}\r\n\r\nexport class Group {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private range: RangeManager\r\n private fillRectMap: Map<string, IGroupFillRect>\r\n private groupIndexMap: Map<string, number> // 批注序号映射\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.range = draw.getRange()\r\n this.fillRectMap = new Map()\r\n this.groupIndexMap = new Map()\r\n }\r\n\r\n public setGroup(): string | null {\r\n if (\r\n this.draw.isReadonly() ||\r\n this.draw.getZone().getZone() !== EditorZone.MAIN\r\n ) {\r\n return null\r\n }\r\n const selection = this.range.getSelection()\r\n if (!selection) return null\r\n const groupId = getUUID()\r\n selection.forEach(el => {\r\n if (!Array.isArray(el.groupIds)) {\r\n el.groupIds = []\r\n }\r\n el.groupIds.push(groupId)\r\n })\r\n this.draw.render({\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n return groupId\r\n }\r\n\r\n public getElementListByGroupId(\r\n elementList: IElement[],\r\n groupId: string\r\n ): IElement[] {\r\n const groupElementList: IElement[] = []\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdGroupElementList = this.getElementListByGroupId(\r\n td.value,\r\n groupId\r\n )\r\n if (tdGroupElementList.length) {\r\n groupElementList.push(...tdGroupElementList)\r\n return groupElementList\r\n }\r\n }\r\n }\r\n }\r\n if (element?.groupIds?.includes(groupId)) {\r\n groupElementList.push(element)\r\n const nextElement = elementList[e + 1]\r\n if (!nextElement?.groupIds?.includes(groupId)) break\r\n }\r\n }\r\n return groupElementList\r\n }\r\n\r\n public deleteGroup(groupId: string) {\r\n if (this.draw.isReadonly()) return\r\n // 仅主体内容可以成组\r\n const elementList = this.draw.getOriginalMainElementList()\r\n const groupElementList = this.getElementListByGroupId(elementList, groupId)\r\n if (!groupElementList.length) return\r\n for (let e = 0; e < groupElementList.length; e++) {\r\n const element = groupElementList[e]\r\n const groupIds = element.groupIds!\r\n const groupIndex = groupIds.findIndex(id => id === groupId)\r\n groupIds.splice(groupIndex, 1)\r\n // 不包含成组时删除字段,减少存储及内存占用\r\n if (!groupIds.length) {\r\n delete element.groupIds\r\n }\r\n }\r\n this.draw.render({\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public getContextByGroupId(\r\n elementList: IElement[],\r\n groupId: string\r\n ): (IRange & IPositionContext) | null {\r\n let groupStartIndex = -1\r\n let groupEndIndex = -1\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const range = this.getContextByGroupId(td.value, groupId)\r\n if (range) {\r\n return {\r\n ...range,\r\n isTable: true,\r\n index: e,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.tableId\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (element.groupIds?.includes(groupId)) {\r\n if (groupStartIndex === -1) groupStartIndex = e\r\n groupEndIndex = e\r\n }\r\n }\r\n if (groupStartIndex !== -1) {\r\n return {\r\n isTable: false,\r\n startIndex: groupStartIndex,\r\n endIndex: groupEndIndex\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public clearFillInfo() {\r\n this.fillRectMap.clear()\r\n this.groupIndexMap.clear()\r\n }\r\n\r\n public recordFillInfo(\r\n element: IElement,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n ) {\r\n const groupIds = element.groupIds\r\n if (!groupIds) return\r\n for (const groupId of groupIds) {\r\n const fillRect = this.fillRectMap.get(groupId)\r\n if (!fillRect) {\r\n this.fillRectMap.set(groupId, {\r\n lineRanges: [{ x, y, width, height }]\r\n })\r\n if (!this.groupIndexMap.has(groupId)) {\r\n this.groupIndexMap.set(groupId, this.groupIndexMap.size + 1)\r\n }\r\n } else {\r\n const lastLine = fillRect.lineRanges[fillRect.lineRanges.length - 1]\r\n if (lastLine && Math.abs(lastLine.y - y) < 1) {\r\n lastLine.width += width\r\n } else {\r\n fillRect.lineRanges.push({ x, y, width, height })\r\n }\r\n }\r\n }\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRectMap.size) return\r\n\r\n const range = this.range.getRange()\r\n const elementList = this.draw.getElementList()\r\n const anchorGroupIds = elementList[range.endIndex]?.groupIds\r\n const {\r\n group: { backgroundColor, opacity, activeOpacity, activeBackgroundColor }\r\n } = this.options\r\n\r\n ctx.save()\r\n \r\n this.fillRectMap.forEach((fillRect, groupId) => {\r\n const { lineRanges } = fillRect\r\n const isActive = anchorGroupIds?.includes(groupId)\r\n \r\n if (isActive) {\r\n ctx.globalAlpha = activeOpacity\r\n ctx.fillStyle = activeBackgroundColor\r\n } else {\r\n ctx.globalAlpha = opacity\r\n ctx.fillStyle = backgroundColor\r\n }\r\n for (const line of lineRanges) {\r\n ctx.fillRect(line.x, line.y, line.width, line.height)\r\n }\r\n\r\n })\r\n \r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n \r\n // 获取批注序号\r\n public getCommentIndex(groupId: string): number {\r\n return this.groupIndexMap.get(groupId) || 0\r\n }\r\n \r\n // 获取所有批注的 groupId 列表(按序号排序)\r\n public getAllGroupIds(): string[] {\r\n const groups = Array.from(this.groupIndexMap.entries())\r\n groups.sort((a, b) => a[1] - b[1])\r\n return groups.map(g => g[0])\r\n }\r\n}\r\n","import { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\n\r\nexport class MouseObserver {\r\n private draw: Draw\r\n private eventBus: EventBus<EventBusMap>\r\n private pageContainer: HTMLDivElement\r\n private _mousemoveHandler: (evt: MouseEvent) => void\r\n private _mouseenterHandler: (evt: MouseEvent) => void\r\n private _mouseleaveHandler: (evt: MouseEvent) => void\r\n private _mousedownHandler: (evt: MouseEvent) => void\r\n private _mouseupHandler: (evt: MouseEvent) => void\r\n private _clickHandler: (evt: MouseEvent) => void\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.eventBus = this.draw.getEventBus()\r\n this.pageContainer = this.draw.getPageContainer()\r\n this._mousemoveHandler = this._mousemove.bind(this)\r\n this._mouseenterHandler = this._mouseenter.bind(this)\r\n this._mouseleaveHandler = this._mouseleave.bind(this)\r\n this._mousedownHandler = this._mousedown.bind(this)\r\n this._mouseupHandler = this._mouseup.bind(this)\r\n this._clickHandler = this._click.bind(this)\r\n this.pageContainer.addEventListener('mousemove', this._mousemoveHandler)\r\n this.pageContainer.addEventListener('mouseenter', this._mouseenterHandler)\r\n this.pageContainer.addEventListener('mouseleave', this._mouseleaveHandler)\r\n this.pageContainer.addEventListener('mousedown', this._mousedownHandler)\r\n this.pageContainer.addEventListener('mouseup', this._mouseupHandler)\r\n this.pageContainer.addEventListener('click', this._clickHandler)\r\n }\r\n\r\n public removeEvent() {\r\n this.pageContainer.removeEventListener('mousemove', this._mousemoveHandler)\r\n this.pageContainer.removeEventListener('mouseenter', this._mouseenterHandler)\r\n this.pageContainer.removeEventListener('mouseleave', this._mouseleaveHandler)\r\n this.pageContainer.removeEventListener('mousedown', this._mousedownHandler)\r\n this.pageContainer.removeEventListener('mouseup', this._mouseupHandler)\r\n this.pageContainer.removeEventListener('click', this._clickHandler)\r\n }\r\n\r\n private _mousemove(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mousemove')) return\r\n this.eventBus.emit('mousemove', evt)\r\n }\r\n\r\n private _mouseenter(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mouseenter')) return\r\n this.eventBus.emit('mouseenter', evt)\r\n }\r\n\r\n private _mouseleave(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mouseleave')) return\r\n this.eventBus.emit('mouseleave', evt)\r\n }\r\n\r\n private _mousedown(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mousedown')) return\r\n this.eventBus.emit('mousedown', evt)\r\n }\r\n\r\n private _mouseup(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mouseup')) return\r\n this.eventBus.emit('mouseup', evt)\r\n }\r\n\r\n private _click(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('click')) return\r\n this.eventBus.emit('click', evt)\r\n }\r\n}\r\n","import { LineNumberType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class LineNumber {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n scale,\r\n lineNumber: { color, size, font, right, type }\r\n } = this.options\r\n const textParticle = this.draw.getTextParticle()\r\n const margins = this.draw.getMargins()\r\n const positionList = this.draw.getPosition().getOriginalMainPositionList()\r\n const pageRowList = this.draw.getPageRowList()\r\n const rowList = pageRowList[pageNo]\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.font = `${size * scale}px ${font}`\r\n for (let i = 0; i < rowList.length; i++) {\r\n const row = rowList[i]\r\n const {\r\n coordinate: { leftBottom }\r\n } = positionList[row.startIndex]\r\n const seq = type === LineNumberType.PAGE ? i + 1 : row.rowIndex + 1\r\n const textMetrics = textParticle.measureText(ctx, {\r\n value: `${seq}`\r\n })\r\n const x = margins[3] - (textMetrics.width + right) * scale\r\n const y = leftBottom[1] - textMetrics.actualBoundingBoxAscent * scale\r\n ctx.fillText(`${seq}`, x, y)\r\n }\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { Footer } from './Footer'\r\nimport { Header } from './Header'\r\n\r\nexport class PageBorder {\r\n private draw: Draw\r\n private header: Header\r\n private footer: Footer\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.header = draw.getHeader()\r\n this.footer = draw.getFooter()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n const {\r\n scale,\r\n pageBorder: { color, lineWidth, padding }\r\n } = this.options\r\n ctx.save()\r\n ctx.translate(0.5, 0.5)\r\n ctx.strokeStyle = color\r\n ctx.lineWidth = lineWidth * scale\r\n const margins = this.draw.getMargins()\r\n // x:左边距 - 左距离正文距离\r\n const x = margins[3] - padding[3] * scale\r\n // y:页眉上边距 + 页眉高度 - 上距离正文距离\r\n const y = margins[0] + this.header.getExtraHeight() - padding[0] * scale\r\n // width:页面宽度 + 左右距离正文距离\r\n const width = this.draw.getInnerWidth() + (padding[1] + padding[3]) * scale\r\n // height:页面高度 - 正文起始位置 - 页脚高度 - 下边距 - 下距离正文距离\r\n const height =\r\n this.draw.getHeight() -\r\n y -\r\n this.footer.getExtraHeight() -\r\n margins[2] +\r\n padding[2] * scale\r\n ctx.rect(x, y, width, height)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n}\r\n","import { ElementType, IElement, TableBorder, VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { TABLE_CONTEXT_ATTR } from '@vervedoc/docx-editor-schema'\r\nimport { TdBorder, TdSlash } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IColgroup } from '@vervedoc/docx-editor-schema'\r\nimport { ITd } from '@vervedoc/docx-editor-schema'\r\nimport { ITr } from '@vervedoc/docx-editor-schema'\r\nimport { cloneProperty, getUUID } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n formatElementContext,\r\n formatElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\nimport { TableParticle } from './TableParticle'\r\nimport { TableTool } from './TableTool'\r\n\r\nexport class TableOperate {\r\n private draw: Draw\r\n private range: RangeManager\r\n private position: Position\r\n private tableTool: TableTool\r\n private tableParticle: TableParticle\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.position = draw.getPosition()\r\n this.tableTool = draw.getTableTool()\r\n this.tableParticle = draw.getTableParticle()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public insertTable(row: number, col: number) {\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n const { defaultTrHeight, defaultTrMinHeight, tdPadding, defaultBorderColor } =\r\n this.options.table\r\n const elementList = this.draw.getElementList()\r\n let offsetX = 0\r\n if (elementList[startIndex]?.listId) {\r\n const positionList = this.position.getPositionList()\r\n const { rowIndex } = positionList[startIndex]\r\n const rowList = this.draw.getRowList()\r\n const row = rowList[rowIndex]\r\n offsetX = row?.offsetX || 0\r\n }\r\n const innerWidth = this.draw.getContextInnerWidth() - offsetX\r\n const tdPaddingHeight = tdPadding[0] + tdPadding[2]\r\n const baseTrHeight =\r\n Number.isFinite(Number(defaultTrHeight)) && Number(defaultTrHeight) > 0\r\n ? Number(defaultTrHeight)\r\n : 0\r\n const autoTrMinHeight = Math.max(\r\n defaultTrMinHeight,\r\n baseTrHeight,\r\n Math.ceil(this.options.defaultSize * 1.4 + tdPaddingHeight)\r\n )\r\n // colgroup\r\n const colgroup: IColgroup[] = []\r\n const colWidth = innerWidth / col\r\n for (let c = 0; c < col; c++) {\r\n colgroup.push({\r\n width: colWidth\r\n })\r\n }\r\n // trlist\r\n const trList: ITr[] = []\r\n for (let r = 0; r < row; r++) {\r\n const tdList: ITd[] = []\r\n const tr: ITr = {\r\n height: autoTrMinHeight,\r\n tdList\r\n }\r\n for (let c = 0; c < col; c++) {\r\n tdList.push({\r\n colspan: 1,\r\n rowspan: 1,\r\n value: []\r\n })\r\n }\r\n trList.push(tr)\r\n }\r\n const element: IElement = {\r\n type: ElementType.TABLE,\r\n value: '',\r\n colgroup,\r\n trList,\r\n borderType: TableBorder.ALL,\r\n borderColor: defaultBorderColor,\r\n borderWidth: 0.5\r\n }\r\n // 格式化element\r\n formatElementList([element], {\r\n editorOptions: this.options\r\n })\r\n formatElementContext(elementList, [element], startIndex, {\r\n editorOptions: this.options\r\n })\r\n const curIndex = startIndex + 1\r\n this.draw.spliceElementList(\r\n elementList,\r\n curIndex,\r\n startIndex === endIndex ? 0 : endIndex - startIndex,\r\n [element]\r\n )\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render({ curIndex, isSetCursor: false })\r\n }\r\n\r\n public insertTableTopRow() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, trIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]\r\n // 之前跨行的增加跨行数\r\n if (curTr.tdList.length < element.colgroup!.length) {\r\n const curTrNo = curTr.tdList[0].rowIndex!\r\n for (let t = 0; t < trIndex!; t++) {\r\n const tr = curTrList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) {\r\n td.rowspan += 1\r\n }\r\n }\r\n }\r\n }\r\n // 增加当前行\r\n const newTrId = getUUID()\r\n const newTr: ITr = {\r\n height: curTr.height,\r\n id: newTrId,\r\n tdList: []\r\n }\r\n for (let t = 0; t < curTr.tdList.length; t++) {\r\n const curTd = curTr.tdList[t]\r\n const newTdId = getUUID()\r\n newTr.tdList.push({\r\n id: newTdId,\r\n rowspan: 1,\r\n colspan: curTd.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: newTrId,\r\n tdId: newTdId\r\n }\r\n ]\r\n })\r\n }\r\n curTrList.splice(trIndex!, 0, newTr)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex,\r\n tdIndex: 0,\r\n tdId: newTr.tdList[0].id,\r\n trId: newTr.id,\r\n tableId\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n this.tableTool.render()\r\n }\r\n\r\n public insertTableBottomRow() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, trIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]\r\n const anchorTr =\r\n curTrList.length - 1 === trIndex ? curTr : curTrList[trIndex! + 1]\r\n // 之前/当前行跨行的增加跨行数\r\n if (anchorTr.tdList.length < element.colgroup!.length) {\r\n const curTrNo = anchorTr.tdList[0].rowIndex!\r\n for (let t = 0; t < trIndex! + 1; t++) {\r\n const tr = curTrList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) {\r\n td.rowspan += 1\r\n }\r\n }\r\n }\r\n }\r\n // 增加当前行\r\n const newTrId = getUUID()\r\n const newTr: ITr = {\r\n height: anchorTr.height,\r\n id: newTrId,\r\n tdList: []\r\n }\r\n for (let t = 0; t < anchorTr.tdList.length; t++) {\r\n const curTd = anchorTr.tdList[t]\r\n const newTdId = getUUID()\r\n newTr.tdList.push({\r\n id: newTdId,\r\n rowspan: 1,\r\n colspan: curTd.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: newTrId,\r\n tdId: newTdId\r\n }\r\n ]\r\n })\r\n }\r\n curTrList.splice(trIndex! + 1, 0, newTr)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: trIndex! + 1,\r\n tdIndex: 0,\r\n tdId: newTr.tdList[0].id,\r\n trId: newTr.id,\r\n tableId: element.id\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n }\r\n\r\n public adjustColWidth(element: IElement) {\r\n if (element.type !== ElementType.TABLE) return\r\n const { defaultColMinWidth } = this.options.table\r\n const colgroup = element.colgroup!\r\n const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0)\r\n const width = this.draw.getOriginalInnerWidth()\r\n if (colgroupWidth > width) {\r\n // 过滤大于最小宽度的列(可能减少宽度的列)\r\n const greaterMinWidthCol = colgroup.filter(\r\n col => col.width > defaultColMinWidth\r\n )\r\n // 均分多余宽度\r\n const adjustWidth = (colgroupWidth - width) / greaterMinWidthCol.length\r\n for (let g = 0; g < colgroup.length; g++) {\r\n const group = colgroup[g]\r\n // 小于最小宽度的列不处理\r\n if (group.width - adjustWidth >= defaultColMinWidth) {\r\n group.width -= adjustWidth\r\n }\r\n }\r\n }\r\n }\r\n\r\n public insertTableLeftCol() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTdIndex = tdIndex!\r\n // 增加列\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdId = getUUID()\r\n tr.tdList.splice(curTdIndex, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n // 重新计算宽度\r\n const { defaultColMinWidth } = this.options.table\r\n const colgroup = element.colgroup!\r\n colgroup.splice(curTdIndex, 0, {\r\n width: defaultColMinWidth\r\n })\r\n this.adjustColWidth(element)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: 0,\r\n tdIndex: curTdIndex,\r\n tdId: curTrList[0].tdList[curTdIndex].id,\r\n trId: curTrList[0].id,\r\n tableId\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n this.tableTool.render()\r\n }\r\n\r\n public insertTableRightCol() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTdIndex = tdIndex! + 1\r\n // 增加列\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdId = getUUID()\r\n tr.tdList.splice(curTdIndex, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n // 重新计算宽度\r\n const { defaultColMinWidth } = this.options.table\r\n const colgroup = element.colgroup!\r\n colgroup.splice(curTdIndex, 0, {\r\n width: defaultColMinWidth\r\n })\r\n this.adjustColWidth(element)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: 0,\r\n tdIndex: curTdIndex,\r\n tdId: curTrList[0].tdList[curTdIndex].id,\r\n trId: curTrList[0].id,\r\n tableId: element.id\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n }\r\n\r\n public deleteTableRow() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, trIndex, tdIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const trList = element.trList!\r\n const curTr = trList[trIndex!]\r\n const curTdRowIndex = curTr.tdList[tdIndex!].rowIndex!\r\n // 如果是最后一行,直接删除整个表格(如果是拆分表格按照正常逻辑走)\r\n if (trList.length <= 1 && element.pagingIndex === 0) {\r\n this.deleteTable()\r\n return\r\n }\r\n // 之前行缩小rowspan\r\n for (let r = 0; r < curTdRowIndex; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (td.rowIndex! + td.rowspan > curTdRowIndex) {\r\n td.rowspan--\r\n }\r\n }\r\n }\r\n // 补跨行\r\n for (let d = 0; d < curTr.tdList.length; d++) {\r\n const td = curTr.tdList[d]\r\n if (td.rowspan > 1) {\r\n const tdId = getUUID()\r\n const nextTr = trList[trIndex! + 1]\r\n nextTr.tdList.splice(d, 0, {\r\n id: tdId,\r\n rowspan: td.rowspan - 1,\r\n colspan: td.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: nextTr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n }\r\n // 删除当前行\r\n trList.splice(trIndex!, 1)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: false\r\n })\r\n this.range.clearRange()\r\n // 重新渲染\r\n this.draw.render({\r\n curIndex: positionContext.index\r\n })\r\n this.tableTool.dispose()\r\n }\r\n\r\n public deleteTableCol() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTd = curTrList[trIndex!].tdList[tdIndex!]\r\n const curColIndex = curTd.colIndex!\r\n // 如果是最后一列,直接删除整个表格\r\n const moreTdTr = curTrList.find(tr => tr.tdList.length > 1)\r\n if (!moreTdTr) {\r\n this.deleteTable()\r\n return\r\n }\r\n // 缩小colspan或删除与当前列重叠的单元格\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (\r\n td.colIndex! <= curColIndex &&\r\n td.colIndex! + td.colspan > curColIndex\r\n ) {\r\n if (td.colspan > 1) {\r\n td.colspan--\r\n } else {\r\n tr.tdList.splice(d, 1)\r\n }\r\n }\r\n }\r\n }\r\n element.colgroup?.splice(curColIndex, 1)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: false\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({\r\n curIndex: positionContext.index\r\n })\r\n this.tableTool.dispose()\r\n }\r\n\r\n public deleteTable() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const tableElement = originalElementList[positionContext.index!]\r\n // 需要删除的表格数量(拆分表格)及位置\r\n let deleteCount = 1\r\n let deleteStartIndex = positionContext.index!\r\n if (tableElement.pagingId) {\r\n // 开始删除的下标位置\r\n deleteStartIndex = positionContext.index! - tableElement.pagingIndex!\r\n // 计算删除的表格数量\r\n for (let i = deleteStartIndex + 1; i < originalElementList.length; i++) {\r\n if (originalElementList[i].pagingId === tableElement.pagingId) {\r\n deleteCount++\r\n } else {\r\n break\r\n }\r\n }\r\n }\r\n // 删除\r\n originalElementList.splice(deleteStartIndex, deleteCount)\r\n const curIndex = deleteStartIndex - 1\r\n this.position.setPositionContext({\r\n isTable: false,\r\n index: curIndex\r\n })\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render({ curIndex })\r\n this.tableTool.dispose()\r\n }\r\n\r\n public mergeTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const {\r\n isCrossRowCol,\r\n startTdIndex,\r\n endTdIndex,\r\n startTrIndex,\r\n endTrIndex\r\n } = this.range.getRange()\r\n if (!isCrossRowCol) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n let startTd = curTrList[startTrIndex!].tdList[startTdIndex!]\r\n let endTd = curTrList[endTrIndex!].tdList[endTdIndex!]\r\n // 交换起始位置\r\n if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {\r\n // prettier-ignore\r\n [startTd, endTd] = [endTd, startTd]\r\n }\r\n const startColIndex = startTd.colIndex!\r\n const endColIndex = endTd.colIndex! + (endTd.colspan - 1)\r\n const startRowIndex = startTd.rowIndex!\r\n const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)\r\n // 选区行列\r\n const rowCol: ITd[][] = []\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdList: ITd[] = []\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdColIndex = td.colIndex!\r\n const tdRowIndex = td.rowIndex!\r\n if (\r\n tdColIndex >= startColIndex &&\r\n tdColIndex <= endColIndex &&\r\n tdRowIndex >= startRowIndex &&\r\n tdRowIndex <= endRowIndex\r\n ) {\r\n tdList.push(td)\r\n }\r\n }\r\n if (tdList.length) {\r\n rowCol.push(tdList)\r\n }\r\n }\r\n if (!rowCol.length) return\r\n // 是否是矩形\r\n const lastRow = rowCol[rowCol.length - 1]\r\n const leftTop = rowCol[0][0]\r\n const rightBottom = lastRow[lastRow.length - 1]\r\n const startX = leftTop.x!\r\n const startY = leftTop.y!\r\n const endX = rightBottom.x! + rightBottom.width!\r\n const endY = rightBottom.y! + rightBottom.height!\r\n for (let t = 0; t < rowCol.length; t++) {\r\n const tr = rowCol[t]\r\n for (let d = 0; d < tr.length; d++) {\r\n const td = tr[d]\r\n const tdStartX = td.x!\r\n const tdStartY = td.y!\r\n const tdEndX = tdStartX + td.width!\r\n const tdEndY = tdStartY + td.height!\r\n // 存在不符合项\r\n if (\r\n startX > tdStartX ||\r\n startY > tdStartY ||\r\n endX < tdEndX ||\r\n endY < tdEndY\r\n ) {\r\n return\r\n }\r\n }\r\n }\r\n // 合并单元格\r\n const mergeTdIdList: string[] = []\r\n const anchorTd = rowCol[0][0]\r\n const isPlaceholder = (el: IElement | undefined) =>\r\n !!el && el.value === ZERO && !el.type\r\n const anchorContextElement =\r\n anchorTd.value.find(el => !isPlaceholder(el)) ||\r\n anchorTd.value[0] ||\r\n ({\r\n value: ZERO,\r\n tableId: element.id,\r\n trId: curTrList[anchorTd.trIndex!]?.id,\r\n tdId: anchorTd.id\r\n } as IElement)\r\n for (let t = 0; t < rowCol.length; t++) {\r\n const tr = rowCol[t]\r\n for (let d = 0; d < tr.length; d++) {\r\n const td = tr[d]\r\n const isAnchorTd = t === 0 && d === 0\r\n // 缓存待删除单元id并合并单元格内容\r\n if (!isAnchorTd) {\r\n mergeTdIdList.push(td.id!)\r\n let startTdValueIndex = 0\r\n while (isPlaceholder(td.value[startTdValueIndex])) {\r\n startTdValueIndex++\r\n }\r\n const isAnchorAllPlaceholder =\r\n anchorTd.value.length > 0 && anchorTd.value.every(isPlaceholder)\r\n if (isAnchorAllPlaceholder && startTdValueIndex < td.value.length) {\r\n anchorTd.value.length = 0\r\n }\r\n for (let d = startTdValueIndex; d < td.value.length; d++) {\r\n const tdElement = td.value[d]\r\n if (isPlaceholder(tdElement)) continue\r\n cloneProperty<IElement>(\r\n TABLE_CONTEXT_ATTR,\r\n anchorContextElement,\r\n tdElement\r\n )\r\n anchorTd.value.push(tdElement)\r\n }\r\n }\r\n // 列合并\r\n if (t === 0 && d !== 0) {\r\n anchorTd.colspan += td.colspan\r\n }\r\n // 行合并\r\n if (t !== 0) {\r\n if (anchorTd.colIndex === td.colIndex) {\r\n anchorTd.rowspan += td.rowspan\r\n }\r\n }\r\n }\r\n }\r\n if (!anchorTd.value.length || !isPlaceholder(anchorTd.value[0])) {\r\n const placeholder: IElement = { value: ZERO }\r\n cloneProperty<IElement>(TABLE_CONTEXT_ATTR, anchorContextElement, placeholder)\r\n anchorTd.value.unshift(placeholder)\r\n } else {\r\n const i = 1\r\n while (i < anchorTd.value.length) {\r\n if (isPlaceholder(anchorTd.value[i])) {\r\n anchorTd.value.splice(i, 1)\r\n continue\r\n }\r\n break\r\n }\r\n }\r\n // 移除多余单元格\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n let d = 0\r\n while (d < tr.tdList.length) {\r\n const td = tr.tdList[d]\r\n if (mergeTdIdList.includes(td.id!)) {\r\n tr.tdList.splice(d, 1)\r\n d--\r\n }\r\n d++\r\n }\r\n }\r\n // 设置上下文信息\r\n this.position.setPositionContext({\r\n ...positionContext,\r\n trIndex: anchorTd.trIndex,\r\n tdIndex: anchorTd.tdIndex\r\n })\r\n const curIndex = anchorTd.value.length - 1\r\n this.range.setRange(curIndex, curIndex)\r\n // 重新渲染\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public cancelMergeTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]!\r\n const curTd = curTr.tdList[tdIndex!]\r\n if (curTd.rowspan === 1 && curTd.colspan === 1) return\r\n const colspan = curTd.colspan\r\n // 设置跨列\r\n if (curTd.colspan > 1) {\r\n for (let c = 1; c < curTd.colspan; c++) {\r\n const tdId = getUUID()\r\n curTr.tdList.splice(tdIndex! + c, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: curTr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n curTd.colspan = 1\r\n }\r\n // 设置跨行\r\n if (curTd.rowspan > 1) {\r\n for (let r = 1; r < curTd.rowspan; r++) {\r\n const tr = curTrList[trIndex! + r]\r\n for (let c = 0; c < colspan; c++) {\r\n const tdId = getUUID()\r\n tr.tdList.splice(curTd.colIndex!, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n }\r\n curTd.rowspan = 1\r\n }\r\n // 重新渲染\r\n const curIndex = curTd.value.length - 1\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public splitVerticalTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n // 暂时忽略跨行列选择\r\n const range = this.range.getRange()\r\n if (range.isCrossRowCol) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]!\r\n const curTd = curTr.tdList[tdIndex!]\r\n // 增加列属性\r\n element.colgroup!.splice(tdIndex! + 1, 0, {\r\n width: this.options.table.defaultColMinWidth\r\n })\r\n // 同行增加td,非同行增加跨列数\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n let d = 0\r\n while (d < tr.tdList.length) {\r\n const td = tr.tdList[d]\r\n // 非同行:存在交叉时增加跨列数\r\n if (td.rowIndex !== curTd.rowIndex) {\r\n if (\r\n td.colIndex! <= curTd.colIndex! &&\r\n td.colIndex! + td.colspan > curTd.colIndex!\r\n ) {\r\n td.colspan++\r\n }\r\n } else {\r\n // 当前单元格:往右插入td\r\n if (td.id === curTd.id) {\r\n const tdId = getUUID()\r\n curTr.tdList.splice(d + curTd.colspan, 0, {\r\n id: tdId,\r\n rowspan: curTd.rowspan,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n d++\r\n }\r\n }\r\n d++\r\n }\r\n }\r\n // 重新渲染\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public splitHorizontalTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n // 暂时忽略跨行列选择\r\n const range = this.range.getRange()\r\n if (range.isCrossRowCol) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]!\r\n const curTd = curTr.tdList[tdIndex!]\r\n // 追加的行跳出循环\r\n let appendTrIndex = -1\r\n // 交叉行增加rowspan,当前单元格往下追加一行tr\r\n let t = 0\r\n while (t < curTrList.length) {\r\n if (t === appendTrIndex) {\r\n t++\r\n continue\r\n }\r\n const tr = curTrList[t]\r\n let d = 0\r\n while (d < tr.tdList.length) {\r\n const td = tr.tdList[d]\r\n if (td.id === curTd.id) {\r\n const trId = getUUID()\r\n const tdId = getUUID()\r\n curTrList.splice(t + curTd.rowspan, 0, {\r\n id: trId,\r\n height: this.options.table.defaultTrMinHeight,\r\n tdList: [\r\n {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: curTd.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId,\r\n tdId\r\n }\r\n ]\r\n }\r\n ]\r\n })\r\n appendTrIndex = t + curTd.rowspan\r\n } else if (\r\n td.rowIndex! >= curTd.rowIndex! &&\r\n td.rowIndex! < curTd.rowIndex! + curTd.rowspan &&\r\n td.rowIndex! + td.rowspan >= curTd.rowIndex! + curTd.rowspan\r\n ) {\r\n // 1. 循环td上方大于等于当前td上方 && 小于当前td的下方=>存在交叉\r\n // 2. 循环td下方大于或等于当前td下方\r\n td.rowspan++\r\n }\r\n d++\r\n }\r\n t++\r\n }\r\n // 重新渲染\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public tableTdVerticalAlign(payload: VerticalAlign) {\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const td = row[c]\r\n if (\r\n !td ||\r\n td.verticalAlign === payload ||\r\n (!td.verticalAlign && payload === VerticalAlign.TOP)\r\n ) {\r\n continue\r\n }\r\n // 重设垂直对齐方式\r\n td.verticalAlign = payload\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableBorderType(payload: TableBorder) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n if (\r\n (!element.borderType && payload === TableBorder.ALL) ||\r\n element.borderType === payload\r\n ) {\r\n return\r\n }\r\n element.borderType = payload\r\n if (payload === TableBorder.EMPTY) {\r\n const trList = element.trList\r\n if (trList) {\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (td.borderTypes) delete td.borderTypes\r\n if (td.borderStyle) delete td.borderStyle\r\n }\r\n }\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableBorderColor(payload: string) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n if (\r\n (!element.borderColor &&\r\n payload === this.options.table.defaultBorderColor) ||\r\n element.borderColor === payload\r\n ) {\r\n return\r\n }\r\n element.borderColor = payload\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableBorderWidth(payload: number) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const nextWidth = Number(payload)\r\n if (!Number.isFinite(nextWidth)) return\r\n if (nextWidth <= 0) {\r\n if (element.borderWidth === undefined) return\r\n delete element.borderWidth\r\n } else {\r\n if (element.borderWidth === nextWidth) return\r\n element.borderWidth = nextWidth\r\n if (\r\n element.borderExternalWidth !== undefined &&\r\n element.borderExternalWidth <= 0\r\n ) {\r\n delete element.borderExternalWidth\r\n }\r\n if (\r\n element.borderExternalWidth !== undefined &&\r\n element.borderExternalWidth === nextWidth\r\n ) {\r\n delete element.borderExternalWidth\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableBorderExternalWidth(payload: number) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const nextWidth = Number(payload)\r\n if (!Number.isFinite(nextWidth)) return\r\n const baseWidth = element.borderWidth ?? 1\r\n if (nextWidth <= 0 || nextWidth === baseWidth) {\r\n if (element.borderExternalWidth === undefined) return\r\n delete element.borderExternalWidth\r\n } else {\r\n if (element.borderExternalWidth === nextWidth) return\r\n element.borderExternalWidth = nextWidth\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableTdBorderType(payload: TdBorder) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n const tdList = rowCol.flat()\r\n // 存在则设置边框类型,否则取消设置\r\n const isSetBorderType = tdList.some(\r\n td => !td.borderTypes?.includes(payload)\r\n )\r\n tdList.forEach(td => {\r\n if (!td.borderTypes) {\r\n td.borderTypes = []\r\n }\r\n const borderTypeIndex = td.borderTypes.findIndex(type => type === payload)\r\n if (isSetBorderType) {\r\n if (!~borderTypeIndex) {\r\n td.borderTypes.push(payload)\r\n }\r\n if (!td.borderStyle) {\r\n td.borderStyle = {}\r\n }\r\n td.borderStyle[payload] = {\r\n width: element.borderWidth ?? 0.5,\r\n color: element.borderColor || this.options.table.defaultBorderColor,\r\n style: element.borderType === TableBorder.DASH ? 'dashed' : 'solid'\r\n }\r\n } else {\r\n if (~borderTypeIndex) {\r\n td.borderTypes.splice(borderTypeIndex, 1)\r\n }\r\n if (td.borderStyle && td.borderStyle[payload]) {\r\n delete td.borderStyle[payload]\r\n if (!Object.keys(td.borderStyle).length) {\r\n delete td.borderStyle\r\n }\r\n }\r\n }\r\n // 不存在边框设置时删除字段\r\n if (!td.borderTypes.length) {\r\n delete td.borderTypes\r\n }\r\n })\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableTdSlashType(payload: TdSlash) {\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n const tdList = rowCol.flat()\r\n // 存在则设置单元格斜线类型,否则取消设置\r\n const isSetTdSlashType = tdList.some(\r\n td => !td.slashTypes?.includes(payload)\r\n )\r\n tdList.forEach(td => {\r\n if (!td.slashTypes) {\r\n td.slashTypes = []\r\n }\r\n const slashTypeIndex = td.slashTypes.findIndex(type => type === payload)\r\n if (isSetTdSlashType) {\r\n if (!~slashTypeIndex) {\r\n td.slashTypes.push(payload)\r\n }\r\n } else {\r\n if (~slashTypeIndex) {\r\n td.slashTypes.splice(slashTypeIndex, 1)\r\n }\r\n }\r\n // 不存在斜线设置时删除字段\r\n if (!td.slashTypes.length) {\r\n delete td.slashTypes\r\n }\r\n })\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableTdBackgroundColor(payload: string) {\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const col = row[c]\r\n col.backgroundColor = payload\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.range.setRange(endIndex, endIndex)\r\n this.draw.render({\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableSelectAll() {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, tableId, isTable } = positionContext\r\n if (!isTable || !tableId) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const trList = originalElementList[index!].trList!\r\n // 最后单元格位置\r\n const endTrIndex = trList.length - 1\r\n const endTdIndex = trList[endTrIndex].tdList.length - 1\r\n this.range.replaceRange({\r\n startIndex,\r\n endIndex,\r\n tableId,\r\n startTdIndex: 0,\r\n endTdIndex,\r\n startTrIndex: 0,\r\n endTrIndex\r\n })\r\n this.draw.render({\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n}\r\n","import { Draw } from '../draw/Draw'\r\nimport { deepClone, getUUID, isNonValue } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IArea,\r\n IAreaInfo,\r\n IGetAreaValueOption,\r\n IGetAreaValueResult,\r\n IInsertAreaOption,\r\n ILocationAreaOption,\r\n ISetAreaPropertiesOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { LocationPosition } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Position } from '../position/Position'\r\nimport { zipElementList } from '@vervedoc/docx-editor-schema'\r\nimport { AreaMode } from '@vervedoc/docx-editor-schema'\r\nimport { IRange } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { Placeholder } from '../frame/Placeholder'\r\nimport { defaultPlaceholderOption } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Area {\r\n private draw: Draw\r\n private zone: Zone\r\n private range: RangeManager\r\n private position: Position\r\n private areaInfoMap = new Map<string, IAreaInfo>()\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.zone = draw.getZone()\r\n this.range = draw.getRange()\r\n this.position = draw.getPosition()\r\n }\r\n\r\n public getAreaInfo(): Map<string, IAreaInfo> {\r\n return this.areaInfoMap\r\n }\r\n\r\n public getActiveAreaId(): string | null {\r\n if (!this.areaInfoMap.size) return null\r\n const { startIndex } = this.range.getRange()\r\n const elementList = this.draw.getElementList()\r\n const element = elementList[startIndex]\r\n return element?.areaId || null\r\n }\r\n\r\n public getActiveAreaInfo(): IAreaInfo | null {\r\n const activeAreaId = this.getActiveAreaId()\r\n if (!activeAreaId) return null\r\n return this.areaInfoMap.get(activeAreaId) || null\r\n }\r\n\r\n public isReadonly() {\r\n const activeAreaInfo = this.getActiveAreaInfo()\r\n if (!activeAreaInfo?.area) return false\r\n switch (activeAreaInfo.area.mode) {\r\n case AreaMode.EDIT:\r\n return false\r\n case AreaMode.READONLY:\r\n return true\r\n case AreaMode.FORM:\r\n return !this.draw.getControl().getIsRangeWithinControl()\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n public insertArea(payload: IInsertAreaOption): string | null {\r\n // 切换至正文\r\n if (this.zone.getZone() !== EditorZone.MAIN) {\r\n this.zone.setZone(EditorZone.MAIN)\r\n }\r\n // 跳出表格\r\n this.draw.getPosition().setPositionContext({\r\n isTable: false\r\n })\r\n // 设置插入位置\r\n const { id, value, area, position } = payload\r\n if (position === LocationPosition.BEFORE) {\r\n this.range.setRange(0, 0)\r\n } else {\r\n const elementList = this.draw.getOriginalMainElementList()\r\n const lastIndex = elementList.length - 1\r\n this.range.setRange(lastIndex, lastIndex)\r\n }\r\n const areaId = id || getUUID()\r\n this.draw.insertElementList([\r\n {\r\n type: ElementType.AREA,\r\n value: '',\r\n areaId,\r\n valueList: value,\r\n area: deepClone(area)\r\n }\r\n ])\r\n return areaId\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n if (!this.areaInfoMap.size) return\r\n ctx.save()\r\n const margins = this.draw.getMargins()\r\n const width = this.draw.getInnerWidth()\r\n for (const areaInfoItem of this.areaInfoMap) {\r\n const { area, positionList } = areaInfoItem[1]\r\n if (\r\n area?.hide ||\r\n (!area?.backgroundColor && !area?.borderColor && !area?.placeholder)\r\n ) {\r\n continue\r\n }\r\n const pagePositionList = positionList.filter(p => p.pageNo === pageNo)\r\n if (!pagePositionList.length) continue\r\n ctx.translate(0.5, 0.5)\r\n const firstPosition = pagePositionList[0]\r\n const lastPosition = pagePositionList[pagePositionList.length - 1]\r\n // 起始位置\r\n const x = margins[3]\r\n const y = Math.ceil(firstPosition.coordinate.leftTop[1])\r\n const height = Math.ceil(lastPosition.coordinate.rightBottom[1] - y)\r\n // 背景色\r\n if (area.backgroundColor) {\r\n ctx.fillStyle = area.backgroundColor\r\n ctx.fillRect(x, y, width, height)\r\n }\r\n // 边框\r\n if (area.borderColor) {\r\n ctx.strokeStyle = area.borderColor\r\n ctx.strokeRect(x, y, width, height)\r\n }\r\n // 提示词\r\n if (area.placeholder && positionList.length <= 1) {\r\n const placeholder = new Placeholder(this.draw)\r\n placeholder.render(ctx, {\r\n placeholder: {\r\n ...defaultPlaceholderOption,\r\n ...area.placeholder\r\n },\r\n startY: firstPosition.coordinate.leftTop[1]\r\n })\r\n }\r\n ctx.translate(-0.5, -0.5)\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public compute() {\r\n this.areaInfoMap.clear()\r\n const elementList = this.draw.getOriginalMainElementList()\r\n const positionList = this.position.getOriginalMainPositionList()\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n const areaId = element.areaId\r\n if (areaId) {\r\n const areaInfo = this.areaInfoMap.get(areaId)\r\n if (!areaInfo) {\r\n this.areaInfoMap.set(areaId, {\r\n id: areaId,\r\n area: element.area!,\r\n elementList: [element],\r\n positionList: [positionList[e]]\r\n })\r\n } else {\r\n areaInfo.elementList.push(element)\r\n areaInfo.positionList.push(positionList[e])\r\n }\r\n }\r\n }\r\n }\r\n\r\n public getAreaValue(\r\n options: IGetAreaValueOption = {}\r\n ): IGetAreaValueResult | null {\r\n const areaId = options.id || this.getActiveAreaId()\r\n if (!areaId) return null\r\n const areaInfo = this.areaInfoMap.get(areaId)\r\n if (!areaInfo) return null\r\n return {\r\n area: areaInfo.area,\r\n id: areaInfo.id,\r\n startPageNo: areaInfo.positionList[0].pageNo,\r\n endPageNo: areaInfo.positionList[areaInfo.positionList.length - 1].pageNo,\r\n value: zipElementList(areaInfo.elementList)\r\n }\r\n }\r\n\r\n public getContextByAreaId(\r\n areaId: string,\r\n options?: ILocationAreaOption\r\n ): { range: IRange; elementPosition: IElementPosition } | null {\r\n const elementList = this.draw.getOriginalMainElementList()\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (options?.position === LocationPosition.OUTER_BEFORE) {\r\n // 区域外面最前\r\n if (elementList[e + 1]?.areaId !== areaId) continue\r\n } else if (options?.position === LocationPosition.AFTER) {\r\n // 区域内部最后\r\n if (\r\n !(element.areaId === areaId && elementList[e + 1]?.areaId !== areaId)\r\n ) {\r\n continue\r\n }\r\n } else if (options?.position === LocationPosition.OUTER_AFTER) {\r\n // 区域外部最后\r\n if (\r\n !(element.areaId !== areaId && elementList[e - 1]?.areaId === areaId)\r\n ) {\r\n continue\r\n }\r\n } else {\r\n // 区域内部最前\r\n if (element.areaId !== areaId) continue\r\n }\r\n const positionList = this.position.getOriginalMainPositionList()\r\n return {\r\n range: {\r\n startIndex: e,\r\n endIndex: e\r\n },\r\n elementPosition: positionList[e]\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public setAreaProperties(payload: ISetAreaPropertiesOption) {\r\n const areaId = payload.id || this.getActiveAreaId()\r\n if (!areaId) return\r\n const areaInfo = this.areaInfoMap.get(areaId)\r\n if (!areaInfo) return\r\n if (!areaInfo.area) {\r\n areaInfo.area = {}\r\n }\r\n // 需要计算的属性\r\n let isCompute = false\r\n const computeProps: Array<keyof IArea> = ['top', 'hide']\r\n // 循环设置\r\n Object.entries(payload.properties).forEach(([key, value]) => {\r\n if (isNonValue(value)) return\r\n const propKey = key as keyof IArea\r\n areaInfo.area[propKey] = value\r\n if (computeProps.includes(propKey)) {\r\n isCompute = true\r\n }\r\n })\r\n this.draw.render({\r\n isCompute,\r\n isSetCursor: false\r\n })\r\n }\r\n}\r\n","import { IAreaBadge, IBadge } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Badge {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private imageCache: Map<string, HTMLImageElement>\r\n private mainBadge: IBadge | null\r\n private areaBadgeMap: Map<string, IBadge>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.imageCache = new Map()\r\n this.mainBadge = null\r\n this.areaBadgeMap = new Map()\r\n }\r\n\r\n public setMainBadge(payload: IBadge | null) {\r\n this.mainBadge = payload\r\n }\r\n\r\n public setAreaBadgeMap(payload: IAreaBadge[]) {\r\n this.areaBadgeMap.clear()\r\n payload.forEach(areaBadge => {\r\n this.areaBadgeMap.set(areaBadge.areaId, areaBadge.badge)\r\n })\r\n }\r\n\r\n private _drawImage(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n value: string\r\n ) {\r\n if (this.imageCache.has(value)) {\r\n const img = this.imageCache.get(value)!\r\n ctx.drawImage(img, x, y, width, height)\r\n } else {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = value\r\n img.onload = () => {\r\n this.imageCache.set(value, img)\r\n ctx.drawImage(img, x, y, width, height)\r\n }\r\n }\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n // 文档签章\r\n if (pageNo === 0 && this.mainBadge) {\r\n const { scale, badge } = this.options\r\n const { left, top, width, height, value } = this.mainBadge\r\n // 默认从页眉下开始\r\n const headerTop =\r\n this.draw.getMargins()[0] + this.draw.getHeader().getExtraHeight()\r\n const x = (left || badge.left) * scale\r\n const y = (top || badge.top) * scale + headerTop\r\n this._drawImage(ctx, x, y, width * scale, height * scale, value)\r\n }\r\n // 区域签章\r\n if (this.areaBadgeMap.size) {\r\n const areaInfo = this.draw.getArea().getAreaInfo()\r\n if (areaInfo.size) {\r\n const { scale, badge } = this.options\r\n for (const areaItem of areaInfo) {\r\n // 忽略非本页区域\r\n const { positionList } = areaItem[1]\r\n const firstPosition = positionList[0]\r\n if (firstPosition.pageNo !== pageNo) continue\r\n // 忽略未设置签章区域\r\n const badgeItem = this.areaBadgeMap.get(areaItem[0])\r\n if (!badgeItem) continue\r\n const { left, top, width, height, value } = badgeItem\r\n const x = (left || badge.left) * scale\r\n const y =\r\n (top || badge.top) * scale + firstPosition.coordinate.leftTop[1]\r\n this._drawImage(ctx, x, y, width * scale, height * scale, value)\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { version } from '../plugin-stubs'\r\nimport { DOCX_EDITOR_DATA_VERSION, ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IAppendElementListOption,\r\n IComputeRowListPayload,\r\n IDrawFloatPayload,\r\n IDrawOption,\r\n IDrawPagePayload,\r\n IDrawRowPayload,\r\n IGetImageOption,\r\n IGetOriginValueOption,\r\n IGetValueOption,\r\n IPainterOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IEditorData,\r\n IEditorOption,\r\n IEditorResult,\r\n ISetValueOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IElement,\r\n IElementMetrics,\r\n IElementFillRect,\r\n IElementPosition,\r\n IElementStyle,\r\n ISpliceElementListOption,\r\n IInsertElementListOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone, getUUID, nextTick } from '@vervedoc/docx-editor-schema'\r\nimport { Cursor } from '../cursor/Cursor'\r\nimport { CanvasEvent } from '../event/CanvasEvent'\r\nimport { GlobalEvent } from '../event/GlobalEvent'\r\nimport { HistoryManager } from '../plugin-stubs'\r\nimport { Listener } from '@vervedoc/docx-editor-state'\r\nimport { Position } from '../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Background } from '../frame/Background'\r\nimport { getSeparatorRenderHeight } from '../utils/separator'\r\nimport { Highlight } from '../richtext/Highlight'\r\nimport { ParagraphColor } from '../richtext/ParagraphColor'\r\nimport { Margin } from '../frame/Margin'\r\nimport { Search } from '../interactive/Search'\r\nimport { Strikeout } from '../richtext/Strikeout'\r\nimport { Underline } from '../richtext/Underline'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { ImageParticle } from '../particle/ImageParticle'\r\nimport { LaTexParticle } from '../plugin-stubs'\r\nimport { TextParticle } from '../particle/TextParticle'\r\nimport { PageNumber } from '../frame/PageNumber'\r\nimport { ScrollObserver } from '../observer/ScrollObserver'\r\nimport { SelectionObserver } from '../observer/SelectionObserver'\r\nimport { TableParticle } from '../particle/table/TableParticle'\r\nimport { TableTool } from '../particle/table/TableTool'\r\nimport { HyperlinkParticle } from '../particle/HyperlinkParticle'\r\nimport { Header } from '../frame/Header'\r\nimport { SuperscriptParticle } from '../particle/SuperscriptParticle'\r\nimport { SubscriptParticle } from '../particle/SubscriptParticle'\r\nimport { SeparatorParticle } from '../particle/SeparatorParticle'\r\nimport { PageBreakParticle } from '../particle/PageBreakParticle'\r\nimport { Watermark } from '../frame/Watermark'\r\nimport {\r\n EditorComponent,\r\n EditorMode,\r\n EditorZone,\r\n PageMode,\r\n PaperDirection,\r\n WordBreak\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Control } from '../control/Control'\r\nimport {\r\n deleteSurroundElementList,\r\n getIsBlockElement,\r\n getSlimCloneElementList,\r\n pickSurroundElementList,\r\n zipElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { CheckboxParticle } from '../particle/CheckboxParticle'\r\nimport { RadioParticle } from '../particle/RadioParticle'\r\nimport { DeepRequired, IPadding } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n ControlComponent,\r\n ControlIndentation\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { formatElementList, isParagraphSeparator, isTableElement, isImageElement } from '@vervedoc/docx-editor-schema'\r\nimport { WorkerManager } from '../plugin-stubs'\r\nimport { Previewer } from '../particle/previewer/Previewer'\r\nimport { DateParticle } from '../plugin-stubs'\r\nimport { IMargin } from '@vervedoc/docx-editor-schema'\r\nimport { BlockParticle } from '../plugin-stubs'\r\nimport { EDITOR_COMPONENT, EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { ImageObserver } from '../observer/ImageObserver'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Footer } from '../frame/Footer'\r\nimport {\r\n IMAGE_ELEMENT_TYPE,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ListParticle } from '../particle/ListParticle'\r\nimport { Placeholder } from '../frame/Placeholder'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { Group } from '../interactive/Group'\r\n\r\nimport { Override } from '../plugin/override/Override'\r\nimport { FlexDirection, ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { PUNCTUATION_REG } from '@vervedoc/docx-editor-schema'\r\nimport { LineBreakParticle } from '../particle/LineBreakParticle'\r\nimport { MouseObserver } from '../observer/MouseObserver'\r\nimport { LineNumber } from '../frame/LineNumber'\r\nimport { PageBorder } from '../frame/PageBorder'\r\nimport { ITd } from '@vervedoc/docx-editor-schema'\r\nimport { Actuator } from '../plugin-stubs'\r\nimport { TableOperate } from '../particle/table/TableOperate'\r\nimport { Area } from '../interactive/Area'\r\nimport { Badge } from '../frame/Badge'\r\n\r\n\r\nexport class Draw {\r\n private container: HTMLDivElement\r\n private pageContainer: HTMLDivElement\r\n private pageList: HTMLCanvasElement[]\r\n private ctxList: CanvasRenderingContext2D[]\r\n private pageNo: number\r\n private renderCount: number\r\n private pagePixelRatio: number | null\r\n private mode: EditorMode\r\n private options: DeepRequired<IEditorOption>\r\n private position: Position\r\n private zone: Zone\r\n private elementList: IElement[]\r\n private listener: Listener\r\n private eventBus: EventBus<EventBusMap>\r\n private override: Override\r\n\r\n private i18n: I18n\r\n private canvasEvent: CanvasEvent\r\n private globalEvent: GlobalEvent\r\n private cursor: Cursor\r\n private range: RangeManager\r\n private margin: Margin\r\n private background: Background\r\n private badge: Badge\r\n private search: Search\r\n private group: Group\r\n\r\n private area: Area\r\n private underline: Underline\r\n private strikeout: Strikeout\r\n private highlight: Highlight\r\n private paragraphColor: ParagraphColor\r\n private historyManager: HistoryManager\r\n private previewer: Previewer\r\n private imageParticle: ImageParticle\r\n private laTexParticle: LaTexParticle\r\n private textParticle: TextParticle\r\n private tableParticle: TableParticle\r\n private tableTool: TableTool\r\n private tableOperate: TableOperate\r\n private pageNumber: PageNumber\r\n private lineNumber: LineNumber\r\n private waterMark: Watermark\r\n private placeholder: Placeholder\r\n private header: Header\r\n private footer: Footer\r\n private hyperlinkParticle: HyperlinkParticle\r\n private dateParticle: DateParticle\r\n private separatorParticle: SeparatorParticle\r\n private pageBreakParticle: PageBreakParticle\r\n private superscriptParticle: SuperscriptParticle\r\n private subscriptParticle: SubscriptParticle\r\n private checkboxParticle: CheckboxParticle\r\n private radioParticle: RadioParticle\r\n private blockParticle: BlockParticle\r\n private listParticle: ListParticle\r\n private lineBreakParticle: LineBreakParticle\r\n private control: Control\r\n private pageBorder: PageBorder\r\n private revisionOverlay: any | null\r\n private commentOverlay: any | null\r\n private workerManager: WorkerManager\r\n private scrollObserver: ScrollObserver\r\n private selectionObserver: SelectionObserver\r\n private imageObserver: ImageObserver\r\n private mouseObserver: MouseObserver\r\n\r\n private LETTER_REG: RegExp\r\n private WORD_LIKE_REG: RegExp\r\n private rowList: IRow[]\r\n private pageRowList: IRow[][]\r\n private painterStyle: IElementStyle | null\r\n private painterOptions: IPainterOption | null\r\n private visiblePageNoList: number[]\r\n private intersectionPageNo: number\r\n private lazyRenderIntersectionObserver: IntersectionObserver | null\r\n private printModeData: Required<IEditorData> | null\r\n private _register: any | null = null\r\n private readonly HEADER_DEFAULT_SIZE = 10\r\n\r\n constructor(\r\n rootContainer: HTMLElement,\r\n options: DeepRequired<IEditorOption>,\r\n data: IEditorData,\r\n listener: Listener,\r\n eventBus: EventBus<EventBusMap>,\r\n override: Override\r\n ) {\r\n this._normalizeHeaderElementList(data.header)\r\n this.container = this._wrapContainer(rootContainer)\r\n this.pageList = []\r\n this.ctxList = []\r\n this.pageNo = 0\r\n this.renderCount = 0\r\n this.pagePixelRatio = null\r\n this.mode = options.mode\r\n this.options = options\r\n this.elementList = data.main\r\n this.listener = listener\r\n this.eventBus = eventBus\r\n this.override = override\r\n\r\n this._formatContainer()\r\n this.pageContainer = this._createPageContainer()\r\n this._createPage(0)\r\n\r\n this.i18n = new I18n(options.locale)\r\n this.historyManager = new HistoryManager(this)\r\n this.position = new Position(this)\r\n this.zone = new Zone(this)\r\n this.range = new RangeManager(this)\r\n this.margin = new Margin(this)\r\n this.background = new Background(this)\r\n this.badge = new Badge(this)\r\n this.search = new Search(this)\r\n this.group = new Group(this)\r\n\r\n this.area = new Area(this)\r\n this.underline = new Underline(this)\r\n this.strikeout = new Strikeout(this)\r\n this.highlight = new Highlight(this)\r\n this.paragraphColor = new ParagraphColor()\r\n this.previewer = new Previewer(this)\r\n this.imageParticle = new ImageParticle(this)\r\n this.laTexParticle = new LaTexParticle(this)\r\n this.textParticle = new TextParticle(this)\r\n this.tableParticle = new TableParticle(this)\r\n this.tableTool = new TableTool(this)\r\n this.tableOperate = new TableOperate(this)\r\n this.pageNumber = new PageNumber(this)\r\n this.lineNumber = new LineNumber(this)\r\n this.waterMark = new Watermark(this)\r\n this.placeholder = new Placeholder(this)\r\n this.header = new Header(this, data.header)\r\n this.footer = new Footer(this, data.footer)\r\n this.hyperlinkParticle = new HyperlinkParticle(this)\r\n this.dateParticle = new DateParticle(this)\r\n this.separatorParticle = new SeparatorParticle(this)\r\n this.pageBreakParticle = new PageBreakParticle(this)\r\n this.superscriptParticle = new SuperscriptParticle()\r\n this.subscriptParticle = new SubscriptParticle()\r\n this.checkboxParticle = new CheckboxParticle(this)\r\n this.radioParticle = new RadioParticle(this)\r\n this.blockParticle = new BlockParticle(this)\r\n this.listParticle = new ListParticle(this)\r\n this.lineBreakParticle = new LineBreakParticle(this)\r\n this.control = new Control(this)\r\n this.pageBorder = new PageBorder(this)\r\n this.revisionOverlay = null\r\n\r\n this.scrollObserver = new ScrollObserver(this)\r\n this.selectionObserver = new SelectionObserver(this)\r\n this.imageObserver = new ImageObserver()\r\n this.mouseObserver = new MouseObserver(this)\r\n\r\n this.canvasEvent = new CanvasEvent(this)\r\n this.cursor = new Cursor(this, this.canvasEvent)\r\n this.canvasEvent.register()\r\n this.globalEvent = new GlobalEvent(this, this.canvasEvent)\r\n this.globalEvent.register()\r\n\r\n this.workerManager = new WorkerManager(this)\r\n new Actuator(this)\r\n\r\n const { letterClass } = options\r\n this.LETTER_REG = new RegExp(`[${letterClass.join('')}]`)\r\n this.WORD_LIKE_REG = new RegExp(\r\n `${letterClass.map(letter => `[^${letter}][${letter}]`).join('|')}`\r\n )\r\n this.rowList = []\r\n this.pageRowList = []\r\n this.painterStyle = null\r\n this.painterOptions = null\r\n this.visiblePageNoList = []\r\n this.intersectionPageNo = 0\r\n this.lazyRenderIntersectionObserver = null\r\n this.printModeData = null\r\n\r\n // 打印模式优先设置打印数据\r\n if (this.mode === EditorMode.PRINT) {\r\n this.setPrintData()\r\n }\r\n this.render({\r\n isInit: true,\r\n isSetCursor: false,\r\n isFirstRender: true\r\n })\r\n }\r\n\r\n // 设置打印数据\r\n public setPrintData() {\r\n this.printModeData = {\r\n header: this.header.getElementList(),\r\n main: this.elementList,\r\n footer: this.footer.getElementList()\r\n }\r\n // 过滤控件辅助元素\r\n const clonePrintModeData = deepClone(this.printModeData)\r\n const editorDataKeys: (keyof IEditorData)[] = ['header', 'main', 'footer']\r\n editorDataKeys.forEach(key => {\r\n clonePrintModeData[key] = this.control.filterAssistElement(\r\n clonePrintModeData[key]\r\n )\r\n })\r\n this.setEditorData(clonePrintModeData)\r\n }\r\n\r\n // 还原打印数据\r\n public clearPrintData() {\r\n if (this.printModeData) {\r\n this.setEditorData(this.printModeData)\r\n this.printModeData = null\r\n }\r\n }\r\n\r\n public getLetterReg(): RegExp {\r\n return this.LETTER_REG\r\n }\r\n\r\n public getMode(): EditorMode {\r\n return this.mode\r\n }\r\n\r\n public setRegister(register: any) {\r\n this._register = register\r\n }\r\n\r\n public getRegister(): any | null {\r\n return this._register\r\n }\r\n\r\n public setMode(payload: EditorMode) {\r\n if (this.mode === payload) return\r\n // 设置打印模式\r\n if (payload === EditorMode.PRINT) {\r\n this.setPrintData()\r\n }\r\n // 取消打印模式\r\n if (this.mode === EditorMode.PRINT) {\r\n this.clearPrintData()\r\n }\r\n this.clearSideEffect()\r\n this.range.clearRange()\r\n this.mode = payload\r\n this.options.mode = payload\r\n this.render({\r\n isSetCursor: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n\r\n public isReadonly() {\r\n if (this.area.getActiveAreaInfo()?.area?.mode) {\r\n return this.area.isReadonly()\r\n }\r\n switch (this.mode) {\r\n case EditorMode.DESIGN:\r\n return false\r\n case EditorMode.READONLY:\r\n case EditorMode.PRINT:\r\n return true\r\n case EditorMode.FORM:\r\n return !this.control.getIsRangeWithinControl()\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n public isDisabled() {\r\n if (this.mode === EditorMode.DESIGN) return false\r\n const { startIndex, endIndex } = this.range.getRange()\r\n const elementList = this.getElementList()\r\n // 优先判断表格单元格\r\n if (this.getTd()?.disabled) return true\r\n if (startIndex === endIndex) {\r\n const startElement = elementList[startIndex]\r\n const nextElement = elementList[startIndex + 1]\r\n return !!(\r\n (startElement?.title?.disabled &&\r\n nextElement?.title?.disabled &&\r\n startElement.titleId === nextElement.titleId) ||\r\n (startElement?.control?.disabled &&\r\n nextElement?.control?.disabled &&\r\n startElement.controlId === nextElement.controlId)\r\n )\r\n }\r\n const selectionElementList = elementList.slice(startIndex + 1, endIndex + 1)\r\n return selectionElementList.some(\r\n element => element.title?.disabled || element.control?.disabled\r\n )\r\n }\r\n\r\n public isDesignMode() {\r\n return this.mode === EditorMode.DESIGN\r\n }\r\n\r\n public isPrintMode() {\r\n return this.mode === EditorMode.PRINT\r\n }\r\n\r\n public getOriginalWidth(): number {\r\n const { paperDirection, width, height } = this.options\r\n return paperDirection === PaperDirection.VERTICAL ? width : height\r\n }\r\n\r\n public getOriginalHeight(): number {\r\n const { paperDirection, width, height } = this.options\r\n return paperDirection === PaperDirection.VERTICAL ? height : width\r\n }\r\n\r\n public getWidth(): number {\r\n return Math.floor(this.getOriginalWidth() * this.options.scale)\r\n }\r\n\r\n public getHeight(): number {\r\n return Math.floor(this.getOriginalHeight() * this.options.scale)\r\n }\r\n\r\n public getMainHeight(): number {\r\n const pageHeight = this.getHeight()\r\n return pageHeight - this.getMainOuterHeight()\r\n }\r\n\r\n public getMainOuterHeight(): number {\r\n const margins = this.getMargins()\r\n const headerExtraHeight = this.header.getExtraHeight()\r\n const footerExtraHeight = this.footer.getExtraHeight()\r\n return margins[0] + margins[2] + headerExtraHeight + footerExtraHeight\r\n }\r\n\r\n public getCanvasWidth(pageNo = -1): number {\r\n const page = this.getPage(pageNo)\r\n return page.width\r\n }\r\n\r\n public getCanvasHeight(pageNo = -1): number {\r\n const page = this.getPage(pageNo)\r\n return page.height\r\n }\r\n\r\n public getInnerWidth(): number {\r\n const width = this.getWidth()\r\n const margins = this.getMargins()\r\n return width - margins[1] - margins[3]\r\n }\r\n\r\n public getOriginalInnerWidth(): number {\r\n const width = this.getOriginalWidth()\r\n const margins = this.getOriginalMargins()\r\n return width - margins[1] - margins[3]\r\n }\r\n\r\n public getContextInnerWidth(): number {\r\n const positionContext = this.position.getPositionContext()\r\n if (positionContext.isTable) {\r\n const { index, trIndex, tdIndex } = positionContext\r\n const elementList = this.getOriginalElementList()\r\n const td = elementList[index!].trList![trIndex!].tdList[tdIndex!]\r\n const tdPadding = this.getTdPadding()\r\n return td!.width! - tdPadding[1] - tdPadding[3]\r\n }\r\n return this.getOriginalInnerWidth()\r\n }\r\n\r\n public getMargins(): IMargin {\r\n return <IMargin>this.getOriginalMargins().map(m => m * this.options.scale)\r\n }\r\n\r\n public getOriginalMargins(): number[] {\r\n const { margins, paperDirection } = this.options\r\n return paperDirection === PaperDirection.VERTICAL\r\n ? margins\r\n : [margins[1], margins[2], margins[3], margins[0]]\r\n }\r\n\r\n public getPageGap(): number {\r\n return this.options.pageGap * this.options.scale\r\n }\r\n\r\n public getOriginalPageGap(): number {\r\n return this.options.pageGap\r\n }\r\n\r\n public getPageNumberBottom(): number {\r\n const {\r\n pageNumber: { bottom },\r\n scale\r\n } = this.options\r\n return bottom * scale\r\n }\r\n\r\n public getMarginIndicatorSize(): number {\r\n return this.options.marginIndicatorSize * this.options.scale\r\n }\r\n\r\n public getDefaultBasicRowMarginHeight(): number {\r\n return this.options.defaultBasicRowMarginHeight * this.options.scale\r\n }\r\n\r\n public getHighlightMarginHeight(): number {\r\n return this.options.highlightMarginHeight * this.options.scale\r\n }\r\n\r\n public getTdPadding(): IPadding {\r\n const {\r\n table: { tdPadding },\r\n scale\r\n } = this.options\r\n const positionContext = this.position.getPositionContext()\r\n if (positionContext.isTable) {\r\n const { index, trIndex, tdIndex } = positionContext\r\n const elementList = this.getOriginalElementList()\r\n const element = elementList[index!]\r\n const td = element.trList?.[trIndex!]?.tdList?.[tdIndex!]\r\n const base = td?.padding || element.tdPadding || tdPadding\r\n return <IPadding>base.map(m => m * scale)\r\n }\r\n return <IPadding>tdPadding.map(m => m * scale)\r\n }\r\n\r\n public getContainer(): HTMLDivElement {\r\n return this.container\r\n }\r\n\r\n public getPageContainer(): HTMLDivElement {\r\n return this.pageContainer\r\n }\r\n\r\n public getVisiblePageNoList(): number[] {\r\n return this.visiblePageNoList\r\n }\r\n\r\n public setVisiblePageNoList(payload: number[]) {\r\n this.visiblePageNoList = payload\r\n if (this.listener.visiblePageNoListChange) {\r\n this.listener.visiblePageNoListChange(this.visiblePageNoList)\r\n }\r\n if (this.eventBus.hasSubscribers('visiblePageNoListChange')) {\r\n this.eventBus.emit('visiblePageNoListChange', this.visiblePageNoList)\r\n }\r\n }\r\n\r\n public getIntersectionPageNo(): number {\r\n return this.intersectionPageNo\r\n }\r\n\r\n public setIntersectionPageNo(payload: number) {\r\n this.intersectionPageNo = payload\r\n if (this.listener.intersectionPageNoChange) {\r\n this.listener.intersectionPageNoChange(this.intersectionPageNo)\r\n }\r\n if (this.eventBus.hasSubscribers('intersectionPageNoChange')) {\r\n this.eventBus.emit('intersectionPageNoChange', this.intersectionPageNo)\r\n }\r\n }\r\n\r\n public getPageNo(): number {\r\n return this.pageNo\r\n }\r\n\r\n public setPageNo(payload: number) {\r\n this.pageNo = payload\r\n }\r\n\r\n public getRenderCount(): number {\r\n return this.renderCount\r\n }\r\n\r\n public getPage(pageNo = -1): HTMLCanvasElement {\r\n return this.pageList[~pageNo ? pageNo : this.pageNo]\r\n }\r\n\r\n public getPageList(): HTMLCanvasElement[] {\r\n return this.pageList\r\n }\r\n\r\n public getPageCount(): number {\r\n return this.pageList.length\r\n }\r\n\r\n public getTableRowList(sourceElementList: IElement[]): IRow[] {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, trIndex, tdIndex } = positionContext\r\n return sourceElementList[index!].trList![trIndex!].tdList[tdIndex!].rowList!\r\n }\r\n\r\n public getOriginalRowList() {\r\n const zoneManager = this.getZone()\r\n if (zoneManager.isHeaderActive()) {\r\n return this.header.getRowList()\r\n }\r\n if (zoneManager.isFooterActive()) {\r\n return this.footer.getRowList()\r\n }\r\n return this.rowList\r\n }\r\n\r\n public getRowList(): IRow[] {\r\n const positionContext = this.position.getPositionContext()\r\n return positionContext.isTable\r\n ? this.getTableRowList(this.getOriginalElementList())\r\n : this.getOriginalRowList()\r\n }\r\n\r\n public getPageRowList(): IRow[][] {\r\n return this.pageRowList\r\n }\r\n\r\n public getCtx(): CanvasRenderingContext2D {\r\n return this.ctxList[this.pageNo]\r\n }\r\n\r\n public getOptions(): DeepRequired<IEditorOption> {\r\n\r\n return this.options\r\n }\r\n\r\n public getSearch(): Search {\r\n return this.search\r\n }\r\n\r\n public getGroup(): Group {\r\n return this.group\r\n }\r\n\r\n public getArea(): Area {\r\n return this.area\r\n }\r\n\r\n public getBadge(): Badge {\r\n return this.badge\r\n }\r\n\r\n public getHistoryManager(): HistoryManager {\r\n return this.historyManager\r\n }\r\n\r\n public setHistoryManager(historyManager: HistoryManager) {\r\n this.historyManager = historyManager\r\n }\r\n\r\n public getPosition(): Position {\r\n return this.position\r\n }\r\n\r\n public getZone(): Zone {\r\n return this.zone\r\n }\r\n\r\n public getRange(): RangeManager {\r\n return this.range\r\n }\r\n\r\n public getLineBreakParticle(): LineBreakParticle {\r\n return this.lineBreakParticle\r\n }\r\n\r\n public getTextParticle(): TextParticle {\r\n return this.textParticle\r\n }\r\n\r\n public getHeaderElementList(): IElement[] {\r\n return this.header.getElementList()\r\n }\r\n\r\n public getTableElementList(sourceElementList: IElement[]): IElement[] {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, trIndex, tdIndex } = positionContext\r\n return (\r\n sourceElementList[index!].trList?.[trIndex!].tdList[tdIndex!].value || []\r\n )\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n const positionContext = this.position.getPositionContext()\r\n const elementList = this.getOriginalElementList()\r\n return positionContext.isTable\r\n ? this.getTableElementList(elementList)\r\n : elementList\r\n }\r\n\r\n public getMainElementList(): IElement[] {\r\n const positionContext = this.position.getPositionContext()\r\n return positionContext.isTable\r\n ? this.getTableElementList(this.elementList)\r\n : this.elementList\r\n }\r\n\r\n public getOriginalElementList() {\r\n const zoneManager = this.getZone()\r\n if (zoneManager.isHeaderActive()) {\r\n return this.getHeaderElementList()\r\n }\r\n if (zoneManager.isFooterActive()) {\r\n return this.getFooterElementList()\r\n }\r\n return this.elementList\r\n }\r\n\r\n public getOriginalMainElementList(): IElement[] {\r\n return this.elementList\r\n }\r\n\r\n public getFooterElementList(): IElement[] {\r\n return this.footer.getElementList()\r\n }\r\n\r\n public getTd(): ITd | null {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, trIndex, tdIndex, isTable } = positionContext\r\n if (isTable) {\r\n const elementList = this.getOriginalElementList()\r\n return elementList[index!].trList![trIndex!].tdList[tdIndex!]\r\n }\r\n return null\r\n }\r\n\r\n public insertElementList(\r\n payload: IElement[],\r\n options: IInsertElementListOption = {}\r\n ) {\r\n if (!payload.length || !this.range.canInput()) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n const { isSubmitHistory = true } = options\r\n formatElementList(payload, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n let curIndex = -1\r\n // 判断是否在控件内\r\n let activeControl = this.control.getActiveControl()\r\n // 光标在控件内如果当前没有被激活,需要手动激活\r\n if (!activeControl && this.control.getIsRangeWithinControl()) {\r\n this.control.initControl()\r\n activeControl = this.control.getActiveControl()\r\n }\r\n if (activeControl && this.control.getIsRangeWithinControl()) {\r\n curIndex = activeControl.setValue(payload, undefined, {\r\n isIgnoreDisabledRule: true\r\n })\r\n this.control.emitControlContentChange()\r\n } else {\r\n const elementList = this.getElementList()\r\n const isCollapsed = startIndex === endIndex\r\n const start = startIndex + 1\r\n if (!isCollapsed) {\r\n this.spliceElementList(elementList, start, endIndex - startIndex)\r\n }\r\n this.spliceElementList(elementList, start, 0, payload)\r\n curIndex = startIndex + payload.length\r\n // 列表前如有换行符则删除-因为列表内已存在\r\n const preElement = elementList[start - 1]\r\n if (\r\n payload[0].listId &&\r\n preElement &&\r\n !preElement.listId &&\r\n preElement?.value === ZERO &&\r\n (!preElement.type || preElement.type === ElementType.TEXT)\r\n ) {\r\n elementList.splice(startIndex, 1)\r\n curIndex -= 1\r\n }\r\n }\r\n if (~curIndex) {\r\n this.range.setRange(curIndex, curIndex)\r\n this.render({\r\n curIndex,\r\n isSubmitHistory\r\n })\r\n }\r\n }\r\n\r\n public appendElementList(\r\n elementList: IElement[],\r\n options: IAppendElementListOption = {}\r\n ) {\r\n if (!elementList.length) return\r\n formatElementList(elementList, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n let curIndex: number\r\n const { isPrepend, isSubmitHistory = true } = options\r\n if (isPrepend) {\r\n this.elementList.splice(1, 0, ...elementList)\r\n curIndex = elementList.length\r\n } else {\r\n this.elementList.push(...elementList)\r\n curIndex = this.elementList.length - 1\r\n }\r\n this.range.setRange(curIndex, curIndex)\r\n this.render({\r\n curIndex,\r\n isSubmitHistory\r\n })\r\n }\r\n\r\n public spliceElementList(\r\n elementList: IElement[],\r\n start: number,\r\n deleteCount: number,\r\n items?: IElement[],\r\n options?: ISpliceElementListOption\r\n ) {\r\n const { isIgnoreDeletedRule = false } = options || {}\r\n const { group, modeRule } = this.options\r\n if (deleteCount > 0) {\r\n // 当最后元素与开始元素列表信息不一致时:清除当前列表信息\r\n const endIndex = start + deleteCount\r\n const endElement = elementList[endIndex]\r\n const endElementListId = endElement?.listId\r\n if (\r\n endElementListId &&\r\n elementList[start - 1]?.listId !== endElementListId\r\n ) {\r\n let startIndex = endIndex\r\n while (startIndex < elementList.length) {\r\n const curElement = elementList[startIndex]\r\n if (\r\n curElement.listId !== endElementListId ||\r\n curElement.value === ZERO\r\n ) {\r\n break\r\n }\r\n delete curElement.listId\r\n delete curElement.listType\r\n delete curElement.listStyle\r\n startIndex++\r\n }\r\n }\r\n // 非明确忽略删除规则 && 非设计模式 && 非光标在控件内(控件内控制) =》 校验删除规则\r\n if (\r\n !isIgnoreDeletedRule &&\r\n !this.isDesignMode() &&\r\n !this.control.getIsRangeWithinControl()\r\n ) {\r\n const tdDeletable = this.getTd()?.deletable\r\n let deleteIndex = endIndex - 1\r\n while (deleteIndex >= start) {\r\n const deleteElement = elementList[deleteIndex]\r\n if (\r\n deleteElement?.control?.hide ||\r\n deleteElement?.area?.hide ||\r\n (tdDeletable !== false &&\r\n deleteElement?.control?.deletable !== false &&\r\n (!deleteElement.controlId ||\r\n this.mode !== EditorMode.FORM ||\r\n !modeRule[this.mode].controlDeletableDisabled) &&\r\n deleteElement?.title?.deletable !== false &&\r\n (group.deletable !== false || !deleteElement.groupIds?.length) &&\r\n (deleteElement?.area?.deletable !== false ||\r\n deleteElement?.areaIndex !== 0))\r\n ) {\r\n elementList.splice(deleteIndex, 1)\r\n }\r\n deleteIndex--\r\n }\r\n } else {\r\n elementList.splice(start, deleteCount)\r\n }\r\n }\r\n // 循环添加,避免使用解构影响性能\r\n if (items?.length) {\r\n for (let i = 0; i < items.length; i++) {\r\n elementList.splice(start + i, 0, items[i])\r\n }\r\n }\r\n }\r\n\r\n public getCanvasEvent(): CanvasEvent {\r\n return this.canvasEvent\r\n }\r\n\r\n public getGlobalEvent(): GlobalEvent {\r\n return this.globalEvent\r\n }\r\n\r\n public getListener(): Listener {\r\n return this.listener\r\n }\r\n\r\n public getEventBus(): EventBus<EventBusMap> {\r\n return this.eventBus\r\n }\r\n\r\n public getOverride(): Override {\r\n return this.override\r\n }\r\n\r\n public initRevisionOverlay(_callbacks?: { onAccept?: (id: string) => void; onReject?: (id: string) => void }) {\r\n if (!this.revisionOverlay) {\r\n this.revisionOverlay = { update: () => {} }\r\n }\r\n this.revisionOverlay.update()\r\n }\r\n\r\n public setRevisionOverlay(overlay: any) {\r\n this.revisionOverlay = overlay\r\n }\r\n\r\n public setCommentOverlay(overlay: any) {\r\n this.commentOverlay = overlay\r\n }\r\n\r\n public destroyRevisionOverlay() {\r\n if (this.revisionOverlay) {\r\n this.revisionOverlay.destroy()\r\n this.revisionOverlay = null\r\n this.commentOverlay = null\r\n }\r\n }\r\n\r\n public getRevisionOverlay(): any | null {\r\n return this.revisionOverlay\r\n }\r\n\r\n public getCursor(): Cursor {\r\n return this.cursor\r\n }\r\n\r\n public getPreviewer(): Previewer {\r\n return this.previewer\r\n }\r\n\r\n public getImageParticle(): ImageParticle {\r\n return this.imageParticle\r\n }\r\n\r\n public getLaTexParticle(): LaTexParticle {\r\n return this.laTexParticle\r\n }\r\n\r\n public setLaTexParticle(laTexParticle: LaTexParticle) {\r\n this.laTexParticle = laTexParticle\r\n }\r\n\r\n public getBlockParticle(): BlockParticle {\r\n return this.blockParticle\r\n }\r\n\r\n public setBlockParticle(blockParticle: BlockParticle) {\r\n this.blockParticle = blockParticle\r\n }\r\n\r\n public getTableTool(): TableTool {\r\n return this.tableTool\r\n }\r\n\r\n public getTableOperate(): TableOperate {\r\n return this.tableOperate\r\n }\r\n\r\n public getTableParticle(): TableParticle {\r\n return this.tableParticle\r\n }\r\n\r\n public getHeader(): Header {\r\n return this.header\r\n }\r\n\r\n public getFooter(): Footer {\r\n return this.footer\r\n }\r\n\r\n public getHyperlinkParticle(): HyperlinkParticle {\r\n return this.hyperlinkParticle\r\n }\r\n\r\n public getDateParticle(): DateParticle {\r\n return this.dateParticle\r\n }\r\n\r\n public setDateParticle(dateParticle: DateParticle) {\r\n this.dateParticle = dateParticle\r\n }\r\n\r\n public getListParticle(): ListParticle {\r\n return this.listParticle\r\n }\r\n\r\n public getCheckboxParticle(): CheckboxParticle {\r\n return this.checkboxParticle\r\n }\r\n\r\n public getRadioParticle(): RadioParticle {\r\n return this.radioParticle\r\n }\r\n\r\n public getControl(): Control {\r\n return this.control\r\n }\r\n\r\n public setControl(control: Control) {\r\n this.control = control\r\n }\r\n\r\n public getWorkerManager(): WorkerManager {\r\n return this.workerManager\r\n }\r\n\r\n public setWorkerManager(workerManager: WorkerManager) {\r\n this.workerManager = workerManager\r\n }\r\n\r\n public getImageObserver(): ImageObserver {\r\n return this.imageObserver\r\n }\r\n\r\n public getI18n(): I18n {\r\n return this.i18n\r\n }\r\n\r\n public getRowCount(): number {\r\n return this.getRowList().length\r\n }\r\n\r\n public async getDataURL(payload: IGetImageOption = {}): Promise<string[]> {\r\n const { pixelRatio, mode } = payload\r\n // 放大像素比\r\n if (pixelRatio) {\r\n this.setPagePixelRatio(pixelRatio)\r\n }\r\n // 不同模式\r\n const currentMode = this.mode\r\n const isSwitchMode = !!mode && currentMode !== mode\r\n if (isSwitchMode) {\r\n this.setMode(mode)\r\n }\r\n this.render({\r\n isLazy: false,\r\n isCompute: false,\r\n isSetCursor: false,\r\n isSubmitHistory: false\r\n })\r\n await this.imageObserver.allSettled()\r\n const dataUrlList = this.pageList.map(c => c.toDataURL())\r\n // 还原\r\n if (pixelRatio) {\r\n this.setPagePixelRatio(null)\r\n }\r\n if (isSwitchMode) {\r\n this.setMode(currentMode)\r\n }\r\n return dataUrlList\r\n }\r\n\r\n public getPainterStyle(): IElementStyle | null {\r\n return this.painterStyle && Object.keys(this.painterStyle).length\r\n ? this.painterStyle\r\n : null\r\n }\r\n\r\n public getPainterOptions(): IPainterOption | null {\r\n return this.painterOptions\r\n }\r\n\r\n public setPainterStyle(\r\n payload: IElementStyle | null,\r\n options?: IPainterOption\r\n ) {\r\n this.painterStyle = payload\r\n this.painterOptions = options || null\r\n if (this.getPainterStyle()) {\r\n this.pageList.forEach(c => (c.style.cursor = 'copy'))\r\n }\r\n }\r\n\r\n public setDefaultRange() {\r\n if (!this.elementList.length) return\r\n setTimeout(() => {\r\n const curIndex = this.elementList.length - 1\r\n this.range.setRange(curIndex, curIndex)\r\n this.range.setRangeStyle()\r\n })\r\n }\r\n\r\n public getIsPagingMode(): boolean {\r\n return this.options.pageMode === PageMode.PAGING\r\n }\r\n\r\n public setPageMode(payload: PageMode) {\r\n if (!payload || this.options.pageMode === payload) return\r\n this.options.pageMode = payload\r\n // 纸张大小重置\r\n if (payload === PageMode.PAGING) {\r\n const { height } = this.options\r\n const dpr = this.getPagePixelRatio()\r\n const canvas = this.pageList[0]\r\n canvas.style.height = `${height}px`\r\n canvas.height = height * dpr\r\n // canvas尺寸发生变化,上下文被重置\r\n this._initPageContext(this.ctxList[0])\r\n } else {\r\n // 连页模式:移除懒加载监听&清空页眉页脚计算数据\r\n this._disconnectLazyRender()\r\n this.header.recovery()\r\n this.footer.recovery()\r\n this.zone.setZone(EditorZone.MAIN)\r\n }\r\n const { startIndex } = this.range.getRange()\r\n const isCollapsed = this.range.getIsCollapsed()\r\n this.render({\r\n isSetCursor: true,\r\n curIndex: startIndex,\r\n isSubmitHistory: false\r\n })\r\n // 重新定位避免事件监听丢失\r\n if (!isCollapsed) {\r\n this.cursor.drawCursor({\r\n isShow: false\r\n })\r\n }\r\n // 回调\r\n setTimeout(() => {\r\n if (this.listener.pageModeChange) {\r\n this.listener.pageModeChange(payload)\r\n }\r\n if (this.eventBus.hasSubscribers('pageModeChange')) {\r\n this.eventBus.emit('pageModeChange', payload)\r\n }\r\n })\r\n }\r\n\r\n public setPageScale(payload: number) {\r\n const dpr = this.getPagePixelRatio()\r\n this.options.scale = payload\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n this.container.style.width = `${width}px`\r\n this.pageList.forEach((p, i) => {\r\n p.width = width * dpr\r\n p.height = height * dpr\r\n p.style.width = `${width}px`\r\n p.style.height = `${height}px`\r\n p.style.marginBottom = `${this.getPageGap()}px`\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n const cursorPosition = this.position.getCursorPosition()\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: !!cursorPosition,\r\n curIndex: cursorPosition?.index\r\n })\r\n if (this.listener.pageScaleChange) {\r\n this.listener.pageScaleChange(payload)\r\n }\r\n if (this.eventBus.hasSubscribers('pageScaleChange')) {\r\n this.eventBus.emit('pageScaleChange', payload)\r\n }\r\n }\r\n\r\n public getPagePixelRatio(): number {\r\n return this.pagePixelRatio || window.devicePixelRatio\r\n }\r\n\r\n public setPagePixelRatio(payload: number | null) {\r\n if (\r\n (!this.pagePixelRatio && payload === window.devicePixelRatio) ||\r\n payload === this.pagePixelRatio\r\n ) {\r\n return\r\n }\r\n this.pagePixelRatio = payload\r\n this.setPageDevicePixel()\r\n }\r\n\r\n public setPageDevicePixel() {\r\n const dpr = this.getPagePixelRatio()\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n this.pageList.forEach((p, i) => {\r\n p.width = width * dpr\r\n p.height = height * dpr\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public setPaperSize(width: number, height: number) {\r\n this.options.width = width\r\n this.options.height = height\r\n const dpr = this.getPagePixelRatio()\r\n const realWidth = this.getWidth()\r\n const realHeight = this.getHeight()\r\n this.container.style.width = `${realWidth}px`\r\n this.pageList.forEach((p, i) => {\r\n p.width = realWidth * dpr\r\n p.height = realHeight * dpr\r\n p.style.width = `${realWidth}px`\r\n p.style.height = `${realHeight}px`\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public setPaperDirection(payload: PaperDirection) {\r\n const dpr = this.getPagePixelRatio()\r\n this.options.paperDirection = payload\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n this.container.style.width = `${width}px`\r\n this.pageList.forEach((p, i) => {\r\n p.width = width * dpr\r\n p.height = height * dpr\r\n p.style.width = `${width}px`\r\n p.style.height = `${height}px`\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public setPaperMargin(payload: IMargin) {\r\n this.options.margins = payload\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public getOriginValue(\r\n options: IGetOriginValueOption = {}\r\n ): Required<IEditorData> {\r\n const { pageNo } = options\r\n let mainElementList = this.elementList\r\n if (\r\n Number.isInteger(pageNo) &&\r\n pageNo! >= 0 &&\r\n pageNo! < this.pageRowList.length\r\n ) {\r\n mainElementList = this.pageRowList[pageNo!].flatMap(\r\n row => row.elementList\r\n )\r\n }\r\n const data: Required<IEditorData> = {\r\n header: this.getHeaderElementList(),\r\n main: mainElementList,\r\n footer: this.getFooterElementList()\r\n }\r\n return data\r\n }\r\n\r\n public getValue(options: IGetValueOption = {}): IEditorResult {\r\n const originData = this.getOriginValue(options)\r\n const { extraPickAttrs } = options\r\n const data: IEditorData = {\r\n header: zipElementList(originData.header, {\r\n extraPickAttrs\r\n }),\r\n main: zipElementList(originData.main, {\r\n extraPickAttrs,\r\n isClassifyArea: true\r\n }),\r\n footer: zipElementList(originData.footer, {\r\n extraPickAttrs\r\n })\r\n }\r\n return {\r\n dataVersion: DOCX_EDITOR_DATA_VERSION,\r\n schemaVersion: version,\r\n data,\r\n options: deepClone(this.options)\r\n }\r\n }\r\n\r\n public setValue(payload: Partial<IEditorData>, options?: ISetValueOption) {\r\n const { header, main, footer } = deepClone(payload)\r\n if (!header && !main && !footer) return\r\n const { isSetCursor = false } = options || {}\r\n const pageComponentData = [header, main, footer]\r\n pageComponentData.forEach(data => {\r\n if (!data) return\r\n formatElementList(data, {\r\n editorOptions: this.options,\r\n isForceCompensation: true\r\n })\r\n })\r\n this.setEditorData({\r\n header,\r\n main,\r\n footer\r\n })\r\n // 渲染&计算&清空历史记录\r\n this.historyManager.recovery()\r\n const curIndex = isSetCursor\r\n ? main?.length\r\n ? main.length - 1\r\n : 0\r\n : undefined\r\n if (curIndex !== undefined) {\r\n this.range.setRange(curIndex, curIndex)\r\n }\r\n this.render({\r\n curIndex,\r\n isSetCursor,\r\n isFirstRender: true\r\n })\r\n }\r\n\r\n public setEditorData(payload: Partial<IEditorData>) {\r\n const { header, main, footer } = payload\r\n if (header) {\r\n this._normalizeHeaderElementList(header)\r\n this.header.setElementList(header)\r\n }\r\n if (main) {\r\n this.elementList = main\r\n }\r\n if (footer) {\r\n this.footer.setElementList(footer)\r\n }\r\n }\r\n\r\n private _normalizeHeaderElementList(elementList?: IElement[]) {\r\n const firstElement = elementList?.[0]\r\n if (!firstElement) return\r\n // 空页眉首个补偿元素没有显式字号时,按八号作为默认字号。\r\n if (firstElement.value === ZERO && firstElement.size === undefined) {\r\n firstElement.size = this.HEADER_DEFAULT_SIZE\r\n }\r\n }\r\n\r\n private _wrapContainer(rootContainer: HTMLElement): HTMLDivElement {\r\n const container = document.createElement('div')\r\n rootContainer.append(container)\r\n return container\r\n }\r\n\r\n private _formatContainer() {\r\n // 容器宽度需跟随纸张宽度\r\n this.container.style.position = 'relative'\r\n this.container.style.width = `${this.getWidth()}px`\r\n this.container.setAttribute(EDITOR_COMPONENT, EditorComponent.MAIN)\r\n }\r\n\r\n private _createPageContainer(): HTMLDivElement {\r\n const pageContainer = document.createElement('div')\r\n pageContainer.classList.add(`${EDITOR_PREFIX}-page-container`)\r\n this.container.append(pageContainer)\r\n return pageContainer\r\n }\r\n\r\n private _createPage(pageNo: number) {\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n const canvas = document.createElement('canvas')\r\n canvas.style.width = `${width}px`\r\n canvas.style.height = `${height}px`\r\n canvas.style.display = 'block'\r\n canvas.style.backgroundColor = '#ffffff'\r\n canvas.style.marginBottom = `${this.getPageGap()}px`\r\n canvas.setAttribute('data-index', String(pageNo))\r\n this.pageContainer.append(canvas)\r\n // 调整分辨率\r\n const dpr = this.getPagePixelRatio()\r\n canvas.width = width * dpr\r\n canvas.height = height * dpr\r\n canvas.style.cursor = 'text'\r\n const ctx = canvas.getContext('2d')!\r\n // 初始化上下文配置\r\n this._initPageContext(ctx)\r\n // 缓存上下文\r\n this.pageList.push(canvas)\r\n this.ctxList.push(ctx)\r\n }\r\n\r\n private _initPageContext(ctx: CanvasRenderingContext2D) {\r\n const dpr = this.getPagePixelRatio()\r\n ctx.scale(dpr, dpr)\r\n // 重置以下属性是因部分浏览器(chrome)会应用css样式\r\n ctx.letterSpacing = '0px'\r\n ctx.wordSpacing = '0px'\r\n ctx.direction = 'ltr'\r\n }\r\n\r\n public getElementFont(el: IElement, scale = 1): string {\r\n const { defaultSize, defaultFont } = this.options\r\n const expandFontFamily = (fontFamily: string) => {\r\n const f = (fontFamily || '').trim()\r\n if (!f) return f\r\n if (/^fangsong/i.test(f) || /仿宋/i.test(f)) {\r\n return 'FangSong,\"FangSong_GB2312\",\"仿宋\",SimSun,\"宋体\",serif'\r\n }\r\n if (/^kaiti/i.test(f) || /楷体/i.test(f)) {\r\n return 'KaiTi,\"KaiTi_GB2312\",\"楷体\",SimSun,\"宋体\",serif'\r\n }\r\n if (/^simsun/i.test(f) || /宋体/i.test(f)) {\r\n return 'SimSun,\"宋体\",serif'\r\n }\r\n if (/^simhei/i.test(f) || /黑体/i.test(f)) {\r\n return 'SimHei,\"黑体\",sans-serif'\r\n }\r\n if (/microsoft yahei|微软雅黑/i.test(f)) {\r\n return 'Microsoft YaHei,\"微软雅黑\",\"Microsoft YaHei UI\",\"微软雅黑 UI\",sans-serif'\r\n }\r\n if (/microsoft jhenghei|微軟正黑體/i.test(f)) {\r\n return 'Microsoft JhengHei,\"微軟正黑體\",sans-serif'\r\n }\r\n if (/^stxinwei/i.test(f) || /华文新魏/i.test(f)) {\r\n return '\"STXinwei\",\"华文新魏\",serif'\r\n }\r\n return f\r\n }\r\n const font = expandFontFamily(el.font || defaultFont)\r\n const size = el.actualSize || el.size || defaultSize\r\n return `${el.italic ? 'italic ' : ''}${el.bold ? 'bold ' : ''}${\r\n size * scale\r\n }px ${font}`\r\n }\r\n\r\n public getElementSize(el: IElement) {\r\n return el.actualSize || el.size || this.options.defaultSize\r\n }\r\n\r\n public getElementRowMargin(el: IElement) {\r\n const { defaultBasicRowMarginHeight, defaultRowMargin, scale } =\r\n this.options\r\n return (\r\n defaultBasicRowMarginHeight * (el.rowMargin ?? defaultRowMargin) * scale\r\n )\r\n }\r\n\r\n private isPageBreakElement(element?: IElement) {\r\n return element?.type === ElementType.PAGE_BREAK\r\n }\r\n\r\n private shouldForceWrapRow(\r\n element: IElement,\r\n preElement?: IElement\r\n ) {\r\n return (\r\n element.type === ElementType.SEPARATOR ||\r\n this.isPageBreakElement(element) ||\r\n isTableElement(element) ||\r\n this.isPageBreakElement(preElement) ||\r\n (preElement && isTableElement(preElement)) ||\r\n preElement?.type === ElementType.BLOCK ||\r\n element.type === ElementType.BLOCK ||\r\n preElement?.listId !== element.listId ||\r\n (preElement?.areaId !== element.areaId && !element.area?.hide) ||\r\n (element.control?.flexDirection === FlexDirection.COLUMN &&\r\n (element.controlComponent === ControlComponent.CHECKBOX ||\r\n element.controlComponent === ControlComponent.RADIO) &&\r\n preElement?.controlComponent === ControlComponent.VALUE) ||\r\n (element.value === ZERO && !element.area?.hide)\r\n )\r\n }\r\n\r\n private normalizeSpecialRow(row: IRow) {\r\n if (row.isPageBreak) {\r\n row.height = 0\r\n row.ascent = 0\r\n }\r\n }\r\n\r\n private shouldDrawLineBreakForRow(\r\n curRow: IRow,\r\n index: number,\r\n isDrawLineBreak: boolean,\r\n isPrintMode: boolean\r\n ) {\r\n return (\r\n isDrawLineBreak &&\r\n !isPrintMode &&\r\n this.mode !== EditorMode.CLEAN &&\r\n !curRow.isWidthNotEnough &&\r\n !curRow.isPageBreak &&\r\n index === curRow.elementList.length - 1\r\n )\r\n }\r\n\r\n public computeRowList(payload: IComputeRowListPayload) {\r\n const {\r\n innerWidth,\r\n elementList,\r\n isPagingMode = false,\r\n isFromTable = false,\r\n startX = 0,\r\n startY = 0,\r\n pageHeight = 0,\r\n mainOuterHeight = 0,\r\n surroundElementList = []\r\n } = payload\r\n const {\r\n defaultSize,\r\n defaultRowMargin,\r\n scale,\r\n table: { tdPadding, defaultTrMinHeight },\r\n defaultTabWidth\r\n } = this.options\r\n const defaultBasicRowMarginHeight = this.getDefaultBasicRowMarginHeight()\r\n // 使用 OffscreenCanvas 进行文本测量(性能更好)\r\n let ctx: CanvasRenderingContext2D\r\n if (typeof OffscreenCanvas !== 'undefined') {\r\n const offscreenCanvas = new OffscreenCanvas(1, 1)\r\n ctx = offscreenCanvas.getContext('2d') as unknown as CanvasRenderingContext2D\r\n } else {\r\n const canvas = document.createElement('canvas')\r\n ctx = canvas.getContext('2d') as CanvasRenderingContext2D\r\n }\r\n // 计算列表偏移宽度\r\n const listStyleMap = this.listParticle.computeListStyle(ctx, elementList)\r\n const rowList: IRow[] = []\r\n if (elementList.length) {\r\n rowList.push({\r\n width: 0,\r\n height: 0,\r\n ascent: 0,\r\n elementList: [],\r\n startIndex: 0,\r\n rowIndex: 0,\r\n rowFlex: elementList?.[0]?.rowFlex || elementList?.[1]?.rowFlex\r\n })\r\n }\r\n // 起始位置及页码计算\r\n let x = startX\r\n let y = startY\r\n let pageNo = 0\r\n // 列表位置\r\n let listId: string | undefined\r\n let listIndex = 0\r\n let paragraphFirstLineIndent = 0\r\n let paragraphIndentLeft = 0\r\n let isParagraphFirstRow = true\r\n // 控件最小宽度\r\n let controlRealWidth = 0\r\n for (let i = 0; i < elementList.length; i++) {\r\n const curRow: IRow = rowList[rowList.length - 1]\r\n const element = elementList[i]\r\n // 分栏区域检测:当遇到分栏标记元素时,收集整个分栏区域并生成分栏容器行\r\n if (\r\n element.columnId &&\r\n element.columnCount &&\r\n element.columnCount >= 2\r\n ) {\r\n const columnId = element.columnId\r\n const columnCount = element.columnCount\r\n const columnGap = (element.columnGap || 0) * scale\r\n const columnSeparator = element.columnSeparator || false\r\n const columnWidths = element.columnWidths || []\r\n // 收集分栏区域内所有元素(跳过起始标记本身)\r\n const columnElements: IElement[] = []\r\n let j = i + 1\r\n while (j < elementList.length) {\r\n const el = elementList[j]\r\n if (!el.columnId || el.columnId !== columnId) break\r\n columnElements.push(el)\r\n j++\r\n }\r\n // 按 COLUMN_BREAK 分组到各列\r\n const columnGroups: IElement[][] = [[]]\r\n for (const el of columnElements) {\r\n if (el.type === ElementType.COLUMN_BREAK) {\r\n if (columnGroups.length < columnCount) {\r\n columnGroups.push([])\r\n }\r\n } else {\r\n columnGroups[columnGroups.length - 1].push(el)\r\n }\r\n }\r\n // 计算各列宽度\r\n const scaledColumnWidths: number[] = []\r\n if (columnWidths.length >= columnCount) {\r\n for (let c = 0; c < columnCount; c++) {\r\n scaledColumnWidths.push(columnWidths[c] * scale)\r\n }\r\n } else {\r\n const totalGap = columnGap * (columnCount - 1)\r\n const colWidth = (innerWidth - totalGap) / columnCount\r\n for (let c = 0; c < columnCount; c++) {\r\n scaledColumnWidths.push(colWidth)\r\n }\r\n }\r\n // 对每列独立调用 computeRowList\r\n const columnRowLists: IRow[][] = []\r\n let maxColumnHeight = 0\r\n for (let c = 0; c < columnCount; c++) {\r\n const groupElements = columnGroups[c] || []\r\n if (groupElements.length === 0) {\r\n columnRowLists.push([])\r\n continue\r\n }\r\n const colRowList = this.computeRowList({\r\n innerWidth: scaledColumnWidths[c],\r\n elementList: groupElements,\r\n isFromTable,\r\n isPagingMode,\r\n columnContext: {\r\n columnId,\r\n columnIndex: c,\r\n totalColumns: columnCount\r\n }\r\n })\r\n columnRowLists.push(colRowList)\r\n const colHeight = colRowList.reduce(\r\n (sum, row) => sum + row.height, 0\r\n )\r\n if (colHeight > maxColumnHeight) {\r\n maxColumnHeight = colHeight\r\n }\r\n }\r\n // 生成分栏容器行\r\n const containerRow: IRow = {\r\n width: innerWidth,\r\n height: maxColumnHeight,\r\n ascent: 0,\r\n startIndex: i,\r\n elementList: [],\r\n rowIndex: curRow.rowIndex + (curRow.elementList.length > 0 ? 1 : 0),\r\n isColumnContainer: true,\r\n columnRowLists,\r\n columnWidths: scaledColumnWidths,\r\n columnGap,\r\n columnSeparator\r\n }\r\n // 如果当前行为空,替换;否则追加新行\r\n if (curRow.elementList.length <= 1) {\r\n rowList[rowList.length - 1] = containerRow\r\n } else {\r\n rowList.push(containerRow)\r\n }\r\n // 跳过分栏区域内的元素(包括结束标记)\r\n i = j // j 已指向分栏区域外第一个元素,for 循环会再 +1\r\n // 添加新的空行用于后续元素\r\n if (i < elementList.length) {\r\n rowList.push({\r\n width: 0,\r\n height: 0,\r\n ascent: 0,\r\n elementList: [],\r\n startIndex: i,\r\n rowIndex: containerRow.rowIndex + 1\r\n })\r\n }\r\n continue\r\n }\r\n if (element.paragraphFirstLineIndent !== undefined) {\r\n paragraphFirstLineIndent = element.paragraphFirstLineIndent\r\n }\r\n if (element.paragraphIndentLeft !== undefined) {\r\n paragraphIndentLeft = element.paragraphIndentLeft\r\n }\r\n const paragraphSpacingBefore = (element.paragraphSpacingBefore || 0) * scale\r\n const paragraphSpacingAfter = (element.paragraphSpacingAfter || 0) * scale\r\n const rowMargin =\r\n defaultBasicRowMarginHeight * (element.rowMargin ?? defaultRowMargin)\r\n const rowMarginTop = rowMargin + paragraphSpacingBefore\r\n const rowMarginBottom = rowMargin + paragraphSpacingAfter\r\n const metrics: IElementMetrics = {\r\n width: 0,\r\n height: 0,\r\n boundingBoxAscent: 0,\r\n boundingBoxDescent: 0\r\n }\r\n // 实际可用宽度\r\n const listOffsetX = element.listId ? listStyleMap.get(element.listId) || 0 : 0\r\n const listIndentX = element.listId\r\n ? ((element.listIndent ?? (element.listLevel || 0) * defaultTabWidth) || 0) *\r\n scale\r\n : 0\r\n const paragraphIndentX = paragraphIndentLeft * scale\r\n if (curRow.offsetX === undefined && (listOffsetX || paragraphIndentX || paragraphFirstLineIndent)) {\r\n const isListParagraph = !!element.listId\r\n const firstIndent = isListParagraph\r\n ? 0\r\n : Math.max(0, isParagraphFirstRow ? paragraphFirstLineIndent : 0)\r\n curRow.offsetX =\r\n listOffsetX +\r\n listIndentX +\r\n paragraphIndentX +\r\n (isParagraphFirstRow ? firstIndent : 0)\r\n if (isParagraphFirstRow && !isListParagraph) {\r\n isParagraphFirstRow = false\r\n }\r\n }\r\n if (element.listId) {\r\n curRow.isList = true\r\n if (curRow.listIndex === undefined) {\r\n curRow.listIndex = listIndex\r\n }\r\n }\r\n const offsetX = curRow.offsetX || 0\r\n const availableWidth = innerWidth - offsetX\r\n // 增加起始位置坐标偏移量\r\n const isStartElement = curRow.elementList.length === 1\r\n x += isStartElement ? offsetX : 0\r\n y += isStartElement ? curRow.offsetY || 0 : 0\r\n if (\r\n (element.control?.hide || element.area?.hide) &&\r\n !this.isDesignMode()\r\n ) {\r\n metrics.height =\r\n curRow.elementList[curRow.elementList.length - 1]?.metrics.height ||\r\n this.options.defaultSize * scale\r\n } else if (element.revisionType === 'delete') {\r\n // 删除修订不占位,宽高设为0\r\n metrics.width = 0\r\n metrics.height = 0\r\n metrics.boundingBoxAscent = 0\r\n metrics.boundingBoxDescent = 0\r\n } else if (\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ) {\r\n // 浮动图片无需计算数据\r\n if (\r\n element.imgDisplay === ImageDisplay.SURROUND ||\r\n element.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n element.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n metrics.width = 0\r\n metrics.height = 0\r\n metrics.boundingBoxDescent = 0\r\n } else {\r\n const elementWidth = element.width! * scale\r\n const elementHeight = element.height! * scale\r\n // 图片超出尺寸后自适应(图片大小大于可用宽度时)\r\n if (elementWidth > availableWidth) {\r\n const adaptiveHeight =\r\n (elementHeight * availableWidth) / elementWidth\r\n element.width = availableWidth / scale\r\n element.height = adaptiveHeight / scale\r\n metrics.width = availableWidth\r\n metrics.height = adaptiveHeight\r\n metrics.boundingBoxDescent = adaptiveHeight\r\n } else {\r\n metrics.width = elementWidth\r\n metrics.height = elementHeight\r\n metrics.boundingBoxDescent = elementHeight\r\n }\r\n }\r\n metrics.boundingBoxAscent = 0\r\n } else if (isTableElement(element)) {\r\n const tableTdPadding = element.tdPadding || tdPadding\r\n // 查看后续表格是否属于同一个源表格-存在即合并\r\n if (element.pagingId) {\r\n let tableIndex = i + 1\r\n let combineCount = 0\r\n while (tableIndex < elementList.length) {\r\n const nextElement = elementList[tableIndex]\r\n if (nextElement.pagingId === element.pagingId) {\r\n const nexTrList = nextElement.trList!.filter(\r\n tr => !tr.pagingRepeat\r\n )\r\n element.trList!.push(...nexTrList)\r\n element.height! += nextElement.height!\r\n tableIndex++\r\n combineCount++\r\n } else {\r\n break\r\n }\r\n }\r\n if (combineCount) {\r\n elementList.splice(i + 1, combineCount)\r\n }\r\n }\r\n element.pagingIndex = element.pagingIndex ?? 0\r\n const trList = element.trList!\r\n const getTrAutoMinHeight = (tr: any) => {\r\n let maxSize = defaultSize\r\n let maxTdPaddingHeight = (tableTdPadding[0] || 0) + (tableTdPadding[2] || 0)\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const curPad = td.padding || tableTdPadding\r\n const curPadH = (curPad[0] || 0) + (curPad[2] || 0)\r\n if (curPadH > maxTdPaddingHeight) maxTdPaddingHeight = curPadH\r\n const valueList = td.value || []\r\n for (let i = 0; i < valueList.length; i++) {\r\n const el = valueList[i]\r\n if (!el) continue\r\n if (el.value === ZERO || el.value === '\\n') continue\r\n const size = el.actualSize || el.size || defaultSize\r\n if (size > maxSize) maxSize = size\r\n }\r\n }\r\n return Math.ceil(maxSize * 1.4 + maxTdPaddingHeight)\r\n }\r\n // 计算前移除上一次的高度\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n const { defaultTrHeight } = this.options.table\r\n const baseHeight = Number(defaultTrHeight)\r\n const hasBaseHeight = Number.isFinite(baseHeight) && baseHeight > 0\r\n const autoMinHeight = Math.max(\r\n defaultTrMinHeight,\r\n hasBaseHeight ? baseHeight : 0,\r\n getTrAutoMinHeight(tr)\r\n )\r\n const explicitHeight = Number(tr.height)\r\n const hasExplicitHeight = Number.isFinite(explicitHeight) && explicitHeight > 0\r\n const nextHeight = tr.minHeight ?? (hasExplicitHeight ? explicitHeight : autoMinHeight)\r\n tr.height = Math.max(defaultTrMinHeight, nextHeight)\r\n tr.minHeight = tr.height\r\n }\r\n // 计算表格行列\r\n this.tableParticle.computeRowColInfo(element)\r\n // 计算表格内元素信息\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const effectiveTdPadding = td.padding || tableTdPadding\r\n const tdPaddingWidth = effectiveTdPadding[1] + effectiveTdPadding[3]\r\n const tdPaddingHeight = effectiveTdPadding[0] + effectiveTdPadding[2]\r\n const rowList = this.computeRowList({\r\n innerWidth: (td.width! - tdPaddingWidth) * scale,\r\n elementList: td.value,\r\n isFromTable: true,\r\n isPagingMode\r\n })\r\n const rowHeight = rowList.reduce((pre, cur) => pre + cur.height, 0)\r\n td.rowList = rowList\r\n // 移除缩放导致的行高变化-渲染时会进行缩放调整\r\n const curTdHeight = rowHeight / scale + tdPaddingHeight\r\n // 内容高度大于当前单元格高度需增加\r\n if (td.height! < curTdHeight) {\r\n const extraHeight = curTdHeight - td.height!\r\n const changeTr = trList[t + td.rowspan - 1]\r\n changeTr.height += extraHeight\r\n changeTr.tdList.forEach(changeTd => {\r\n changeTd.height! += extraHeight\r\n if (!changeTd.realHeight) {\r\n changeTd.realHeight = changeTd.height!\r\n } else {\r\n changeTd.realHeight! += extraHeight\r\n }\r\n })\r\n }\r\n // 当前单元格最小高度及真实高度(包含跨列)\r\n let curTdMinHeight = 0\r\n let curTdRealHeight = 0\r\n let i = 0\r\n while (i < td.rowspan) {\r\n const curTr = trList[i + t] || trList[t]\r\n curTdMinHeight += curTr.minHeight!\r\n curTdRealHeight += curTr.height!\r\n i++\r\n }\r\n td.realMinHeight = curTdMinHeight\r\n td.realHeight = curTdRealHeight\r\n td.mainHeight = curTdHeight\r\n }\r\n }\r\n // 单元格高度大于实际内容高度需减少\r\n const reduceTrList = this.tableParticle.getTrListGroupByCol(trList)\r\n for (let t = 0; t < reduceTrList.length; t++) {\r\n const tr = reduceTrList[t]\r\n let reduceHeight = -1\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const curTdRealHeight = td.realHeight!\r\n const curTdHeight = td.mainHeight!\r\n const curTdMinHeight = td.realMinHeight!\r\n // 获取最大可减少高度\r\n const curReduceHeight =\r\n curTdHeight < curTdMinHeight\r\n ? curTdRealHeight - curTdMinHeight\r\n : curTdRealHeight - curTdHeight\r\n if (!~reduceHeight || curReduceHeight < reduceHeight) {\r\n reduceHeight = curReduceHeight\r\n }\r\n }\r\n if (reduceHeight > 0) {\r\n const changeTr = trList[t]\r\n changeTr.height -= reduceHeight\r\n changeTr.tdList.forEach(changeTd => {\r\n changeTd.height! -= reduceHeight\r\n changeTd.realHeight! -= reduceHeight\r\n })\r\n }\r\n }\r\n // 需要重新计算表格内值\r\n this.tableParticle.computeRowColInfo(element)\r\n // 计算出表格高度\r\n const tableHeight = this.tableParticle.getTableHeight(element)\r\n const tableWidth = this.tableParticle.getTableWidth(element)\r\n element.width = tableWidth\r\n element.height = tableHeight\r\n const elementWidth = tableWidth * scale\r\n const elementHeight = tableHeight * scale\r\n metrics.width = elementWidth\r\n metrics.height = elementHeight\r\n metrics.boundingBoxDescent = elementHeight\r\n metrics.boundingBoxAscent = -rowMargin\r\n // 后一个元素也是表格则移除行间距\r\n if (elementList[i + 1]?.type === ElementType.TABLE) {\r\n metrics.boundingBoxAscent -= rowMargin\r\n }\r\n // 表格分页处理(拆分表格)\r\n if (isPagingMode) {\r\n const height = this.getHeight()\r\n const marginHeight = this.getMainOuterHeight()\r\n let curPagePreHeight = marginHeight\r\n for (let r = 0; r < rowList.length; r++) {\r\n const row = rowList[r]\r\n const rowOffsetY = row.offsetY || 0\r\n if (\r\n row.height + curPagePreHeight + rowOffsetY > height ||\r\n rowList[r - 1]?.isPageBreak\r\n ) {\r\n curPagePreHeight = marginHeight + row.height + rowOffsetY\r\n } else {\r\n curPagePreHeight += row.height + rowOffsetY\r\n }\r\n }\r\n // 当前剩余高度是否能容下当前表格第一行(可拆分)的高度,排除掉表头类型\r\n const rowMarginHeight = rowMargin * 2 * scale\r\n const firstTrHeight = element.trList![0].height! * scale\r\n if (\r\n curPagePreHeight + firstTrHeight + rowMarginHeight > height ||\r\n (element.pagingIndex !== 0 && element.trList![0].pagingRepeat)\r\n ) {\r\n // 无可拆分行则切换至新页\r\n curPagePreHeight = marginHeight\r\n }\r\n // 表格高度超过页面高度开始截断行\r\n if (curPagePreHeight + rowMarginHeight + elementHeight > height) {\r\n const trList = element.trList!\r\n // 计算需要移除的行数\r\n let deleteStart = 0\r\n let deleteCount = 0\r\n let preTrHeight = 0\r\n // 大于一行时再拆分避免循环\r\n if (trList.length > 1) {\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const trHeight = tr.height * scale\r\n if (\r\n curPagePreHeight + rowMarginHeight + preTrHeight + trHeight >\r\n height\r\n ) {\r\n // 当前行存在跨行中断-暂时忽略分页\r\n const rowColCount = tr.tdList.reduce(\r\n (pre, cur) => pre + cur.colspan,\r\n 0\r\n )\r\n if (element.colgroup?.length !== rowColCount) {\r\n deleteCount = 0\r\n }\r\n break\r\n } else {\r\n deleteStart = r + 1\r\n deleteCount = trList.length - deleteStart\r\n preTrHeight += trHeight\r\n }\r\n }\r\n }\r\n if (deleteCount) {\r\n const cloneTrList = trList.splice(deleteStart, deleteCount)\r\n const cloneTrHeight = cloneTrList.reduce(\r\n (pre, cur) => pre + cur.height,\r\n 0\r\n )\r\n const cloneTrRealHeight = cloneTrHeight * scale\r\n const pagingId = element.pagingId || getUUID()\r\n element.pagingId = pagingId\r\n element.height -= cloneTrHeight\r\n metrics.height -= cloneTrRealHeight\r\n metrics.boundingBoxDescent -= cloneTrRealHeight\r\n // 追加拆分表格\r\n const cloneElement = deepClone(element)\r\n cloneElement.pagingId = pagingId\r\n cloneElement.pagingIndex = element.pagingIndex! + 1\r\n // 处理分页重复表头\r\n const repeatTrList = trList.filter(tr => tr.pagingRepeat)\r\n if (repeatTrList.length) {\r\n const cloneRepeatTrList = deepClone(repeatTrList)\r\n cloneRepeatTrList.forEach(tr => (tr.id = getUUID()))\r\n cloneTrList.unshift(...cloneRepeatTrList)\r\n }\r\n cloneElement.trList = cloneTrList\r\n cloneElement.id = getUUID()\r\n this.spliceElementList(elementList, i + 1, 0, [cloneElement])\r\n }\r\n }\r\n // 表格经过分页处理-需要处理上下文\r\n if (element.pagingId) {\r\n const positionContext = this.position.getPositionContext()\r\n if (positionContext.isTable) {\r\n // 查找光标所在表格索引(根据trId搜索)\r\n let newPositionContextIndex = -1\r\n let newPositionContextTrIndex = -1\r\n let tableIndex = i\r\n while (tableIndex < elementList.length) {\r\n const curElement = elementList[tableIndex]\r\n if (curElement.pagingId !== element.pagingId) break\r\n const trIndex = curElement.trList!.findIndex(\r\n r => r.id === positionContext.trId\r\n )\r\n if (~trIndex) {\r\n newPositionContextIndex = tableIndex\r\n newPositionContextTrIndex = trIndex\r\n break\r\n }\r\n tableIndex++\r\n }\r\n if (~newPositionContextIndex) {\r\n positionContext.index = newPositionContextIndex\r\n positionContext.trIndex = newPositionContextTrIndex\r\n this.position.setPositionContext(positionContext)\r\n }\r\n }\r\n }\r\n }\r\n } else if (element.type === ElementType.SEPARATOR) {\r\n const {\r\n separator: { lineWidth }\r\n } = this.options\r\n element.width = availableWidth / scale\r\n metrics.width = availableWidth\r\n metrics.height = getSeparatorRenderHeight(element, lineWidth) * scale\r\n metrics.boundingBoxAscent = -rowMargin\r\n metrics.boundingBoxDescent = -rowMargin + metrics.height\r\n } else if (element.type === ElementType.PAGE_BREAK) {\r\n // 分页符禁用显示时,保留最小高度用于光标定位,但不占用水平空间\r\n if (this.options.pageBreak.disabled) {\r\n element.width = 0\r\n metrics.width = 0\r\n metrics.height = defaultSize * scale\r\n metrics.boundingBoxAscent = defaultSize * scale\r\n metrics.boundingBoxDescent = 0\r\n } else {\r\n element.width = availableWidth / scale\r\n metrics.width = availableWidth\r\n metrics.height = defaultSize\r\n }\r\n } else if (\r\n element.type === ElementType.RADIO ||\r\n element.controlComponent === ControlComponent.RADIO\r\n ) {\r\n const { width, height, gap } = this.options.radio\r\n const elementWidth = width + gap * 2\r\n element.width = elementWidth\r\n metrics.width = elementWidth * scale\r\n metrics.height = height * scale\r\n } else if (\r\n element.type === ElementType.CHECKBOX ||\r\n element.controlComponent === ControlComponent.CHECKBOX\r\n ) {\r\n const { width, height, gap } = this.options.checkbox\r\n const elementWidth = width + gap * 2\r\n element.width = elementWidth\r\n metrics.width = elementWidth * scale\r\n metrics.height = height * scale\r\n } else if (element.type === ElementType.TAB) {\r\n metrics.width = defaultTabWidth * scale\r\n metrics.height = defaultSize * scale\r\n metrics.boundingBoxDescent = 0\r\n metrics.boundingBoxAscent = metrics.height\r\n } else if (element.type === ElementType.BLOCK) {\r\n if (!element.width) {\r\n metrics.width = availableWidth\r\n } else {\r\n const elementWidth = element.width * scale\r\n metrics.width = Math.min(elementWidth, availableWidth)\r\n }\r\n metrics.height = element.height! * scale\r\n metrics.boundingBoxDescent = metrics.height\r\n metrics.boundingBoxAscent = 0\r\n } else {\r\n // 设置上下标真实字体尺寸\r\n const size = element.size || defaultSize\r\n if (\r\n element.type === ElementType.SUPERSCRIPT ||\r\n element.type === ElementType.SUBSCRIPT\r\n ) {\r\n element.actualSize = Math.ceil(size * 0.6)\r\n }\r\n metrics.height = (element.actualSize || size) * scale\r\n ctx.font = this.getElementFont(element)\r\n const fontMetrics = this.textParticle.measureText(ctx, element)\r\n const characterScaleRatio = TextParticle.getCharacterScaleRatio(\r\n element.characterScale\r\n )\r\n metrics.width = fontMetrics.width * scale * characterScaleRatio\r\n if (element.letterSpacing) {\r\n metrics.width += element.letterSpacing * scale\r\n }\r\n metrics.boundingBoxAscent =\r\n (element.value === ZERO\r\n ? element.size || defaultSize\r\n : fontMetrics.actualBoundingBoxAscent) * scale\r\n metrics.boundingBoxDescent =\r\n fontMetrics.actualBoundingBoxDescent * scale\r\n if (element.type === ElementType.SUPERSCRIPT) {\r\n metrics.boundingBoxAscent += metrics.height / 2\r\n } else if (element.type === ElementType.SUBSCRIPT) {\r\n metrics.boundingBoxDescent += metrics.height / 2\r\n }\r\n }\r\n const lineHeight = element.lineHeight ?? this.options.defaultLineHeight\r\n const ascent =\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ? metrics.height + rowMarginTop\r\n : metrics.boundingBoxAscent +\r\n rowMarginTop +\r\n ((metrics.boundingBoxAscent + metrics.boundingBoxDescent) *\r\n (lineHeight - 1)) /\r\n 2\r\n const height =\r\n rowMarginTop +\r\n (metrics.boundingBoxAscent + metrics.boundingBoxDescent) * lineHeight +\r\n rowMarginBottom\r\n const rowElement: IRowElement = Object.assign(element, {\r\n metrics,\r\n left: 0,\r\n style: this.getElementFont(element, scale)\r\n })\r\n // 暂时只考虑非换行场景:控件开始时统计宽度,结束时消费宽度及还原\r\n if (rowElement.control?.minWidth) {\r\n if (rowElement.controlComponent) {\r\n controlRealWidth += metrics.width\r\n }\r\n if (rowElement.controlComponent === ControlComponent.POSTFIX) {\r\n // 设置最小宽度控件属性(字符偏移量)\r\n this.control.setMinWidthControlInfo({\r\n row: curRow,\r\n rowElement,\r\n availableWidth,\r\n controlRealWidth\r\n })\r\n controlRealWidth = 0\r\n }\r\n }\r\n // 超过限定宽度\r\n const preElement = elementList[i - 1]\r\n let nextElement = elementList[i + 1]\r\n // 累计行宽 + 当前元素宽度 + 排版宽度(英文单词整体宽度 + 后面标点符号宽度)\r\n let curRowWidth = curRow.width + metrics.width\r\n if (this.options.wordBreak === WordBreak.BREAK_WORD) {\r\n if (\r\n (!preElement?.type || preElement?.type === ElementType.TEXT) &&\r\n (!element.type || element.type === ElementType.TEXT)\r\n ) {\r\n // 英文单词\r\n const word = `${preElement?.value || ''}${element.value}`\r\n if (this.WORD_LIKE_REG.test(word)) {\r\n const { width, endElement } = this.textParticle.measureWord(\r\n ctx,\r\n elementList,\r\n i\r\n )\r\n // 单词宽度大于行可用宽度,无需折行\r\n const wordWidth = width * scale\r\n if (wordWidth <= availableWidth) {\r\n curRowWidth += wordWidth\r\n nextElement = endElement\r\n }\r\n }\r\n // 标点符号\r\n const punctuationWidth = this.textParticle.measurePunctuationWidth(\r\n ctx,\r\n nextElement\r\n )\r\n curRowWidth += punctuationWidth * scale\r\n }\r\n }\r\n // 列表信息\r\n if (element.listId) {\r\n if (element.listId !== listId) {\r\n listIndex = 0\r\n } else if (isParagraphSeparator(element)) {\r\n listIndex++\r\n }\r\n }\r\n listId = element.listId\r\n // 计算四周环绕导致的元素偏移量\r\n const surroundPosition = this.position.setSurroundPosition({\r\n pageNo,\r\n rowElement,\r\n row: curRow,\r\n rowElementRect: {\r\n x,\r\n y,\r\n height,\r\n width: metrics.width\r\n },\r\n availableWidth,\r\n surroundElementList\r\n })\r\n x = surroundPosition.x\r\n curRowWidth += surroundPosition.rowIncreaseWidth\r\n x += metrics.width\r\n // 是否强制换行\r\n const isForceBreak =\r\n i !== 0 &&\r\n this.shouldForceWrapRow(element, preElement)\r\n // 是否宽度不足导致换行\r\n const isWidthNotEnough = curRowWidth > availableWidth\r\n const isWrap = isForceBreak || isWidthNotEnough\r\n // 新行数据处理\r\n if (isWrap) {\r\n const resolveRowFlex = () => {\r\n const cur = elementList[i]\r\n if (cur?.value === ZERO) {\r\n return (\r\n elementList[i + 1]?.rowFlex ||\r\n elementList[i + 2]?.rowFlex ||\r\n cur.rowFlex\r\n )\r\n }\r\n return cur?.rowFlex || elementList[i + 1]?.rowFlex\r\n }\r\n const row: IRow = {\r\n width: metrics.width,\r\n height,\r\n startIndex: i,\r\n elementList: [rowElement],\r\n ascent,\r\n rowIndex: curRow.rowIndex + 1,\r\n rowFlex: resolveRowFlex(),\r\n isPageBreak: this.isPageBreakElement(element)\r\n }\r\n this.normalizeSpecialRow(row)\r\n // 控件缩进\r\n if (\r\n rowElement.controlComponent !== ControlComponent.PREFIX &&\r\n rowElement.control?.indentation === ControlIndentation.VALUE_START\r\n ) {\r\n // 查找到非前缀的第一个元素位置\r\n const preStartIndex = curRow.elementList.findIndex(\r\n el =>\r\n el.controlId === rowElement.controlId &&\r\n el.controlComponent !== ControlComponent.PREFIX\r\n )\r\n if (~preStartIndex) {\r\n const preRowPositionList = this.position.computeRowPosition({\r\n row: curRow,\r\n innerWidth: this.getInnerWidth()\r\n })\r\n const valueStartPosition = preRowPositionList[preStartIndex]\r\n if (valueStartPosition) {\r\n row.offsetX = valueStartPosition.coordinate.leftTop[0]\r\n }\r\n }\r\n }\r\n // 列表缩进\r\n if (element.listId) {\r\n row.isList = true\r\n row.offsetX =\r\n (row.offsetX || 0) + (listStyleMap.get(element.listId!) || 0) + listIndentX\r\n row.listIndex = listIndex\r\n }\r\n // Y轴偏移量\r\n row.offsetY =\r\n !isFromTable &&\r\n element.area?.top &&\r\n element.areaId !== elementList[i - 1]?.areaId\r\n ? element.area.top * scale\r\n : 0\r\n rowList.push(row)\r\n } else {\r\n curRow.width += metrics.width\r\n // 减小块元素前第一行空行行高\r\n if (\r\n i === 0 &&\r\n (getIsBlockElement(elementList[1]) || !!elementList[1]?.areaId)\r\n ) {\r\n curRow.height = defaultBasicRowMarginHeight\r\n curRow.ascent = defaultBasicRowMarginHeight\r\n } else if (curRow.height < height) {\r\n curRow.height = height\r\n curRow.ascent = ascent\r\n }\r\n curRow.elementList.push(rowElement)\r\n }\r\n // 行结束时逻辑\r\n if (isWrap || i === elementList.length - 1) {\r\n // 换行原因:宽度不足\r\n curRow.isWidthNotEnough = isWidthNotEnough && !isForceBreak\r\n // 两端对齐、分散对齐\r\n if (\r\n !curRow.isSurround &&\r\n (preElement?.rowFlex === RowFlex.JUSTIFY ||\r\n (preElement?.rowFlex === RowFlex.ALIGNMENT &&\r\n curRow.isWidthNotEnough))\r\n ) {\r\n // 忽略换行符及尾部元素间隔设置\r\n const rowElementList =\r\n curRow.elementList[0]?.value === ZERO\r\n ? curRow.elementList.slice(1)\r\n : curRow.elementList\r\n const gap =\r\n (availableWidth - curRow.width) / (rowElementList.length - 1)\r\n for (let e = 0; e < rowElementList.length - 1; e++) {\r\n const el = rowElementList[e]\r\n el.metrics.width += gap\r\n }\r\n curRow.width = availableWidth\r\n }\r\n }\r\n if (i !== 0 && element.value === ZERO && !element.area?.hide && !element.listWrap) {\r\n paragraphFirstLineIndent = 0\r\n paragraphIndentLeft = 0\r\n isParagraphFirstRow = true\r\n }\r\n // 重新计算坐标、页码、下一行首行元素环绕交叉\r\n if (isWrap) {\r\n x = startX\r\n y += curRow.height\r\n if (\r\n isPagingMode &&\r\n !isFromTable &&\r\n pageHeight &&\r\n (y - startY + mainOuterHeight + height > pageHeight ||\r\n this.isPageBreakElement(element))\r\n ) {\r\n y = startY\r\n // 删除多余四周环绕型元素\r\n deleteSurroundElementList(surroundElementList, pageNo)\r\n pageNo += 1\r\n }\r\n // 计算下一行第一个元素是否存在环绕交叉\r\n rowElement.left = 0\r\n const nextRow = rowList[rowList.length - 1]\r\n const surroundPosition = this.position.setSurroundPosition({\r\n pageNo,\r\n rowElement,\r\n row: nextRow,\r\n rowElementRect: {\r\n x,\r\n y,\r\n height,\r\n width: metrics.width\r\n },\r\n availableWidth,\r\n surroundElementList\r\n })\r\n x = surroundPosition.x\r\n x += metrics.width\r\n }\r\n }\r\n return rowList\r\n }\r\n\r\n private _computePageList(): IRow[][] {\r\n const pageRowList: IRow[][] = [[]]\r\n const {\r\n pageMode,\r\n pageNumber: { maxPageNo }\r\n } = this.options\r\n const height = this.getHeight()\r\n const marginHeight = this.getMainOuterHeight()\r\n let pageHeight = marginHeight\r\n let pageNo = 0\r\n if (pageMode === PageMode.CONTINUITY) {\r\n pageRowList[0] = this.rowList\r\n // 重置高度\r\n pageHeight += this.rowList.reduce(\r\n (pre, cur) => pre + cur.height + (cur.offsetY || 0),\r\n 0\r\n )\r\n const dpr = this.getPagePixelRatio()\r\n const pageDom = this.pageList[0]\r\n const pageDomHeight = Number(pageDom.style.height.replace('px', ''))\r\n if (pageHeight > pageDomHeight) {\r\n pageDom.style.height = `${pageHeight}px`\r\n pageDom.height = pageHeight * dpr\r\n } else {\r\n const reduceHeight = pageHeight < height ? height : pageHeight\r\n pageDom.style.height = `${reduceHeight}px`\r\n pageDom.height = reduceHeight * dpr\r\n }\r\n this._initPageContext(this.ctxList[0])\r\n } else {\r\n for (let i = 0; i < this.rowList.length; i++) {\r\n const row = this.rowList[i]\r\n const rowOffsetY = row.offsetY || 0\r\n if (\r\n row.height + rowOffsetY + pageHeight > height ||\r\n this.rowList[i - 1]?.isPageBreak\r\n ) {\r\n if (Number.isInteger(maxPageNo) && pageNo >= maxPageNo!) {\r\n this.elementList = this.elementList.slice(0, row.startIndex)\r\n break\r\n }\r\n pageHeight = marginHeight + row.height + rowOffsetY\r\n pageRowList.push([row])\r\n pageNo++\r\n } else {\r\n pageHeight += row.height + rowOffsetY\r\n pageRowList[pageNo].push(row)\r\n }\r\n }\r\n }\r\n return pageRowList\r\n }\r\n\r\n private _drawParagraphColor(\r\n ctx: CanvasRenderingContext2D,\r\n payload: IDrawRowPayload\r\n ) {\r\n const { rowList, positionList, innerWidth } = payload\r\n const margins = this.getMargins()\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n const firstElement = curRow.elementList[0]\r\n const paragraphColor = firstElement?.paragraphColor\r\n if (!paragraphColor) continue\r\n const {\r\n coordinate: {\r\n leftTop: [, y]\r\n }\r\n } = positionList[curRow.startIndex]\r\n const x = margins[3]\r\n this.paragraphColor.recordFillInfo(\r\n ctx,\r\n x,\r\n y,\r\n innerWidth,\r\n curRow.height,\r\n paragraphColor\r\n )\r\n this.paragraphColor.render(ctx)\r\n }\r\n }\r\n\r\n private _drawHighlight(\r\n ctx: CanvasRenderingContext2D,\r\n payload: IDrawRowPayload\r\n ) {\r\n const { rowList, positionList, elementList } = payload\r\n const marginHeight = this.getDefaultBasicRowMarginHeight()\r\n const highlightMarginHeight = this.getHighlightMarginHeight()\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n for (let j = 0; j < curRow.elementList.length; j++) {\r\n const element = curRow.elementList[j]\r\n const preElement = curRow.elementList[j - 1]\r\n // 高亮配置:元素 > 控件配置\r\n const highlight =\r\n element.highlight ||\r\n this.control.getControlHighlight(elementList, curRow.startIndex + j)\r\n if (highlight) {\r\n // 高亮元素相连需立即绘制,并记录下一元素坐标\r\n if (\r\n preElement &&\r\n preElement.highlight &&\r\n preElement.highlight !== element.highlight\r\n ) {\r\n this.highlight.render(ctx)\r\n }\r\n // 当前元素位置信息记录\r\n const {\r\n coordinate: {\r\n leftTop: [x, y]\r\n }\r\n } = positionList[curRow.startIndex + j]\r\n // 元素向左偏移量\r\n const offsetX = element.left || 0\r\n this.highlight.recordFillInfo(\r\n ctx,\r\n x - offsetX,\r\n y + marginHeight - highlightMarginHeight, // 先减去行margin,再加上高亮margin\r\n element.metrics.width + offsetX,\r\n curRow.height - 2 * marginHeight + 2 * highlightMarginHeight,\r\n highlight\r\n )\r\n } else if (preElement?.highlight) {\r\n // 之前是高亮元素,当前不是需立即绘制\r\n this.highlight.render(ctx)\r\n }\r\n }\r\n this.highlight.render(ctx)\r\n }\r\n }\r\n\r\n public drawRow(ctx: CanvasRenderingContext2D, payload: IDrawRowPayload) {\r\n // 优先绘制段落背景色(最底层)\r\n this._drawParagraphColor(ctx, payload)\r\n // 绘制高亮元素\r\n this._drawHighlight(ctx, payload)\r\n // 绘制元素、下划线、删除线、选区\r\n const {\r\n scale,\r\n table: { tdPadding },\r\n group,\r\n lineBreak\r\n } = this.options\r\n const {\r\n rowList,\r\n pageNo,\r\n elementList,\r\n positionList,\r\n startIndex,\r\n zone,\r\n isDrawLineBreak = !lineBreak.disabled\r\n } = payload\r\n const isPrintMode = this.mode === EditorMode.PRINT\r\n const { isCrossRowCol, tableId } = this.range.getRange()\r\n let index = startIndex\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n // 分栏容器行:绘制各列内容及可选分隔线\r\n if (curRow.isColumnContainer && curRow.columnRowLists) {\r\n const { scale } = this.options\r\n const colWidths = curRow.columnWidths || []\r\n const colGap = curRow.columnGap || 0\r\n const colSeparator = curRow.columnSeparator || false\r\n // 获取分栏容器行的 Y 坐标\r\n const containerPos = positionList[curRow.startIndex]\r\n const containerY = containerPos\r\n ? containerPos.coordinate.leftTop[1]\r\n : 0\r\n let colX = containerPos\r\n ? containerPos.coordinate.leftTop[0]\r\n : 0\r\n for (let c = 0; c < curRow.columnRowLists.length; c++) {\r\n const colRowList = curRow.columnRowLists[c]\r\n if (colRowList.length > 0) {\r\n // 计算列内元素的位置列表\r\n const colPositionList: IElementPosition[] = []\r\n this.position.computePageRowPosition({\r\n positionList: colPositionList,\r\n rowList: colRowList,\r\n pageNo,\r\n startX: colX,\r\n startY: containerY,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n innerWidth: colWidths[c] || 0\r\n })\r\n // 构建列内元素列表\r\n const colElementList: IElement[] = []\r\n for (const colRow of colRowList) {\r\n for (const el of colRow.elementList) {\r\n colElementList.push(el)\r\n }\r\n }\r\n // 绘制列内容\r\n this.drawRow(ctx, {\r\n elementList: colElementList,\r\n positionList: colPositionList,\r\n rowList: colRowList,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth: colWidths[c] || 0,\r\n zone\r\n })\r\n }\r\n // 绘制列间分隔线\r\n if (colSeparator && c < curRow.columnRowLists.length - 1) {\r\n const separatorX = colX + (colWidths[c] || 0) + colGap / 2\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.moveTo(separatorX, containerY)\r\n ctx.lineTo(separatorX, containerY + curRow.height)\r\n ctx.strokeStyle = '#DCDFE6'\r\n ctx.lineWidth = 0.5 * scale\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n colX += (colWidths[c] || 0) + colGap\r\n }\r\n continue\r\n }\r\n // 选区绘制记录\r\n const rangeRecord: IElementFillRect = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n let tableRangeElement: IElement | null = null\r\n for (let j = 0; j < curRow.elementList.length; j++) {\r\n const element = curRow.elementList[j]\r\n const metrics = element.metrics\r\n // 当前元素位置信息\r\n const {\r\n ascent: offsetY,\r\n coordinate: {\r\n leftTop: [x, y]\r\n }\r\n } = positionList[curRow.startIndex + j]\r\n const preElement = curRow.elementList[j - 1]\r\n // 元素绘制\r\n if (\r\n element.revisionType === 'delete'\r\n ) {\r\n // 删除修订内容不在正文渲染,由右侧气泡显示\r\n this.textParticle.complete()\r\n } else if (\r\n (element.control?.hide || element.area?.hide) &&\r\n !this.isDesignMode()\r\n ) {\r\n // 控件隐藏时不绘制\r\n this.textParticle.complete()\r\n } else if (element.type === ElementType.IMAGE) {\r\n this.textParticle.complete()\r\n // 浮动图片单独绘制\r\n if (\r\n element.imgDisplay !== ImageDisplay.SURROUND &&\r\n element.imgDisplay !== ImageDisplay.FLOAT_TOP &&\r\n element.imgDisplay !== ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n this.imageParticle.render(ctx, element, x, y + offsetY)\r\n }\r\n } else if (element.type === ElementType.LATEX) {\r\n this.textParticle.complete()\r\n this.laTexParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.TABLE) {\r\n if (isCrossRowCol) {\r\n rangeRecord.x = x\r\n rangeRecord.y = y\r\n tableRangeElement = element\r\n }\r\n this.tableParticle.render(ctx, element, x, y)\r\n } else if (element.type === ElementType.HYPERLINK) {\r\n this.textParticle.complete()\r\n this.hyperlinkParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.DATE) {\r\n const nextElement = curRow.elementList[j + 1]\r\n // 释放之前的\r\n if (!preElement || preElement.dateId !== element.dateId) {\r\n this.textParticle.complete()\r\n }\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n if (!nextElement || nextElement.dateId !== element.dateId) {\r\n // 手动触发渲染\r\n this.textParticle.complete()\r\n }\r\n } else if (element.type === ElementType.SUPERSCRIPT) {\r\n this.textParticle.complete()\r\n this.superscriptParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.SUBSCRIPT) {\r\n this.underline.render(ctx)\r\n this.textParticle.complete()\r\n this.subscriptParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.SEPARATOR) {\r\n this.separatorParticle.render(ctx, element, x, y)\r\n } else if (this.isPageBreakElement(element)) {\r\n if (\r\n this.mode !== EditorMode.CLEAN &&\r\n !isPrintMode &&\r\n this.options.pageBreak.disabled === false\r\n ) {\r\n this.pageBreakParticle.render(ctx, element, x, y)\r\n }\r\n } else if (\r\n element.type === ElementType.CHECKBOX ||\r\n element.controlComponent === ControlComponent.CHECKBOX\r\n ) {\r\n this.textParticle.complete()\r\n this.checkboxParticle.render({\r\n ctx,\r\n x,\r\n y: y + offsetY,\r\n index: j,\r\n row: curRow\r\n })\r\n } else if (\r\n element.type === ElementType.RADIO ||\r\n element.controlComponent === ControlComponent.RADIO\r\n ) {\r\n this.textParticle.complete()\r\n this.radioParticle.render({\r\n ctx,\r\n x,\r\n y: y + offsetY,\r\n index: j,\r\n row: curRow\r\n })\r\n } else if (element.type === ElementType.TAB) {\r\n this.textParticle.complete()\r\n } else if (\r\n element.rowFlex === RowFlex.ALIGNMENT ||\r\n element.rowFlex === RowFlex.JUSTIFY\r\n ) {\r\n // 如果是两端对齐,因canvas目前不支持letterSpacing需单独绘制文本\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n this.textParticle.complete()\r\n } else if (element.type === ElementType.BLOCK) {\r\n this.textParticle.complete()\r\n this.blockParticle.render(pageNo, element, x, y + offsetY)\r\n } else if (element.type === ElementType.PLACEHOLDER) {\r\n // 占位符元素按普通文本绘制\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n this.textParticle.complete()\r\n } else {\r\n // 如果当前元素设置左偏移,则上一元素立即绘制\r\n const hasCustomCharacterScale =\r\n (element.characterScale ?? 100) !== 100\r\n if (element.left || hasCustomCharacterScale) {\r\n this.textParticle.complete()\r\n }\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n // 如果设置字宽、字间距、标点符号(避免浏览器排版缩小间距)需单独绘制\r\n if (\r\n element.width ||\r\n element.letterSpacing ||\r\n hasCustomCharacterScale ||\r\n PUNCTUATION_REG.test(element.value)\r\n ) {\r\n this.textParticle.complete()\r\n }\r\n }\r\n // 换行符绘制\r\n if (\r\n this.shouldDrawLineBreakForRow(\r\n curRow,\r\n j,\r\n isDrawLineBreak,\r\n isPrintMode\r\n )\r\n ) {\r\n this.lineBreakParticle.render(ctx, element, x, y + curRow.height / 2)\r\n }\r\n // 边框绘制(目前仅支持控件)\r\n if (element.control?.border) {\r\n // 不同控件边框立刻绘制\r\n if (\r\n preElement?.control?.border &&\r\n preElement.controlId !== element.controlId\r\n ) {\r\n this.control.drawBorder(ctx)\r\n }\r\n // 当前元素位置信息记录\r\n const rowMargin = this.getElementRowMargin(element)\r\n this.control.recordBorderInfo(\r\n x,\r\n y + rowMargin,\r\n element.metrics.width,\r\n curRow.height - 2 * rowMargin\r\n )\r\n } else if (preElement?.control?.border) {\r\n this.control.drawBorder(ctx)\r\n }\r\n // 下划线记录\r\n if (element.underline || element.control?.underline) {\r\n // 下标元素下划线单独绘制\r\n if (\r\n preElement?.type === ElementType.SUBSCRIPT &&\r\n element.type !== ElementType.SUBSCRIPT\r\n ) {\r\n this.underline.render(ctx)\r\n }\r\n // 行间距\r\n const rowMargin = this.getElementRowMargin(element)\r\n // 元素向左偏移量\r\n const offsetX = element.left || 0\r\n // 下标元素y轴偏移值\r\n let offsetY = 0\r\n if (element.type === ElementType.SUBSCRIPT) {\r\n offsetY = this.subscriptParticle.getOffsetY(element)\r\n }\r\n // 占位符不参与颜色计算\r\n const color = element.control?.underline\r\n ? this.options.underlineColor\r\n : element.color\r\n this.underline.recordFillInfo(\r\n ctx,\r\n x - offsetX,\r\n y + curRow.height - rowMargin + offsetY,\r\n metrics.width + offsetX,\r\n 0,\r\n color,\r\n element.textDecoration?.style\r\n )\r\n } else if (preElement?.underline || preElement?.control?.underline) {\r\n this.underline.render(ctx)\r\n }\r\n // 删除线记录\r\n if (element.strikeout) {\r\n // 仅文本类元素支持删除线\r\n if (!element.type || TEXTLIKE_ELEMENT_TYPE.includes(element.type)) {\r\n // 字体大小不同时需立即绘制\r\n if (\r\n preElement &&\r\n ((preElement.type === ElementType.SUBSCRIPT &&\r\n element.type !== ElementType.SUBSCRIPT) ||\r\n (preElement.type === ElementType.SUPERSCRIPT &&\r\n element.type !== ElementType.SUPERSCRIPT) ||\r\n this.getElementSize(preElement) !==\r\n this.getElementSize(element))\r\n ) {\r\n this.strikeout.render(ctx)\r\n }\r\n // 基线文字测量信息\r\n const standardMetrics = this.textParticle.measureBasisWord(\r\n ctx,\r\n this.getElementFont(element)\r\n )\r\n // 文字渲染位置 + 基线文字下偏移量 - 一半文字高度\r\n let adjustY =\r\n y +\r\n offsetY +\r\n standardMetrics.actualBoundingBoxDescent * scale -\r\n metrics.height / 2\r\n // 上下标位置调整\r\n if (element.type === ElementType.SUBSCRIPT) {\r\n adjustY += this.subscriptParticle.getOffsetY(element)\r\n } else if (element.type === ElementType.SUPERSCRIPT) {\r\n adjustY += this.superscriptParticle.getOffsetY(element)\r\n }\r\n this.strikeout.recordFillInfo(ctx, x, adjustY, metrics.width)\r\n }\r\n } else if (preElement?.strikeout) {\r\n this.strikeout.render(ctx)\r\n }\r\n // 插入修订:蓝色下划线\r\n if (element.revisionType === 'insert') {\r\n const revColor = this.options.revisionInsertColor || '#1a73e8'\r\n const rowMargin = this.getElementRowMargin(element)\r\n const offsetX = element.left || 0\r\n const lineY = y + curRow.height - rowMargin\r\n ctx.save()\r\n ctx.strokeStyle = revColor\r\n ctx.lineWidth = this.options.scale\r\n const adjustY = Math.floor(lineY + 2 * ctx.lineWidth) + 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x - offsetX, adjustY)\r\n ctx.lineTo(x - offsetX + metrics.width + offsetX, adjustY)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n // 选区记录\r\n const {\r\n zone: currentZone,\r\n startIndex,\r\n endIndex\r\n } = this.range.getRange()\r\n if (\r\n currentZone === zone &&\r\n startIndex !== endIndex &&\r\n startIndex <= index &&\r\n index <= endIndex\r\n ) {\r\n const positionContext = this.position.getPositionContext()\r\n // 表格需限定上下文\r\n if (\r\n (!positionContext.isTable && !element.tdId) ||\r\n positionContext.tdId === element.tdId\r\n ) {\r\n // 从行尾开始-绘制最小宽度\r\n if (startIndex === index) {\r\n const nextElement = elementList[startIndex + 1]\r\n if (nextElement && nextElement.value === ZERO) {\r\n rangeRecord.x = x + metrics.width\r\n rangeRecord.y = y\r\n rangeRecord.height = curRow.height\r\n rangeRecord.width += this.options.rangeMinWidth\r\n }\r\n } else {\r\n let rangeWidth = metrics.width\r\n // 最小选区宽度\r\n if (rangeWidth === 0 && curRow.elementList.length === 1) {\r\n rangeWidth = this.options.rangeMinWidth\r\n }\r\n // 记录第一次位置、行高\r\n if (!rangeRecord.width) {\r\n rangeRecord.x = x\r\n rangeRecord.y = y\r\n rangeRecord.height = curRow.height\r\n }\r\n rangeRecord.width += rangeWidth\r\n }\r\n }\r\n }\r\n // 组信息记录\r\n if (!group.disabled && element.groupIds) {\r\n this.group.recordFillInfo(element, x, y, metrics.width, curRow.height)\r\n }\r\n\r\n index++\r\n // 绘制表格内元素\r\n if (element.type === ElementType.TABLE) {\r\n const tdPaddingWidth = tdPadding[1] + tdPadding[3]\r\n for (let t = 0; t < element.trList!.length; t++) {\r\n const tr = element.trList![t]\r\n for (let d = 0; d < tr.tdList!.length; d++) {\r\n const td = tr.tdList[d]\r\n this.drawRow(ctx, {\r\n elementList: td.value,\r\n positionList: td.positionList!,\r\n rowList: td.rowList!,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth: (td.width! - tdPaddingWidth) * scale,\r\n zone,\r\n isDrawLineBreak: false\r\n })\r\n }\r\n }\r\n }\r\n }\r\n // 绘制列表样式\r\n if (curRow.isList) {\r\n this.listParticle.drawListStyle(\r\n ctx,\r\n curRow,\r\n positionList[curRow.startIndex]\r\n )\r\n }\r\n // 绘制文字、边框、下划线、删除线\r\n this.textParticle.complete()\r\n this.control.drawBorder(ctx)\r\n this.underline.render(ctx)\r\n this.strikeout.render(ctx)\r\n // 绘制批注样式\r\n this.group.render(ctx)\r\n\r\n // 绘制选区\r\n if (!isPrintMode) {\r\n if (rangeRecord.width && rangeRecord.height) {\r\n const { x, y, width, height } = rangeRecord\r\n this.range.render(ctx, x, y, width, height)\r\n }\r\n if (\r\n isCrossRowCol &&\r\n tableRangeElement &&\r\n tableRangeElement.id === tableId\r\n ) {\r\n const {\r\n coordinate: {\r\n leftTop: [x, y]\r\n }\r\n } = positionList[curRow.startIndex]\r\n this.tableParticle.drawRange(ctx, tableRangeElement, x, y)\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _drawFloat(\r\n ctx: CanvasRenderingContext2D,\r\n payload: IDrawFloatPayload\r\n ) {\r\n const { scale } = this.options\r\n const floatPositionList = this.position.getFloatPositionList()\r\n const { imgDisplays, pageNo } = payload\r\n for (let e = 0; e < floatPositionList.length; e++) {\r\n const floatPosition = floatPositionList[e]\r\n const element = floatPosition.element\r\n if (\r\n (pageNo === floatPosition.pageNo ||\r\n floatPosition.zone === EditorZone.HEADER ||\r\n floatPosition.zone == EditorZone.FOOTER) &&\r\n element.imgDisplay &&\r\n imgDisplays.includes(element.imgDisplay) &&\r\n element.type === ElementType.IMAGE\r\n ) {\r\n const imgFloatPosition = element.imgFloatPosition!\r\n this.imageParticle.render(\r\n ctx,\r\n element,\r\n imgFloatPosition.x * scale,\r\n imgFloatPosition.y * scale\r\n )\r\n }\r\n }\r\n }\r\n\r\n private _clearPage(pageNo: number) {\r\n const ctx = this.ctxList[pageNo]\r\n const pageDom = this.pageList[pageNo]\r\n ctx.clearRect(\r\n 0,\r\n 0,\r\n Math.max(pageDom.width, this.getWidth()),\r\n Math.max(pageDom.height, this.getHeight())\r\n )\r\n this.blockParticle.clear()\r\n }\r\n\r\n private _drawPage(payload: IDrawPagePayload) {\r\n const { elementList, positionList, rowList, pageNo } = payload\r\n\r\n const {\r\n inactiveAlpha,\r\n pageMode,\r\n header,\r\n footer,\r\n pageNumber,\r\n lineNumber,\r\n pageBorder\r\n } = this.options\r\n const isPrintMode = this.mode === EditorMode.PRINT\r\n const innerWidth = this.getInnerWidth()\r\n const ctx = this.ctxList[pageNo]\r\n // 判断当前激活区域-非正文区域时元素透明度降低\r\n ctx.globalAlpha = !this.zone.isMainActive() ? inactiveAlpha : 1\r\n this._clearPage(pageNo)\r\n // 绘制背景\r\n this.background.render(ctx, pageNo)\r\n // 绘制区域\r\n if (!isPrintMode) {\r\n this.area.render(ctx, pageNo)\r\n }\r\n // 绘制水印\r\n if (pageMode !== PageMode.CONTINUITY && this.options.watermark.data) {\r\n this.waterMark.render(ctx, pageNo)\r\n }\r\n // 绘制页边距\r\n if (!isPrintMode) {\r\n this.margin.render(ctx, pageNo)\r\n }\r\n // 渲染衬于文字下方元素\r\n this._drawFloat(ctx, {\r\n pageNo,\r\n imgDisplays: [ImageDisplay.FLOAT_BOTTOM]\r\n })\r\n // 控件高亮\r\n if (!isPrintMode) {\r\n this.control.renderHighlightList(ctx, pageNo)\r\n }\r\n // 渲染元素\r\n const index = rowList[0]?.startIndex\r\n this.drawRow(ctx, {\r\n elementList,\r\n positionList,\r\n rowList,\r\n pageNo,\r\n startIndex: index,\r\n innerWidth,\r\n zone: EditorZone.MAIN\r\n })\r\n if (this.getIsPagingMode()) {\r\n // 绘制页眉\r\n if (!header.disabled) {\r\n this.header.render(ctx, pageNo)\r\n }\r\n // 绘制页码\r\n if (!pageNumber.disabled) {\r\n this.pageNumber.render(ctx, pageNo)\r\n }\r\n // 绘制页脚\r\n if (!footer.disabled) {\r\n this.footer.render(ctx, pageNo)\r\n }\r\n }\r\n // 渲染浮于文字上方元素\r\n this._drawFloat(ctx, {\r\n pageNo,\r\n imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]\r\n })\r\n // 搜索匹配绘制\r\n if (!isPrintMode && this.search.getSearchKeyword()) {\r\n this.search.render(ctx, pageNo)\r\n }\r\n // 绘制空白占位符\r\n if (this.elementList.length <= 1 && !this.elementList[0]?.listId) {\r\n this.placeholder.render(ctx)\r\n }\r\n // 渲染行数\r\n if (!lineNumber.disabled) {\r\n this.lineNumber.render(ctx, pageNo)\r\n }\r\n // 绘制页面边框\r\n if (!pageBorder.disabled) {\r\n this.pageBorder.render(ctx)\r\n }\r\n // 绘制签章\r\n this.badge.render(ctx, pageNo)\r\n }\r\n\r\n private _disconnectLazyRender() {\r\n this.lazyRenderIntersectionObserver?.disconnect()\r\n }\r\n\r\n // 局部渲染 - 只渲染当前页面和相邻页面\r\n private _renderVisiblePages(currentPageNo?: number) {\r\n const positionList = this.position.getOriginalMainPositionList()\r\n const elementList = this.getOriginalMainElementList()\r\n const pageCount = this.pageRowList.length\r\n \r\n // 确定需要渲染的页面范围\r\n let pagesToRender: number[] = []\r\n \r\n if (currentPageNo !== undefined && currentPageNo >= 0) {\r\n // 只渲染当前页和前后各一页\r\n const startPage = Math.max(0, currentPageNo - 1)\r\n const endPage = Math.min(pageCount - 1, currentPageNo + 1)\r\n for (let i = startPage; i <= endPage; i++) {\r\n pagesToRender.push(i)\r\n }\r\n } else {\r\n // 渲染所有可见页面\r\n pagesToRender = [...this.visiblePageNoList]\r\n // 如果没有可见页面信息,渲染第一页\r\n if (pagesToRender.length === 0) {\r\n pagesToRender = [0]\r\n }\r\n }\r\n \r\n // 只渲染指定的页面\r\n for (const pageNo of pagesToRender) {\r\n if (pageNo < pageCount && this.pageRowList[pageNo]) {\r\n this._drawPage({\r\n elementList,\r\n positionList,\r\n rowList: this.pageRowList[pageNo],\r\n pageNo\r\n })\r\n }\r\n }\r\n }\r\n\r\n private _lazyRender() {\r\n const positionList = this.position.getOriginalMainPositionList()\r\n const elementList = this.getOriginalMainElementList()\r\n this._disconnectLazyRender()\r\n this.lazyRenderIntersectionObserver = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n const index = Number((<HTMLCanvasElement>entry.target).dataset.index)\r\n this._drawPage({\r\n elementList,\r\n positionList,\r\n rowList: this.pageRowList[index],\r\n pageNo: index\r\n })\r\n }\r\n })\r\n })\r\n this.pageList.forEach(el => {\r\n this.lazyRenderIntersectionObserver!.observe(el)\r\n })\r\n }\r\n\r\n private _immediateRender() {\r\n const positionList = this.position.getOriginalMainPositionList()\r\n const elementList = this.getOriginalMainElementList()\r\n for (let i = 0; i < this.pageRowList.length; i++) {\r\n this._drawPage({\r\n elementList,\r\n positionList,\r\n rowList: this.pageRowList[i],\r\n pageNo: i\r\n })\r\n }\r\n }\r\n\r\n public render(payload?: IDrawOption) {\r\n this.renderCount++\r\n const { header, footer } = this.options\r\n const {\r\n isSubmitHistory = true,\r\n isSetCursor = true,\r\n isCompute = true,\r\n isLazy = true,\r\n isInit = false,\r\n isSourceHistory = false,\r\n isFirstRender = false,\r\n isPartialRender = false,\r\n pageNo: targetPageNo\r\n } = payload || {}\r\n let { curIndex } = payload || {}\r\n const innerWidth = this.getInnerWidth()\r\n const isPagingMode = this.getIsPagingMode()\r\n // 缓存当前页数信息\r\n const oldPageSize = this.pageRowList.length\r\n // 计算文档信息\r\n if (isCompute) {\r\n // 清空浮动元素位置信息\r\n this.position.setFloatPositionList([])\r\n if (isPagingMode) {\r\n // 页眉信息\r\n if (!header.disabled) {\r\n this.header.compute()\r\n }\r\n // 页脚信息\r\n if (!footer.disabled) {\r\n this.footer.compute()\r\n }\r\n }\r\n // 行信息\r\n const margins = this.getMargins()\r\n const pageHeight = this.getHeight()\r\n const extraHeight = this.header.getExtraHeight()\r\n const mainOuterHeight = this.getMainOuterHeight()\r\n const startX = margins[3]\r\n const startY = margins[0] + extraHeight\r\n const surroundElementList = pickSurroundElementList(this.elementList)\r\n this.rowList = this.computeRowList({\r\n startX,\r\n startY,\r\n pageHeight,\r\n mainOuterHeight,\r\n isPagingMode,\r\n innerWidth,\r\n surroundElementList,\r\n elementList: this.elementList\r\n })\r\n // 页面信息\r\n this.pageRowList = this._computePageList()\r\n // 位置信息\r\n this.position.computePositionList()\r\n // 区域信息\r\n this.area.compute()\r\n if (this.mode !== EditorMode.PRINT) {\r\n // 搜索信息\r\n const searchKeyword = this.search.getSearchKeyword()\r\n if (searchKeyword) {\r\n this.search.compute(searchKeyword)\r\n }\r\n // 控件关键词高亮\r\n this.control.computeHighlightList()\r\n }\r\n }\r\n // 清除光标等副作用\r\n this.imageObserver.clearAll()\r\n this.cursor.recoveryCursor()\r\n // 创建纸张\r\n for (let i = 0; i < this.pageRowList.length; i++) {\r\n if (!this.pageList[i]) {\r\n this._createPage(i)\r\n }\r\n }\r\n // 移除多余页\r\n const curPageCount = this.pageRowList.length\r\n const prePageCount = this.pageList.length\r\n if (prePageCount > curPageCount) {\r\n const deleteCount = prePageCount - curPageCount\r\n this.ctxList.splice(curPageCount, deleteCount)\r\n this.pageList\r\n .splice(curPageCount, deleteCount)\r\n .forEach(page => page.remove())\r\n }\r\n // 绘制元素\r\n // 连续页因为有高度的变化会导致canvas渲染空白,需立即渲染,否则会出现闪动\r\n // 当页面数量变化时,需要完整渲染\r\n const pageCountChanged = oldPageSize !== this.pageRowList.length\r\n if (isPartialRender && isPagingMode && !pageCountChanged) {\r\n // 局部渲染 - 只渲染当前页面和相邻页面\r\n this._renderVisiblePages(targetPageNo ?? this.intersectionPageNo)\r\n } else if (isLazy && isPagingMode) {\r\n this._lazyRender()\r\n } else {\r\n this._immediateRender()\r\n }\r\n // 光标重绘\r\n if (isSetCursor) {\r\n curIndex = this.setCursor(curIndex)\r\n } else if (this.range.getIsSelection()) {\r\n // 存在选区时仅定位避免事件无法捕获\r\n this.cursor.focus()\r\n }\r\n // 历史记录用于undo、redo(非首次渲染内容变更 || 第一次存在光标时)\r\n if (\r\n (isSubmitHistory && !isFirstRender) ||\r\n (curIndex !== undefined && this.historyManager.isStackEmpty())\r\n ) {\r\n this.submitHistory(curIndex)\r\n }\r\n // 信息变动回调\r\n nextTick(() => {\r\n // 选区样式\r\n this.range.setRangeStyle()\r\n // 重新唤起弹窗类控件\r\n if (isCompute && this.control.getActiveControl()) {\r\n this.control.reAwakeControl()\r\n }\r\n // 表格工具重新渲染\r\n if (\r\n isCompute &&\r\n !this.isReadonly() &&\r\n this.position.getPositionContext().isTable\r\n ) {\r\n this.tableTool.render()\r\n }\r\n // 页眉指示器重新渲染\r\n if (isCompute && !this.zone.isMainActive()) {\r\n this.zone.drawZoneIndicator()\r\n }\r\n // 页数改变\r\n if (oldPageSize !== this.pageRowList.length) {\r\n if (this.listener.pageSizeChange) {\r\n this.listener.pageSizeChange(this.pageRowList.length)\r\n }\r\n if (this.eventBus.hasSubscribers('pageSizeChange')) {\r\n this.eventBus.emit('pageSizeChange', this.pageRowList.length)\r\n }\r\n }\r\n // 文档内容改变\r\n if ((isSubmitHistory || isSourceHistory) && !isInit) {\r\n if (this.listener.contentChange) {\r\n this.listener.contentChange()\r\n }\r\n if (this.eventBus.hasSubscribers('contentChange')) {\r\n this.eventBus.emit('contentChange')\r\n }\r\n }\r\n // 修订气泡更新\r\n if (isCompute && this.revisionOverlay) {\r\n this.revisionOverlay.update()\r\n }\r\n // 批注卡片位置更新(纸张大小/缩放变更等非编辑场景)\r\n if (isCompute && !isSubmitHistory && !isSourceHistory && this.commentOverlay) {\r\n this.commentOverlay.render()\r\n }\r\n })\r\n }\r\n\r\n public setCursor(curIndex: number | undefined) {\r\n const positionContext = this.position.getPositionContext()\r\n const positionList = this.position.getPositionList()\r\n if (positionContext.isTable) {\r\n const { index, trIndex, tdIndex } = positionContext\r\n const elementList = this.getOriginalElementList()\r\n const tablePositionList =\r\n elementList[index!].trList?.[trIndex!].tdList[tdIndex!].positionList\r\n if (curIndex === undefined && tablePositionList) {\r\n curIndex = tablePositionList.length - 1\r\n }\r\n const tablePosition = tablePositionList?.[curIndex!]\r\n this.position.setCursorPosition(tablePosition || null)\r\n } else {\r\n this.position.setCursorPosition(\r\n curIndex !== undefined ? positionList[curIndex] : null\r\n )\r\n }\r\n // 定位到图片元素并且位置发生变化\r\n let isShowCursor = true\r\n if (\r\n curIndex !== undefined &&\r\n positionContext.isImage &&\r\n positionContext.isDirectHit\r\n ) {\r\n const elementList = this.getElementList()\r\n const element = elementList[curIndex]\r\n if (IMAGE_ELEMENT_TYPE.includes(element.type!)) {\r\n isShowCursor = false\r\n const position = this.position.getCursorPosition()\r\n this.previewer.updateResizer(element, position)\r\n }\r\n }\r\n this.cursor.drawCursor({\r\n isShow: isShowCursor\r\n })\r\n return curIndex\r\n }\r\n\r\n public submitHistory(curIndex: number | undefined) {\r\n const positionContext = this.position.getPositionContext()\r\n const oldElementList = getSlimCloneElementList(this.elementList)\r\n const oldHeaderElementList = getSlimCloneElementList(\r\n this.header.getElementList()\r\n )\r\n const oldFooterElementList = getSlimCloneElementList(\r\n this.footer.getElementList()\r\n )\r\n const oldRange = deepClone(this.range.getRange())\r\n const pageNo = this.pageNo\r\n const oldPositionContext = deepClone(positionContext)\r\n const zone = this.zone.getZone()\r\n this.historyManager.execute(() => {\r\n this.zone.setZone(zone)\r\n this.setPageNo(pageNo)\r\n this.position.setPositionContext(deepClone(oldPositionContext))\r\n this.header.setElementList(deepClone(oldHeaderElementList))\r\n this.footer.setElementList(deepClone(oldFooterElementList))\r\n this.elementList = deepClone(oldElementList)\r\n this.range.replaceRange(deepClone(oldRange))\r\n this.render({\r\n curIndex,\r\n isSubmitHistory: false,\r\n isSourceHistory: true\r\n })\r\n })\r\n }\r\n\r\n public destroy() {\r\n this.container.remove()\r\n this.canvasEvent.removeEvent()\r\n this.globalEvent.removeEvent()\r\n this.mouseObserver.removeEvent()\r\n this.scrollObserver.removeEvent()\r\n this.selectionObserver.removeEvent()\r\n }\r\n\r\n public clearSideEffect() {\r\n // 预览工具组件\r\n this.getPreviewer().clearResizer()\r\n // 表格工具组件\r\n this.getTableTool().dispose()\r\n // 超链接弹窗\r\n this.getHyperlinkParticle().clearHyperlinkPopup()\r\n // 日期控件\r\n this.getDateParticle().clearDatePicker()\r\n }\r\n}\r\n","import { EDITOR_COMPONENT, EDITOR_FONT_OPTIONS, EDITOR_PREFIX, EDITOR_SIZE_OPTIONS } from '@vervedoc/docx-editor-schema'\r\nimport { EditorComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { findParent } from '@vervedoc/docx-editor-schema'\r\nimport { Command } from '@vervedoc/docx-editor-transform'\r\nimport { Draw } from '../draw/Draw'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\n\r\ninterface IFloatingBarContext {\r\n hasSelection: boolean\r\n isImageSelected: boolean\r\n imageElement: IElement | null\r\n}\r\n\r\nexport class FloatingBar {\r\n private draw: Draw\r\n private command: Command\r\n private range: RangeManager\r\n private options: DeepRequired<IEditorOption>\r\n private container: HTMLDivElement\r\n \r\n private textToolbar: HTMLDivElement | null = null\r\n private imageToolbar: HTMLDivElement | null = null\r\n \r\n private lastMousePosition = { x: 0, y: 0 }\r\n private currentImageElement: IElement | null = null\r\n\r\n constructor(draw: Draw, command: Command) {\r\n this.draw = draw\r\n this.command = command\r\n this.range = draw.getRange()\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n \r\n if (this.options.floatingBar?.enabled !== false) {\r\n this._createToolbars()\r\n this._addEvents()\r\n }\r\n }\r\n\r\n private _createToolbars() {\r\n // 文字工具栏\r\n this.textToolbar = document.createElement('div')\r\n this.textToolbar.className = `${EDITOR_PREFIX}-floating-toolbar`\r\n this.textToolbar.setAttribute(EDITOR_COMPONENT, EditorComponent.COMPONENT)\r\n this.textToolbar.innerHTML = `\r\n <select class=\"fb-select fb-fontfamily\" title=\"字体\">\r\n ${this._createFontOptionsHtml()}\r\n </select>\r\n <select class=\"fb-select fb-fontsize\" title=\"字号\">\r\n ${this._createSizeOptionsHtml()}\r\n </select>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"bold\" title=\"加粗\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"italic\" title=\"斜体\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"underline\" title=\"下划线\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>\r\n </button>\r\n <div class=\"fb-divider\"></div>\r\n <div class=\"fb-color-picker\" data-type=\"color\">\r\n <button class=\"fb-btn fb-color-btn\" title=\"文字颜色\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M11 2L5.5 16h2.25l1.12-3h6.25l1.12 3h2.25L13 2h-2zm-1.38 9L12 4.67 14.38 11H9.62z\"/></svg>\r\n <span class=\"fb-color-indicator\" style=\"background:#000000\"></span>\r\n </button>\r\n <input type=\"color\" class=\"fb-color-input\" value=\"#000000\">\r\n </div>\r\n <div class=\"fb-color-picker\" data-type=\"highlight\">\r\n <button class=\"fb-btn fb-color-btn\" title=\"高亮颜色\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M6 14l3 3v5h6v-5l3-3V9H6v5zm5-12h2v3h-2V2zM3.5 5.88l1.41-1.41 2.12 2.12L5.62 8 3.5 5.88zm13.46.71l2.12-2.12 1.41 1.41L18.38 8l-1.42-1.41z\"/></svg>\r\n <span class=\"fb-color-indicator\" style=\"background:#ffff00\"></span>\r\n </button>\r\n <input type=\"color\" class=\"fb-color-input\" value=\"#ffff00\">\r\n </div>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"alignLeft\" title=\"左对齐\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"alignCenter\" title=\"居中\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"alignRight\" title=\"右对齐\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/></svg>\r\n </button>\r\n `\r\n this.container.appendChild(this.textToolbar)\r\n \r\n // 图片工具栏\r\n this.imageToolbar = document.createElement('div')\r\n this.imageToolbar.className = `${EDITOR_PREFIX}-floating-toolbar ${EDITOR_PREFIX}-image-toolbar`\r\n this.imageToolbar.setAttribute(EDITOR_COMPONENT, EditorComponent.COMPONENT)\r\n this.imageToolbar.innerHTML = `\r\n <span class=\"fb-label\">环绕</span>\r\n <button class=\"fb-btn\" data-action=\"imgInline\" data-display=\"INLINE\" title=\"嵌入文字\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M4 9h16v2H4V9zm0 4h10v2H4v-2z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"imgSurround\" data-display=\"SURROUND\" title=\"文字环绕\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M4 19h16v2H4v-2zm0-4h4v2H4v-2zm0-4h4v2H4v-2zm0-4h4v2H4V7zm0-4h16v2H4V3zm12 4h4v6h-4V7zm-2 10h8v2h-8v-2z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"imgFloatTop\" data-display=\"FLOAT_TOP\" title=\"浮于文字上方\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"imgFloatBottom\" data-display=\"FLOAT_BOTTOM\" title=\"衬于文字下方\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2z\"/></svg>\r\n </button>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"rotateLeft\" title=\"向左旋转\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"rotateRight\" title=\"向右旋转\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\"/></svg>\r\n </button>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"replaceImage\" title=\"替换图片\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"saveImage\" title=\"保存图片\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"deleteImage\" title=\"删除\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"/></svg>\r\n </button>\r\n `\r\n this.container.appendChild(this.imageToolbar)\r\n \r\n // 绑定事件\r\n this._bindToolbarEvents()\r\n }\r\n\r\n private _bindToolbarEvents() {\r\n // 文字工具栏事件\r\n if (this.textToolbar) {\r\n // 字体选择\r\n const fontFamilySelect = this.textToolbar.querySelector('.fb-fontfamily') as HTMLSelectElement\r\n fontFamilySelect.value = this._resolveFontValue(this.options.defaultFont)\r\n fontFamilySelect?.addEventListener('change', () => {\r\n this.command.executeFont(fontFamilySelect.value)\r\n })\r\n\r\n // 字号选择\r\n const fontSizeSelect = this.textToolbar.querySelector('.fb-fontsize') as HTMLSelectElement\r\n fontSizeSelect.value = this._resolveSizeValue(this.options.defaultSize)\r\n fontSizeSelect?.addEventListener('change', () => {\r\n this.command.executeSize(Number(fontSizeSelect.value))\r\n })\r\n \r\n // 按钮点击\r\n this.textToolbar.querySelectorAll('.fb-btn:not(.fb-color-btn)').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n const action = btn.getAttribute('data-action')\r\n this._executeTextAction(action)\r\n })\r\n })\r\n \r\n // 颜色选择器\r\n this.textToolbar.querySelectorAll('.fb-color-picker').forEach(picker => {\r\n const type = picker.getAttribute('data-type')\r\n const btn = picker.querySelector('.fb-color-btn') as HTMLButtonElement\r\n const input = picker.querySelector('.fb-color-input') as HTMLInputElement\r\n const indicator = picker.querySelector('.fb-color-indicator') as HTMLSpanElement\r\n \r\n // 点击按钮触发颜色选择器\r\n btn?.addEventListener('click', () => {\r\n input?.click()\r\n })\r\n \r\n // 颜色选择实时应用\r\n input?.addEventListener('input', () => {\r\n const value = input.value\r\n if (value) {\r\n if (type === 'color') {\r\n this.command.executeColor(value)\r\n } else if (type === 'highlight') {\r\n this.command.executeHighlight(value)\r\n }\r\n if (indicator) {\r\n indicator.style.background = value\r\n }\r\n }\r\n })\r\n })\r\n }\r\n \r\n // 图片工具栏事件\r\n if (this.imageToolbar) {\r\n this.imageToolbar.querySelectorAll('.fb-btn').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n const action = btn.getAttribute('data-action')\r\n this._executeImageAction(action)\r\n })\r\n })\r\n }\r\n }\r\n\r\n private _createFontOptionsHtml() {\r\n const defaultFont = this.options.defaultFont?.trim()\r\n const hasDefaultFont = defaultFont && EDITOR_FONT_OPTIONS.some(\r\n option => option.value === defaultFont || option.label === defaultFont\r\n )\r\n const fontOptions = hasDefaultFont\r\n ? [...EDITOR_FONT_OPTIONS]\r\n : [\r\n ...EDITOR_FONT_OPTIONS,\r\n {\r\n label: defaultFont || '',\r\n value: defaultFont || ''\r\n }\r\n ].filter(option => option.label && option.value)\r\n\r\n return fontOptions\r\n .map(option => `<option value=\"${option.value}\" style=\"font-family:${option.value}\">${option.label}</option>`)\r\n .join('')\r\n }\r\n\r\n private _createSizeOptionsHtml() {\r\n const defaultSize = this.options.defaultSize\r\n const hasDefaultSize = EDITOR_SIZE_OPTIONS.some(option => option.value === defaultSize)\r\n const sizeOptions = hasDefaultSize\r\n ? [...EDITOR_SIZE_OPTIONS]\r\n : [\r\n ...EDITOR_SIZE_OPTIONS,\r\n {\r\n label: String(defaultSize),\r\n value: defaultSize\r\n }\r\n ]\r\n\r\n return sizeOptions\r\n .map(option => `<option value=\"${option.value}\">${option.label}</option>`)\r\n .join('')\r\n }\r\n\r\n private _resolveFontValue(font: string) {\r\n const normalizedFont = font.trim().toLowerCase()\r\n const match = EDITOR_FONT_OPTIONS.find(option => {\r\n const optionValue = option.value.trim().toLowerCase()\r\n const optionLabel = option.label.trim().toLowerCase()\r\n const primaryFamily = option.value\r\n .split(',')\r\n .map(item => item.replace(/['\"]/g, '').trim().toLowerCase())\r\n .find(Boolean)\r\n\r\n return optionValue === normalizedFont\r\n || optionLabel === normalizedFont\r\n || primaryFamily === normalizedFont\r\n })\r\n\r\n return match?.value || font\r\n }\r\n\r\n private _resolveSizeValue(size: number) {\r\n const normalizedSize = Number(size)\r\n const match = EDITOR_SIZE_OPTIONS.find(option => option.value === normalizedSize)\r\n return String(match?.value ?? normalizedSize)\r\n }\r\n\r\n private _executeTextAction(action: string | null) {\r\n if (!action) return\r\n switch (action) {\r\n case 'bold':\r\n this.command.executeBold()\r\n break\r\n case 'italic':\r\n this.command.executeItalic()\r\n break\r\n case 'underline':\r\n this.command.executeUnderline()\r\n break\r\n case 'alignLeft':\r\n this.command.executeRowFlex(RowFlex.LEFT)\r\n break\r\n case 'alignCenter':\r\n this.command.executeRowFlex(RowFlex.CENTER)\r\n break\r\n case 'alignRight':\r\n this.command.executeRowFlex(RowFlex.RIGHT)\r\n break\r\n }\r\n }\r\n\r\n private _executeImageAction(action: string | null) {\r\n if (!action || !this.currentImageElement) return\r\n \r\n switch (action) {\r\n case 'imgInline':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.INLINE)\r\n this._updateImageToolbarState()\r\n break\r\n case 'imgSurround':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.SURROUND)\r\n this._updateImageToolbarState()\r\n break\r\n case 'imgFloatTop':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.FLOAT_TOP)\r\n this._updateImageToolbarState()\r\n break\r\n case 'imgFloatBottom':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.FLOAT_BOTTOM)\r\n this._updateImageToolbarState()\r\n break\r\n case 'rotateLeft':\r\n this._rotateImage(-90)\r\n break\r\n case 'rotateRight':\r\n this._rotateImage(90)\r\n break\r\n case 'replaceImage':\r\n this._replaceImage()\r\n break\r\n case 'saveImage':\r\n this.command.executeSaveAsImageElement()\r\n break\r\n case 'deleteImage':\r\n this.command.executeBackspace()\r\n this.dispose()\r\n break\r\n }\r\n }\r\n\r\n private _rotateImage(angle: number) {\r\n if (!this.currentImageElement) return\r\n const currentValue = this.currentImageElement.value\r\n const img = new Image()\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d')!\r\n \r\n // 90度旋转时交换宽高\r\n if (Math.abs(angle) === 90) {\r\n canvas.width = img.height\r\n canvas.height = img.width\r\n } else {\r\n canvas.width = img.width\r\n canvas.height = img.height\r\n }\r\n \r\n ctx.translate(canvas.width / 2, canvas.height / 2)\r\n ctx.rotate(angle * Math.PI / 180)\r\n ctx.drawImage(img, -img.width / 2, -img.height / 2)\r\n \r\n const newDataUrl = canvas.toDataURL()\r\n this.command.executeReplaceImageElement(newDataUrl)\r\n \r\n // 旋转后重新获取图片元素引用以支持连续旋转\r\n setTimeout(() => {\r\n const context = this._getContext()\r\n if (context.isImageSelected && context.imageElement) {\r\n this.currentImageElement = context.imageElement\r\n }\r\n }, 50)\r\n }\r\n img.src = currentValue\r\n }\r\n\r\n private _replaceImage() {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = 'image/*'\r\n input.onchange = (e: Event) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n const reader = new FileReader()\r\n reader.onload = (event) => {\r\n this.command.executeReplaceImageElement(event.target?.result as string)\r\n }\r\n reader.readAsDataURL(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n private _updateImageToolbarState() {\r\n if (!this.imageToolbar || !this.currentImageElement) return\r\n \r\n const displayBtns = this.imageToolbar.querySelectorAll('[data-display]')\r\n displayBtns.forEach(btn => {\r\n const display = btn.getAttribute('data-display')\r\n const imgDisplay = this.currentImageElement?.imgDisplay || ImageDisplay.INLINE\r\n if (display && ImageDisplay[display as keyof typeof ImageDisplay] === imgDisplay) {\r\n btn.classList.add('active')\r\n } else {\r\n btn.classList.remove('active')\r\n }\r\n })\r\n }\r\n\r\n private _addEvents() {\r\n const pageContainer = this.draw.getPageContainer()\r\n \r\n // 监听鼠标抬起\r\n pageContainer.addEventListener('mouseup', this._handleMouseUp)\r\n \r\n // 监听点击外部隐藏\r\n document.addEventListener('mousedown', this._handleClickOutside)\r\n \r\n // 禁用右键菜单\r\n pageContainer.addEventListener('contextmenu', this._handleContextMenu)\r\n }\r\n\r\n private _handleMouseUp = (e: MouseEvent) => {\r\n this.lastMousePosition = { x: e.clientX, y: e.clientY }\r\n \r\n setTimeout(() => {\r\n const context = this._getContext()\r\n \r\n if (context.isImageSelected && context.imageElement) {\r\n this.currentImageElement = context.imageElement\r\n this._hideTextToolbar()\r\n this._showImageToolbar()\r\n this._updateImageToolbarState()\r\n } else if (context.hasSelection) {\r\n this.currentImageElement = null\r\n this._hideImageToolbar()\r\n this._showTextToolbar()\r\n } else {\r\n this.currentImageElement = null\r\n this._hideTextToolbar()\r\n this._hideImageToolbar()\r\n }\r\n }, 10)\r\n }\r\n\r\n private _handleClickOutside = (e: MouseEvent) => {\r\n const target = e.target as Element\r\n const isInToolbar = findParent(\r\n target,\r\n (node: Node & Element) => \r\n node?.classList?.contains(`${EDITOR_PREFIX}-floating-toolbar`),\r\n true\r\n )\r\n const isInContainer = this.container.contains(target)\r\n \r\n if (!isInToolbar && !isInContainer) {\r\n this.dispose()\r\n }\r\n }\r\n\r\n private _handleContextMenu = (e: MouseEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n private _getContext(): IFloatingBarContext {\r\n const range = this.range.getRange()\r\n const hasSelection = range.startIndex !== range.endIndex && range.startIndex >= 0\r\n \r\n const elementList = this.draw.getElementList()\r\n const startElement = elementList[range.startIndex]\r\n const endElement = elementList[range.endIndex]\r\n \r\n const isImageSelected = \r\n (startElement?.type === ElementType.IMAGE) ||\r\n (endElement?.type === ElementType.IMAGE)\r\n \r\n const imageElement = isImageSelected\r\n ? (startElement?.type === ElementType.IMAGE ? startElement : endElement)\r\n : null\r\n \r\n return { hasSelection, isImageSelected, imageElement }\r\n }\r\n\r\n private _showTextToolbar() {\r\n if (!this.textToolbar) return\r\n this.textToolbar.classList.add('show')\r\n this._positionToolbar(this.textToolbar)\r\n }\r\n\r\n private _hideTextToolbar() {\r\n this.textToolbar?.classList.remove('show')\r\n }\r\n\r\n private _showImageToolbar() {\r\n if (!this.imageToolbar) return\r\n this.imageToolbar.classList.add('show')\r\n this._positionToolbar(this.imageToolbar)\r\n }\r\n\r\n private _hideImageToolbar() {\r\n this.imageToolbar?.classList.remove('show')\r\n this.currentImageElement = null\r\n }\r\n\r\n private _positionToolbar(toolbar: HTMLDivElement) {\r\n const rect = toolbar.getBoundingClientRect()\r\n const width = rect.width || 400\r\n const height = rect.height || 40\r\n \r\n let left = this.lastMousePosition.x - width / 2\r\n let top = this.lastMousePosition.y - height - 10\r\n \r\n // 边界检查\r\n if (left < 10) left = 10\r\n if (left + width > window.innerWidth - 10) {\r\n left = window.innerWidth - width - 10\r\n }\r\n if (top < 10) {\r\n top = this.lastMousePosition.y + 20\r\n }\r\n \r\n toolbar.style.left = `${left}px`\r\n toolbar.style.top = `${top}px`\r\n }\r\n\r\n public removeEvent() {\r\n const pageContainer = this.draw.getPageContainer()\r\n pageContainer.removeEventListener('mouseup', this._handleMouseUp)\r\n document.removeEventListener('mousedown', this._handleClickOutside)\r\n pageContainer.removeEventListener('contextmenu', this._handleContextMenu)\r\n }\r\n\r\n public dispose() {\r\n this._hideTextToolbar()\r\n this._hideImageToolbar()\r\n }\r\n\r\n public destroy() {\r\n this.removeEvent()\r\n this.textToolbar?.remove()\r\n this.imageToolbar?.remove()\r\n }\r\n}\r\n","import { PluginFunction } from '@vervedoc/docx-editor-schema'\r\n\r\nexport type Editor = any\r\n\r\nexport class Plugin {\r\n private editor: Editor\r\n\r\n constructor(editor: Editor) {\r\n this.editor = editor\r\n }\r\n\r\n public use<Options>(\r\n pluginFunction: PluginFunction<Options>,\r\n options?: Options\r\n ) {\r\n pluginFunction(this.editor, options)\r\n }\r\n}\r\n","export interface IOverrideResult {\r\n preventDefault?: boolean\r\n}\r\n\r\nexport class Override {\r\n public paste:\r\n | ((evt?: ClipboardEvent) => unknown | IOverrideResult)\r\n | undefined\r\n public copy: (() => unknown | IOverrideResult) | undefined\r\n public drop: ((evt: DragEvent) => unknown | IOverrideResult) | undefined\r\n}\r\n","import { IRegisterShortcut } from '@vervedoc/docx-editor-schema'\r\nimport { Shortcut, I18n } from '../../plugin-stubs'\r\nimport { ILang } from '@vervedoc/docx-editor-schema'\r\nimport { DeepPartial } from '@vervedoc/docx-editor-schema'\r\nimport { IChartRenderer } from '@vervedoc/docx-editor-schema'\r\n\r\ninterface IRegisterPayload {\r\n shortcut: Shortcut\r\n i18n: I18n\r\n}\r\n\r\nexport class Register {\r\n public shortcutList: (payload: IRegisterShortcut[]) => void\r\n public langMap: (locale: string, lang: DeepPartial<ILang>) => void\r\n\r\n private chartRenderer: IChartRenderer | null = null\r\n\r\n constructor(payload: IRegisterPayload) {\r\n const { shortcut, i18n } = payload\r\n this.shortcutList = shortcut.registerShortcutList.bind(shortcut)\r\n this.langMap = i18n.registerLangMap.bind(i18n)\r\n }\r\n\r\n /**\r\n * 注册图表渲染器\r\n * @param renderer 图表渲染器实例\r\n */\r\n public registerChartRenderer(renderer: IChartRenderer): void {\r\n this.chartRenderer = renderer\r\n }\r\n\r\n /**\r\n * 获取图表渲染器\r\n * @returns 图表渲染器实例或 null\r\n */\r\n public getChartRenderer(): IChartRenderer | null {\r\n return this.chartRenderer\r\n }\r\n\r\n /**\r\n * 检查是否已注册图表渲染器\r\n * @returns 是否已注册\r\n */\r\n public hasChartRenderer(): boolean {\r\n return this.chartRenderer !== null\r\n }\r\n}\r\n"],"names":["Xu","u","vu","Iu","K","$","G","Cu","su","Mu","Y","m","zu","Wu","ju","Vu","fu","Yu","Ou","Lu","Ru","bu","f","Zu","qu","mu","q","b","Qu","N","Ju","P","Ku","ue","S","du","Su","tu","J","ee","te","De","re","vt","It","Ot","ne","Lt","lu","H","mt","Au","St","Nt","le","yt","Pt","uu","Ht","oe","ie","Nu","yu","ae","wt","Pu","Hu","wu","nu","_t","ce","se","kt","xt","Fe","Ut","Ee","Ce","Gt","Xt","Mt","zt","fe","de","pe","Wt","pu","Ae","he","ge","Fu","Te","Be","ve","Ie","Oe","Le","Re","be","me","Se","Ne","ye","Pe","He","we","_e","ke","xe","Ue","Ge","_u","Xe","e","n","r","o","c","l","Me","ze","We","Z","je","D","i","t","a","s","F","E","C","A","Ve","Ze","qe","Qe","Je","jt","Ke","Vt","ut","et","X","tt","Eu","ku","ou","Yt","j","$t","Zt","Dt","gu","qt","Qt","Kt","uD","iu","Du","rt","eD","tD","DD","rD","nD","lt","oD","iD","aD","ot","h","O","M","g","R","I","y","w","p","d","it","Tu","at","Q","Et","k","B","v","T","_","U","W","L","V","eu","Gu","z","ct","au","x","st","xu","Ft","Ct","ft","ru","dt","Uu","pt","At","ht","cu","Tt","gt","FD","ED","CD","Bt","dD","pD","AD","version","DOCX_EDITOR_SCHEMA_VERSION","HistoryManager","WorkerManager","I18n","key","_args","Actuator","LaTexParticle","DateParticle","BlockParticle","DatePicker","setClipboardData","data","EDITOR_CLIPBOARD","getClipboardData","clipboardText","clipboardData","getIsClipboardContainFile","item","removeClipboardData","fallbackWriteClipboardItem","html","fakeElement","selection","ranges","range","br","savedRange","writeClipboardItem","text","elementList","_a","clipboard","ClipboardItemCtor","plainText","htmlText","writeElementList","options","clipboardDom","createDomFromElementList","zipElementList","pasteElement","host","draw","rangeManager","startIndex","originalElementList","anchorElement","start","VIRTUAL_ELEMENT_TYPE","element","ZERO","formatElementContext","pasteHTML","getElementListByHTML","pasteImage","file","fileReader","image","value","imageElement","ElementType","pasteByEvent","evt","paste","overrideResult","editorClipboardData","normalizeLineBreak","isHTML","pasteByApi","type","imageBlob","CursorAgent","canvasEvent","__publicField","agentCursorDom","EDITOR_PREFIX","Cursor","isMobile","payload","cursorPosition","scale","cursor","color","width","isShow","isBlink","isFocus","hitLineStartIndex","height","pageGap","metrics","leftTop","rightTop","ascent","pageNo","preY","defaultOffsetHeight","CURSOR_AGENT_OFFSET_HEIGHT","increaseHeight","cursorHeight","descent","cursorTop","cursorLeft","isReadonly","direction","leftBottom","prePageY","isUp","MoveDirection","scrollContainer","findScrollContainer","rect","left","right","top","bottom","maskMargin","scrollLeft","scrollTop","CheckboxControl","control","startElement","preIndex","preElement","ControlComponent","nextIndex","nextElement","codes","context","checkbox","endIndex","KeyMap","RadioControl","radio","setRangeCache","position","deepClone","hitCheckbox","codeIndex","activeControl","hitRadio","mousedown","_b","MouseEventButton","pageIndex","oldPositionContext","positionResult","index","isDirectHit","isCheckbox","isRadio","isImage","isTable","tdValueIndex","positionList","curIndex","curElement","isDirectHitImage","isDirectHitCheckbox","isDirectHitRadio","oldStartIndex","ControlType","previewer","previewerDrawOption","EditorMode","ImageDisplay","eventBus","tableTool","hyperlinkParticle","isMod","dateParticle","createDragId","dragId","getUUID","getElementIndexByDragId","el","moveImgPosition","moveX","moveY","imgFloatPosition","mouseup","_c","_d","_f","positionContext","cacheRange","cacheElementList","cachePositionList","cachePositionContext","isCacheRangeCollapsed","cacheStartIndex","cacheEndIndex","isSubmitHistory","isCompute","dragElement","cachePosition","dragElementList","isContainControl","cacheStartElement","cacheEndElement","isOmitControlAttr","editorOptions","replaceElementList","newElement","copyAttr","EDITOR_ELEMENT_STYLE_ATTR","CONTROL_CONTEXT_ATTR","attr","omitObject","formatElementList","cacheStartPosition","cacheRangeStartId","cacheRangeEndId","replaceLength","rangeStart","rangeEnd","rangeStartId","rangeEndId","cacheRangeStartIndex","cacheRangeEndIndex","isTdElementDeletable","tableId","trIndex","tdIndex","startPosition","positionContextIndex","rangeStartIndex","rangeEndIndex","imgElement","dragPosition","mouseleave","pageContainer","mousemove","rightBottom","trId","tdId","startIsTable","startTdIndex","startTrIndex","startTableId","end","endElement","backspace","isTrackChanges","newIndex","isCrossRowCol","rowCol","isDeleted","row","col","isCollapsed","firstElement","rowFlexElementList","nextRevisionElement","del","enter","enterText","AREA_CONTEXT_ATTR","copyElement","EDITOR_ROW_ATTR","moveCount","LETTER_REG","moveStartIndex","anchorStartIndex","anchorEndIndex","trList","lastTrIndex","lastTr","lastTdIndex","lastTd","outer","tr","tdList","preTrIndex","preTdIndex","preTr","preTd","newElementList","getNonHideElementIndex","isAnchorCollapsed","nextTr","nextTd","nextTrIndex","nextTdIndex","maxElementListIndex","LocationPosition","tab","anchorStyle","tabElement","pickObject","getNextPositionIndex","rowNo","cursorX","probablePosition","nextPosition","nextLeftX","nextRightX","updown","curTdColIndex","td","nexTrIndex","anchorPosition","rowIndex","curRightX","margins","tdPositionIndex","tdX","tdWidth","tdPositionList","lastPosition","nextPositionIndex","keydown","zoneManager","EditorZone","inputDebounceTimer","pendingRender","input","isComposing","defaultStyle","removeComposingInput","TEXT","HYPERLINK","SUBSCRIPT","SUPERSCRIPT","DATE","TAB","isDesignMode","inputData","splitText","EDITOR_ELEMENT_COPY_ATTR","cut","curRowNo","curPageNo","cutElementIndexList","firstElementIndex","copy","copyElementList","tableElement","copyTableElement","firstRow","colStartIndex","lastCol","colEndIndex","coptTr","getTextFromElementList","drop","files","contextmenu","tableContextMenu","getWordRangeBySegmenter","paragraphInfo","paragraphText","TEXTLIKE_ELEMENT_TYPE","cursorStartIndex","offset","segments","segment","isWordLike","realSegmentStartIndex","getWordRangeByCursor","upCount","downCount","isNumber","NUMBER_LIKE_REG","upStartIndex","downStartIndex","dblclick","segmenterRange","handleTripleClick","isParagraphSeparator","newStartIndex","newEndIndex","click","compositionstart","compositionend","composition","dragover","findParent","node","dragColor","dragWidth","dragFloatImageDisabled","drag","CanvasEvent","painterStyle","painterStyleKeys","pKey","painterOptions","isIOS","GlobalEvent","target","pageList","EDITOR_COMPONENT","INTERNAL_SHORTCUT_KEY","nextScale","isSetCursor","Position","sourceElementList","rowList","startX","startY","startRowIndex","innerWidth","zone","tdPadding","curRow","colWidths","colGap","colX","colRowList","colRow","curRowWidth","RowFlex","tablePreX","tablePreY","offsetY","isImageElement","positionItem","prePosition","isTableElement","tableTdPadding","effectiveTdPadding","tdPaddingWidth","tdPaddingHeight","drawRowResult","VerticalAlign","rowsHeight","pre","cur","blankHeight","offsetHeight","tdPosition","pageRowList","extraHeight","isMainActive","positionNo","floatTopPosition","isFirstLetter","curPositionIndex","tablePosition","tdValueElement","ListStyle","valueWidth","floatBottomPosition","isLastArea","tdY","tdHeight","lastLetterList","headIndex","headElement","headPosition","headStartX","headerBottomY","footer","footerTopY","lastLetter","lastRowNo","currentPageNo","currentZone","floatElementZone","imgFloatPositionX","imgFloatPositionY","elementWidth","elementHeight","isControl","rowElement","rowElementRect","surroundElementList","availableWidth","rowIncreaseWidth","getIsBlockElement","surroundElement","floatPosition","surroundRect","isRectIntersect","translateX","Background","ctx","background","BackgroundSize","imageWidth","imageHeight","BackgroundRepeat","repeatXCount","repeatYCount","imageElementCache","img","applyPageNumbers","DEFAULT_SEPARATOR_TYPE","DEFAULT_DASH_ARRAY","getSeparatorType","getSeparatorLineWidth","defaultLineWidth","lineWidth","getSeparatorDashArray","getSeparatorRenderHeight","AbstractRichText","decorationStyle","isFirstRecord","Highlight","highlightAlpha","ParagraphColor","Margin","marginIndicatorColor","pageMode","PageMode","marginIndicatorSize","leftTopPoint","rightTopPoint","leftBottomPoint","rightBottomPoint","Search","isExistPre","searchNavigateId","match","isExistNext","anchor","ANCHOR_OVERFLOW_SIZE","navigate","count","groupId","keyword","searchMatchList","elementListGroup","originalElementListLength","tableIndexList","elementIndex","pageElement","EditorContext","searchClosure","restArgs","matchStartIndexList","group","searchMatchAlpha","searchMatchColor","searchNavigateMatchColor","searchMatch","tableIndex","preSearchMatch","option","matchList","replaceIndex","matchGroup","last","pageDiffCount","tableDiffCount","curGroupId","curTdId","firstMatchIndex","curTableIndex","tableElementList","firstMatch","firstIndex","Strikeout","strikeoutColor","adjustY","Underline","dashType","endX","DashType","endY","AMPLITUDE","FREQUENCY","underlineColor","TextDecorationStyle","ImageParticle","imageList","getImageList","floatImageContainer","floatImage","movementX","movementY","promise","svg","fallbackImage","convertStringToBase64","cacheRenderCount","imageLoadPromise","resolve","TextParticle","characterScale","nextCharacterScale","ratio","font","textMetrics","METRICS_BASIS_TEXT","PUNCTUATION_LIST","id","cacheTextMetrics","RenderMode","PageNumber","replaceReg","numberType","pageNoText","NumberType","convertNumberToChinese","size","rowFlex","format","startPageNo","fromPageNo","pageNoReg","FORMAT_PLACEHOLDER","pageCountReg","pageNumberBottom","textWidth","ScrollObserver","debounce","intersectionPageNo","visiblePageNoList","viewHeight","visibleHeight","intersectionMaxHeight","curPage","intersectionHeight","SelectionObserver","scrollContainerSelector","container","TableParticle","rowspan","colIndex","curRowIndex","changeTd","endTdIndex","endTrIndex","curTrList","startTd","endTd","startColIndex","endColIndex","endRowIndex","tdColIndex","tdRowIndex","TdSlash","colgroup","borderType","borderColor","borderWidth","borderExternalWidth","defaultBorderColor","colCount","rowCount","baseColor","baseWidth","outerWidth","baseStyle","TableBorder","isEmpty","isExternal","isInternal","drawOuter","drawInner","styleRank","normalizeLine","line","style","pickLine","segMap","addSeg","seg","exist","chosen","addH","x1","x2","sx1","sx2","addV","y1","y2","sy1","sy2","getImplicitLine","isOuterLine","getTdLine","side","implicit","styleLine","isLeftOuter","isRightOuter","isTopOuter","isBottomOuter","implicitTop","implicitBottom","implicitLeft","implicitRight","implicitInnerRight","implicitInnerBottom","topLine","TdBorder","bottomLine","leftLine","rightLine","groupKey","groups","arr","segs","widthStr","lw","scaledWidth","singleWidth","gap","isH","isV","min","max","colOffsetList","colOffset","rowOffsetList","rowOffset","occupiedRowSpan","canPlaceAt","colspan","isFound","maxStart","colItem","curTr","isLastRowTd","isLastColTd","isLastTd","rangeAlpha","rangeColor","TableTool","prePageHeight","tableX","tableY","tableHeight","tableWidth","tableSelectBtn","rowHeightList","rowContainer","rowHeight","rowItem","firstTd","rowItemAnchor","TableOrder","rowAddBtn","colWidthList","colContainer","colWidth","colItemAnchor","colAddBtn","borderContainer","rowBorder","colBorder","children","child","order","canvasRect","anchorLine","dx","dy","mousemoveFn","movePosition","isChangeSize","defaultTrMinHeight","curColWidth","nextColWidth","moveColWidth","moveTableWidth","tableOrder","HyperlinkParticle","hyperlinkPopupContainer","hyperlinkDom","url","parsed","lineHeight","newTab","Header","pickSurroundElementList","headerTop","disabled","maxHeightRadio","maxHeightRadioMapping","maxHeight","headerHeight","curRowHeight","SuperscriptParticle","SubscriptParticle","SeparatorParticle","alpha","normalizedAlpha","hex","fullHex","char","rgbMatch","dashArray","centerY","amplitude","wavelength","currentX","midX","nextX","strokeStyle","actualLineWidth","actualDashArray","renderHeight","gradient","PageBreakParticle","fontSize","lineDash","displayName","defaultRowMargin","textMeasure","halfX","Watermark","opacity","repeat","measureText","temporaryCanvas","temporaryCtx","textHeight","diagonalLength","patternWidth","patternHeight","pattern","docWidth","docHeight","WatermarkType","ControlSearch","activeBackgroundColor","disabledBackgroundColor","existValueBackgroundColor","noValueBackgroundColor","isPrintMode","activeControlElement","isActiveControlHighlight","isDisabledControlHighlight","isExitsValueControlHighlight","isNoValueControlHighlight","search","computeHighlight","currentControl","highlightIndex","highlight","controlElementList","ruleList","rule","searchResult","result","ControlBorder","SelectControl","multiSelectDelimiter","valueSets","valueList","code","valueSet","isNonValue","CONTROL_STYLE_ATTR","endNextElement","isIgnoreDisabledRule","isAddPlaceholder","leftIndex","rightIndex","newCodes","oldCode","oldCodes","isMultiSelect","isArrayEqual","prefixIndex","valueElement","styleElement","propertyElement","selectPopupContainer","EditorComponent","ul","li","TextControl","DateControl","date","dateFormat","NumberControl","Control","isExistValue","prefixCount","postfixCount","state","isSubscribeControlChange","activeElement","pickElementAttr","ControlState","controlElement","selectControl","dateControl","isEmitEvent","isSubscribeControlContentChange","controlValue","nonHideIndex","deletable","mode","isHasSubmitHistory","placeholderStrList","anchorElementStyleAttr","properties","conceptId","areaId","getValue","textControlValue","textControlElementList","innerText","selectCode","isExistSet","isExistSubmitHistory","setValue","payloadItem","currentEndIndex","controlContext","controlRule","formatValue","select","isArray","isString","setExtension","extension","isExistUpdate","setProperties","controlStyleProperty","pageComponentData","pageComponentKey","getControlElementList","tdElement","TITLE_CONTEXT_ATTR","LIST_CONTEXT_ATTR","getPreContext","getNextContext","controlRealWidth","controlMinWidth","controlFirstElement","controlContentWidth","controlElementIndex","controlRowElement","extraWidth","controlFirstElementLeft","rowRemainingWidth","CheckboxParticle","fillStyle","verticalAlign","NBSP","boundingBoxAscent","boundingBoxDescent","RadioParticle","Previewer","resizerSelection","resizerHandleList","resizerImageContainer","resizerImage","resizerSize","handleDom","resizerSizeView","resizerLeft","resizerTop","offsetX","dw","dh","previewerContainer","closeBtn","imgContainer","scaleSize","rotateSize","menuContainer","navigateContainer","imagePre","imageCount","imageNext","zoomIn","zoomOut","rotate","originalSize","imageDownload","mime","downloadFile","isAllowDrag","currentIndex","handleSize","ImageObserver","ZoneTip","tipContainer","tipContent","watchZones","header","throttle","mousemoveZone","visible","Zone","nextTick","listener","isHeaderActive","pageHeight","indicatorHeight","indicatorTop","indicatorLeftX","indicatorRightX","indicatorTopY","indicatorBottomY","toolbar","labelLeft","zoneName","btnInsertPageNo","lineTop","lineLeft","lineBottom","lineRight","menu","PAGE_NUMBER_STYLES","menuItem","scrollHandler","closeHandler","pageNumberOptions","isHeader","Footer","footerBottom","footerHeight","ListSymbolDrawer","UlStyle","filled","half","outerRadius","innerRadius","points","step","radius","angle","px","py","petalRadius","centerOffset","petals","lines","ListParticle","listType","listStyle","changeElementList","listId","listStyleMap","curListId","curElementList","elementLength","listElementList","defaultSize","defaultFont","referenceElement","elementSize","elementFont","ListType","symbolWidth","symbolText","symbolMetrics","listIndex","tabWidth","defaultTabWidth","checkboxHeight","checkboxRowElement","baselineY","rowCenterY","symbolX","OlStyle","chineseNumbers","chineseUnits","unitIndex","digit","isUpper","base","_LineBreakParticle","LineBreakParticle","Placeholder","lineBreak","headerExtraHeight","placeholder","Group","groupElementList","tdGroupElementList","groupIds","groupIndex","groupStartIndex","groupEndIndex","fillRect","lastLine","anchorGroupIds","backgroundColor","activeOpacity","lineRanges","MouseObserver","LineNumber","textParticle","seq","LineNumberType","PageBorder","padding","TableOperate","defaultTrHeight","baseTrHeight","autoTrMinHeight","curTrNo","newTrId","newTr","curTd","newTdId","anchorTr","defaultColMinWidth","colgroupWidth","greaterMinWidthCol","adjustWidth","curTdIndex","curTdRowIndex","curColIndex","deleteCount","deleteStartIndex","lastRow","tdStartX","tdStartY","tdEndX","tdEndY","mergeTdIdList","anchorTd","isPlaceholder","anchorContextElement","startTdValueIndex","cloneProperty","TABLE_CONTEXT_ATTR","appendTrIndex","nextWidth","isSetBorderType","borderTypeIndex","isSetTdSlashType","slashTypeIndex","Area","activeAreaId","activeAreaInfo","AreaMode","area","lastIndex","areaInfoItem","pagePositionList","firstPosition","defaultPlaceholderOption","areaInfo","computeProps","propKey","Badge","areaBadge","badge","areaItem","badgeItem","Draw","rootContainer","override","RangeManager","letterClass","letter","clonePrintModeData","register","paperDirection","PaperDirection","footerExtraHeight","historyManager","isPrepend","items","_g","_h","isIgnoreDeletedRule","modeRule","endElementListId","tdDeletable","deleteIndex","deleteElement","_callbacks","overlay","laTexParticle","blockParticle","workerManager","pixelRatio","currentMode","isSwitchMode","dataUrlList","dpr","canvas","realWidth","realHeight","mainElementList","originData","extraPickAttrs","DOCX_EDITOR_DATA_VERSION","main","fontFamily","defaultBasicRowMarginHeight","FlexDirection","isDrawLineBreak","_i","_j","_k","_l","_m","_n","_o","isPagingMode","isFromTable","mainOuterHeight","paragraphFirstLineIndent","paragraphIndentLeft","isParagraphFirstRow","columnId","columnCount","columnGap","columnSeparator","columnWidths","columnElements","columnGroups","scaledColumnWidths","totalGap","columnRowLists","maxColumnHeight","groupElements","colHeight","sum","containerRow","paragraphSpacingBefore","paragraphSpacingAfter","rowMargin","rowMarginTop","rowMarginBottom","listOffsetX","listIndentX","paragraphIndentX","isListParagraph","firstIndent","isStartElement","adaptiveHeight","combineCount","nexTrList","getTrAutoMinHeight","maxSize","maxTdPaddingHeight","curPad","curPadH","baseHeight","hasBaseHeight","autoMinHeight","explicitHeight","hasExplicitHeight","nextHeight","curTdHeight","changeTr","curTdMinHeight","curTdRealHeight","reduceTrList","reduceHeight","curReduceHeight","marginHeight","curPagePreHeight","rowOffsetY","rowMarginHeight","firstTrHeight","deleteStart","preTrHeight","trHeight","rowColCount","cloneTrList","cloneTrHeight","cloneTrRealHeight","pagingId","cloneElement","repeatTrList","cloneRepeatTrList","newPositionContextIndex","newPositionContextTrIndex","fontMetrics","characterScaleRatio","WordBreak","word","wordWidth","punctuationWidth","surroundPosition","isForceBreak","isWidthNotEnough","isWrap","resolveRowFlex","ControlIndentation","preStartIndex","valueStartPosition","rowElementList","deleteSurroundElementList","nextRow","maxPageNo","pageDom","pageDomHeight","paragraphColor","highlightMarginHeight","colSeparator","containerPos","containerY","colPositionList","colElementList","separatorX","rangeRecord","tableRangeElement","hasCustomCharacterScale","PUNCTUATION_REG","standardMetrics","revColor","lineY","rangeWidth","floatPositionList","imgDisplays","inactiveAlpha","pageNumber","lineNumber","pageBorder","pageCount","pagesToRender","startPage","endPage","entries","entry","isLazy","isInit","isSourceHistory","isFirstRender","isPartialRender","targetPageNo","oldPageSize","searchKeyword","curPageCount","prePageCount","page","pageCountChanged","tablePositionList","isShowCursor","IMAGE_ELEMENT_TYPE","oldElementList","getSlimCloneElementList","oldHeaderElementList","oldFooterElementList","oldRange","FloatingBar","command","isInToolbar","isInContainer","fontFamilySelect","fontSizeSelect","btn","action","picker","indicator","EDITOR_FONT_OPTIONS","EDITOR_SIZE_OPTIONS","normalizedFont","optionValue","optionLabel","primaryFamily","normalizedSize","currentValue","newDataUrl","reader","event","display","imgDisplay","hasSelection","isImageSelected","Plugin","editor","pluginFunction","Override","Register","shortcut","i18n","renderer"],"mappings":"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AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAK,CAAC,UAAU,MAAM,GAAGC,KAAK;AAAA,EAC/B,GAAGN;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAAA,EACH,GAAGG;AACL,GAAGE,KAAK;AAAA,EACN9C,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AACJ,GAAG+C,KAAK;AAAA,EACN/C,EAAE;AAAA,EACFA,EAAE;AACJ,GAAGgD,KAAK;AAAA,EACNhD,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AAAA,EACFA,EAAE;AACJ,GAAGiD,KAAK,CAAC,MAAM,SAAS,MAAM,IAAI,GAAGC,KAAK;AAAA,EACxClD,EAAE;AAAA,EACFA,EAAE;AACJ,GAAGmD,KAAK,IAAIC,KAAK;AAAA,EACf,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EACX,wBAAwB;AAC1B,GAAGC,KAAK;AAAA,EACN,YAAY;AACd,GAAGC,KAAK;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AACd,GAAGC,KAAK;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS9C,GAAE;AAAA,EACX,QAAQ6C,GAAG;AAAA,EACX,YAAYtE,GAAE;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AACb,GAAGwE,KAAK;AAAA,EACN,EAAE,OAAO,YAAY,OAAO,eAAe,YAAYxE,GAAE,OAAM;AAAA,EAC/D,EAAE,OAAO,gBAAgB,OAAO,2BAA2B,YAAYA,GAAE,OAAM;AAAA,EAC/E,EAAE,OAAO,gBAAgB,OAAO,2BAA2B,YAAYA,GAAE,OAAM;AAAA,EAC/E,EAAE,OAAO,gBAAgB,OAAO,SAAS,YAAYA,GAAE,OAAM;AAAA,EAC7D,EAAE,OAAO,gCAAgC,OAAO,eAAe,YAAYA,GAAE,OAAM;AAAA,EACnF,EAAE,OAAO,0BAA0B,OAAO,SAAS,YAAYA,GAAE,OAAM;AAAA,EACvE,EAAE,OAAO,2BAA2B,OAAO,UAAU,YAAYA,GAAE,OAAM;AAAA,EACzE,EAAE,OAAO,cAAc,OAAO,OAAO,YAAYA,GAAE,QAAO;AAAA,EAC1D,EAAE,OAAO,8BAA8B,OAAO,aAAa,YAAYA,GAAE,QAAO;AAAA,EAChF,EAAE,OAAO,YAAY,OAAO,kBAAkB,YAAY,cAAa;AAAA,EACvE,EAAE,OAAO,YAAY,OAAO,kBAAkB,YAAY,cAAa;AAAA,EACvE,EAAE,OAAO,YAAY,OAAO,eAAe,YAAY,iBAAgB;AAAA,EACvE,EAAE,OAAO,YAAY,OAAO,eAAe,YAAY,iBAAgB;AAAA,EACvE,EAAE,OAAO,YAAY,OAAO,eAAe,YAAY,wBAAuB;AAAA,EAC9E,EAAE,OAAO,YAAY,OAAO,eAAe,YAAY,iBAAgB;AAAA,EACvE,EAAE,OAAO,YAAY,OAAO,eAAe,YAAY,iBAAgB;AACzE,GAAGyE,KAAK;AAAA,EACN,EAAE,OAAO,MAAM,OAAO,gBAAe;AAAA,EACrC,EAAE,OAAO,MAAM,OAAO,eAAc;AAAA,EACpC,EAAE,OAAO,MAAM,OAAO,kBAAiB;AAAA,EACvC,EAAE,OAAO,MAAM,OAAO,qBAAoB;AAAA,EAC1C,EAAE,OAAO,QAAQ,OAAO,8BAA6B;AAAA,EACrD,EAAE,OAAO,SAAS,OAAO,iCAAgC;AAAA,EACzD,EAAE,OAAO,QAAQ,OAAO,kBAAiB;AAAA,EACzC,EAAE,OAAO,QAAQ,OAAO,iCAAgC;AAAA,EACxD,EAAE,OAAO,QAAQ,OAAO,6BAA4B;AAAA,EACpD,EAAE,OAAO,SAAS,OAAO,oBAAmB;AAAA,EAC5C,EAAE,OAAO,mBAAmB,OAAO,yBAAwB;AAAA,EAC3D,EAAE,OAAO,YAAY,OAAO,uBAAsB;AAAA,EAClD,EAAE,OAAO,eAAe,OAAO,yBAAwB;AACzD,GAAGC,KAAK;AAAA,EACN,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,KAAI;AAAA,EAC1B,EAAE,OAAO,MAAM,OAAO,EAAC;AAAA,EACvB,EAAE,OAAO,MAAM,OAAO,IAAG;AAAA,EACzB,EAAE,OAAO,MAAM,OAAO,IAAG;AAAA,EACzB,EAAE,OAAO,MAAM,OAAO,IAAG;AAAA,EACzB,EAAE,OAAO,MAAM,OAAO,EAAC;AAAA,EACvB,EAAE,OAAO,KAAK,OAAO,EAAC;AAAA,EACtB,EAAE,OAAO,OAAO,OAAO,IAAG;AAAA,EAC1B,EAAE,OAAO,KAAK,OAAO,EAAC;AAAA,EACtB,EAAE,OAAO,OAAO,OAAO,IAAG;AAAA,EAC1B,EAAE,OAAO,KAAK,OAAO,EAAC;AAAA,EACtB,EAAE,OAAO,OAAO,OAAO,IAAG;AAAA,EAC1B,EAAE,OAAO,KAAK,OAAO,EAAC;AAAA,EACtB,EAAE,OAAO,KAAK,OAAO,EAAC;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,QAAQ,OAAO,KAAI;AAAA,EAC5B,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAAA,EACxB,EAAE,OAAO,MAAM,OAAO,GAAE;AAC1B,GAAGC,KAAK,UAAUC,KAAK,kCAAkCC,KAAK,yhZAAyhZC,KAAK,IAAI;AAAA,EAC9lZ,GAAGD,GAAG,MAAM,IAAID,GAAG,MAAM;AAAA,EACzB;AACF,GAAGG,KAAK,mEAAmEC,KAAK,IAAI,OAAO,KAAKrC,CAAC;AAAA,EAC/F,GAAGsC,KAAK;AAAA,EACR,MAAM;AAAA,EACN,MAAMnD,GAAG;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK,CAAC,IAAI,EAAE;AAAA,EACZ,YAAY9B,GAAE;AAChB,GAAGkF,KAAK;AAAA,EACN,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AACpB,GAAGC,KAAK;AAAA,EACN,CAACvD,GAAE,KAAK,GAAG;AAAA,EACX,CAACA,GAAE,MAAM,GAAG;AAAA,EACZ,CAACA,GAAE,KAAK,GAAG;AAAA,EACX,CAACA,GAAE,MAAM,GAAG;AAAA,EACZ,CAACA,GAAE,KAAK,GAAG;AAAA,EACX,CAACA,GAAE,KAAK,GAAG;AACb,GAAGwD,KAAK;AAAA,EACN,CAACxD,GAAE,KAAK,GAAG;AAAA,EACX,CAACA,GAAE,MAAM,GAAG;AAAA,EACZ,CAACA,GAAE,KAAK,GAAG;AAAA,EACX,CAACA,GAAE,MAAM,GAAG;AAAA,EACZ,CAACA,GAAE,KAAK,GAAG;AAAA,EACX,CAACA,GAAE,KAAK,GAAG;AACb,GAAGyD,KAAK;AAAA,EACN,IAAIzD,GAAE;AAAA,EACN,IAAIA,GAAE;AAAA,EACN,IAAIA,GAAE;AAAA,EACN,IAAIA,GAAE;AAAA,EACN,IAAIA,GAAE;AAAA,EACN,IAAIA,GAAE;AACR,GAAG0D,KAAK;AAAA,EACN,CAACjE,EAAE,IAAI,GAAG;AAAA,EACV,CAACA,EAAE,MAAM,GAAG;AAAA,EACZ,CAACA,EAAE,MAAM,GAAG;AAAA,EACZ,CAACA,EAAE,QAAQ,GAAG;AAAA,EACd,CAACA,EAAE,OAAO,GAAG;AAAA,EACb,CAACA,EAAE,IAAI,GAAG;AAAA,EACV,CAACA,EAAE,KAAK,GAAG;AAAA,EACX,CAACA,EAAE,QAAQ,GAAG;AAAA,EACd,CAACA,EAAE,IAAI,GAAG;AAAA,EACV,CAACA,EAAE,KAAK,GAAG;AAAA,EACX,CAACA,EAAE,aAAa,GAAG;AAAA,EACnB,CAACA,EAAE,KAAK,GAAG;AAAA,EACX,CAACA,EAAE,aAAa,GAAG;AAAA,EACnB,CAACA,EAAE,aAAa,GAAG;AAAA,EACnB,CAACA,EAAE,YAAY,GAAG;AAAA,EAClB,CAACA,EAAE,IAAI,GAAG;AAAA,EACV,CAACA,EAAE,cAAc,GAAG;AAAA,EACpB,CAACA,EAAE,UAAU,GAAG;AAAA,EAChB,CAACA,EAAE,WAAW,GAAG;AAAA,EACjB,CAACA,EAAE,MAAM,GAAG;AAAA,EACZ,CAACA,EAAE,QAAQ,GAAG;AAAA,EACd,CAACA,EAAE,cAAc,GAAG;AAAA,EACpB,CAACA,EAAE,eAAe,GAAG;AACvB,GAAGkE,KAAK;AAAA,EACN,CAACnE,GAAE,EAAE,GAAG;AAAA,EACR,CAACA,GAAE,EAAE,GAAG;AACV,GAAGoE,KAAK;AAAA,EACN,CAACjE,GAAE,IAAI,GAAG;AAAA,EACV,CAACA,GAAE,MAAM,GAAG;AAAA,EACZ,CAACA,GAAE,MAAM,GAAG;AAAA,EACZ,CAACA,GAAE,OAAO,GAAG;AAAA,EACb,CAACA,GAAE,WAAW,GAAG;AAAA,EACjB,CAACA,GAAE,aAAa,GAAG;AAAA,EACnB,CAACA,GAAE,cAAc,GAAG;AAAA,EACpB,CAACA,GAAE,eAAe,GAAG;AAAA,EACrB,CAACA,GAAE,OAAO,GAAG;AAAA,EACb,CAACA,GAAE,eAAe,GAAG;AAAA,EACrB,CAACA,GAAE,WAAW,GAAG;AAAA,EACjB,CAACA,GAAE,eAAe,GAAG;AAAA,EACrB,CAACA,GAAE,QAAQ,GAAG;AAAA,EACd,CAACA,GAAE,OAAO,GAAG;AAAA,EACb,CAACA,GAAE,IAAI,GAAG;AAAA,EACV,CAACA,GAAE,KAAK,GAAG;AACb,GAAGkE,KAAK;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AACR,GAAGC,KAAK;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM9F,GAAG;AAAA,EACT,QAAQC,GAAG;AAAA,EACX,kBAAkB,CAAA;AACpB,GAAG8F,KAAK;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR,GAAGC,KAAK;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe/D,GAAG;AACpB,GAAGgE,KAAK;AAAA,EACN,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAC1B,GAAGC,KAAK;AAAA,EACN,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,gBAAgB/F,GAAE;AAAA,EAClB,UAAU;AAAA,EACV,UAAU;AACZ,GAAGgG,KAAK;AAAA,EACN,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV,WAAW;AACb,GAAGC,KAAK;AAAA,EACN,KAAK;AAAA,EACL,eAAe;AAAA,EACf,gBAAgBjG,GAAE;AAAA,EAClB,UAAU;AAAA,EACV,UAAU;AACZ,GAAGkG,KAAK;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AACb,GAAGC,KAAK;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACpB,UAAU;AACZ,GAAGC,KAAK;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU,CAAC,GAAG,CAAC;AAAA,EACf,UAAU;AACZ,GAAGC,KAAK;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAevE,GAAG;AACpB,GAAGwE,KAAK;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AACf,GAAGC,KAAK;AAAA,EACN,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACtB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AACtB,GAAGC,KAAK;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAMpF,GAAG;AACX,GAAGqF,KAAK;AAAA,EACN,aAAa;AACf;AACA,SAASC,GAAG9G,GAAG;AACb,SAAOA,KAAKA,EAAE,cAAc,OAAO,UAAU,eAAe,KAAKA,GAAG,SAAS,IAAIA,EAAE,UAAUA;AAC/F;AACA,IAAI+G,KAAK,SAAS/G,EAAEgH,GAAGC,GAAG;AACxB,MAAID,MAAMC,EAAG,QAAO;AACpB,MAAID,KAAKC,KAAK,OAAOD,KAAK,YAAY,OAAOC,KAAK,UAAU;AAC1D,QAAID,EAAE,gBAAgBC,EAAE,YAAa,QAAO;AAC5C,QAAIC,GAAGC,GAAGC;AACV,QAAI,MAAM,QAAQJ,CAAC,GAAG;AACpB,UAAIE,IAAIF,EAAE,QAAQE,KAAKD,EAAE,OAAQ,QAAO;AACxC,WAAKE,IAAID,GAAGC,QAAQ;AAClB,YAAI,CAACnH,EAAEgH,EAAEG,CAAC,GAAGF,EAAEE,CAAC,CAAC,EAAG,QAAO;AAC7B,aAAO;AAAA,IACT;AACA,QAAIH,EAAE,gBAAgB,OAAQ,QAAOA,EAAE,WAAWC,EAAE,UAAUD,EAAE,UAAUC,EAAE;AAC5E,QAAID,EAAE,YAAY,OAAO,UAAU,QAAS,QAAOA,EAAE,QAAO,MAAOC,EAAE,QAAO;AAC5E,QAAID,EAAE,aAAa,OAAO,UAAU,SAAU,QAAOA,EAAE,SAAQ,MAAOC,EAAE,SAAQ;AAChF,QAAIG,IAAI,OAAO,KAAKJ,CAAC,GAAGE,IAAIE,EAAE,QAAQF,MAAM,OAAO,KAAKD,CAAC,EAAE,OAAQ,QAAO;AAC1E,SAAKE,IAAID,GAAGC,QAAQ;AAClB,UAAI,CAAC,OAAO,UAAU,eAAe,KAAKF,GAAGG,EAAED,CAAC,CAAC,EAAG,QAAO;AAC7D,SAAKA,IAAID,GAAGC,QAAQ,KAAK;AACvB,UAAIE,IAAID,EAAED,CAAC;AACX,UAAI,CAACnH,EAAEgH,EAAEK,CAAC,GAAGJ,EAAEI,CAAC,CAAC,EAAG,QAAO;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AACA,SAAOL,MAAMA,KAAKC,MAAMA;AAC1B;AACA,MAAMK,KAAqB,gBAAAR,GAAGC,EAAE;AAChC,IAAIQ,KAAKC;AACT,SAASC,GAAEzH,GAAG;AACZ,SAAOA,aAAa,SAAS,OAAO,KAAKA,CAAC,IAAI,IAAIA,EAAE,YAAYA,EAAE,OAAO,MAAK,GAAIA,EAAE,YAAYA,EAAE,MAAM;AAC1G;AACA,SAASwH,GAAGxH,GAAG;AACb,MAAIA,IAAIA,KAAK,CAAA,GAAIA,EAAE,QAAS,QAAO0H,GAAG1H,CAAC;AACvC,QAAMgH,IAAoB,oBAAI,IAAG;AACjC,MAAIA,EAAE,IAAI,MAAM,CAACK,MAAM,IAAI,KAAKA,CAAC,CAAC,GAAGL,EAAE,IAAI,KAAK,CAACK,GAAGM,MAAM,IAAI,IAAIT,EAAE,MAAM,KAAKG,CAAC,GAAGM,CAAC,CAAC,CAAC,GAAGX,EAAE,IAAI,KAAK,CAACK,GAAGM,MAAM,IAAI,IAAIT,EAAE,MAAM,KAAKG,CAAC,GAAGM,CAAC,CAAC,CAAC,GAAG3H,EAAE;AAC7I,eAAWqH,KAAKrH,EAAE;AAChB,MAAAgH,EAAE,IAAIK,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AACpB,MAAIJ,IAAI;AACR,SAAOjH,EAAE,QAAQoH,IAAID;AACrB,WAASD,EAAEG,GAAGM,GAAG;AACf,UAAMC,IAAI,OAAO,KAAKP,CAAC,GAAGQ,IAAI,IAAI,MAAMD,EAAE,MAAM;AAChD,aAASE,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,YAAMC,IAAIH,EAAEE,CAAC,GAAGE,IAAIX,EAAEU,CAAC;AACvB,aAAOC,KAAK,YAAYA,MAAM,OAAOH,EAAEE,CAAC,IAAIC,IAAIA,EAAE,gBAAgB,WAAWf,IAAID,EAAE,IAAIgB,EAAE,WAAW,KAAKH,EAAEE,CAAC,IAAId,EAAEe,GAAGL,CAAC,IAAI,YAAY,OAAOK,CAAC,IAAIH,EAAEE,CAAC,IAAIN,GAAEO,CAAC,IAAIH,EAAEE,CAAC,IAAIJ,EAAEK,CAAC;AAAA,IAC5K;AACA,WAAOH;AAAA,EACT;AACA,WAASV,EAAEE,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAOH,EAAEG,GAAGF,CAAC;AACnC,QAAIE,EAAE,gBAAgB,WAAWJ,IAAID,EAAE,IAAIK,EAAE,WAAW;AACtD,aAAOJ,EAAEI,GAAGF,CAAC;AACf,UAAMQ,IAAI,CAAA;AACV,eAAWC,KAAKP,GAAG;AACjB,UAAI,OAAO,eAAe,KAAKA,GAAGO,CAAC,MAAM,GAAI;AAC7C,YAAMC,IAAIR,EAAEO,CAAC;AACb,aAAOC,KAAK,YAAYA,MAAM,OAAOF,EAAEC,CAAC,IAAIC,IAAIA,EAAE,gBAAgB,WAAWZ,IAAID,EAAE,IAAIa,EAAE,WAAW,KAAKF,EAAEC,CAAC,IAAIX,EAAEY,GAAGV,CAAC,IAAI,YAAY,OAAOU,CAAC,IAAIF,EAAEC,CAAC,IAAIH,GAAEI,CAAC,IAAIF,EAAEC,CAAC,IAAIT,EAAEU,CAAC;AAAA,IAC5K;AACA,WAAOF;AAAA,EACT;AACA,WAASP,EAAEC,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAOH,EAAEG,GAAGD,CAAC;AACnC,QAAIC,EAAE,gBAAgB,WAAWJ,IAAID,EAAE,IAAIK,EAAE,WAAW;AACtD,aAAOJ,EAAEI,GAAGD,CAAC;AACf,UAAMO,IAAI,CAAA;AACV,eAAWC,KAAKP,GAAG;AACjB,YAAMQ,IAAIR,EAAEO,CAAC;AACb,aAAOC,KAAK,YAAYA,MAAM,OAAOF,EAAEC,CAAC,IAAIC,IAAIA,EAAE,gBAAgB,WAAWZ,IAAID,EAAE,IAAIa,EAAE,WAAW,KAAKF,EAAEC,CAAC,IAAIX,EAAEY,GAAGT,CAAC,IAAI,YAAY,OAAOS,CAAC,IAAIF,EAAEC,CAAC,IAAIH,GAAEI,CAAC,IAAIF,EAAEC,CAAC,IAAIR,EAAES,CAAC;AAAA,IAC5K;AACA,WAAOF;AAAA,EACT;AACF;AACA,SAASD,GAAG1H,GAAG;AACb,QAAMgH,IAAI,CAAA,GAAIC,IAAI,CAAA,GAAIC,IAAoB,oBAAI,IAAG;AACjD,MAAIA,EAAE,IAAI,MAAM,CAACU,MAAM,IAAI,KAAKA,CAAC,CAAC,GAAGV,EAAE,IAAI,KAAK,CAACU,GAAGC,MAAM,IAAI,IAAIT,EAAE,MAAM,KAAKQ,CAAC,GAAGC,CAAC,CAAC,CAAC,GAAGX,EAAE,IAAI,KAAK,CAACU,GAAGC,MAAM,IAAI,IAAIT,EAAE,MAAM,KAAKQ,CAAC,GAAGC,CAAC,CAAC,CAAC,GAAG7H,EAAE;AAC7I,eAAW4H,KAAK5H,EAAE;AAChB,MAAAkH,EAAE,IAAIU,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AACpB,MAAIT,IAAI;AACR,SAAOnH,EAAE,QAAQ2H,IAAIN;AACrB,WAASD,EAAEQ,GAAGC,GAAG;AACf,UAAMC,IAAI,OAAO,KAAKF,CAAC,GAAGG,IAAI,IAAI,MAAMD,EAAE,MAAM;AAChD,aAASE,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,YAAMC,IAAIH,EAAEE,CAAC,GAAGE,IAAIN,EAAEK,CAAC;AACvB,UAAI,OAAOC,KAAK,YAAYA,MAAM;AAChC,QAAAH,EAAEE,CAAC,IAAIC;AAAA,eACAA,EAAE,gBAAgB,WAAWf,IAAID,EAAE,IAAIgB,EAAE,WAAW;AAC3D,QAAAH,EAAEE,CAAC,IAAId,EAAEe,GAAGL,CAAC;AAAA,eACN,YAAY,OAAOK,CAAC;AAC3B,QAAAH,EAAEE,CAAC,IAAIR,GAAES,CAAC;AAAA,WACP;AACH,cAAMC,IAAInB,EAAE,QAAQkB,CAAC;AACrB,QAAAC,MAAM,KAAKJ,EAAEE,CAAC,IAAIhB,EAAEkB,CAAC,IAAIJ,EAAEE,CAAC,IAAIJ,EAAEK,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAOH;AAAA,EACT;AACA,WAASV,EAAEO,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAOR,EAAEQ,GAAGP,CAAC;AACnC,QAAIO,EAAE,gBAAgB,WAAWT,IAAID,EAAE,IAAIU,EAAE,WAAW;AACtD,aAAOT,EAAES,GAAGP,CAAC;AACf,UAAMQ,IAAI,CAAA;AACV,IAAAb,EAAE,KAAKY,CAAC,GAAGX,EAAE,KAAKY,CAAC;AACnB,eAAWC,KAAKF,GAAG;AACjB,UAAI,OAAO,eAAe,KAAKA,GAAGE,CAAC,MAAM,GAAI;AAC7C,YAAMC,IAAIH,EAAEE,CAAC;AACb,UAAI,OAAOC,KAAK,YAAYA,MAAM;AAChC,QAAAF,EAAEC,CAAC,IAAIC;AAAA,eACAA,EAAE,gBAAgB,WAAWZ,IAAID,EAAE,IAAIa,EAAE,WAAW;AAC3D,QAAAF,EAAEC,CAAC,IAAIX,EAAEY,GAAGV,CAAC;AAAA,eACN,YAAY,OAAOU,CAAC;AAC3B,QAAAF,EAAEC,CAAC,IAAIL,GAAEM,CAAC;AAAA,WACP;AACH,cAAMC,IAAIhB,EAAE,QAAQe,CAAC;AACrB,QAAAC,MAAM,KAAKH,EAAEC,CAAC,IAAIb,EAAEe,CAAC,IAAIH,EAAEC,CAAC,IAAIT,EAAEU,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAOf,EAAE,IAAG,GAAIC,EAAE,IAAG,GAAIY;AAAA,EAC3B;AACA,WAASF,EAAEC,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAOR,EAAEQ,GAAGD,CAAC;AACnC,QAAIC,EAAE,gBAAgB,WAAWT,IAAID,EAAE,IAAIU,EAAE,WAAW;AACtD,aAAOT,EAAES,GAAGD,CAAC;AACf,UAAME,IAAI,CAAA;AACV,IAAAb,EAAE,KAAKY,CAAC,GAAGX,EAAE,KAAKY,CAAC;AACnB,eAAWC,KAAKF,GAAG;AACjB,YAAMG,IAAIH,EAAEE,CAAC;AACb,UAAI,OAAOC,KAAK,YAAYA,MAAM;AAChC,QAAAF,EAAEC,CAAC,IAAIC;AAAA,eACAA,EAAE,gBAAgB,WAAWZ,IAAID,EAAE,IAAIa,EAAE,WAAW;AAC3D,QAAAF,EAAEC,CAAC,IAAIX,EAAEY,GAAGJ,CAAC;AAAA,eACN,YAAY,OAAOI,CAAC;AAC3B,QAAAF,EAAEC,CAAC,IAAIL,GAAEM,CAAC;AAAA,WACP;AACH,cAAMC,IAAIhB,EAAE,QAAQe,CAAC;AACrB,QAAAC,MAAM,KAAKH,EAAEC,CAAC,IAAIb,EAAEe,CAAC,IAAIH,EAAEC,CAAC,IAAIH,EAAEI,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAOf,EAAE,IAAG,GAAIC,EAAE,IAAG,GAAIY;AAAA,EAC3B;AACF;AACA,MAAMO,KAAqB,gBAAAtB,GAAGS,EAAE;AAahC,IAAIc,KAAKC;AACT,SAASA,GAAGtI,GAAGgH,GAAG;AAChB,MAAIC,IAAI,CAAA;AACR,SAAOD,KAAK,aAAaA,IAAI,CAAA,EAAG,MAAM,KAAK,WAAW,CAAC;AACvD,WAASE,IAAIF,EAAE,QAAQG,IAAI,GAAGA,IAAID,GAAGC,KAAK;AACxC,QAAIC,IAAIJ,EAAEG,CAAC;AACX,IAAAC,KAAKpH,MAAMiH,EAAEG,CAAC,IAAIpH,EAAEoH,CAAC;AAAA,EACvB;AACA,SAAOH;AACT;AACA,IAAIsB,KAAKC;AACT,SAASA,GAAGxI,GAAGgH,GAAG;AAChB,MAAIC,IAAI,CAAA;AACR,SAAOD,KAAK,aAAaA,IAAI,CAAA,EAAG,MAAM,KAAK,WAAW,CAAC;AACvD,WAASE,KAAKlH;AACZ,KAAC,CAACA,EAAE,kBAAkBA,EAAE,eAAekH,CAAC,MAAMF,EAAE,QAAQE,CAAC,MAAM,OAAOD,EAAEC,CAAC,IAAIlH,EAAEkH,CAAC;AAClF,SAAOD;AACT;AACA,IAAIwB,KAAKC;AACT,SAASA,GAAG1I,GAAGgH,GAAGC,GAAG;AACnB,MAAIC,IAAI,MAAMC,IAAI,MAAMC,IAAI,WAAW;AACrC,IAAAF,MAAM,aAAaA,CAAC,GAAGC,IAAI,MAAMD,IAAI;AAAA,EACvC,GAAGG,IAAI,WAAW;AAChB,QAAIO,IAAIT;AACR,IAAAC,EAAC,GAAIQ,KAAKA,EAAC;AAAA,EACb,GAAGD,IAAI,WAAW;AAChB,QAAI,CAACX;AACH,aAAOhH,EAAE,MAAM,MAAM,SAAS;AAChC,QAAI4H,IAAI,MAAMC,IAAI,WAAWC,IAAIb,KAAK,CAACC;AACvC,QAAIE,EAAC,GAAID,IAAI,WAAW;AACtB,MAAAnH,EAAE,MAAM4H,GAAGC,CAAC;AAAA,IACd,GAAGX,IAAI,WAAW,WAAW;AAC3B,UAAIA,IAAI,MAAM,CAACY,GAAG;AAChB,YAAIC,IAAIZ;AACR,eAAOA,IAAI,MAAMY,EAAC;AAAA,MACpB;AAAA,IACF,GAAGf,CAAC,GAAGc;AACL,aAAOX,EAAC;AAAA,EACZ;AACA,SAAOQ,EAAE,SAASP,GAAGO,EAAE,QAAQN,GAAGM;AACpC;AACA,IAAIgB,KAAKC;AACT,SAASA,GAAG5I,GAAGgH,GAAGC,GAAG;AACnB,MAAIC,IAAI,MAAMC,IAAI,MAAMC,IAAIH,KAAKA,EAAE,SAASI,IAAIJ,KAAKA,EAAE;AACvD,EAAAG,KAAK,SAASA,IAAI,KAAKC,KAAK,SAASA,IAAI,CAACD,IAAIA,KAAK,OAAOC,IAAI;AAC9D,MAAIM,IAAI,WAAW;AACjB,IAAAT,MAAM,aAAaA,CAAC,GAAGA,IAAI;AAAA,EAC7B,GAAGU,IAAI,WAAW;AAChB,QAAIE,IAAIX;AACR,IAAAQ,EAAC,GAAIG,KAAKA,EAAC;AAAA,EACb,GAAGD,IAAI,WAAW;AAChB,QAAIC,IAAIV,KAAK,CAACF,GAAGa,IAAI,MAAMC,IAAI;AAC/B,QAAIb,IAAI,WAAW;AACjB,aAAOnH,EAAE,MAAM+H,GAAGC,CAAC;AAAA,IACrB,GAAGd,MAAMA,IAAI,WAAW,WAAW;AACjC,UAAIA,IAAI,MAAMG;AACZ,eAAOF,EAAC;AAAA,IACZ,GAAGH,CAAC,IAAIc;AACN,aAAOA,IAAI,IAAIX,EAAC;AAAA,EACpB;AACA,SAAOU,EAAE,SAASF,GAAGE,EAAE,QAAQD,GAAGC;AACpC;AACA,IAAIgB,KAAK,oEAAoEC,KAAI,CAAC9I,IAAI,OAAO;AAC3F,MAAIgH,IAAI,IAAIC,IAAI,OAAO,gBAAgB,IAAI,WAAWjH,KAAK,CAAC,CAAC;AAC7D,SAAOA;AACL,IAAAgH,KAAK6B,GAAG5B,EAAEjH,CAAC,IAAI,EAAE;AACnB,SAAOgH;AACT;AACA,MAAM+B,KAAKX,GAAE;AACb,SAASY,GAAGhJ,GAAGgH,GAAG;AAChB,MAAI,CAAChH,KAAK,OAAOA,KAAK;AACpB,WAAOA;AACT,MAAIiH,IAAI,CAAA;AACR,SAAO,MAAM,QAAQjH,CAAC,IAAIiH,IAAIjH,EAAE,IAAI,CAACkH,MAAM8B,GAAG9B,GAAGF,CAAC,CAAC,IAAI,OAAO,KAAKhH,CAAC,EAAE,QAAQ,CAACkH,MAAM;AACnF,QAAI,CAACF,EAAE,SAASE,CAAC;AACf,aAAOD,EAAEC,CAAC,IAAI8B,GAAGhJ,EAAEkH,CAAC,GAAGF,CAAC;AAAA,EAC5B,CAAC,GAAGC;AACN;AACA,SAASgC,GAAGjJ,GAAG;AACb,SAAO,OAAO,mBAAmB,aAAa,gBAAgBA,CAAC,IAAI+I,GAAG/I,CAAC;AACzE;AACA,SAASkJ,GAAGlJ,GAAG;AACb,SAAOA,KAAKA,EAAE,aAAa,KAAKA,EAAE,QAAQ,YAAW,MAAO;AAC9D;AACA,SAASmJ,GAAGnJ,GAAGgH,GAAGC,GAAG;AACnB,MAAIjH,KAAK,CAACkJ,GAAGlJ,CAAC;AACZ,SAAKA,IAAQA,GAAkBA,KAAK;AAClC,UAAI,CAACgH,KAAKA,EAAEhH,CAAC,KAAKkJ,GAAGlJ,CAAC;AACpB,eAAOgH,KAAK,CAACA,EAAEhH,CAAC,KAAKkJ,GAAGlJ,CAAC,IAAI,OAAOA;AACtC,MAAAA,IAAIA,EAAE;AAAA,IACR;AACF,SAAO;AACT;AACA,SAASoJ,GAAEpJ,GAAG;AACZ,QAAMgH,IAAI,CAAA;AACV,MAAI,KAAK,WAAW;AAClB,UAAME,IAAI,IAAI,KAAK,UAAS,EAAG,QAAQlH,CAAC;AACxC,eAAW,EAAE,SAASmH,EAAC,KAAMD;AAC3B,MAAAF,EAAE,KAAKG,CAAC;AAAA,EACZ,OAAO;AACL,UAAMF,IAAoB,oBAAI,IAAG;AACjC,eAAWE,KAAKnH,EAAE,SAASmF,EAAE;AAC3B,MAAA8B,EAAE,IAAIE,EAAE,OAAOA,EAAE,CAAC,CAAC;AACrB,QAAID,IAAI;AACR,WAAOA,IAAIlH,EAAE,UAAU;AACrB,YAAMmH,IAAIF,EAAE,IAAIC,CAAC;AACjB,MAAAC,KAAKH,EAAE,KAAKG,CAAC,GAAGD,KAAKC,EAAE,WAAWH,EAAE,KAAKhH,EAAEkH,CAAC,CAAC,GAAGA;AAAA,IAClD;AAAA,EACF;AACA,SAAOF;AACT;AACA,SAASqC,GAAGrJ,GAAGgH,GAAG;AAChB,QAAMC,IAAI,SAAS,cAAc,GAAG;AACpC,EAAAA,EAAE,OAAOjH,GAAGiH,EAAE,WAAWD,GAAGC,EAAE,MAAK;AACrC;AACA,SAASqC,GAAGtJ,GAAGgH,GAAG;AAChB,SAAOuC,GAAG,GAAGvJ,GAAGgH,CAAC;AACnB;AACA,SAASuC,GAAGvJ,GAAGgH,GAAGC,GAAG;AACnB,MAAIC,IAAI,GAAGC,IAAI;AACf,QAAMC,IAAI,SAASC,GAAG;AACpB,IAAAH,KAAqB,oBAAI,KAAI,GAAI,QAAO,IAAKC,IAAI,MAAMD,IAAI,IAAI,GAAGC,KAAqB,oBAAI,QAAQ,WAAWD,KAAKlH,IAAI,MAAMiH,EAAEI,CAAC,GAAGH,IAAI;AAAA,EACzI;AACA,SAAOF,EAAE,iBAAiB,SAASI,CAAC,GAAG,MAAM;AAC3C,IAAAJ,EAAE,oBAAoB,SAASI,CAAC;AAAA,EAClC;AACF;AAIA,SAASoC,GAAGxJ,GAAG;AACb,SAAO,MAAM,QAAQA,CAAC;AACxB;AACA,SAASyJ,GAAGzJ,GAAG;AACb,SAAO,OAAO,UAAU,SAAS,KAAKA,CAAC,MAAM;AAC/C;AACA,SAAS0J,GAAG1J,GAAG;AACb,SAAO,OAAO,UAAU,SAAS,KAAKA,CAAC,MAAM;AAC/C;AAIA,SAAS2J,GAAG3J,GAAG;AACb,iBAAe,MAAM;AACnB,IAAAA,EAAC;AAAA,EACH,CAAC;AACH;AACA,SAAS4J,GAAG5J,GAAG;AACb,QAAMgH,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,GAAKC,IAAI;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACE,MAAI,CAACjH,KAAK,MAAMA,CAAC,EAAG,QAAO;AAC3B,QAAMkH,IAAIlH,EAAE,SAAQ,EAAG,MAAM,EAAE;AAC/B,MAAImH,IAAI;AACR,WAASC,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,UAAMC,IAAIH,EAAE,SAAS,IAAIE;AACzB,IAAAD,IAAI,GAAGF,EAAEG,CAAC,CAAC,GAAGD,CAAC,IAAIA,IAAI,GAAGH,EAAE,OAAOE,EAAEG,CAAC,CAAC,CAAC,CAAC,GAAGF,CAAC;AAAA,EAC/C;AACA,SAAOA,IAAIA,EAAE,QAAQ,aAAa,GAAG,EAAE,QAAQ,OAAO,GAAG,GAAGA,IAAIA,EAAE,QAAQ,OAAO,GAAG,GAAGA,IAAIA,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,GAAGA,IAAIA,EAAE,QAAQ,OAAO,GAAG,GAAGA,IAAIA,EAAE,QAAQ,OAAO,EAAE,GAAGA,IAAIA,EAAE,QAAQ,QAAQ,GAAG,GAAGA;AACzN;AACA,SAAS0C,GAAG7J,GAAGgH,GAAGC,GAAG;AACnB,WAASC,IAAI,GAAGA,IAAIlH,EAAE,QAAQkH,KAAK;AACjC,UAAMC,IAAInH,EAAEkH,CAAC,GAAGE,IAAIJ,EAAEG,CAAC;AACvB,IAAAC,MAAM,SAASH,EAAEE,CAAC,IAAIC,IAAI,OAAOH,EAAEE,CAAC;AAAA,EACtC;AACF;AACA,SAAS2C,GAAG9J,GAAGgH,GAAG;AAChB,SAAOqB,GAAGrI,GAAGgH,CAAC;AAChB;AACA,SAAS+C,GAAG/J,GAAGgH,GAAG;AAChB,SAAOuB,GAAGvI,GAAGgH,CAAC;AAChB;AACA,SAASgD,GAAGhK,GAAG;AACb,QAAMiH,IAAI,IAAI,YAAW,EAAG,OAAOjH,CAAC,GAAGkH,IAAI,MAAM,KAAKD,GAAG,CAACG,MAAM,OAAO,aAAaA,CAAC,CAAC;AACtF,SAAO,OAAO,KAAKF,EAAE,KAAK,EAAE,CAAC;AAC/B;AACA,SAAS+C,GAAGjK,GAAG;AACb,MAAIgH,IAAIhH,EAAE;AACV,SAAOgH,KAAK;AACV,UAAME,IAAI,OAAO,iBAAiBF,CAAC,EAAE,iBAAiB,YAAY;AAClE,QAAIA,EAAE,eAAeA,EAAE,iBAAiBE,MAAM,UAAUA,MAAM;AAC5D,aAAOF;AACT,IAAAA,IAAIA,EAAE;AAAA,EACR;AACA,SAAO,SAAS;AAClB;AACA,SAASkD,GAAGlK,GAAGgH,GAAG;AAChB,QAAMC,IAAIjH,EAAE,GAAGkH,IAAIlH,EAAE,IAAIA,EAAE,OAAOmH,IAAInH,EAAE,GAAGoH,IAAIpH,EAAE,IAAIA,EAAE,QAAQqH,IAAIL,EAAE,GAAGW,IAAIX,EAAE,IAAIA,EAAE,OAAOY,IAAIZ,EAAE,GAAGa,IAAIb,EAAE,IAAIA,EAAE;AAChH,SAAO,EAAEC,IAAIU,KAAKT,IAAIG,KAAKF,IAAIU,KAAKT,IAAIQ;AAC1C;AACA,SAASuC,GAAGnK,GAAG;AACb,SAAOA,KAAK;AACd;AACA,SAASoK,GAAGpK,GAAG;AACb,SAAOA,EAAE,QAAQ,YAAY;AAAA,CAC9B;AACD;AAOA,MAAMqK,KAAK,OAAO,YAAY,OAAO,WAAW,KAAK,UAAU,SAAS,GAAGC,KAAK,OAAO,YAAY,OAAO,cAAc,KAAK,UAAU,SAAS,GAAGC,KAAK,OAAO,YAAY,OAAO,kEAAkE,KAAK,UAAU,SAAS;AAC5Q,SAASC,GAAGxK,GAAG;AACb,SAAOqK,KAAKrK,EAAE,UAAUA,EAAE;AAC5B;AAIA,SAASyK,GAAGzK,IAAI,IAAI;AAClB,MAAI0K,GAAGC,GAAGC;AACV,QAAM5D,IAAI;AAAA,IACR,GAAGL;AAAA,IACH,GAAG3G,EAAE;AAAA,EACT,GAAKiH,IAAI;AAAA,IACL,GAAGZ;AAAA,IACH,GAAGrG,EAAE;AAAA,EACT,GAAKkH,IAAI;AAAA,IACL,GAAGf;AAAAA,IACH,GAAGnG,EAAE;AAAA,EACT,GAAKmH,IAAI;AAAA,IACL,GAAGvC;AAAA,IACH,GAAG5E,EAAE;AAAA,EACT,GAAKoH,IAAI;AAAA,IACL,GAAG9B;AAAA,IACH,GAAGtF,EAAE;AAAA,EACT,GAAKqH,IAAI;AAAA,IACL,GAAGnB;AAAA,IACH,GAAGlG,EAAE;AAAA,EACT,GAAK2H,IAAI;AAAA,IACL,GAAG1B;AAAA,IACH,GAAGjG,EAAE;AAAA,EACT,GAAK4H,IAAI;AAAA,IACL,GAAGnB;AAAA,IACH,GAAGzG,EAAE;AAAA,EACT,GAAK6H,IAAI;AAAA,IACL,GAAGpD;AAAA,IACH,GAAGzE,EAAE;AAAA,EACT,GAAK8H,IAAI;AAAA,IACL,GAAGvC;AAAAA,IACH,GAAGvF,EAAE;AAAA,EACT,GAAK+H,IAAI;AAAA,IACL,GAAGjC;AAAA,IACH,GAAG9F,EAAE;AAAA,EACT,GAAKgI,IAAI;AAAA,IACL,GAAG5B;AAAA,IACH,GAAGpG,EAAE;AAAA,EACT,GAAKiI,IAAI;AAAA,IACL,GAAGzB;AAAA,IACH,GAAGxG,EAAE;AAAA,EACT,GAAK,IAAI;AAAA,IACL,GAAG6G;AAAA,IACH,GAAG7G,EAAE;AAAA,EACT,GAAKmI,IAAI;AAAA,IACL,GAAGpC;AAAA,IACH,GAAG/F,EAAE;AAAA,EACT,GAAK6K,IAAI;AAAA,IACL,GAAGvE;AAAA,IACH,GAAGtG,EAAE;AAAA,EACT,GAAK8K,IAAI;AAAA,IACL,GAAGpE;AAAA,IACH,GAAG1G,EAAE;AAAA,EACT,GAAK+K,IAAI;AAAA,IACL,GAAGnE;AAAA,IACH,GAAG5G,EAAE;AAAA,EACT,GAAKgL,IAAI;AAAA,IACL,GAAGzE;AAAA,IACH,GAAGvG,EAAE;AAAA,EACT,GAAKiL,IAAI;AAAA,IACL,GAAGjF;AAAA,IACH,GAAGhG,EAAE;AAAA,EACT,GAAKkL,IAAI;AAAA,IACL,OAAO;AAAA,MACL,GAAGnI,GAAG;AAAA,MACN,IAAI2H,IAAI1K,EAAE,aAAa,OAAO,SAAS0K,EAAE;AAAA,IAC/C;AAAA,IACI,UAAU;AAAA,MACR,GAAG3H,GAAG;AAAA,MACN,IAAI4H,IAAI3K,EAAE,aAAa,OAAO,SAAS2K,EAAE;AAAA,IAC/C;AAAA,IACI,MAAM;AAAA,MACJ,GAAG5H,GAAG;AAAA,MACN,IAAI6H,IAAI5K,EAAE,aAAa,OAAO,SAAS4K,EAAE;AAAA,IAC/C;AAAA,EACA,GAAKO,IAAI;AAAA,IACL,SAAS;AAAA,IACT,GAAGnL,EAAE;AAAA,EACT;AACE,SAAO;AAAA,IACL,MAAMe,GAAG;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,6BAA6B;AAAA,IAC7B,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,SAAS,CAAC,IAAI,KAAK,IAAI,GAAG;AAAA,IAC1B,UAAUE,GAAG;AAAA,IACb,YAAYG,GAAG;AAAA,IACf,uBAAuB;AAAA,IACvB,gBAAgBF,GAAG;AAAA,IACnB,eAAe;AAAA,IACf,uBAAuB;AAAA,IACvB,WAAWC,GAAG;AAAA,IACd,iBAAiB;AAAA,IACjB,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,IACvB,aAAa,CAACkC,GAAG,OAAO;AAAA,IACxB,qBAAqB,CAAA;AAAA,IACrB,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,GAAGrD;AAAA,IACH,OAAOgH;AAAA,IACP,QAAQC;AAAA,IACR,QAAQC;AAAA,IACR,YAAYC;AAAA,IACZ,WAAWC;AAAA,IACX,SAASC;AAAA,IACT,UAAUM;AAAA,IACV,OAAOC;AAAA,IACP,QAAQC;AAAA,IACR,OAAOC;AAAA,IACP,aAAaC;AAAA,IACb,OAAOC;AAAA,IACP,WAAWC;AAAA,IACX,MAAM;AAAA,IACN,YAAYE;AAAA,IACZ,WAAW0C;AAAA,IACX,WAAWC;AAAA,IACX,YAAYC;AAAA,IACZ,YAAYC;AAAA,IACZ,OAAOC;AAAA,IACP,UAAUC;AAAA,IACV,aAAaC;AAAA,IACb,cAAcnL,EAAE,gBAAgB;AAAA,IAChC,qBAAqBA,EAAE,uBAAuB;AAAA,IAC9C,qBAAqBA,EAAE,uBAAuB;AAAA,IAC9C,iBAAiBA,EAAE,mBAAmB;AAAA,IACtC,eAAeA,EAAE,iBAAiB;AAAA,IAClC,qBAAqBA,EAAE,uBAAuB;AAAA,IAC9C,qBAAqBA,EAAE,uBAAuB;AAAA,IAC9C,sBAAsBA,EAAE,wBAAwB;AAAA,EACpD;AACA;AACA,MAAMoL,KAAK,CAAC,iBAAiB,mBAAmB;AAChD,SAASC,GAAGrL,GAAG;AACb,QAAMgH,IAAI,CAAA;AACV,WAASC,IAAI,GAAGA,IAAIjH,EAAE,QAAQiH,KAAK;AACjC,UAAMC,IAAIlH,EAAEiH,CAAC,GAAGE,IAAIiC,GAAElC,EAAE,KAAK;AAC7B,aAASE,IAAI,GAAGA,IAAID,EAAE,QAAQC;AAC5B,MAAAJ,EAAE,KAAK,EAAE,GAAGE,GAAG,OAAOC,EAAEC,CAAC,GAAG;AAAA,EAChC;AACA,SAAOJ;AACT;AAIA,SAASsE,GAAGtL,GAAG;AACb,SAAOA,KAAK8I,GAAC;AACf;AA6DA,SAASyC,GAAEvL,GAAGgH,GAAG;AACf,MAAIY;AACJ,QAAM;AAAA,IACJ,sBAAsB,IAAI;AAAA,IAC1B,qBAAqBV,IAAI;AAAA,IACzB,eAAeC;AAAA,IACf,YAAYC;AAAA,EAChB,IAAMJ,GAAGK,IAAIrH,EAAE,CAAC;AACd,GAACkH,KAAK,MAAMG,KAAK,OAAO,SAASA,EAAE,UAAUhG,EAAE,SAASgG,KAAK,QAAQA,EAAE,QAAQA,EAAE,SAAShG,EAAE,QAAQ,CAACgE,GAAG,KAAKgC,KAAK,OAAO,SAASA,EAAE,KAAK,OAAOrH,EAAE,QAAQ;AAAA,IACxJ,OAAOgD;AAAAA,IACP,SAASqE,KAAK,OAAO,SAASA,EAAE;AAAA,IAChC,QAAQA,KAAK,OAAO,SAASA,EAAE;AAAA,IAC/B,UAAUA,KAAK,OAAO,SAASA,EAAE;AAAA,IACjC,WAAWA,KAAK,OAAO,SAASA,EAAE;AAAA,IAClC,WAAWA,KAAK,OAAO,SAASA,EAAE;AAAA,IAClC,YAAYA,KAAK,OAAO,SAASA,EAAE;AAAA,IACnC,aAAaA,KAAK,OAAO,SAASA,EAAE;AAAA,IACpC,qBAAqBA,KAAK,OAAO,SAASA,EAAE;AAAA,IAC5C,wBAAwBA,KAAK,OAAO,SAASA,EAAE;AAAA,IAC/C,uBAAuBA,KAAK,OAAO,SAASA,EAAE;AAAA,IAC9C,0BAA0BA,KAAK,OAAO,SAASA,EAAE;AAAA,EACrD,CAAG;AACD,MAAIM,IAAI;AACR,SAAOA,IAAI3H,EAAE,UAAU;AACrB,QAAI6H,IAAI7H,EAAE2H,CAAC;AACX,QAAIE,EAAE,SAASxG,EAAE,OAAO;AACtB,MAAArB,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAMG,IAAID,EAAE,aAAa,CAAA;AACzB,UAAI0D,GAAEzD,GAAG;AAAA,QACP,GAAGd;AAAA,QACH,sBAAsB;AAAA,QACtB,qBAAqB;AAAA,MAC7B,CAAO,GAAGc,EAAE,QAAQ;AACZ,cAAMC,IAAIuD,GAAGzD,EAAE,OAAO,GAAGG,IAAIb,EAAE;AAC/B,iBAASc,IAAI,GAAGA,IAAIH,EAAE,QAAQG,KAAK;AACjC,gBAAMC,IAAIJ,EAAEG,CAAC;AACb,UAAAC,EAAE,QAAQL,EAAE,OAAOA,EAAE,UAAUK,EAAE,UAAUH,GAAGG,EAAE,QAAQL,EAAE,QAAQ2D,GAAGtD,CAAC,MAAMA,EAAE,SAASA,EAAE,OAAOF,EAAExC,GAAG0C,EAAE,KAAK,CAAC,IAAIA,EAAE,SAAS,WAAWA,EAAE,OAAO,MAAMlI,EAAE,OAAO2H,GAAG,GAAGO,CAAC,GAAGP;AAAA,QAC3K;AAAA,MACF;AACA,MAAAA;AAAA,IACF,WAAWE,EAAE,SAASxG,EAAE,MAAM;AAC5B,MAAArB,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAMG,IAAID,EAAE,aAAa,CAAA;AACzB,UAAI0D,GAAEzD,GAAG;AAAA,QACP,GAAGd;AAAA,QACH,sBAAsB;AAAA,QACtB,qBAAqB;AAAA,MAC7B,CAAO,GAAGc,EAAE,QAAQ;AACZ,cAAMC,IAAIe,GAAC;AACX,iBAASd,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,gBAAMC,IAAIH,EAAEE,CAAC;AACb,UAAAC,EAAE,SAASF,GAAGE,EAAE,WAAWJ,EAAE,UAAUI,EAAE,YAAYJ,EAAE,WAAW7H,EAAE,OAAO2H,GAAG,GAAGM,CAAC,GAAGN;AAAA,QACvF;AAAA,MACF;AACA,MAAAA;AAAA,IACF,WAAWE,EAAE,SAASxG,EAAE,MAAM;AAC5B,MAAArB,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAMG,KAAKD,KAAK,OAAO,SAASA,EAAE,cAAc,CAAA;AAChD,UAAI0D,GAAEzD,GAAG;AAAA,QACP,GAAGd;AAAA,QACH,sBAAsB;AAAA,QACtB,qBAAqB;AAAA,MAC7B,CAAO,GAAGc,EAAE,QAAQ;AACZ,cAAMC,IAAIe,GAAC;AACX,iBAASd,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,gBAAMC,IAAIH,EAAEE,CAAC;AACb,cAAIC,EAAE,SAASJ,EAAE,UAAUE,GAAGE,EAAE,OAAOJ,EAAE,MAAMI,EAAE,YAAYD,GAAGC,EAAE,SAAS5G,EAAE,OAAO;AAClF,kBAAM6G,IAAID,EAAE;AACZ,qBAASE,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,oBAAM0C,IAAI3C,EAAEC,CAAC;AACb,uBAAS2C,IAAI,GAAGA,IAAID,EAAE,OAAO,QAAQC,KAAK;AACxC,sBAAME,IAAIH,EAAE,OAAOC,CAAC,EAAE;AACtB,yBAASG,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,wBAAMC,IAAIF,EAAEC,CAAC;AACb,kBAAAC,EAAE,SAASrD,EAAE,UAAUE,GAAGmD,EAAE,OAAOrD,EAAE;AAAA,gBACvC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,UAAA7H,EAAE,OAAO2H,GAAG,GAAGM,CAAC,GAAGN;AAAA,QACrB;AAAA,MACF;AACA,MAAAA;AAAA,IACF,WAAWE,EAAE,SAASxG,EAAE,OAAO;AAC7B,YAAMyG,IAAID,EAAE,MAAMiB,GAAC;AACnB,UAAIjB,EAAE,KAAKC,GAAGD,EAAE,QAAQ;AACtB,cAAM,EAAE,oBAAoBE,EAAC,IAAKZ,EAAE;AACpC,iBAASa,IAAI,GAAGA,IAAIH,EAAE,OAAO,QAAQG,KAAK;AACxC,gBAAMC,IAAIJ,EAAE,OAAOG,CAAC,GAAGE,IAAID,EAAE,MAAMa,GAAC;AACpC,UAAAb,EAAE,KAAKC,IAAI,CAACD,EAAE,aAAaA,EAAE,YAAYF,OAAOE,EAAE,YAAYF,IAAIE,EAAE,SAASA,EAAE,cAAcA,EAAE,SAASA,EAAE;AAC1G,mBAASE,IAAI,GAAGA,IAAIF,EAAE,OAAO,QAAQE,KAAK;AACxC,kBAAM0C,IAAI5C,EAAE,OAAOE,CAAC,GAAG2C,IAAID,EAAE,MAAM/B,GAAC;AACpC,YAAA+B,EAAE,KAAKC,GAAGS,GAAEV,EAAE,OAAO;AAAA,cACnB,GAAG7D;AAAA,cACH,sBAAsB;AAAA,cACtB,qBAAqB;AAAA,YACnC,CAAa;AACD,qBAAS,IAAI,GAAG,IAAI6D,EAAE,MAAM,QAAQ,KAAK;AACvC,oBAAMG,IAAIH,EAAE,MAAM,CAAC;AACnB,cAAAG,EAAE,OAAOF,GAAGE,EAAE,OAAO9C,GAAG8C,EAAE,UAAUlD;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAWD,EAAE,SAASxG,EAAE,WAAW;AACjC,MAAArB,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAMG,IAAIuD,GAAGxD,EAAE,aAAa,CAAA,CAAE;AAC9B,UAAIC,EAAE,QAAQ;AACZ,cAAMC,IAAIe,GAAC;AACX,iBAASd,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,gBAAMC,IAAIH,EAAEE,CAAC;AACb,UAAAC,EAAE,OAAOJ,EAAE,MAAMI,EAAE,MAAMJ,EAAE,KAAKI,EAAE,cAAcF,GAAG/H,EAAE,OAAO2H,GAAG,GAAGM,CAAC,GAAGN;AAAA,QACxE;AAAA,MACF;AACA,MAAAA;AAAA,IACF,WAAWE,EAAE,SAASxG,EAAE,MAAM;AAC5B,MAAArB,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAMG,IAAIuD,GAAGxD,EAAE,aAAa,CAAA,CAAE;AAC9B,UAAIC,EAAE,QAAQ;AACZ,cAAMC,IAAIe,GAAC;AACX,iBAASd,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,gBAAMC,IAAIH,EAAEE,CAAC;AACb,UAAAC,EAAE,OAAOJ,EAAE,MAAMI,EAAE,aAAaJ,EAAE,YAAYI,EAAE,SAASF,GAAG/H,EAAE,OAAO2H,GAAG,GAAGM,CAAC,GAAGN;AAAA,QACjF;AAAA,MACF;AACA,MAAAA;AAAA,IACF,WAAWE,EAAE,SAASxG,EAAE,SAAS;AAC/B,UAAI,CAACwG,EAAE,SAAS;AACd,QAAAF;AACA;AAAA,MACF;AACA,YAAM;AAAA,QACJ,QAAQG;AAAA,QACR,SAASC;AAAA,QACT,SAASC;AAAA,QACT,UAAUC;AAAA,QACV,OAAOC;AAAA,QACP,aAAaC;AAAA,QACb,MAAM0C;AAAA,QACN,MAAMC;AAAA,QACN,WAAW;AAAA,MACnB,IAAUjD,EAAE,SAAS;AAAA,QACb,eAAe;AAAA,UACb,SAASmD;AAAA,UACT,UAAU;AAAA,UACV,OAAOE;AAAA,QACjB;AAAA,MACA,IAAUlE,GAAGmE,IAAItD,EAAE,aAAaiB,GAAC;AAC3B,MAAA9I,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAM+C,IAAIZ,GAAGjC,GAAG;AAAA,QACd,GAAG3D;AAAA,QACH,GAAGV;AAAA,MACX,CAAO,GAAGmH,IAAIb;AAAA,QACNjC,EAAE;AAAA,QACF7D;AAAA,MACR,GAAS4G,IAAI;AAAA,QACL,GAAGD;AAAA,QACH,OAAOxD,EAAE,QAAQ;AAAA,MACzB,GAASsE,IAAIrC,GAAEtB,KAAKkD,EAAE,MAAM;AACtB,eAASU,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,cAAMC,IAAIF,EAAEC,CAAC;AACb,QAAA1L,EAAE,OAAO2H,GAAG,GAAG;AAAA,UACb,GAAG+C;AAAA,UACH,GAAGE;AAAA,UACH,WAAWO;AAAA,UACX,OAAOQ;AAAA,UACP,MAAM9D,EAAE;AAAA,UACR,SAASA,EAAE;AAAA,UACX,kBAAkBnH,EAAE;AAAA,QAC9B,CAAS,GAAGiH;AAAA,MACN;AACA,UAAIK,GAAG;AACL,cAAM0D,IAAItC,GAAEpB,CAAC;AACb,iBAAS2D,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,gBAAMC,IAAIF,EAAEC,CAAC;AACb,UAAA3L,EAAE,OAAO2H,GAAG,GAAG;AAAA,YACb,GAAG+C;AAAA,YACH,GAAGC;AAAA,YACH,WAAWQ;AAAA,YACX,OAAOS;AAAA,YACP,MAAM/D,EAAE;AAAA,YACR,SAASA,EAAE;AAAA,YACX,kBAAkBnH,EAAE;AAAA,UAChC,CAAW,GAAGiH;AAAA,QACN;AAAA,MACF;AACA,UAAIO,KAAKA,EAAE,UAAU4C,MAAMrK,GAAE,YAAYqK,MAAMrK,GAAE,SAASqK,MAAMrK,GAAE,UAAUoK,MAAM,CAAC3C,KAAK,CAACA,EAAE,SAAS;AAClG,YAAIwD,IAAIxD,IAAIe,GAAGf,CAAC,IAAI,CAAA;AACpB,YAAI4C,MAAMrK,GAAE,UAAU;AACpB,gBAAMkL,IAAId,IAAIA,EAAE,MAAM,GAAG,IAAI,CAAA;AAC7B,cAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,QAAQ;AAChC,kBAAMe,IAAIF,EAAE;AAAA,cACV,CAACG,GAAGC,MAAMD,EAAE;AAAA,gBACVC,EAAE,MAAM,MAAM,EAAE,EAAE,IAAI,CAACC,OAAO,EAAE,GAAGD,GAAG,OAAOC,EAAC,EAAG;AAAA,cACjE;AAAA,cACc,CAAA;AAAA,YACd;AACY,gBAAIC,IAAI;AACR,qBAASH,IAAI,GAAGA,IAAI,EAAE,QAAQA,KAAK;AACjC,oBAAMC,IAAI,EAAED,CAAC;AACb,cAAA7L,EAAE,OAAO2H,GAAG,GAAG;AAAA,gBACb,GAAG+C;AAAA,gBACH,GAAGC;AAAA,gBACH,WAAWQ;AAAA,gBACX,OAAO;AAAA,gBACP,MAAMtD,EAAE;AAAA,gBACR,SAASA,EAAE;AAAA,gBACX,kBAAkBnH,EAAE;AAAA,gBACpB,UAAU;AAAA,kBACR,MAAMoL,EAAE;AAAA,kBACR,OAAOH,EAAE,SAASG,EAAE,IAAI;AAAA,gBAC1C;AAAA,cACA,CAAe,GAAGnE;AACJ,oBAAMoE,IAAI3C,GAAE0C,EAAE,KAAK;AACnB,uBAASG,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,sBAAMC,IAAKH,EAAEE,CAAC,GAAGE,IAAKF,MAAMF,EAAE,SAAS;AACvC,gBAAA/L,EAAE,OAAO2H,GAAG,GAAG;AAAA,kBACb,GAAG+C;AAAA,kBACH,GAAGC;AAAA,kBACH,GAAGiB,EAAEI,CAAC;AAAA,kBACN,WAAWb;AAAA,kBACX,OAAOe,MAAO;AAAA,IAC5BlJ,IAAIkJ;AAAA,kBACU,eAAeC,IAAK,EAAE,MAAM;AAAA,kBAC5B,SAAStE,EAAE;AAAA,kBACX,kBAAkBnH,EAAE;AAAA,gBACtC,CAAiB,GAAGsL,KAAKrE;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAWmD,MAAMrK,GAAE;AACjB,cAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,QAAQ;AAChC,kBAAMkL,IAAID,EAAE;AAAA,cACV,CAACM,GAAGH,MAAMG,EAAE;AAAA,gBACVH,EAAE,MAAM,MAAM,EAAE,EAAE,IAAI,CAACC,OAAO,EAAE,GAAGD,GAAG,OAAOC,EAAC,EAAG;AAAA,cACjE;AAAA,cACc,CAAA;AAAA,YACd;AACY,gBAAIF,IAAI;AACR,qBAASI,IAAI,GAAGA,IAAI,EAAE,QAAQA,KAAK;AACjC,oBAAMH,IAAI,EAAEG,CAAC;AACb,cAAAhM,EAAE,OAAO2H,GAAG,GAAG;AAAA,gBACb,GAAG+C;AAAA,gBACH,GAAGC;AAAA,gBACH,WAAWQ;AAAA,gBACX,OAAO;AAAA,gBACP,MAAMtD,EAAE;AAAA,gBACR,SAASA,EAAE;AAAA,gBACX,kBAAkBnH,EAAE;AAAA,gBACpB,OAAO;AAAA,kBACL,MAAMmL,EAAE;AAAA,kBACR,OAAOhB,MAAMgB,EAAE;AAAA,gBACjC;AAAA,cACA,CAAe,GAAGlE;AACJ,oBAAMmE,IAAI1C,GAAEyC,EAAE,KAAK;AACnB,uBAASE,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,sBAAME,IAAIH,EAAEC,CAAC,GAAGG,IAAKH,MAAMD,EAAE,SAAS;AACtC,gBAAA9L,EAAE,OAAO2H,GAAG,GAAG;AAAA,kBACb,GAAG+C;AAAA,kBACH,GAAGC;AAAA,kBACH,GAAGgB,EAAEC,CAAC;AAAA,kBACN,WAAWT;AAAA,kBACX,OAAOc,MAAM;AAAA,IAC3BjJ,IAAIiJ;AAAA,kBACU,eAAeC,IAAKhB,EAAE,MAAM;AAAA,kBAC5B,SAASrD,EAAE;AAAA,kBACX,kBAAkBnH,EAAE;AAAA,gBACtC,CAAiB,GAAGkL,KAAKjE;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,eACK;AACL,eAAK,CAACO,KAAK,CAACA,EAAE,WAAW,MAAM,QAAQ,CAAC,KAAK,EAAE,QAAQ;AACrD,kBAAMyD,IAAI,EAAE,KAAK,CAACC,MAAMA,EAAE,SAASf,CAAC;AACpC,YAAAc,MAAMD,IAAI;AAAA,cACR;AAAA,gBACE,OAAOC,EAAE;AAAA,cACzB;AAAA,YACA;AAAA,UACU;AACAJ,UAAAA,GAAEG,GAAG;AAAA,YACH,GAAG1E;AAAA,YACH,sBAAsB;AAAA,YACtB,qBAAqB;AAAA,UACjC,CAAW;AACD,mBAAS2E,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,kBAAMC,IAAIF,EAAEC,CAAC,GAAGK,IAAIJ,EAAE;AACtB,YAAA5L,EAAE,OAAO2H,GAAG,GAAG;AAAA,cACb,GAAG+C;AAAA,cACH,GAAGC;AAAA,cACH,GAAGiB;AAAA,cACH,WAAWT;AAAA,cACX,OAAOa,MAAM;AAAA,IACvBhJ,IAAIgJ;AAAA,cACM,MAAMJ,EAAE,QAAQvK,EAAE;AAAA,cAClB,SAASwG,EAAE;AAAA,cACX,kBAAkBnH,EAAE;AAAA,YAClC,CAAa,GAAGiH;AAAA,UACN;AAAA,QACF;AAAA,MACF,WAAWQ,GAAG;AACZ,cAAMuD,IAAI;AAAA,UACR,GAAGf;AAAA,UACH,OAAOxD,EAAE,QAAQ;AAAA,QAC3B,GAAWwE,IAAIvC,GAAEjB,CAAC;AACV,iBAASyD,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,gBAAMI,IAAIL,EAAEC,CAAC;AACb,UAAA5L,EAAE,OAAO2H,GAAG,GAAG;AAAA,YACb,GAAG+C;AAAA,YACH,GAAGgB;AAAA,YACH,WAAWP;AAAA,YACX,OAAOa,MAAM;AAAA,IACrBhJ,IAAIgJ;AAAA,YACI,MAAMnE,EAAE;AAAA,YACR,SAASA,EAAE;AAAA,YACX,kBAAkBnH,EAAE;AAAA,UAChC,CAAW,GAAGiH;AAAA,QACN;AAAA,MACF;AACA,UAAIM,GAAG;AACL,cAAMyD,IAAItC,GAAEnB,CAAC;AACb,iBAAS0D,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,gBAAMC,IAAIF,EAAEC,CAAC;AACb,UAAA3L,EAAE,OAAO2H,GAAG,GAAG;AAAA,YACb,GAAG+C;AAAA,YACH,GAAGC;AAAA,YACH,WAAWQ;AAAA,YACX,OAAOS;AAAA,YACP,MAAM/D,EAAE;AAAA,YACR,SAASA,EAAE;AAAA,YACX,kBAAkBnH,EAAE;AAAA,UAChC,CAAW,GAAGiH;AAAA,QACN;AAAA,MACF;AACA,YAAMyE,IAAIhD,GAAErB,KAAKiD,EAAE,OAAO;AAC1B,eAASU,IAAI,GAAGA,IAAIU,EAAE,QAAQV,KAAK;AACjC,cAAMC,IAAIS,EAAEV,CAAC;AACb,QAAA1L,EAAE,OAAO2H,GAAG,GAAG;AAAA,UACb,GAAG+C;AAAA,UACH,GAAGE;AAAA,UACH,WAAWO;AAAA,UACX,OAAOQ;AAAA,UACP,MAAM9D,EAAE;AAAA,UACR,SAASA,EAAE;AAAA,UACX,kBAAkBnH,EAAE;AAAA,QAC9B,CAAS,GAAGiH;AAAA,MACN;AACA,MAAAA;AAAA,IACF,YAAY,CAACE,EAAE,QAAQ1D,GAAG,SAAS0D,EAAE,IAAI,KAAKA,EAAE,SAASxG,EAAE,kBAAkBuG,IAAIC,EAAE,UAAU,OAAO,SAASD,EAAE,UAAU,GAAG;AAC1H,MAAA5H,EAAE,OAAO2H,GAAG,CAAC;AACb,YAAMG,IAAIsB,GAAEvB,EAAE,KAAK;AACnB,eAASE,IAAI,GAAGA,IAAID,EAAE,QAAQC;AAC5B,QAAA/H,EAAE,OAAO2H,IAAII,GAAG,GAAG,EAAE,GAAGF,GAAG,OAAOC,EAAEC,CAAC,EAAC,CAAE;AAC1C,MAAAF,IAAI7H,EAAE2H,CAAC;AAAA,IACT;AACA,SAAKE,EAAE,UAAU;AAAA,KAChBA,EAAE,SAAS;AAAA,OACTA,EAAE,QAAQ7E,KAAK6E,EAAE,SAASxG,EAAE,SAASwG,EAAE,SAASxG,EAAE,WAAWwG,EAAE,KAAKA,EAAE,MAAMiB,GAAC,IAAKjB,EAAE,SAASxG,EAAE,SAAS+F,GAAG;AAC5G,YAAM,EAAE,KAAKU,GAAG,OAAOC,GAAG,QAAQC,MAAMZ,EAAES,EAAE,KAAK;AACjD,MAAAA,EAAE,QAAQA,EAAE,SAASE,GAAGF,EAAE,SAASA,EAAE,UAAUG,GAAGH,EAAE,WAAWC,GAAGD,EAAE,KAAKA,EAAE,MAAMiB,GAAC;AAAA,IACpF;AACA,IAAAnB;AAAA,EACF;AACF;AACA,SAAS0E,GAAGrM,GAAGgH,GAAG;AAChB,QAAMC,IAAI,OAAO,KAAKjH,CAAC,GAAGkH,IAAI,OAAO,KAAKF,CAAC;AAC3C,MAAIC,EAAE,WAAWC,EAAE,OAAQ,QAAO;AAClC,WAASC,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,UAAMC,IAAIH,EAAEE,CAAC;AACb,QAAIC,MAAM,WAAW,EAAEA,MAAM,cAAc,MAAM,QAAQpH,EAAEoH,CAAC,CAAC,KAAK,MAAM,QAAQJ,EAAEI,CAAC,CAAC,KAAKE,GAAGtH,EAAEoH,CAAC,GAAGJ,EAAEI,CAAC,CAAC,MAAMpH,EAAEoH,CAAC,MAAMJ,EAAEI,CAAC;AACtH,aAAO;AAAA,EACX;AACA,SAAO;AACT;AACA,SAASkF,GAAGtM,GAAGgH,IAAI,IAAI;AACrB,QAAM,EAAE,gBAAgBC,EAAC,IAAKD,GAAGE,IAAI,CAAC,GAAGxD,EAAE;AAC3C,EAAAuD,KAAKC,EAAE,KAAK,GAAGD,CAAC;AAChB,QAAME,IAAI;AAAA,IACR,OAAOnH,EAAE,UAAUgD,IAAI;AAAA,IACvBhD,EAAE;AAAA,EACN;AACE,SAAOkH,EAAE,QAAQ,CAACE,MAAM;AACtB,UAAMC,IAAIrH,EAAEoH,CAAC;AACb,IAAAC,MAAM,WAAWF,EAAEC,CAAC,IAAIC;AAAA,EAC1B,CAAC,GAAGF;AACN;AACA,SAASoF,GAAEvM,GAAGgH,IAAI,IAAI;AACpB,QAAM,EAAE,gBAAgBC,GAAG,gBAAgBC,IAAI,IAAI,SAASC,IAAI,GAAE,IAAKH,GAAGI,IAAID,IAAI8B,GAAGjJ,CAAC,IAAIA,GAAGqH,IAAI,CAAA;AACjG,MAAIM,IAAI;AACR,SAAOA,IAAIP,EAAE,UAAU;AACrB,QAAIQ,IAAIR,EAAEO,CAAC;AACX,QAAIA,MAAM,KAAKC,EAAE,UAAU5E,KAAK,CAAC4E,EAAE,WAAW,CAACA,EAAE,QAAQA,EAAE,SAASvG,EAAE,OAAO;AAC3E,YAAMyG,IAAIV,EAAEO,IAAI,CAAC;AACjB,MAAAG,KAAKtE,GAAG,QAAQ,CAACuE,MAAM;AACrB,QAAAH,EAAEG,CAAC,MAAM,UAAUD,EAAEC,CAAC,MAAM,WAAWD,EAAEC,CAAC,IAAIH,EAAEG,CAAC;AAAA,MACnD,CAAC,GAAGJ;AACJ;AAAA,IACF;AACA,QAAIC,EAAE,QAAQ;AACZ,YAAME,IAAIF,EAAE,QAAQG,IAAIH,EAAE,MAAMI,IAAI,CAAA;AACpC,aAAOL,IAAIP,EAAE,UAAU;AACrB,cAAMc,IAAId,EAAEO,CAAC;AACb,YAAIG,MAAMI,EAAE,QAAQ;AAClB,UAAAP;AACA;AAAA,QACF;AACA,eAAOO,EAAE,MAAM,OAAOA,EAAE,QAAQF,EAAE,KAAKE,CAAC,GAAGP;AAAA,MAC7C;AACA,YAAMM,IAAIsE,GAAEvE,GAAGhB,CAAC;AAChB,UAAIE,GAAG;AACL,cAAMgB,IAAI;AAAA,UACR,MAAM7G,EAAE;AAAA,UACR,OAAO;AAAA,UACP,QAAQyG;AAAA,UACR,MAAMC;AAAA,QAChB;AACQ,QAAAG,EAAE,YAAYD,GAAGL,IAAIM;AAAA,MACvB,OAAO;AACL,QAAAb,EAAE,OAAOM,GAAG,GAAG,GAAGM,CAAC;AACnB;AAAA,MACF;AAAA,IACF,WAAWL,EAAE,WAAWA,EAAE,OAAO;AAC/B,YAAME,IAAIF,EAAE;AACZ,UAAIE,GAAG;AACL,cAAMC,IAAIH,EAAE,OAAOI,IAAI;AAAA,UACrB,MAAM3G,EAAE;AAAA,UACR,OAAOuG,EAAE;AAAA,UACT,SAASE;AAAA,UACT,OAAO;AAAA,UACP,OAAOC;AAAA,QACjB,GAAWE,IAAI,CAAA;AACP,eAAON,IAAIP,EAAE,UAAU;AACrB,gBAAMc,IAAId,EAAEO,CAAC;AACb,cAAIG,MAAMI,EAAE,SAAS;AACnB,YAAAP;AACA;AAAA,UACF;AACA,iBAAOO,EAAE,OAAO,OAAOA,EAAE,OAAOD,EAAE,KAAKC,CAAC,GAAGP;AAAA,QAC7C;AACA,QAAAK,EAAE,YAAYuE,GAAEtE,GAAGjB,CAAC,GAAGY,IAAII;AAAA,MAC7B;AAAA,IACF,WAAWJ,EAAE,UAAUA,EAAE,UAAU;AACjC,YAAME,IAAIF,EAAE;AACZ,UAAIE,GAAG;AACL,cAAMC,IAAIH,EAAE,UAAUI,IAAIJ,EAAE,WAAWK,IAAI;AAAA,UACzC,MAAM5G,EAAE;AAAA,UACR,OAAO;AAAA,UACP,QAAQyG;AAAA,UACR,UAAUC;AAAA,UACV,WAAWC;AAAA,QACrB,GAAWE,IAAI,CAAA;AACP,eAAOP,IAAIP,EAAE,UAAU;AACrB,gBAAMe,IAAIf,EAAEO,CAAC;AACb,cAAIG,MAAMK,EAAE,QAAQ;AAClB,YAAAR;AACA;AAAA,UACF;AACA,iBAAOQ,EAAE,UAAU,OAAOA,EAAE,WAAWD,EAAE,KAAKC,CAAC,GAAGR;AAAA,QACpD;AACA,QAAAM,EAAE,YAAYsE,GAAErE,GAAGlB,CAAC,GAAGY,IAAIK;AAAA,MAC7B;AAAA,IACF,WAAWL,EAAE,SAASvG,EAAE,OAAO;AAC7B,UAAIuG,EAAE,UAAU;AACd,YAAIE,IAAIH,IAAI,GAAGI,IAAI;AACnB,eAAOD,IAAIV,EAAE,UAAU;AACrB,gBAAMY,IAAIZ,EAAEU,CAAC;AACb,cAAIE,EAAE,aAAaJ,EAAE;AACnB,YAAAA,EAAE,UAAUI,EAAE,QAAQJ,EAAE,OAAO,KAAK,GAAGI,EAAE,MAAM,GAAGF,KAAKC;AAAA;AAEvD;AAAA,QACJ;AACA,QAAAJ,KAAKI;AAAA,MACP;AACA,UAAIH,EAAE;AACJ,iBAASE,IAAI,GAAGA,IAAIF,EAAE,OAAO,QAAQE,KAAK;AACxC,gBAAMC,IAAIH,EAAE,OAAOE,CAAC;AACpB,iBAAOC,EAAE;AACT,mBAASC,IAAI,GAAGA,IAAID,EAAE,OAAO,QAAQC,KAAK;AACxC,kBAAMC,IAAIF,EAAE,OAAOC,CAAC,GAAGE,IAAI;AAAA,cACzB,SAASD,EAAE;AAAA,cACX,SAASA,EAAE;AAAA,cACX,OAAOsE,GAAEtE,EAAE,OAAO;AAAA,gBAChB,GAAGjB;AAAA,gBACH,gBAAgB;AAAA,cAChC,CAAe;AAAA,YACf;AACY,YAAArD,GAAG,QAAQ,CAACwE,MAAM;AAChB,oBAAM0C,IAAI5C,EAAEE,CAAC;AACb,cAAA0C,MAAM,WAAW3C,EAAEC,CAAC,IAAI0C;AAAA,YAC1B,CAAC,GAAG9C,EAAE,OAAOC,CAAC,IAAIE;AAAA,UACpB;AAAA,QACF;AAAA,IACJ,WAAWN,EAAE,SAASvG,EAAE,WAAW;AACjC,YAAMyG,IAAIF,EAAE;AACZ,UAAIE,GAAG;AACL,cAAMC,IAAI;AAAA,UACR,MAAM1G,EAAE;AAAA,UACR,OAAO;AAAA,UACP,KAAKuG,EAAE;AAAA,QACjB,GAAWI,IAAI,CAAA;AACP,eAAOL,IAAIP,EAAE,UAAU;AACrB,gBAAMa,IAAIb,EAAEO,CAAC;AACb,cAAIG,MAAMG,EAAE,aAAa;AACvB,YAAAN;AACA;AAAA,UACF;AACA,iBAAOM,EAAE,MAAM,OAAOA,EAAE,KAAKD,EAAE,KAAKC,CAAC,GAAGN;AAAA,QAC1C;AACA,QAAAI,EAAE,YAAYwE,GAAEvE,GAAGhB,CAAC,GAAGY,IAAIG;AAAA,MAC7B;AAAA,IACF,WAAWH,EAAE,SAASvG,EAAE,MAAM;AAC5B,YAAMyG,IAAIF,EAAE;AACZ,UAAIE,GAAG;AACL,cAAMC,IAAI;AAAA,UACR,MAAM1G,EAAE;AAAA,UACR,OAAO;AAAA,UACP,YAAYuG,EAAE;AAAA,QACxB,GAAWI,IAAI,CAAA;AACP,eAAOL,IAAIP,EAAE,UAAU;AACrB,gBAAMa,IAAIb,EAAEO,CAAC;AACb,cAAIG,MAAMG,EAAE,QAAQ;AAClB,YAAAN;AACA;AAAA,UACF;AACA,iBAAOM,EAAE,MAAM,OAAOA,EAAE,YAAYD,EAAE,KAAKC,CAAC,GAAGN;AAAA,QACjD;AACA,QAAAI,EAAE,YAAYwE,GAAEvE,GAAGhB,CAAC,GAAGY,IAAIG;AAAA,MAC7B;AAAA,IACF,WAAWH,EAAE,WAAW;AACtB,YAAME,IAAIF,EAAE;AACZ,UAAIA,EAAE,qBAAqBlH,EAAE,QAAQ;AACnC,cAAMqH,IAAI,CAAA;AACV,YAAIC,IAAI,IAAIC,IAAIN;AAChB,eAAOM,IAAIb,EAAE,UAAU;AACrB,gBAAMc,IAAId,EAAEa,CAAC;AACb,cAAIH,MAAMI,EAAE,UAAW;AACvB,UAAAA,EAAE,qBAAqBxH,EAAE,UAAU,OAAOwH,EAAE,SAAS,OAAOA,EAAE,WAAWH,EAAE,KAAKG,CAAC,IAAIA,EAAE,qBAAqBxH,EAAE,YAAYsH,IAAI,KAAKC;AAAA,QACrI;AACA,YAAID,GAAG;AACL,gBAAME,IAAI4B,GAAGlC,GAAG5D,EAAE,GAAGmE,IAAI;AAAA,YACvB,GAAGP,EAAE;AAAA,YACL,GAAGM;AAAA,UACf,GAAa2C,IAAI;AAAA,YACL,GAAGf,GAAGlC,GAAGpE,EAAE;AAAA,YACX,MAAMnC,EAAE;AAAA,YACR,OAAO;AAAA,YACP,SAAS8G;AAAA,YACT,WAAWL;AAAA,UACvB;AACU,UAAA+C,EAAE,QAAQ,QAAQ0B,GAAExE,GAAGf,CAAC,GAAGY,IAAI0E,GAAGzB,GAAG,EAAE,gBAAgB5D,EAAC,CAAE,GAAGU,KAAKM,IAAIN,IAAI;AAAA,QAC5E;AAAA,MACF;AACA,UAAIC,EAAE,qBAAqB,OAAOA,EAAE,SAAS,OAAOA,EAAE,WAAWA,EAAE,qBAAqBlH,EAAE,SAASkH,EAAE,qBAAqBlH,EAAE,YAAYkH,EAAE,qBAAqBlH,EAAE,YAAY;AAC3K,QAAAiH;AACA;AAAA,MACF;AAAA,IACF;AACA,UAAME,IAAIyE,GAAG1E,GAAG,EAAE,gBAAgBX,EAAC,CAAE;AACrC,QAAI,CAACW,EAAE,QAAQA,EAAE,SAASvG,EAAE,QAAQuG,EAAE,SAASvG,EAAE,aAAauG,EAAE,SAASvG,EAAE;AACzE,aAAOsG,IAAIP,EAAE,UAAU;AACrB,cAAMU,IAAIV,EAAEO,IAAI,CAAC;AACjB,YAAIA,KAAKG,KAAKuE;AAAA,UACZxE;AAAA,UACAyE,GAAGxE,GAAG,EAAE,gBAAgBb,EAAC,CAAE;AAAA,QACrC,GAAW;AACD,gBAAMc,IAAID,EAAE,UAAU9E,IAAI;AAAA,IAChC8E,EAAE;AACI,UAAAD,EAAE,SAASE;AAAA,QACb;AACE;AAAA,MACJ;AAAA;AAEA,MAAAJ;AACF,IAAAN,EAAE,KAAKQ,CAAC;AAAA,EACV;AACA,SAAOR;AACT;AACA,SAASmF,GAAGxM,GAAG;AACb,UAAQ,OAAO,iBAAiBA,CAAC,EAAE,WAAS;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK;AACH,aAAO8B,GAAE;AAAA,IACX,KAAK;AACH,aAAOA,GAAE;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACH,aAAOA,GAAE;AAAA,IACX,KAAK;AACH,aAAOA,GAAE;AAAA,IACX,KAAK;AACH,aAAOA,GAAE;AAAA,IACX;AACE,aAAOA,GAAE;AAAA,EACf;AACA;AACA,SAAS2K,GAAGzM,GAAG;AACb,SAAOA,MAAM8B,GAAE,YAAY,YAAY9B;AACzC;AACA,SAAS0M,GAAG1M,GAAG;AACb,UAAQA,GAAC;AAAA,IACP,KAAK8B,GAAE;AACL,aAAO;AAAA,IACT,KAAKA,GAAE;AACL,aAAO;AAAA,IACT,KAAKA,GAAE;AACL,aAAO;AAAA,IACT,KAAKA,GAAE;AAAA,IACP,KAAKA,GAAE;AACL,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACb;AACA;AACA,SAAS0J,GAAGxL,GAAG;AACb,SAAO,CAACA,EAAE,QAAQmE,GAAG,SAASnE,EAAE,IAAI;AACtC;AACA,SAAS2M,GAAG3M,GAAGgH,GAAG;AAChB,QAAMC,IAAIjH,EAAEgH,CAAC;AACb,MAAI,CAACC,EAAG,QAAO;AACf,QAAMC,IAAIlH,EAAEgH,IAAI,CAAC;AACjB,SAAO,CAACC,EAAE,UAAUA,EAAE,UAAUjE,KAAKkE,KAAKA,EAAE,UAAUlE,KAAKiE,EAAE,WAAWC,EAAE,SAASA,IAAID;AACzF;AACA,SAAS2F,GAAG5M,GAAGgH,GAAGC,GAAGC,GAAG;AACtB,MAAIW,GAAGC,GAAGC;AACV,MAAIZ,IAAIwF,GAAG3M,GAAGiH,CAAC;AACf,MAAI,CAACE,EAAG;AACR,QAAM,EAAE,iBAAiBC,IAAI,IAAI,eAAeC,EAAC,IAAKH,KAAK,CAAA,GAAI,EAAE,MAAMS,EAAC,IAAKN,KAAK,CAAA;AAClF,EAAAM,MAAM5G,GAAG,WAAY8G,IAAIV,EAAE,UAAU,QAAQU,EAAE,aAAcV,IAAI4C,GAAG5C,GAAGtD,EAAE;AACzE,MAAI+D,IAAI;AACR,WAASI,IAAI,GAAGA,IAAIhB,EAAE,QAAQgB,KAAK;AACjC,UAAMC,IAAIjB,EAAEgB,CAAC;AACb,QAAIZ,KAAK,CAACD,EAAE,UAAU9B,GAAG,KAAK4C,EAAE,KAAK,MAAML,IAAI,KAAKA,KAAK,CAACT,EAAE,UAAUc,EAAE,SAAS5G,EAAE,MAAM;AACvF,YAAM8G,IAAI;AAAA,QACR,GAAGvE;AAAA,QACH,GAAGJ;AAAA,QACH,GAAGS;AAAA,MACX;AACM,MAAA4F,GAAG1B,GAAGhB,GAAGc,CAAC,IAAIH,IAAIG,EAAE,cAAc,QAAQH,EAAE,QAAQ,CAAC+C,MAAM;AACzD,QAAAhB,GAAG1B,GAAGhB,GAAG0D,CAAC;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AACA,KAAC9C,IAAIE,EAAE,cAAc,QAAQF,EAAE,UAAU6E;AAAA,MACvC5M;AAAA,MACAiI,EAAE;AAAA,MACFhB;AAAA,MACAC;AAAA,IACN;AACI,UAAMgB,IAAI,CAAC,GAAGhE,EAAE;AAChB,IAAA2I,GAAG5E,CAAC,KAAKC,EAAE,KAAK,GAAG1E,EAAE,GAAGqG,GAAG3B,GAAGf,GAAGc,CAAC;AAAA,EACpC;AACF;AACA,SAAS6E,GAAG9M,GAAGgH,GAAG;AAChB,MAAIC,IAAI;AACR,EAAAjH,EAAE,SAASqB,EAAE,cAAc4F,IAAI,QAAQjH,EAAE,SAASqB,EAAE,cAAc4F,IAAI;AACtE,QAAMC,IAAI,SAAS,cAAcD,CAAC;AAClC,SAAOC,EAAE,MAAM,aAAalH,EAAE,QAAQgH,EAAE,aAAahH,EAAE,YAAYkH,EAAE,MAAM,YAAYuF,GAAGzM,EAAE,OAAO,IAAIA,EAAE,UAAUkH,EAAE,MAAM,QAAQlH,EAAE,QAAQA,EAAE,SAASkH,EAAE,MAAM,aAAa,QAAQlH,EAAE,WAAWkH,EAAE,MAAM,YAAY,WAAWA,EAAE,MAAM,WAAW,GAAGlH,EAAE,QAAQgH,EAAE,WAAW,MAAMhH,EAAE,cAAckH,EAAE,MAAM,kBAAkBlH,EAAE,YAAYA,EAAE,cAAckH,EAAE,MAAM,iBAAiB,cAAclH,EAAE,cAAckH,EAAE,MAAM,kBAAkB,kBAAkBA,EAAE,YAAYlH,EAAE,MAAM,QAAQ,IAAI,OAAO,GAAGgD,CAAC,IAAI,GAAG,GAAG;AAAA,CACvf,GAAGkE;AACJ;AACA,SAAS6F,GAAG/M,GAAG;AACb,MAAIgH,IAAI;AACR,QAAMC,IAAoB,oBAAI,IAAG;AACjC,WAASC,IAAI,GAAGA,IAAIlH,EAAE,QAAQkH,KAAK;AACjC,UAAMC,IAAInH,EAAEkH,CAAC;AACb,QAAIA,MAAM,GAAG;AACX,UAAIC,EAAE,SAAU;AAChB,MAAAA,EAAE,QAAQA,EAAE,MAAM,QAAQ9B,IAAI,EAAE;AAAA,IAClC;AACA,QAAI8B,EAAE,UAAU;AACd,YAAMC,IAAIH,EAAE,IAAID,CAAC,KAAK,CAAA;AACtB,MAAAI,EAAE,KAAKD,CAAC,GAAGF,EAAE,IAAID,GAAGI,CAAC;AAAA,IACvB,OAAO;AACL,YAAMA,IAAID,EAAE,MAAM,MAAM;AAAA,CAC7B;AACK,eAASE,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,QAAAA,IAAI,MAAML,KAAK;AACf,cAAMW,IAAIP,EAAEC,CAAC,GAAGO,IAAIX,EAAE,IAAID,CAAC,KAAK,CAAA;AAChC,QAAAY,EAAE,KAAK;AAAA,UACL,GAAGT;AAAA,UACH,OAAOQ;AAAA,QACjB,CAAS,GAAGV,EAAE,IAAID,GAAGY,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAOX;AACT;AACA,SAAS+F,GAAGhN,GAAG;AACb,MAAIkH;AACJ,QAAM,IAAI,CAAA;AACV,MAAI,CAAClH,EAAE,OAAQ,QAAO;AACtB,MAAI,MAAMkH,IAAIlH,EAAE,CAAC,MAAM,OAAO,SAASkH,EAAE,YAAY;AACrD,IAAE,KAAK;AAAA,IACL,SAAS;AAAA,IACT,MAAM,CAAClH,EAAE,CAAC,CAAC;AAAA,EACf,CAAG;AACD,WAASmH,IAAI,GAAGA,IAAInH,EAAE,QAAQmH,KAAK;AACjC,UAAMC,IAAIpH,EAAEmH,CAAC,GAAGE,IAAID,EAAE,WAAW;AACjC,UAAMC,KAAK,CAACwF,GAAGzF,CAAC,KAAK,CAACyF,GAAG7M,EAAEmH,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE,KAAK,KAAKC,CAAC,KAAK,EAAE,KAAK;AAAA,MAC1E,SAASC;AAAA,MACT,MAAM,CAACD,CAAC;AAAA,IACd,CAAK,GAAG,IAAIC;AAAA,EACV;AACA,WAASF,IAAI,GAAGA,IAAI,EAAE,QAAQA,KAAK;AACjC,UAAMC,IAAI,EAAED,CAAC;AACb,IAAAC,EAAE,OAAOmF,GAAEnF,EAAE,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AACA,SAAS6F,GAAGjN,GAAGgH,GAAG;AAChB,QAAMC,IAAIwD,GAAGzD,CAAC;AACd,WAASE,EAAEG,GAAG;AACZ,QAAIO,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAG0C,GAAGC,GAAGC,GAAGC;AACrC,UAAMrD,IAAI,SAAS,cAAc,KAAK;AACtC,aAAS,IAAI,GAAG,IAAIN,EAAE,QAAQ,KAAK;AACjC,YAAM6D,IAAI7D,EAAE,CAAC;AACb,UAAI6D,EAAE,SAAS7J,EAAE,OAAO;AACtB,cAAM8J,IAAI,SAAS,cAAc,OAAO;AACxC,QAAAA,EAAE,aAAa,eAAe,GAAG,GAAGA,EAAE,aAAa,eAAe,GAAG,GAAGA,EAAE,aAAa,UAAU,GAAG;AACpG,cAAMT,IAAI;AACV,SAACQ,EAAE,cAAcA,EAAE,eAAe9I,GAAG,OAAO+I,EAAE,MAAM,YAAYT,GAAGS,EAAE,MAAM,aAAaT,KAAKQ,EAAE,eAAe9I,GAAG,aAAa+I,EAAE,MAAM,SAAST,IAAIS,EAAE,MAAM,QAAQ,GAAGD,EAAE,KAAK;AAC7K,cAAMP,IAAI,SAAS,cAAc,UAAU;AAC3C,iBAASc,IAAI,GAAGA,IAAIP,EAAE,SAAS,QAAQO,KAAK;AAC1C,gBAAMW,IAAIlB,EAAE,SAASO,CAAC,GAAGC,IAAI,SAAS,cAAc,KAAK;AACzD,UAAAA,EAAE,aAAa,SAAS,GAAGU,EAAE,KAAK,EAAE,GAAGzB,EAAE,OAAOe,CAAC;AAAA,QACnD;AACA,QAAAP,EAAE,OAAOR,CAAC;AACV,cAAMC,IAAIM,EAAE;AACZ,iBAASO,IAAI,GAAGA,IAAIb,EAAE,QAAQa,KAAK;AACjC,gBAAMW,IAAI,SAAS,cAAc,IAAI,GAAGV,IAAId,EAAEa,CAAC;AAC/C,UAAAW,EAAE,MAAM,SAAS,GAAGV,EAAE,MAAM;AAC5B,mBAASC,IAAI,GAAGA,IAAID,EAAE,OAAO,QAAQC,KAAK;AACxC,kBAAMC,IAAI,SAAS,cAAc,IAAI;AACrC,aAAC,CAACV,EAAE,cAAcA,EAAE,eAAe9I,GAAG,SAASwJ,EAAE,MAAM,eAAeA,EAAE,MAAM,cAAc;AAC5F,kBAAMI,IAAIN,EAAE,OAAOC,CAAC;AACpB,YAAAC,EAAE,UAAUI,EAAE,SAASJ,EAAE,UAAUI,EAAE,SAASJ,EAAE,MAAM,gBAAgBI,EAAE,iBAAiB,QAAQpE,IAAIoE,EAAE,gBAAgB,QAAQpE,EAAE,SAASvF,GAAE,GAAG,MAAMuJ,EAAE,MAAM,YAAYlB,KAAK7C,IAAImE,EAAE,gBAAgB,QAAQnE,EAAE,SAASxF,GAAE,KAAK,MAAMuJ,EAAE,MAAM,cAAclB,KAAK5C,IAAIkE,EAAE,gBAAgB,QAAQlE,EAAE,SAASzF,GAAE,MAAM,MAAMuJ,EAAE,MAAM,eAAelB,KAAK3C,IAAIiE,EAAE,gBAAgB,QAAQjE,EAAE,SAAS1F,GAAE,IAAI,MAAMuJ,EAAE,MAAM,aAAalB;AAC5Z,kBAAMmB,IAAIoB,GAAGjB,EAAE,OAAOhF,CAAC;AACvB,YAAA4E,EAAE,YAAYC,EAAE,WAAWG,EAAE,oBAAoBJ,EAAE,MAAM,kBAAkBI,EAAE,kBAAkBI,EAAE,OAAOR,CAAC;AAAA,UAC3G;AACA,UAAAT,EAAE,OAAOiB,CAAC;AAAA,QACZ;AACA,QAAAzE,EAAE,OAAOwD,CAAC;AAAA,MACZ,WAAWD,EAAE,SAAS7J,EAAE,WAAW;AACjC,cAAM8J,IAAI,SAAS,cAAc,GAAG;AACpC,QAAAA,EAAE,YAAYD,EAAE,UAAU,IAAI,CAACR,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE,GAAGQ,EAAE,QAAQC,EAAE,OAAOD,EAAE,MAAMvD,EAAE,OAAOwD,CAAC;AAAA,MAC/F,WAAWD,EAAE,SAAS7J,EAAE,OAAO;AAC7B,cAAM8J,IAAI,SAAS;AAAA,UACjB,IAAI1F,GAAGyF,EAAE,KAAK,CAAC;AAAA,QACzB,GAAWR,IAAIxD,EAAEgE,EAAE,SAAS;AACpB,QAAAC,EAAE,YAAYT,EAAE,WAAW/C,EAAE,OAAOwD,CAAC;AAAA,MACvC,WAAWD,EAAE,SAAS7J,EAAE,MAAM;AAC5B,cAAM8J,IAAI,SAAS;AAAA,UACjBvF,GAAGsF,EAAE,QAAQ;AAAA,QACvB;AACQ,QAAAA,EAAE,cAAcC,EAAE,MAAM,gBAAgBtF,GAAGqF,EAAE,SAAS;AACtD,cAAMR,IAAI6B,GAAErB,EAAE,SAAS;AACvB,QAAA6B,GAAGrC,CAAC,EAAE,QAAQ,CAACE,MAAM;AACnB,gBAAMa,IAAI,SAAS,cAAc,IAAI,GAAGW,IAAIlF,EAAE0D,CAAC;AAC/C,UAAAa,EAAE,YAAYW,EAAE,WAAWjB,EAAE,OAAOM,CAAC;AAAA,QACvC,CAAC,GAAG9D,EAAE,OAAOwD,CAAC;AAAA,MAChB,WAAWD,EAAE,SAAS7J,EAAE,OAAO;AAC7B,cAAM8J,IAAI,SAAS,cAAc,KAAK;AACtC,QAAAD,EAAE,UAAUC,EAAE,MAAMD,EAAE,OAAOC,EAAE,QAAQD,EAAE,OAAOC,EAAE,SAASD,EAAE,SAASvD,EAAE,OAAOwD,CAAC;AAAA,MAClF,WAAWD,EAAE,SAAS7J,EAAE;AACtB,cAAM2G,IAAIkD,EAAE,UAAU,OAAO,SAASlD,EAAE,UAAU7H,GAAE,OAAO;AACzD,gBAAMgL,KAAKlD,IAAIiD,EAAE,MAAM,eAAe,OAAO,SAASjD,EAAE;AACxD,cAAIkD,GAAG;AACL,kBAAMT,IAAI,SAAS,cAAc,OAAO;AACxC,YAAAA,EAAE,MAAM,UAAU,SAASA,EAAE,WAAW,IAAIA,EAAE,MAAMS,GAAGT,EAAE,QAAQQ,EAAE,UAAUlE,KAAK,OAAO,SAASA,EAAE,UAAU,OAAO,YAAY0D,EAAE,SAASQ,EAAE,QAAQvD,EAAE,OAAO+C,CAAC;AAAA,UAClK;AAAA,QACF,aAAaxC,IAAIgD,EAAE,UAAU,OAAO,SAAShD,EAAE,UAAU/H,GAAE,QAAQ;AACjE,gBAAM,EAAE,KAAKgL,GAAG,QAAQT,EAAC,IAAKQ,EAAE,MAAM,eAAe,CAAA;AACrD,cAAIC,KAAKT,GAAG;AACV,kBAAMC,IAAI,SAAS,cAAc,QAAQ;AACzC,YAAAA,EAAE,QAAQ,IAAI,GAAGS,EAAE,GAAGT,EAAE,MAAM,UAAU,SAASA,EAAE,MAAM,SAAS,QAAQQ,IAAIR,EAAE,MAAMQ,IAAIT,MAAMC,EAAE,SAASD,IAAIC,EAAE,QAAQ,GAAGO,EAAE,UAAUlE,KAAK,OAAO,SAASA,EAAE,UAAU,OAAO,UAAU,IAAI2D,EAAE,SAAS,GAAGO,EAAE,MAAM,IAAIvD,EAAE,OAAOgD,CAAC;AAAA,UACpO;AAAA,QACF;AAAA,iBACSO,EAAE,SAAS7J,EAAE,WAAW;AACjC,cAAM8J,IAAI,SAAS,cAAc,IAAI;AACrC,QAAAxD,EAAE,OAAOwD,CAAC;AAAA,MACZ,WAAWD,EAAE,SAAS7J,EAAE,UAAU;AAChC,cAAM8J,IAAI,SAAS,cAAc,OAAO;AACxC,QAAAA,EAAE,OAAO,aAAahD,IAAI+C,EAAE,aAAa,QAAQ/C,EAAE,SAASgD,EAAE,aAAa,WAAW,MAAM,GAAGxD,EAAE,OAAOwD,CAAC;AAAA,MAC3G,WAAWD,EAAE,SAAS7J,EAAE,OAAO;AAC7B,cAAM8J,IAAI,SAAS,cAAc,OAAO;AACxC,QAAAA,EAAE,OAAO,UAAUN,IAAIK,EAAE,UAAU,QAAQL,EAAE,SAASM,EAAE,aAAa,WAAW,MAAM,GAAGxD,EAAE,OAAOwD,CAAC;AAAA,MACrG,WAAWD,EAAE,SAAS7J,EAAE,KAAK;AAC3B,cAAM8J,IAAI,SAAS,cAAc,MAAM;AACvC,QAAAA,EAAE,YAAY,GAAGjI,EAAE,GAAGA,EAAE,IAAIyE,EAAE,OAAOwD,CAAC;AAAA,MACxC,WAAWD,EAAE,SAAS7J,EAAE,SAAS;AAC/B,cAAM8J,IAAI,SAAS,cAAc,MAAM,GAAGT,IAAIxD,IAAI4D,IAAII,EAAE,YAAY,OAAO,SAASJ,EAAE,UAAU,EAAE;AAClG,QAAAK,EAAE,YAAYT,EAAE,WAAW/C,EAAE,OAAOwD,CAAC;AAAA,MACvC,WAAW,CAACD,EAAE,QAAQA,EAAE,SAAS7J,EAAE,SAAS8C,GAAG,SAAS+G,EAAE,IAAI,GAAG;AAC/D,YAAIC,IAAI;AACR,YAAID,EAAE,SAAS7J,EAAE,OAAO8J,MAAMJ,IAAIG,EAAE,cAAc,OAAO,SAASH,EAAE,IAAI,CAACJ,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAKQ,IAAID,EAAE,OAAO,CAACC,EAAG;AAC3H,cAAMT,IAAIoC,GAAG5B,GAAGjE,CAAC;AACjB,UAAE+D,IAAI3D,EAAE,IAAI,CAAC,MAAM,OAAO,SAAS2D,EAAE,UAAU3J,EAAE,UAAU8J,IAAIA,EAAE,QAAQ,OAAO,EAAE,IAAIT,EAAE,YAAYS,EAAE,QAAQ,IAAI,OAAO,GAAGnI,CAAC,IAAI,GAAG,GAAG;AAAA,CAC9I,GAAG2E,EAAE,OAAO+C,CAAC;AAAA,MACR;AAAA,IACF;AACA,WAAO/C;AAAA,EACT;AACA,QAAMR,IAAI,SAAS,cAAc,KAAK,GAAGC,IAAI4F,GAAGhN,CAAC;AACjD,WAASqH,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,UAAMM,IAAIP,EAAEC,CAAC,GAAGO,IAAI,CAACD,EAAE,WAAWA,EAAE,YAAY7F,GAAE,MAAM+F,IAAI,SAAS,cAAc,KAAK;AACxF,QAAI,CAACD,GAAG;AACN,YAAME,IAAIH,EAAE,KAAK,CAAC;AAClB,MAAAkF,GAAG/E,CAAC,KAAKD,EAAE,MAAM,UAAU,QAAQA,EAAE,MAAM,iBAAiB6E;AAAA,QAC1D5E,EAAE;AAAA,MACV,KAAWD,EAAE,MAAM,YAAY4E;AAAA,QACvB9E,EAAE;AAAA,MACV;AAAA,IACI;AACA,IAAAE,EAAE,YAAYX,EAAES,EAAE,IAAI,EAAE,WAAWC,IAAIC,EAAE,WAAW,QAAQ,CAACC,MAAM;AACjE,MAAAX,EAAE,OAAOW,EAAE,UAAU,EAAE,CAAC;AAAA,IAC1B,CAAC,IAAIX,EAAE,OAAOU,CAAC;AAAA,EACjB;AACA,SAAOV;AACT;AACA,SAAS+F,GAAGlN,GAAG;AACb,MAAI,CAACA,KAAKA,EAAE,aAAa,EAAG,QAAO;AACnC,QAAMgH,IAAIhH,EAAE,YAAYiH,IAAID,EAAE,aAAa,SAASA,EAAE,aAAaA,GAAGE,IAAIsF,GAAGvF,CAAC,GAAGE,IAAInH,EAAE,aAAaoH,IAAI,OAAO,iBAAiBH,CAAC;AACjI,MAAI,CAACE,KAAKF,EAAE,aAAa,QAAS,QAAO;AACzC,QAAMI,IAAI;AAAA,IACR,OAAOF;AAAA,IACP,OAAOC,EAAE;AAAA,IACT,MAAM,OAAOA,EAAE,UAAU,IAAI;AAAA,IAC7B,QAAQA,EAAE,UAAU,SAAS,QAAQ;AAAA,IACrC,MAAM,KAAK,MAAM,WAAWA,EAAE,QAAQ,CAAC;AAAA,EAC3C;AACE,SAAOH,EAAE,aAAa,SAASG,EAAE,kBAAkB,QAAQC,EAAE,OAAOhG,EAAE,aAAa4F,EAAE,aAAa,SAASG,EAAE,kBAAkB,aAAaC,EAAE,OAAOhG,EAAE,cAAc6F,MAAMpF,GAAE,SAASuF,EAAE,UAAUH,IAAIE,EAAE,oBAAoB,uBAAuBC,EAAE,YAAYD,EAAE,kBAAkBA,EAAE,mBAAmB,SAAS,WAAW,MAAMC,EAAE,YAAY,KAAKD,EAAE,mBAAmB,SAAS,cAAc,MAAMC,EAAE,YAAY,KAAKA;AAC9Z;AACA,SAAS8F,GAAGnN,GAAGgH,GAAG;AAChB,QAAMC,IAAI,CAAA;AACV,WAASC,EAAEG,GAAG;AACZ,QAAIA,EAAE,aAAa,GAAG;AACpB,YAAMM,IAAIuF,GAAG7F,CAAC;AACd,MAAAM,KAAKV,EAAE,KAAKU,CAAC;AAAA,IACf,WAAWN,EAAE,aAAa,GAAG;AAC3B,YAAMM,IAAIN,EAAE;AACZ,eAASO,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,cAAMC,IAAIF,EAAEC,CAAC;AACb,YAAIC,EAAE,aAAa;AACjB,UAAAZ,EAAE,KAAK;AAAA,YACL,OAAO;AAAA;AAAA,UAEnB,CAAW;AAAA,iBACMY,EAAE,aAAa,KAAK;AAC3B,gBAAMC,IAAID,GAAGE,IAAID,EAAE;AACnB,UAAAC,KAAKd,EAAE,KAAK;AAAA,YACV,MAAM5F,EAAE;AAAA,YACR,OAAO;AAAA,YACP,WAAW;AAAA,cACT;AAAA,gBACE,OAAO0G;AAAA,cACvB;AAAA,YACA;AAAA,YACY,KAAKD,EAAE;AAAA,UACnB,CAAW;AAAA,QACH,WAAW,SAAS,KAAKD,EAAE,QAAQ,GAAG;AACpC,gBAAME,IAAIoF;AAAA,YACRC,GAAGvF,GAAG,KAAK,EAAE;AAAA,YACbb;AAAA,UACZ;AACU,UAAAC,EAAE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,MAAM5F,EAAE;AAAA,YACR,OAAOqE,GAAGmC,EAAE,QAAQ;AAAA,YACpB,WAAWE;AAAA,UACvB,CAAW,GAAGF,EAAE,eAAe,CAACvD,GAAG,SAASuD,EAAE,YAAY,QAAQ,KAAKZ,EAAE,KAAK;AAAA,YAClE,OAAO;AAAA;AAAA,UAEnB,CAAW;AAAA,QACH,WAAWY,EAAE,aAAa,QAAQA,EAAE,aAAa,MAAM;AACrD,gBAAMC,IAAID,GAAGE,IAAI;AAAA,YACf,OAAO;AAAA,YACP,MAAM1G,EAAE;AAAA,YACR,WAAW,CAAA;AAAA,UACvB;AACU,UAAAwG,EAAE,aAAa,OAAOE,EAAE,WAAWtG,GAAE,MAAMsG,EAAE,WAAWtG,GAAE,IAAIsG,EAAE,YAAYD,EAAE,MAAM,gBAAgBA,EAAE,iBAAiB,IAAI,EAAE,QAAQ,CAACE,MAAM;AAC1I,kBAAMC,IAAIkF,GAAGnF,EAAE,WAAWhB,CAAC;AAC3B,YAAAiB,EAAE,QAAQ,CAACC,MAAM;AACf,cAAAA,EAAE,UAAU;AAAA,MACpBA,EAAE,WAAW;AAAA,YACP,CAAC,GAAGD,EAAE,QAAQ;AAAA,cACZ,OAAO;AAAA;AAAA,YAErB,CAAa,GAAGF,EAAE,UAAU,KAAK,GAAGE,CAAC;AAAA,UAC3B,CAAC,GAAGhB,EAAE,KAAKc,CAAC;AAAA,QACd,WAAWF,EAAE,aAAa;AACxB,UAAAZ,EAAE,KAAK;AAAA,YACL,OAAO;AAAA;AAAA,YAEP,MAAM5F,EAAE;AAAA,UACpB,CAAW;AAAA,iBACMwG,EAAE,aAAa,OAAO;AAC7B,gBAAM,EAAE,KAAKC,GAAG,OAAOC,GAAG,QAAQC,EAAC,IAAKH;AACxC,UAAAC,KAAKC,KAAKC,KAAKf,EAAE,KAAK;AAAA,YACpB,OAAOc;AAAA,YACP,QAAQC;AAAA,YACR,OAAOF;AAAA,YACP,MAAMzG,EAAE;AAAA,UACpB,CAAW;AAAA,QACH,WAAWwG,EAAE,aAAa,SAAS;AACjC,gBAAM,EAAE,KAAKC,GAAG,OAAOC,GAAG,QAAQC,EAAC,IAAKH;AACxC,UAAAC,KAAKC,KAAKC,KAAKf,EAAE,KAAK;AAAA,YACpB,OAAO;AAAA,YACP,MAAM5F,EAAE;AAAA,YACR,OAAO;AAAA,cACL,MAAMlB,GAAE;AAAA,cACR,YAAY;AAAA,gBACV,KAAK2H;AAAA,cACrB;AAAA,YACA;AAAA,YACY,OAAOC;AAAA,YACP,QAAQC;AAAA,UACpB,CAAW;AAAA,QACH,WAAWH,EAAE,aAAa,UAAU;AAClC,gBAAM,EAAE,KAAKC,GAAG,QAAQC,GAAG,OAAOC,GAAG,QAAQC,EAAC,IAAKJ;AACnD,WAACC,KAAKC,MAAMC,KAAKC,KAAKhB,EAAE,KAAK;AAAA,YAC3B,OAAO;AAAA,YACP,MAAM5F,EAAE;AAAA,YACR,OAAO;AAAA,cACL,MAAMlB,GAAE;AAAA,cACR,aAAa;AAAA,gBACX,KAAK2H;AAAA,gBACL,QAAQC;AAAA,cACxB;AAAA,YACA;AAAA,YACY,OAAO,SAASC,CAAC;AAAA,YACjB,QAAQ,SAASC,CAAC;AAAA,UAC9B,CAAW;AAAA,QACH,WAAWJ,EAAE,aAAa,SAAS;AACjC,gBAAMC,IAAID,GAAGE,IAAI;AAAA,YACf,MAAM1G,EAAE;AAAA,YACR,OAAO;AAAA;AAAA,YAEP,UAAU,CAAA;AAAA,YACV,QAAQ,CAAA;AAAA,UACpB;AACU,cAAIyG,EAAE,iBAAiB,IAAI,EAAE,QAAQ,CAACE,MAAM;AAC1C,kBAAMC,IAAI,OAAO,iBAAiBD,CAAC,EAAE,OAAO,QAAQ,MAAM,EAAE,GAAGE,IAAI;AAAA,cACjE,QAAQ,OAAOD,CAAC;AAAA,cAChB,QAAQ,CAAA;AAAA,YACtB;AACY,YAAAD,EAAE,iBAAiB,OAAO,EAAE,QAAQ,CAACG,MAAM;AACzC,oBAAM0C,IAAI1C,GAAG2C,IAAIqC;AAAA,gBACftC,EAAE;AAAA,gBACF7D;AAAA,cAChB,GAAiB,IAAI;AAAA,gBACL,SAAS6D,EAAE;AAAA,gBACX,SAASA,EAAE;AAAA,gBACX,OAAOC;AAAA,cACvB;AACc,cAAAD,EAAE,MAAM,oBAAoB,EAAE,kBAAkBA,EAAE,MAAM,kBAAkB3C,EAAE,OAAO,KAAK,CAAC;AAAA,YAC3F,CAAC,GAAGH,EAAE,OAAO,KAAKG,CAAC;AAAA,UACrB,CAAC,GAAGH,EAAE,OAAO,QAAQ;AACnB,kBAAMC,IAAID,EAAE,OAAO,CAAC,EAAE,OAAO;AAAA,cAC3B,CAACG,GAAGC,MAAMD,IAAIC,EAAE;AAAA,cAChB;AAAA,YACd,GAAeF,IAAI,KAAK,KAAKjB,EAAE,aAAagB,CAAC;AACjC,qBAASE,IAAI,GAAGA,IAAIF,GAAGE;AACrB,cAAAH,EAAE,SAAS,KAAK;AAAA,gBACd,OAAOE;AAAA,cACvB,CAAe;AACH,YAAAhB,EAAE,KAAKc,CAAC;AAAA,UACV;AAAA,QACF,MAAO,CAAAF,EAAE,aAAa,WAAWA,EAAE,SAASnH,EAAE,WAAWuG,EAAE,KAAK;AAAA,UAC9D,MAAM5F,EAAE;AAAA,UACR,OAAO;AAAA,UACP,UAAU;AAAA,YACR,OAAOwG,EAAE;AAAA,UACrB;AAAA,QACA,CAAS,IAAIA,EAAE,aAAa,WAAWA,EAAE,SAASnH,EAAE,QAAQuG,EAAE,KAAK;AAAA,UACzD,MAAM5F,EAAE;AAAA,UACR,OAAO;AAAA,UACP,OAAO;AAAA,YACL,OAAOwG,EAAE;AAAA,UACrB;AAAA,QACA,CAAS,KAAKX,EAAEW,CAAC,GAAGA,EAAE,aAAa,KAAKD,MAAMD,EAAE,SAAS,KAAK,OAAO,iBAAiBE,CAAC,EAAE,YAAY,WAAWZ,EAAE,KAAK;AAAA,UAC7G,OAAO;AAAA;AAAA,QAEjB,CAAS;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,QAAME,IAAI,SAAS,cAAc,KAAK;AACtC,EAAAA,EAAE,YAAYnH,GAAG,SAAS,KAAK,YAAYmH,CAAC;AAC5C,QAAMC,IAAI,CAAA;AACV,SAAOD,EAAE,WAAW,QAAQ,CAACE,MAAM;AACjC,QAAIM;AACJ,IAAAN,EAAE,aAAa,KAAK,GAAGM,IAAIN,EAAE,gBAAgB,QAAQM,EAAE,KAAI,MAAOP,EAAE,KAAKC,CAAC;AAAA,EAC5E,CAAC,GAAGD,EAAE,QAAQ,CAACC,MAAMA,EAAE,QAAQ,GAAGH,EAAEC,CAAC,GAAGA,EAAE,OAAM,GAAIF;AACtD;AACA,SAASoG,GAAGrN,GAAG;AACb,WAASgH,EAAEC,GAAG;AACZ,QAAIE,GAAGC,GAAGC,GAAGM,GAAGC,GAAGC,GAAGC;AACtB,QAAIZ,IAAI;AACR,aAASa,IAAI,GAAGA,IAAId,EAAE,QAAQc,KAAK;AACjC,YAAMC,IAAIf,EAAEc,CAAC;AACb,UAAIC,EAAE,SAAS3G,EAAE,OAAO;AACtB,QAAA6F,KAAK;AAAA;AAEL,cAAMe,IAAID,EAAE;AACZ,iBAASE,IAAI,GAAGA,IAAID,EAAE,QAAQC,KAAK;AACjC,gBAAMC,IAAIF,EAAEC,CAAC;AACb,mBAAS2C,IAAI,GAAGA,IAAI1C,EAAE,OAAO,QAAQ0C,KAAK;AACxC,kBAAMC,IAAI3C,EAAE,OAAO0C,CAAC,GAAG,IAAI7D,EAAEuF,GAAEzB,EAAE,KAAK,CAAC,GAAGE,IAAIH,MAAM,GAAG,IAAI1C,EAAE,OAAO,SAAS,MAAM0C;AACnF,YAAA3D,KAAK,GAAG8D,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI;AAAA,IACxC,EAAE;AAAA,UACI;AAAA,QACF;AAAA,MACF,WAAWhD,EAAE,SAAS3G,EAAE;AACtB,QAAA6F,KAAK;AAAA,eACEc,EAAE,SAAS3G,EAAE;AACpB,QAAA6F,KAAKc,EAAE,UAAU,IAAI,CAACC,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE;AAAA,eACrCD,EAAE,SAAS3G,EAAE;AACpB,QAAA6F,KAAK,GAAGF,EAAEuF,GAAEvE,EAAE,SAAS,CAAC,CAAC;AAAA,eAClBA,EAAE,SAAS3G,EAAE,MAAM;AAC1B,cAAM4G,IAAIsE,GAAEvE,EAAE,SAAS,GAAGE,IAAI6E,GAAG9E,CAAC;AAClC,YAAIE,IAAI;AACR,QAAAH,EAAE,aAAavG,GAAE,OAAO0G,IAAIxC,GAAGqC,EAAE,SAAS,IAAIE,EAAE,QAAQ,CAAC2C,GAAGC,MAAM;AAChE,gBAAM,IAAI5C,EAAE,OAAO,MAAM4C;AACzB,UAAA5D,KAAK;AAAA,EACbiB,KAAK,GAAG2C,IAAI,CAAC,GAAG,GAAG9D;AAAA,YACT6D;AAAA,UACZ,CAAW,GAAG,IAAI;AAAA,IACd,EAAE;AAAA,QACE,CAAC;AAAA,MACH,WAAW7C,EAAE,SAAS3G,EAAE;AACtB,QAAA6F,MAAMC,IAAIa,EAAE,aAAa,QAAQb,EAAE,QAAQ,MAAM;AAAA,eAC1Ca,EAAE,SAAS3G,EAAE;AACpB,QAAA6F,MAAME,IAAIY,EAAE,UAAU,QAAQZ,EAAE,QAAQ,MAAM;AAAA,eACvC,CAACY,EAAE,QAAQA,EAAE,SAAS3G,EAAE,SAAS8C,GAAG,SAAS6D,EAAE,IAAI,GAAG;AAC7D,YAAIC,IAAI;AACR,YAAID,EAAE,SAAS3G,EAAE,SAAS;AACxB,gBAAM6G,MAAMP,KAAKN,IAAIW,EAAE,QAAQ,UAAU,OAAO,SAASX,EAAE,CAAC,MAAM,OAAO,SAASM,EAAE,UAAU;AAC9F,UAAAM,IAAIC,IAAI,KAAKN,IAAII,EAAE,YAAY,OAAO,SAASJ,EAAE,YAAY,EAAE,GAAGM,CAAC,KAAKL,IAAIG,EAAE,YAAY,OAAO,SAASH,EAAE,aAAa,EAAE,KAAK;AAAA,QAClI,MAAO,CAAAG,EAAE,SAAS3G,EAAE,OAAO4G,MAAMH,IAAIE,EAAE,cAAc,OAAO,SAASF,EAAE,IAAI,CAACI,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAKD,IAAID,EAAE;AACnH,QAAAd,KAAKe,EAAE,QAAQ,IAAI,OAAO,GAAGjF,CAAC,IAAI,GAAG,GAAG;AAAA,CAC/C;AAAA,MACK;AAAA,IACF;AACA,WAAOkE;AAAA,EACT;AACA,SAAOF,EAAEuF,GAAEvM,CAAC,CAAC;AACf;AACA,SAASsN,GAAGtN,GAAG;AACb,SAAOgJ,GAAGhJ,GAAG;AAAA,IACX;AAAA,IACA;AAAA,EACJ,CAAG;AACH;AACA,SAAS6M,GAAG7M,GAAG;AACb,SAAO,CAAC,EAAEA,KAAK,QAAQA,EAAE,UAAUqE,GAAG,SAASrE,EAAE,IAAI,KAAKA,EAAE,eAAeM,EAAG;AAChF;AACA,SAAS8M,GAAGpN,GAAGgH,GAAG;AAChB,QAAMC,IAAI,SAAS,cAAcD,CAAC;AAClC,WAASE,IAAI,GAAGA,IAAIlH,EAAE,WAAW,QAAQkH,KAAK;AAC5C,UAAMC,IAAInH,EAAE,WAAWkH,CAAC;AACxB,IAAAD,EAAE,aAAaE,EAAE,MAAMA,EAAE,KAAK;AAAA,EAChC;AACA,SAAOF,EAAE,YAAYjH,EAAE,WAAWiH;AACpC;AACA,SAASsG,GAAGvN,GAAG;AACb,QAAMgH,IAAI,CAAA;AACV,WAASC,IAAI,GAAGA,IAAIjH,EAAE,QAAQiH,KAAK;AACjC,UAAMC,IAAIlH,EAAEiH,CAAC;AACb,IAAAC,EAAE,eAAe5G,EAAG,YAAY0G,EAAE,KAAKE,CAAC;AAAA,EAC1C;AACA,SAAOF;AACT;AACA,SAASwG,GAAGxN,GAAGgH,GAAG;AAChB,MAAIC;AACJ,WAASC,IAAIlH,EAAE,SAAS,GAAGkH,KAAK,GAAGA;AACjC,MAAED,IAAIjH,EAAEkH,CAAC,EAAE,qBAAqB,OAAO,SAASD,EAAE,YAAYD,KAAKhH,EAAE,OAAOkH,GAAG,CAAC;AACpF;AACA,SAASuG,GAAGzN,GAAG;AACb,SAAOA,EAAE,UAAUgD,KAAK,CAAChD,EAAE;AAC7B;AAIA,SAAS0N,GAAG1N,GAAG;AACb,SAAOA,EAAE,SAASqB,EAAE;AACtB;AACA,SAASsM,GAAG3N,GAAG;AACb,SAAOA,EAAE,SAASqB,EAAE;AACtB;AACA,SAASuM,GAAG5N,GAAGgH,GAAGC,IAAI1G,GAAG,QAAQ;AAC/B,MAAI4G,GAAGC,GAAGC,GAAGM,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC;AACrC,MAAI,GAAGf,KAAKD,IAAInH,EAAEgH,CAAC,MAAM,OAAO,SAASG,EAAE,YAAY,QAAQC,EAAE,SAAS,GAAGO,KAAKN,IAAIrH,EAAEgH,CAAC,MAAM,OAAO,SAASK,EAAE,SAAS,QAAQM,EAAE;AAClI,WAAOX;AACT,MAAIE,IAAIF;AACR,MAAIC,MAAM1G,GAAG;AACX,SAAK2G,IAAIF,IAAI,GAAGE,IAAI,KAAK;AACvB,UAAI,GAAGW,KAAKD,IAAI5H,EAAEkH,CAAC,MAAM,OAAO,SAASU,EAAE,YAAY,QAAQC,EAAE,SAAS,GAAGE,KAAKD,IAAI9H,EAAEkH,CAAC,MAAM,OAAO,SAASY,EAAE,SAAS,QAAQC,EAAE;AAClI,eAAOb;AACT,MAAAA;AAAA,IACF;AAAA;AAEA,SAAKA,IAAIF,IAAI,GAAGE,IAAIlH,EAAE,UAAU;AAC9B,UAAI,GAAGiI,KAAKD,IAAIhI,EAAEkH,CAAC,MAAM,OAAO,SAASc,EAAE,YAAY,QAAQC,EAAE,SAAS,GAAGE,KAAKD,IAAIlI,EAAEkH,CAAC,MAAM,OAAO,SAASgB,EAAE,SAAS,QAAQC,EAAE;AAClI,eAAOjB;AACT,MAAAA;AAAA,IACF;AACF,SAAOA;AACT;AC5pEO,MAAM2G,KAAUC;AAEhB,MAAMC,GAAe;AAAA,EAC1B,eAAelC,GAAU;AAAA,EAAC;AAAA,EAC1B,QAAQA,GAAU;AAAA,EAAC;AAAA,EACnB,QAAQA,GAAU;AAAA,EAAC;AAAA,EACnB,YAAYA,GAAU;AAAA,EAAC;AAAA,EACvB,SAASA,GAAU;AAAA,EAAC;AAAA,EACpB,WAAWA,GAAe;AAAA,EAAmB;AAAA,EAC7C,gBAAgBA,GAAmB;AAAE,WAAO;AAAA,EAAK;AAAA,EACjD,aAAaA,GAAmB;AAAE,WAAO;AAAA,EAAM;AAAA,EAC/C,aAAaA,GAAmB;AAAE,WAAO;AAAA,EAAM;AAAA,EAC/C,WAAWA,GAAU;AAAA,EAAC;AAAA,EACtB,WAAWA,GAAU;AAAA,EAAC;AACxB;AAEO,MAAMmC,GAAc;AAAA,EACzB,eAAenC,GAAU;AAAA,EAAC;AAAA,EAC1B,WAAWA,GAAU;AAAA,EAAC;AACxB;AAEO,MAAMoC,GAAK;AAAA,EAChB,eAAepC,GAAU;AAAA,EAAC;AAAA,EAC1B,EAAEqC,MAAgBC,GAAsB;AAAE,WAAOD;AAAA,EAAI;AAAA,EACrD,mBAAmBrC,GAAU;AAAA,EAAC;AAAA,EAC9B,WAAWA,GAAU;AAAA,EAAC;AACxB;AAEO,MAAMuC,GAAS;AAAA,EACpB,eAAevC,GAAU;AAAA,EAAC;AAC5B;AAEO,MAAMwC,GAAc;AAAA,EACzB,eAAexC,GAAU;AAAA,EAAC;AAAA,EAC1B,UAAUA,GAAU;AAAA,EAAC;AACvB;AAEO,MAAMyC,GAAa;AAAA,EACxB,eAAezC,GAAU;AAAA,EAAC;AAAA,EAC1B,UAAUA,GAAU;AAAA,EAAC;AAAA,EACrB,oBAAoBA,GAAU;AAAA,EAAC;AAAA,EAC/B,mBAAmBA,GAAU;AAAA,EAAC;AAAA,EAC9B,WAAWA,GAAU;AAAA,EAAC;AACxB;AAEO,MAAM0C,GAAc;AAAA,EACzB,eAAe1C,GAAU;AAAA,EAAC;AAAA,EAC1B,UAAUA,GAAU;AAAA,EAAC;AAAA,EACrB,SAASA,GAAU;AAAA,EAAC;AAAA,EACpB,WAAWA,GAAU;AAAA,EAAC;AACxB;AAEO,MAAM2C,GAAW;AAAA,EACtB,eAAe3C,GAAU;AAAA,EAAC;AAAA,EAC1B,UAAUA,GAAU;AAAA,EAAC;AAAA,EACrB,WAAWA,GAAU;AAAA,EAAC;AACxB;AAOA,SAAS4C,GAAiBC,GAAsB;AAC9C,MAAI,SAAO,eAAiB;AAC5B,QAAI;AACF,mBAAa;AAAA,QACXC;AAAAA,QACA,KAAK,UAAU;AAAA,UACb,MAAMD,EAAK;AAAA,UACX,aAAaA,EAAK;AAAA,QAAA,CACnB;AAAA,MAAA;AAAA,IAEL,QAAQ;AAAA,IAER;AACF;AAEO,SAASE,KAA0C;AACxD,MAAI,OAAO,eAAiB,IAAa,QAAO;AAChD,MAAI;AACF,UAAMC,IAAgB,aAAa,QAAQF,EAAgB;AAC3D,QAAI,CAACE,EAAe,QAAO;AAC3B,UAAMC,IAAgB,KAAK,MAAMD,CAAa;AAC9C,QACE,QAAOC,KAAA,gBAAAA,EAAe,SAAS,YAC/B,MAAM,QAAQA,KAAA,gBAAAA,EAAe,WAAW;AAExC,aAAOA;AAAA,EAEX,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAASC,GAA0BD,GAAsC;AAC9E,SAAO,MAAM,KAAKA,EAAc,KAAK,EAAE,KAAK,CAAAE,MAAQA,EAAK,SAAS,MAAM;AAC1E;AAEO,SAASC,KAA4B;AAC1C,MAAI,SAAO,eAAiB;AAC5B,QAAI;AACF,mBAAa,WAAWN,EAAgB;AAAA,IAC1C,QAAQ;AAAA,IAER;AACF;AAEA,SAASO,GAA2BC,GAAc;AAChD,MAAI,OAAO,WAAa,OAAe,OAAO,SAAW,IAAa;AACtE,QAAMC,IAAc,SAAS,cAAc,KAAK;AAChD,EAAAA,EAAY,aAAa,mBAAmB,MAAM,GAClDA,EAAY,MAAM,WAAW,SAC7BA,EAAY,MAAM,OAAO,WACzBA,EAAY,MAAM,MAAM,KACxBA,EAAY,MAAM,UAAU,KAC5BA,EAAY,YAAYD;AACxB,QAAME,IAAY,OAAO,aAAA,GACnBC,IAAkB,CAAA;AACxB,MAAID;AACF,aAASzH,IAAI,GAAGA,IAAIyH,EAAU,YAAYzH;AACxC,MAAA0H,EAAO,KAAKD,EAAU,WAAWzH,CAAC,EAAE,YAAY;AAGpD,QAAM2H,IAAQ,SAAS,YAAA,GACjBC,IAAK,SAAS,cAAc,MAAM;AACxC,EAAAA,EAAG,YAAY;AAAA,GACfJ,EAAY,OAAOI,CAAE,GACrB,SAAS,KAAK,OAAOJ,CAAW,GAChCG,EAAM,mBAAmBH,CAAW,GACpCC,KAAA,QAAAA,EAAW,mBACXA,KAAA,QAAAA,EAAW,SAASE;AACpB,MAAI;AACF,aAAS,YAAY,MAAM;AAAA,EAC7B,UAAA;AACE,IAAAF,KAAA,QAAAA,EAAW,mBACXC,EAAO,QAAQ,CAAAG,MAAcJ,KAAA,gBAAAA,EAAW,SAASI,EAAW,GAC5DL,EAAY,OAAA;AAAA,EACd;AACF;AAEA,SAASM,GACPC,GACAR,GACAS,GACA;AD9JC,MAAAC;ACiKD,MAFI,CAACF,KAAQ,CAACR,KAAQ,CAACS,EAAY,WACnCnB,GAAiB,EAAE,MAAAkB,GAAM,aAAAC,GAAa,GAClC,OAAO,SAAW,KAAa;AACnC,QAAME,KAAYD,IAAA,OAAO,cAAP,gBAAAA,EAAkB,WAC9BE,IAAoB,OAAO;AACjC,MAAID,KAAA,QAAAA,EAAW,SAASC,GAAmB;AACzC,UAAMC,IAAY,IAAI,KAAK,CAACL,CAAI,GAAG,EAAE,MAAM,cAAc,GACnDM,IAAW,IAAI,KAAK,CAACd,CAAI,GAAG,EAAE,MAAM,aAAa,GAEjDH,IAAO,IAAIe,EAAkB;AAAA,MACjC,CAACC,EAAU,IAAI,GAAGA;AAAA,MAClB,CAACC,EAAS,IAAI,GAAGA;AAAA,IAAA,CAClB;AACD,IAAKH,EAAU,MAAM,CAACd,CAAI,CAAC,EAAE,MAAM,MAAME,GAA2BC,CAAI,CAAC;AACzE;AAAA,EACF;AACA,EAAAD,GAA2BC,CAAI;AACjC;AAEO,SAASe,GACdN,GACAO,GACQ;AACR,MAAI,OAAO,WAAa;AACtB,WAAO,KAAK,UAAUP,CAAW;AAEnC,QAAMQ,IAAeC,GAAyBT,GAAaO,CAAO;AAClE,WAAS,KAAK,OAAOC,CAAY;AACjC,QAAMT,IAAOS,EAAa,WACpBjB,IAAOiB,EAAa;AAE1B,SADAA,EAAa,OAAA,GACT,CAACT,KAAQ,CAACR,KAAQ,CAACS,EAAY,SAAe,MAClDF,GAAmBC,GAAMR,GAAMmB,GAAeV,CAAW,CAAC,GACnDD;AACT;AC/KO,SAASY,GAAaC,GAAmBZ,GAAyB;AACvE,QAAMa,IAAOD,EAAK,QAAA;AAClB,MACEC,EAAK,WAAA,KACLA,EAAK,WAAA,KACLA,EAAK,aAAa;AAElB;AAEF,QAAMC,IAAeD,EAAK,SAAA,GACpB,EAAE,YAAAE,EAAA,IAAeD,EAAa,SAAA,GAC9BE,IAAsBH,EAAK,eAAA;AAEjC,MAAI,CAACE,KAAc,CAACD,EAAa,kBAAkB;AAEjD,UAAMG,IAAgBD,EAAoBD,CAAU;AACpD,QAAIE,KAAA,QAAAA,EAAe,WAAWA,KAAA,QAAAA,EAAe,QAAQ;AACnD,UAAIC,IAAQ;AACZ,aAAOA,IAAQlB,EAAY,UAAQ;AACjC,cAAMW,IAAeX,EAAYkB,CAAK;AACtC,YAAID,EAAc,WAAW,MAAM,KAAKN,EAAa,KAAK;AACxD;AAEF,YAAIQ,GAAqB,SAASR,EAAa,IAAK,GAAG;AAErD,cADAX,EAAY,OAAOkB,GAAO,CAAC,GACvBP,EAAa;AACf,qBAAS5E,IAAI,GAAGA,IAAI4E,EAAa,UAAU,QAAQ5E,KAAK;AACtD,oBAAMqF,IAAUT,EAAa,UAAU5E,CAAC;AACxC,cAAIqF,EAAQ,UAAUC,KAAQD,EAAQ,UAAU;AAAA,MAGhDpB,EAAY,OAAOkB,GAAO,GAAGE,CAAO,GACpCF;AAAA,YACF;AAEF,UAAAA;AAAA,QACF;AACA,QAAAA;AAAA,MACF;AAAA,IACF;AACAI,IAAAA,GAAqBN,GAAqBhB,GAAae,GAAY;AAAA,MACjE,iBAAiB;AAAA,MACjB,eAAeF,EAAK,WAAA;AAAA,IAAW,CAChC;AAAA,EACH;AACA,EAAAA,EAAK,kBAAkBb,CAAW;AACpC;AAEO,SAASuB,GAAUX,GAAmBP,GAAkB;AAC7D,QAAMQ,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,WAAA,KAAgBA,EAAK,aAAc;AAC5C,QAAMb,IAAcwB,GAAqBnB,GAAU;AAAA,IACjD,YAAYQ,EAAK,sBAAA;AAAA,EAAsB,CACxC;AACD,EAAAF,GAAaC,GAAMZ,CAAW;AAChC;AAEO,SAASyB,GAAWb,GAAmBc,GAAmB;AAC/D,QAAMb,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,WAAA,KAAgBA,EAAK,aAAc;AAC5C,QAAMC,IAAeD,EAAK,SAAA,GACpB,EAAE,YAAAE,EAAA,IAAeD,EAAa,SAAA,GAC9Bd,IAAca,EAAK,eAAA,GAEnBc,IAAa,IAAI,WAAA;AACvB,EAAAA,EAAW,cAAcD,CAAI,GAC7BC,EAAW,SAAS,MAAM;AAExB,UAAMC,IAAQ,IAAI,MAAA,GACZC,IAAQF,EAAW;AACzB,IAAAC,EAAM,MAAMC,GACZD,EAAM,SAAS,MAAM;AACnB,YAAME,IAAyB;AAAA,QAC7B,OAAAD;AAAA,QACA,MAAME,EAAY;AAAA,QAClB,OAAOH,EAAM;AAAA,QACb,QAAQA,EAAM;AAAA,MAAA;AAEhB,MAAI,CAACb,KACHO,GAAqBtB,GAAa,CAAC8B,CAAY,GAAGf,GAAY;AAAA,QAC5D,eAAeF,EAAK,WAAA;AAAA,MAAW,CAChC,GAEHA,EAAK,kBAAkB,CAACiB,CAAY,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAASE,GAAapB,GAAmBqB,GAAqB;AACnE,QAAMpB,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,WAAA,KAAgBA,EAAK,aAAc;AAC5C,QAAM3B,IAAgB+C,EAAI;AAC1B,MAAI,CAAC/C,EAAe;AAEpB,QAAM,EAAE,OAAAgD,EAAA,IAAUrB,EAAK,YAAA;AACvB,MAAIqB,GAAO;AACT,UAAMC,IAAiBD,EAAMD,CAAG;AAEhC,SAAsBE,KAAA,gBAAAA,EAAiB,oBAAmB,GAAO;AAAA,EACnE;AAEA,MAAI,CAAChD,GAA0BD,CAAa,GAAG;AAC7C,UAAMD,IAAgBC,EAAc,QAAQ,MAAM,GAC5CkD,IAAsBpD,GAAA;AAE5B,QACEoD,KACAC,GAAmBpD,CAAa,MAC9BoD,GAAmBD,EAAoB,IAAI,GAC7C;AACA,MAAAzB,GAAaC,GAAMwB,EAAoB,WAAW;AAClD;AAAA,IACF;AAAA,EACF;AACA,EAAA/C,GAAA;AAEA,MAAIiD,IAAS;AACb,WAAStK,IAAI,GAAGA,IAAIkH,EAAc,MAAM,QAAQlH;AAE9C,QADakH,EAAc,MAAMlH,CAAC,EACzB,SAAS,aAAa;AAC7B,MAAAsK,IAAS;AACT;AAAA,IACF;AAEF,WAAStK,IAAI,GAAGA,IAAIkH,EAAc,MAAM,QAAQlH,KAAK;AACnD,UAAMoH,IAAOF,EAAc,MAAMlH,CAAC;AAClC,QAAIoH,EAAK,SAAS,UAAU;AAC1B,UAAIA,EAAK,SAAS,gBAAgB,CAACkD,GAAQ;AACzC,QAAAlD,EAAK,YAAY,CAAAgB,MAAa;AAC5B,UAAAQ,EAAK,MAAMR,CAAS;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AACA,UAAIhB,EAAK,SAAS,eAAekD,GAAQ;AACvC,QAAAlD,EAAK,YAAY,CAAAiB,MAAY;AAC3B,UAAAkB,GAAUX,GAAMP,CAAQ;AAAA,QAC1B,CAAC;AACD;AAAA,MACF;AAAA,IACF,WAAWjB,EAAK,SAAS,UACnBA,EAAK,KAAK,SAAS,OAAO,GAAG;AAC/B,YAAMsC,IAAOtC,EAAK,UAAA;AAClB,MAAIsC,KACFD,GAAWb,GAAMc,CAAI;AAAA,IAEzB;AAAA,EAEJ;AACF;AAEA,eAAsBa,GAAW3B,GAAmBL,GAAwB;AAC1E,QAAMM,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,WAAA,KAAgBA,EAAK,aAAc;AAE5C,QAAM,EAAE,OAAAqB,EAAA,IAAUrB,EAAK,YAAA;AACvB,MAAIqB,GAAO;AACT,UAAMC,IAAiBD,EAAA;AAEvB,SAAsBC,KAAA,gBAAAA,EAAiB,oBAAmB,GAAO;AAAA,EACnE;AACA,QAAMC,IAAsBpD,GAAA;AAC5B,MAAIC,IAAgB;AACpB,MAAI;AACF,IAAAA,IAAgB,MAAM,UAAU,UAAU,SAAA;AAAA,EAC5C,QAAQ;AACN,IAAAA,KAAgBmD,KAAA,gBAAAA,EAAqB,SAAQ;AAAA,EAC/C;AACA,MACEA,KACAC,GAAmBpD,CAAa,MAC9BoD,GAAmBD,EAAoB,IAAI,GAC7C;AACA,IAAAzB,GAAaC,GAAMwB,EAAoB,WAAW;AAClD;AAAA,EACF;AAGA,MAFA/C,GAAA,GAEIkB,KAAA,QAAAA,EAAS;AACX,IAAItB,KACF2B,EAAK,MAAM3B,CAAa;AAAA,OAErB;AACL,QAAIC,IAAiC,CAAA;AACrC,QAAI;AACF,MAAAA,IAAgB,MAAM,UAAU,UAAU,KAAA;AAAA,IAC5C,QAAQ;AACN,MAAID,KACF2B,EAAK,MAAM3B,CAAa;AAE1B;AAAA,IACF;AACA,QAAIqD,IAAS;AACb,eAAWlD,KAAQF;AACjB,UAAIE,EAAK,MAAM,SAAS,WAAW,GAAG;AACpC,QAAAkD,IAAS;AACT;AAAA,MACF;AAEF,eAAWlD,KAAQF;AACjB,UAAIE,EAAK,MAAM,SAAS,YAAY,KAAK,CAACkD,GAAQ;AAEhD,cAAMvC,IAAO,OADI,MAAMX,EAAK,QAAQ,YAAY,GACpB,KAAA;AAC5B,QAAIW,KACFa,EAAK,MAAMb,CAAI;AAAA,MAEnB,WAAWX,EAAK,MAAM,SAAS,WAAW,KAAKkD,GAAQ;AAErD,cAAMjC,IAAW,OADI,MAAMjB,EAAK,QAAQ,WAAW,GACf,KAAA;AACpC,QAAIiB,KACFkB,GAAUX,GAAMP,CAAQ;AAAA,MAE5B,WAAWjB,EAAK,MAAM,KAAK,OAAQoD,EAAK,WAAW,QAAQ,CAAC,GAAG;AAC7D,cAAMA,IAAOpD,EAAK,MAAM,KAAK,CAAAoD,MAAQA,EAAK,WAAW,QAAQ,CAAC,GACxDC,IAAY,MAAMrD,EAAK,QAAQoD,CAAI;AACzC,QAAAf,GAAWb,GAAM6B,CAAS;AAAA,MAC5B;AAAA,EAEJ;AACF;ACrOO,MAAMC,GAAY;AAAA,EAOvB,YAAY7B,GAAY8B,GAA0B;AAN1C,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,cAAc8B,GACnB,KAAK,WAAW9B,EAAK,YAAA;AAErB,UAAMgC,IAAiB,SAAS,cAAc,UAAU;AACxD,IAAAA,EAAe,eAAe,OAC9BA,EAAe,UAAU,IAAI,GAAGC,CAAa,YAAY,GACzDD,EAAe,YAAY,IAC3B,KAAK,UAAU,OAAOA,CAAc,GACpC,KAAK,iBAAiBA,GAEtBA,EAAe,YAAY,CAACZ,MAAuB,KAAK,SAASA,CAAG,GACpEY,EAAe,UAAU,KAAK,OAAO,KAAK,IAAI,GAC9CA,EAAe,UAAU,CAACZ,MAAwB,KAAK,OAAOA,CAAG,GACjEY,EAAe;AAAA,MACb;AAAA,MACA,KAAK,kBAAkB,KAAK,IAAI;AAAA,IAAA,GAElCA,EAAe;AAAA,MACb;AAAA,MACA,KAAK,gBAAgB,KAAK,IAAI;AAAA,IAAA;AAAA,EAElC;AAAA,EAEO,oBAAyC;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,SAASZ,GAAoB;AACnC,SAAK,YAAY,QAAQA,CAAG;AAAA,EAC9B;AAAA,EAEQ,OAAOA,GAAY;AACzB,UAAMnD,IAAoBmD,EAAK;AAC/B,IAAInD,KACF,KAAK,YAAY,MAAMA,CAAI,GAEzB,KAAK,SAAS,eAAe,OAAO,KACtC,KAAK,SAAS,KAAK,SAASmD,CAAG;AAAA,EAEnC;AAAA,EAEQ,OAAOA,GAAqB;AAIlC,IAHmB,KAAK,KAAK,WAAA,KAGzB,CADkBA,EAAI,kBAE1BD,GAAa,KAAK,aAAaC,CAAG,GAClCA,EAAI,eAAA;AAAA,EACN;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,YAAY,iBAAA;AAAA,EACnB;AAAA,EAEQ,gBAAgBA,GAAuB;AAC7C,SAAK,YAAY,eAAeA,CAAG;AAAA,EACrC;AACF;AChDO,MAAMc,GAAO;AAAA,EAYlB,YAAYlC,GAAY8B,GAA0B;AAXjC,IAAAC,EAAA,yBAAkB,GAAGE,CAAa;AAE3C,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,UAAUA,EAAK,WAAA,GAEpB,KAAK,YAAY,SAAS,cAAc,KAAK,GAC7C,KAAK,UAAU,UAAU,IAAI,GAAGiC,CAAa,SAAS,GACtD,KAAK,UAAU,OAAO,KAAK,SAAS,GACpC,KAAK,cAAc,IAAIJ,GAAY7B,GAAM8B,CAAW,GACpD,KAAK,eAAe;AAAA,EACtB;AAAA,EAEO,eAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,cAAmC;AACxC,WAAO,KAAK,YAAY,kBAAA;AAAA,EAC1B;AAAA,EAEO,mBAA4B;AACjC,WAAO,KAAK,kBAAkB,SAAS;AAAA,EACzC;AAAA,EAEO,mBAA2B;AAChC,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEO,qBAAqB;AAC1B,SAAK,cAAc,QAAQ;AAAA,EAC7B;AAAA,EAEO,uBAAuB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,cAAc;AACpB,SAAK,UAAU,UAAU,IAAI,KAAK,eAAe;AAAA,EACnD;AAAA,EAEQ,aAAa;AACnB,SAAK,UAAU,UAAU,OAAO,KAAK,eAAe;AAAA,EACtD;AAAA,EAEQ,mBAAmB;AACzB,SAAK,mBAAA,GACL,KAAK,eAAe,OAAO,WAAW,MAAM;AAC1C,WAAK,YAAA;AAAA,IACP,GAAG,GAAG;AAAA,EACR;AAAA,EAEQ,qBAAqB;AAC3B,IAAI,KAAK,iBACP,KAAK,WAAA,GACL,OAAO,aAAa,KAAK,YAAY,GACrC,KAAK,eAAe;AAAA,EAExB;AAAA,EAEO,QAAQ;AAEb,QAAIK,MAAY,KAAK,KAAK,WAAA,EAAc;AACxC,UAAMH,IAAiB,KAAK,YAAY,kBAAA;AAExC,IAAI,SAAS,kBAAkBA,MAC7BA,EAAe,MAAA,GACfA,EAAe,kBAAkB,GAAG,CAAC;AAAA,EAEzC;AAAA,EAEO,WAAWI,GAA6B;AAC7C,QAAIC,IAAiB,KAAK,SAAS,kBAAA;AACnC,QAAI,CAACA,EAAgB;AACrB,UAAM,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAW,KAAK,SACzB;AAAA,MACJ,OAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAAC,IAAS;AAAA,MACT,SAAAC,IAAU;AAAA,MACV,SAAAC,IAAU;AAAA,MACV,mBAAAC;AAAA,IAAA,IACE,EAAE,GAAGN,GAAQ,GAAGH,EAAA,GAEdU,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA;AAE1B,SAAK,oBAAoBF,GACrBA,MAEFR,IADqB,KAAK,SAAS,gBAAA,EACLQ,CAAiB;AAEjD,UAAM;AAAA,MACJ,SAAAG;AAAA,MACA,YAAY,EAAE,SAAAC,GAAS,UAAAC,EAAA;AAAA,MACvB,QAAAC;AAAA,MACA,QAAAC;AAAA,IAAA,IACEf,GAKEgB,KAJc,KAAK,KAAK,QAAA,EACA,aAAA,IAC1BD,IACA,KAAK,KAAK,UAAA,MACYN,IAASC,IAE7BO,IAAsBC,KAA6BjB,GAEnDkB,IAAiB,KAAK,IAAIR,EAAQ,SAAS,GAAGM,CAAmB,GACjEG,IAAeT,EAAQ,SAASQ,IAAiB,GACjDxB,IAAiB,KAAK,YAAY,kBAAA;AACxC,IAAIY,KACF,WAAW,MAAM;AACf,WAAK,MAAA;AAAA,IACP,CAAC;AAGH,UAAMc,IACJV,EAAQ,qBAAqB,IAAI,IAAIA,EAAQ,oBACzCW,IACJV,EAAQ,CAAC,IAAIE,IAASO,KAAWD,IAAeD,KAAkBH,GAC9DO,IAAaf,IAAoBI,EAAQ,CAAC,IAAIC,EAAS,CAAC;AAM9D,QALAlB,EAAe,MAAM,OAAO,GAAG4B,CAAU,MACzC5B,EAAe,MAAM,MAAM,GACzB2B,IAAYF,IAAeH,CAC7B,MAEI,CAACZ,GAAQ;AACX,WAAK,eAAA;AACL;AAAA,IACF;AACA,UAAMmB,IAAa,KAAK,KAAK,WAAA;AAC7B,SAAK,UAAU,MAAM,QAAQ,GAAGpB,IAAQH,CAAK,MAC7C,KAAK,UAAU,MAAM,kBAAkBE,GACvC,KAAK,UAAU,MAAM,OAAO,GAAGoB,CAAU,MACzC,KAAK,UAAU,MAAM,MAAM,GAAGD,CAAS,MACvC,KAAK,UAAU,MAAM,UAAUE,IAAa,SAAS,SACrD,KAAK,UAAU,MAAM,SAAS,GAAGJ,CAAY,MACzCd,IACF,KAAK,iBAAA,IAEL,KAAK,mBAAA;AAAA,EAET;AAAA,EAEO,iBAAiB;AACtB,SAAK,UAAU,MAAM,UAAU,QAC/B,KAAK,mBAAA;AAAA,EACP;AAAA,EAEO,oBAAoBP,GAAqC;AAC9D,UAAM,EAAE,gBAAAC,GAAgB,WAAAyB,EAAA,IAAc1B;AACtC,QAAI,CAACC,KAAkB,CAACyB,EAAW;AACnC,UAAM;AAAA,MACJ,QAAAV;AAAA,MACA,YAAY,EAAE,SAAAH,GAAS,YAAAc,EAAA;AAAA,IAAW,IAChC1B,GAEE2B,IACJZ,KAAU,KAAK,KAAK,UAAA,IAAc,KAAK,KAAK,WAAA,KAC5C,KAAK,UAAU,wBAAwB,KAEnCa,IAAOH,MAAcI,GAAc,IACnCpI,IAAIiI,EAAW,CAAC,GAChBxJ,IAAI0J,IAAOhB,EAAQ,CAAC,IAAIe,IAAWD,EAAW,CAAC,IAAIC,GAEnDG,IAAkBC,GAAoB,KAAK,SAAS,GACpDC,IAAO;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAEV,QAAIF,MAAoB,SAAS;AAC/B,MAAAE,EAAK,QAAQ,OAAO,YACpBA,EAAK,SAAS,OAAO;AAAA,SAChB;AACL,YAAM,EAAE,MAAAC,GAAM,OAAAC,GAAO,KAAAC,GAAK,QAAAC,EAAA,IACxBN,EAAgB,sBAAA;AAClB,MAAAE,EAAK,OAAOC,GACZD,EAAK,QAAQE,GACbF,EAAK,MAAMG,GACXH,EAAK,SAASI;AAAA,IAChB;AAEA,UAAM,EAAE,YAAAC,MAAe,KAAK;AAI5B,QAHAL,EAAK,OAAOK,EAAW,CAAC,GACxBL,EAAK,UAAUK,EAAW,CAAC,GAGzB,EAAE5I,KAAKuI,EAAK,QAAQvI,KAAKuI,EAAK,SAAS9J,KAAK8J,EAAK,OAAO9J,KAAK8J,EAAK,SAClE;AACA,YAAM,EAAE,YAAAM,GAAY,WAAAC,EAAA,IAAcT;AAClC,MAAAF,IACIE,EAAgB,OAAOQ,GAAYC,KAAaP,EAAK,MAAM9J,EAAE,IAC7D4J,EAAgB,OAAOQ,GAAYC,IAAYrK,IAAI8J,EAAK,MAAM;AAAA,IACpE;AAAA,EACF;AACF;AChOO,MAAMQ,GAA4C;AAAA,EAIvD,YAAYtE,GAAmBuE,GAAkB;AAHvC,IAAA/C,EAAA;AACA,IAAAA,EAAA;AAGR,SAAK,UAAUxB,GACf,KAAK,UAAUuE;AAAA,EACjB;AAAA,EAEO,WAAWvE,GAAmB;AACnC,SAAK,UAAUA;AAAA,EACjB;AAAA,EAEO,aAAuB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAAyB;AL3B/B,QAAAnB;AK4BC,aAAOA,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB,SAAQ;AAAA,EACvC;AAAA,EAEO,WAAuB;AAC5B,UAAMD,IAAc,KAAK,QAAQ,eAAA,GAC3B,EAAE,YAAAe,EAAA,IAAe,KAAK,QAAQ,SAAA,GAC9B6E,IAAe5F,EAAYe,CAAU,GACrCjC,IAAmB,CAAA;AAEzB,QAAI+G,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD;AAEF,MAAID,EAAW,qBAAqBC,EAAiB,SACnDjH,EAAK,QAAQgH,CAAU,GAEzBD;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,MAAIE,EAAY,qBAAqBF,EAAiB,SACpDjH,EAAK,KAAKmH,CAAW,GAEvBD;AAAA,IACF;AACA,WAAOlH;AAAA,EACT;AAAA,EAEO,WAAmB;AACxB,WAAO;AAAA,EACT;AAAA,EAEO,UACLoH,GACAC,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GAC9B;AAEA,QACE,CAACA,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC;AAEF,UAAM,EAAE,SAAAR,MAAY,KAAK,SACnB3F,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClD,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAC/CP,IAAe5F,EAAYe,CAAU;AAE3C,QAAI8E,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD;AAEF,UAAID,EAAW,qBAAqBC,EAAiB,UAAU;AAC7D,cAAMK,IAAWN,EAAW;AAC5B,QAAAM,EAAS,QAAQF,EAAM,SAASE,EAAS,IAAK;AAAA,MAChD;AACA,MAAAP;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,UAAIE,EAAY,qBAAqBF,EAAiB,UAAU;AAC9D,cAAMK,IAAWH,EAAY;AAC7B,QAAAG,EAAS,QAAQF,EAAM,SAASE,EAAS,IAAK;AAAA,MAChD;AACA,MAAAJ;AAAA,IACF;AACA,IAAAL,EAAS,OAAOO,EAAM,KAAK,GAAG,GAC9B,KAAK,QAAQ,eAAe;AAAA,MAC1B,UAAUnF;AAAA,MACV,aAAa;AAAA,IAAA,CACd,GACD,KAAK,QAAQ,yBAAyB;AAAA,MACpC,SAAAoF;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEO,QAAQlE,GAAmC;AAChD,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,UAAMtC,IAAQ,KAAK,QAAQ,SAAA;AAE3B,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAoB,GAAY,UAAAsF,EAAA,IAAa1G;AAEjC,WAAIsC,EAAI,QAAQqE,GAAO,aAAarE,EAAI,QAAQqE,GAAO,SAC9C,KAAK,QAAQ,cAAcvF,CAAU,IAEvCsF;AAAA,EACT;AAAA,EAEO,MAAc;AACnB,WAAO;AAAA,EACT;AACF;AClJO,MAAME,WAAqBb,GAAgB;AAAA,EACzC,UACLQ,GACAC,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GAC9B;AAEA,QACE,CAACA,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC;AAEF,UAAM,EAAE,SAAAR,MAAY,KAAK,SACnB3F,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClD,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAC/CP,IAAe5F,EAAYe,CAAU;AAE3C,QAAI8E,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD;AAEF,UAAID,EAAW,qBAAqBC,EAAiB,OAAO;AAC1D,cAAMS,IAAQV,EAAW;AACzB,QAAAU,EAAM,QAAQN,EAAM,SAASM,EAAM,IAAK;AAAA,MAC1C;AACA,MAAAX;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,UAAIE,EAAY,qBAAqBF,EAAiB,OAAO;AAC3D,cAAMS,IAAQP,EAAY;AAC1B,QAAAO,EAAM,QAAQN,EAAM,SAASM,EAAM,IAAK;AAAA,MAC1C;AACA,MAAAR;AAAA,IACF;AACA,IAAAL,EAAS,OAAOO,EAAM,KAAK,GAAG,GAC9B,KAAK,QAAQ,eAAe;AAAA,MAC1B,UAAUnF;AAAA,MACV,aAAa;AAAA,IAAA,CACd,GACD,KAAK,QAAQ,yBAAyB;AAAA,MACpC,SAAAoF;AAAA,IAAA,CACD;AAAA,EACH;AACF;ACpDO,SAASM,GAAc7F,GAAmB;AAC/C,QAAMC,IAAOD,EAAK,QAAA,GACZ8F,IAAW7F,EAAK,YAAA,GAChBC,IAAeD,EAAK,SAAA;AAE1B,EAAAD,EAAK,cAAc,IACnBA,EAAK,aAAa+F,GAAU7F,EAAa,SAAA,CAAU,GACnDF,EAAK,mBAAmBC,EAAK,eAAA,GAC7BD,EAAK,oBAAoB8F,EAAS,gBAAA,GAClC9F,EAAK,uBAAuB8F,EAAS,mBAAA;AACvC;AAEO,SAASE,GAAYxF,GAAmBP,GAAY;AACzD,QAAM,EAAE,UAAAuF,GAAU,SAAAT,EAAA,IAAYvE;AAE9B,MAAI,CAACuE;AACH,IAAA9E,EAAK,oBAAA,EAAsB,UAAUO,CAAO;AAAA,OACvC;AACL,UAAM8E,IAAQP,KAAA,QAAAA,EAAS,OAAOA,EAAQ,KAAK,MAAM,GAAG,IAAI,CAAA;AACxD,QAAIS,KAAA,QAAAA,EAAU,OAAO;AACnB,YAAMS,IAAYX,EAAM,UAAU,CAAA1O,MAAKA,MAAM4O,EAAS,IAAI;AAC1D,MAAAF,EAAM,OAAOW,GAAW,CAAC;AAAA,IAC3B;AACE,MAAIT,KAAA,QAAAA,EAAU,QACZF,EAAM,KAAKE,EAAS,IAAI;AAG5B,UAAMU,IAAgBjG,EAAK,WAAA,EAAa,iBAAA;AACxC,IAAIiG,aAAyBpB,MAC3BoB,EAAc,UAAUZ,CAAK;AAAA,EAEjC;AACF;AAEO,SAASa,GAAS3F,GAAmBP,GAAY;AACtD,QAAM,EAAE,OAAA2F,GAAO,SAAAb,EAAA,IAAYvE;AAE3B,MAAI,CAACuE;AACH,IAAA9E,EAAK,iBAAA,EAAmB,UAAUO,CAAO;AAAA,OACpC;AACL,UAAM8E,IAAQM,KAAA,QAAAA,EAAO,OAAO,CAACA,EAAM,IAAI,IAAI,CAAA,GACrCM,IAAgBjG,EAAK,WAAA,EAAa,iBAAA;AACxC,IAAIiG,aAAyBP,MAC3BO,EAAc,UAAUZ,CAAK;AAAA,EAEjC;AACF;AAEO,SAASc,GAAU/E,GAAiBrB,GAAmB;AP/D3D,MAAAX,GAAAgH;AOgED,QAAMpG,IAAOD,EAAK,QAAA,GACZ8D,IAAa7D,EAAK,WAAA,GAClBC,IAAeD,EAAK,SAAA,GACpB6F,IAAW7F,EAAK,YAAA,GAEhBlB,IAAQmB,EAAa,SAAA;AAC3B,MACEmB,EAAI,WAAWiF,GAAiB,UAC/BvH,EAAM,iBAAiB,CAACmB,EAAa,eAAA;AAEtC;AAGF,MAAI,CAACF,EAAK,eACJ,CAAC8D,KAAc/E,EAAM,eAAeA,EAAM,YACrBmB,EAAa;AAAA,IAClCmB,EAAI;AAAA,IACJA,EAAI;AAAA,EAAA,GAEc;AAClB,IAAAwE,GAAc7F,CAAI;AAClB;AAAA,EACF;AAIJ,QAAMuG,IADSlF,EAAI,OACM,QAAQ;AAEjC,EAAIkF,KACFtG,EAAK,UAAU,OAAOsG,CAAS,CAAC,GAElCvG,EAAK,mBAAmB;AAExB,QAAMwG,IAAqBT,GAAUD,EAAS,mBAAA,CAAoB,GAC5DW,IAAiBX,EAAS,sBAAsB;AAAA,IACpD,GAAGzE,EAAI;AAAA,IACP,GAAGA,EAAI;AAAA,EAAA,CACR;AACD,MAAI,CAACoF,EAAgB;AACrB,QAAM;AAAA,IACJ,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,cAAAC;AAAA,IACA,mBAAAlE;AAAA,EAAA,IACE2D;AAEJ,EAAAzG,EAAK,yBAAyB;AAAA,IAC5B,GAAGyG;AAAA,IACH,OAAOM,IAAUC,IAAgBN;AAAA,IACjC,GAAGrF,EAAI;AAAA,IACP,GAAGA,EAAI;AAAA,EAAA;AAET,QAAMjC,IAAca,EAAK,eAAA,GACnBgH,IAAenB,EAAS,gBAAA,GACxBoB,IAAWH,IAAUC,IAAgBN,GACrCS,IAAa/H,EAAY8H,CAAQ,GAEjCE,IAAmB,CAAC,EAAET,KAAeG,IACrCO,IAAsB,CAAC,EAAEV,KAAeC,IACxCU,IAAmB,CAAC,EAAEX,KAAeE;AAC3C,MAAI,CAACH,GAAO;AACV,QAAIvG,IAAa+G,GACbzB,IAAWyB;AAEf,QAAI7F,EAAI,UAAU;AAChB,YAAM,EAAE,YAAYkG,MAAkBrH,EAAa,SAAA;AACnD,MAAI,CAACqH,KACwBzB,EAAS,mBAAA,EACb,SAASU,EAAmB,SAC7CU,IAAWK,IACbpH,IAAaoH,IAEb9B,IAAW8B;AAAA,IAInB;AAIA,QAHArH,EAAa,SAASC,GAAYsF,CAAQ,GAC1CK,EAAS,kBAAkBmB,EAAaC,CAAQ,CAAC,GAE7CG,KAAuB,CAACvD;AAC1B,MAAAkC,GAAYmB,GAAYlH,CAAI;AAAA,aACnBqH,KAAoB,CAACxD;AAC9B,MAAAqC,GAASgB,GAAYlH,CAAI;AAAA,aAEzBkH,EAAW,qBAAqBhC,EAAiB,YAChD9F,IAAA8H,EAAW,YAAX,gBAAA9H,EAAoB,UAASmI,GAAY,cACxCnB,IAAAc,EAAW,YAAX,gBAAAd,EAAoB,UAASmB,GAAY,QAC3C;AAEA,UAAIvC,IAAWiC;AACf,aAAOjC,IAAW,KAAG;AACnB,cAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,YAAIC,EAAW,qBAAqBC,EAAiB,UAAU;AAC7D,UAAAa,GAAYd,GAAYjF,CAAI;AAC5B;AAAA,QACF,WAAWiF,EAAW,qBAAqBC,EAAiB,OAAO;AACjE,UAAAgB,GAASjB,GAAYjF,CAAI;AACzB;AAAA,QACF;AACA,QAAAgF;AAAA,MACF;AAAA,IACF;AACE,MAAAhF,EAAK,OAAO;AAAA,QACV,UAAAiH;AAAA,QACA,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,aACE,CAACE,KAAoB,CAACC,KAAuB,CAACC;AAAA,MAAA,CACjD;AAGH,IAAIxE,KACF9C,EAAK,QAAA,EAAU,UAAA,EAAY,WAAW;AAAA,MACpC,mBAAA8C;AAAA,IAAA,CACD;AAAA,EAEL;AAEA,QAAM2E,IAAYxH,EAAK,aAAA;AAEvB,MADAwH,EAAU,aAAA,GACNL,GAAkB;AACpB,UAAMM,IAA4C;AAAA;AAAA,MAEhD,aACE5D,KACC,CAACqD,EAAW,aAAalH,EAAK,QAAA,MAAc0H,GAAW;AAAA,IAAA;AAE5D,IAAIR,EAAW,SAAShG,EAAY,UAClCuG,EAAoB,OAAO,OAC3BA,EAAoB,SAAS,aAE/BD,EAAU;AAAA,MACRN;AAAA,MACAF,EAAaC,CAAQ;AAAA,MACrBQ;AAAA,IAAA,GAGFzH,EAAK,UAAA,EAAY,WAAW;AAAA,MAC1B,QAAQ;AAAA,IAAA,CACT,GAED4F,GAAc7F,CAAI,IAGhBmH,EAAW,eAAeS,EAAa,YACvCT,EAAW,eAAeS,EAAa,aACvCT,EAAW,eAAeS,EAAa,iBAEvC3H,EAAK,iBAAA,EAAmB,iBAAiBkH,CAAU;AAGrD,UAAMU,IAAW5H,EAAK,YAAA;AACtB,IAAI4H,EAAS,eAAe,gBAAgB,KAC1CA,EAAS,KAAK,kBAAkB;AAAA,MAC9B,KAAAxG;AAAA,MACA,SAAS8F;AAAA,IAAA,CACV;AAAA,EAEL;AAEA,QAAMW,IAAY7H,EAAK,aAAA;AACvB,EAAA6H,EAAU,QAAA,GACNf,KAAW,CAACjD,KAAc7D,EAAK,QAAA,MAAc0H,GAAW,QAC1DG,EAAU,OAAA;AAGZ,QAAMC,IAAoB9H,EAAK,qBAAA;AAC/B,EAAA8H,EAAkB,oBAAA,GACdZ,EAAW,SAAShG,EAAY,cAC9B6G,GAAM3G,CAAG,IACX0G,EAAkB,cAAcZ,CAAU,IAE1CY,EAAkB,mBAAmBZ,GAAYF,EAAaC,CAAQ,CAAC;AAI3E,QAAMe,IAAehI,EAAK,gBAAA;AAC1B,EAAAgI,EAAa,gBAAA,GACTd,EAAW,SAAShG,EAAY,QAAQ,CAAC2C,KAC3CmE,EAAa,iBAAiBd,GAAYF,EAAaC,CAAQ,CAAC;AAEpE;AC5OA,SAASgB,GAAa1H,GAA2B;AAC/C,QAAM2H,IAASC,GAAA;AACf,iBAAQ,IAAI5H,GAAS,UAAU2H,CAAM,GAC9BA;AACT;AAEA,SAASE,GAAwBF,GAAgB/I,GAAyB;AACxE,SAAwBA,EAAa,UAAU,CAAAkJ,MAAMA,EAAG,WAAWH,CAAM;AAC3E;AAGA,SAASI,GACP/H,GACAa,GACArB,GACA;AACA,QAAMC,IAAOD,EAAK,QAAA;AAClB,MACEQ,EAAQ,eAAeoH,EAAa,YACpCpH,EAAQ,eAAeoH,EAAa,aACpCpH,EAAQ,eAAeoH,EAAa,cACpC;AACA,UAAMY,IAAQnH,EAAI,UAAUrB,EAAK,uBAAwB,GACnDyI,IAAQpH,EAAI,UAAUrB,EAAK,uBAAwB,GACnD0I,IAAmBlI,EAAQ;AACjC,IAAAA,EAAQ,mBAAmB;AAAA,MACzB,GAAGkI,EAAiB,IAAIF;AAAA,MACxB,GAAGE,EAAiB,IAAID;AAAA,MACxB,QAAQxI,EAAK,UAAA;AAAA,IAAU;AAAA,EAE3B;AACA,EAAAA,EAAK,iBAAA,EAAmB,kBAAA;AAC1B;AAEO,SAAS0I,GAAQtH,GAAiBrB,GAAmB;ARhDzD,MAAAX,GAAAgH,GAAAuC,GAAAC,GAAA5S,GAAA6S;AQkDD,MAAI9I,EAAK,aAAa;AACpB,UAAMC,IAAOD,EAAK,QAAA;AAClB,QAAIC,EAAK,WAAA,KAAgBA,EAAK,cAAc;AAC1C,MAAAD,EAAK,UAAUqB,CAAG;AAClB;AAAA,IACF;AACA,UAAMyE,IAAW7F,EAAK,YAAA,GAChBgH,IAAenB,EAAS,gBAAA,GACxBiD,IAAkBjD,EAAS,mBAAA,GAC3B5F,IAAeD,EAAK,SAAA,GACpB+I,IAAahJ,EAAK,YAClBiJ,IAAmBjJ,EAAK,kBACxBkJ,IAAoBlJ,EAAK,mBACzBmJ,IAAuBnJ,EAAK,sBAC5BjB,IAAQmB,EAAa,SAAA,GAErBkJ,IAAwBJ,EAAW,eAAeA,EAAW,UAE7DK,IAAkBD,IACpBJ,EAAW,aAAa,IACxBA,EAAW,YACTM,IAAgBN,EAAW;AAEjC,QACEjK,EAAM,cAAcsK,KACpBtK,EAAM,YAAYuK,OAClBjK,IAAAW,EAAK,yBAAL,gBAAAX,EAA2B,UAAS0J,EAAgB,MACpD;AAEA,MAAA9I,EAAK,gBAAA;AAEL,UAAIsJ,IAAkB,IAClBC,KAAY;AAChB,UAAIJ,GAAuB;AAEzB,cAAMK,KAAcR,EAAiBK,CAAa;AAClD,YACEG,GAAY,SAAStI,EAAY,SACjCsI,GAAY,SAAStI,EAAY,OACjC;AAEA,cADAoH,GAAgBkB,IAAapI,GAAKrB,CAAI,GAEpCyJ,GAAY,eAAe7B,EAAa,YACxC6B,GAAY,eAAe7B,EAAa,aACxC6B,GAAY,eAAe7B,EAAa;AAExC,YAAA3H,EAAK,aAAA,EAAe,YAAYwJ,EAAW,GAC3CF,IAAkB;AAAA,eACb;AACL,kBAAMG,KAAgBR,EAAkBI,CAAa;AACrD,YAAArJ,EAAK,aAAA,EAAe,YAAYwJ,IAAaC,EAAa;AAAA,UAC5D;AAEA,UAAAF,KAAYC,GAAY,eAAe7B,EAAa;AAAA,QACtD;AAAA,MACF;AACA,MAAA1H,EAAa,aAAa;AAAA,QACxB,GAAG8I;AAAA,MAAA,CACJ,GACD/I,EAAK,OAAO;AAAA,QACV,WAAAuJ;AAAA,QACA,iBAAAD;AAAA,QACA,aAAa;AAAA,MAAA,CACd;AACD;AAAA,IACF;AAEA,UAAMI,IAAkBV,EAAiB;AAAA,MACvCI,IAAkB;AAAA,MAClBC,IAAgB;AAAA,IAAA,GAEZM,IAAmBD,EAAgB,KAAK,CAAAnJ,MAAWA,EAAQ,SAAS;AAC1E,QAAIoJ,GAAkB;AAEpB,YAAMC,IAAoBZ,EAAiBI,IAAkB,CAAC,GACxDS,KAAkBb,EAAiBK,CAAa;AAatD,UAAI,GAXA,CAACO,EAAkB,aACnBA,EAAkB,qBAAqB1E,EAAiB,YACvD,CAAC2E,GAAgB,aAChBA,GAAgB,qBAAqB3E,EAAiB,YACzD0E,EAAkB,cAAcC,GAAgB,aAC/CD,EAAkB,qBAAqB1E,EAAiB,UACxD2E,GAAgB,qBAAqB3E,EAAiB,aACvD0E,IAAAA,EAAkB,YAAlBA,gBAAAA,EAA2B,UAASrC,GAAY,QAC/CqC,EAAkB,qBAAqB1E,EAAiB,WACxD2E,IAAAA,GAAgB,YAAhBA,gBAAAA,EAAyB,UAAStC,GAAY,QAC9CsC,GAAgB,qBAAqB3E,EAAiB,QACjC;AACvB,QAAAlF,EAAK,OAAO;AAAA,UACV,UAAUlB,EAAM;AAAA,UAChB,WAAW;AAAA,UACX,iBAAiB;AAAA,QAAA,CAClB;AACD;AAAA,MACF;AAAA,IACF;AAEA,UAAMgG,IAAU9E,EAAK,WAAA,GACfb,IAAca,EAAK,eAAA,GAEnB8J,IACJ,CAACH,KACD,CAAC,CAACxK,EAAYL,EAAM,UAAU,EAAE,aAChC,CAACgG,EAAQ,mCAAmC4E,CAAe,GACvDK,IAAgB/J,EAAK,WAAA,GAErBgK,IAAqBN,EAAgB,IAAI,CAAArB,MAAM;AACnD,UAAI,CAACA,EAAG,QAAQA,EAAG,SAASnH,EAAY,MAAM;AAC5C,cAAM+I,KAAuB;AAAA,UAC3B,OAAO5B,EAAG;AAAA,QAAA,GAEN6B,KAAWC;AACjB,eAAKL,KACHI,GAAS,KAAK,GAAGE,EAAoB,GAEvCF,GAAS,QAAQ,CAAAG,OAAQ;AACvB,gBAAMrJ,KAAQqH,EAAGgC,EAAI;AACrB,UAAIrJ,OAAU,WACZiJ,GAAWI,EAAI,IAAIrJ;AAAA,QAEvB,CAAC,GACMiJ;AAAA,MACT,OAAO;AACL,YAAIA,KAAanE,GAAUuC,CAAE;AAC7B,eAAIyB,MACFG,KAAaK,GAAWL,IAAYG,EAAoB,IAE1DG,GAAkB,CAACN,EAAU,GAAG;AAAA,UAC9B,sBAAsB;AAAA,UACtB,eAAAF;AAAA,QAAA,CACD,GACME;AAAA,MACT;AAAA,IACF,CAAC;AACDxJ,IAAAA,GAAqBtB,GAAa6K,GAAoBlL,EAAM,YAAY;AAAA,MACtE,eAAekB,EAAK,WAAA;AAAA,IAAW,CAChC;AAED,UAAM4J,IAAoBZ,EAAiBI,CAAe,GACpDoB,IAAqBvB,EAAkBG,CAAe,GACtDqB,IAAoBxC,GAAae,EAAiBI,CAAe,CAAC,GAClEsB,IAAkBzC,GAAae,EAAiBK,CAAa,CAAC,GAE9DsB,IAAgBX,EAAmB;AACzC,QAAIY,IAAa9L,EAAM,YACnB+L,IAAWD,IAAaD;AAC5B,UAAM1E,IAAgBnB,EAAQ,iBAAA;AAU9B,QAREmB,KACA+C,EAAiB4B,CAAU,EAAE,qBAAqB1F,EAAiB,WAEnE2F,IAAW5E,EAAc,SAAS+D,CAAkB,GACpDY,IAAaC,IAAWF,KAExB3K,EAAK,kBAAkBb,GAAayL,IAAa,GAAG,GAAGZ,CAAkB,GAEvE,CAAC,CAACa,GAAU;AACd,MAAA7K,EAAK,OAAO;AAAA,QACV,aAAa;AAAA,MAAA,CACd;AACD;AAAA,IACF;AAEA,UAAM8K,IAAe7C,GAAa9I,EAAYyL,CAAU,CAAC,GACnDG,IAAa9C,GAAa9I,EAAY0L,CAAQ,CAAC,GAE/CG,IAAuB5C;AAAA,MAC3BqC;AAAA,MACAzB;AAAA,IAAA,GAEIiC,IAAqB7C;AAAA,MACzBsC;AAAA,MACA1B;AAAA,IAAA,GAEIa,KAAkBb,EAAiBiC,CAAkB;AAC3D,QACEpB,GAAgB,aAChBA,GAAgB,qBAAqB3E,EAAiB;AAEtD,MAAAjF,EAAa,aAAa;AAAA,QACxB,GAAG8I;AAAA,QACH,YAAYiC;AAAA,QACZ,UAAUC;AAAA,MAAA,CACX,IACDrC,IAAA9D,EAAQ,iBAAA,MAAR,QAAA8D,EAA4B;AAAA,SACvB;AAEL,UAAIsC,IAAuB;AAC3B,UAAIhC,KAAA,QAAAA,EAAsB,SAAS;AACjC,cAAM,EAAE,SAAAiC,IAAS,SAAAC,IAAS,SAAAC,GAAA,IAAYnC;AAEtC,QAAAgC,IAAuB,CADGlL,EAAK,uBAAA,EACW;AAAA,UACxC,CAAAqI,OAAA;ARnPP,gBAAAjJ,GAAAgH,IAAAuC,IAAAC;AQoPS,mBAAAP,GAAG,OAAO8C,QACVvC,MAAAD,MAAAvC,MAAAhH,IAAAiJ,MAAA,gBAAAA,GAAI,WAAJ,gBAAAjJ,EAAagM,QAAb,gBAAAhF,GAAwB,WAAxB,gBAAAuC,GAAiC0C,QAAjC,gBAAAzC,GAA4C,eAAc;AAAA;AAAA,QAAA;AAAA,MAEhE;AACA,MAAIsC,KACFlL,EAAK;AAAA,QACHgJ;AAAA,QACAgC,IAAuB;AAAA,QACvBC,IAAqBD;AAAA,MAAA;AAAA,IAG3B;AAEA,UAAMjG,IAAe5F,EAAYL,EAAM,UAAU,GAC3CwM,IAAgBtE,EAAalI,EAAM,UAAU;AACnD,QAAIyM,KAAuBzC,EAAgB;AAC3C,IAAIyC,OACExG,EAAa,WAAW,CAAC6E,EAAkB,UAEzCY,EAAmB,QAAQe,OAC7BA,MAAwBZ,KAEjB,CAAC5F,EAAa,WAAW6E,EAAkB,WAEhD0B,EAAc,QAAQC,OACxBA,MAAwBZ,IAG5B9E,EAAS,mBAAmB;AAAA,MAC1B,GAAGiD;AAAA,MACH,OAAOyC;AAAA,IAAA,CACR;AAGH,UAAMC,KAAkBpD,GAAwB0C,GAAc3L,CAAW,GACnEsM,IAAgBrD,GAAwB2C,GAAY5L,CAAW;AACrE,IAAAc,EAAa;AAAA,MACXkJ,IAAwBsC,IAAgBD;AAAA,MACxCC;AAAA,MACA3M,EAAM;AAAA,MACNA,EAAM;AAAA,MACNA,EAAM;AAAA,MACNA,EAAM;AAAA,MACNA,EAAM;AAAA,IAAA,GAGRkB,EAAK,gBAAA;AAEL,QAAI0L,IAA8B;AAClC,QAAIvC,GAAuB;AAEzB,YAAMK,KADcxJ,EAAK,eAAA,EACOyL,CAAa;AAC7C,OACEjC,GAAY,SAAStI,EAAY,SACjCsI,GAAY,SAAStI,EAAY,WAEjCoH,GAAgBkB,IAAapI,GAAKrB,CAAI,GACtC2L,IAAalC;AAAA,IAEjB;AAkBA,QAhBAxJ,EAAK,OAAO;AAAA,MACV,aAAa;AAAA,IAAA,CACd,GAEGiG,IACFnB,EAAQ,yBAAA,IACC8E,EAAkB,aAC3B9E,EAAQ,yBAAyB;AAAA,MAC/B,SAAS;AAAA,QACP,OAAOiE;AAAA,QACP,aAAaC;AAAA,MAAA;AAAA,MAEf,gBAAgBY;AAAA,IAAA,CACjB,GAGC8B;AACF,UACEA,EAAW,eAAe/D,EAAa,YACvC+D,EAAW,eAAe/D,EAAa,aACvC+D,EAAW,eAAe/D,EAAa;AAEvC,QAAA3H,EAAK,aAAA,EAAe,YAAY0L,CAAU;AAAA,WACrC;AAEL,cAAMC,KADmB9F,EAAS,gBAAA,EACI4F,CAAa;AACnD,QAAAzL,EAAK,aAAA,EAAe,YAAY0L,GAAYC,EAAY;AAAA,MAC1D;AAAA,EAEJ,MAAA,CAAW5L,EAAK,iBAEV/J,IAAA+J,EAAK,eAAL,gBAAA/J,EAAiB,kBAAe6S,IAAA9I,EAAK,eAAL,gBAAA8I,EAAiB,aACnD9I,EAAK,UAAUqB,CAAG;AAGxB;AClVO,SAASwK,GAAWxK,GAAiBrB,GAAmB;AAC7D,QAAMC,IAAOD,EAAK,QAAA;AAElB,MAAI,CAACC,EAAK,WAAA,EAAa,0BAA2B;AAElD,QAAM6L,IAAgB7L,EAAK,iBAAA,GACrB,EAAE,GAAAlE,GAAG,GAAAvB,GAAG,OAAAkI,GAAO,QAAAK,EAAA,IAAW+I,EAAc,sBAAA;AAC9C,EAAIzK,EAAI,KAAKtF,KAAKsF,EAAI,KAAKtF,IAAI2G,KAASrB,EAAI,KAAK7G,KAAK6G,EAAI,KAAK7G,IAAIuI,KAGnE/C,EAAK,oBAAoB,EAAK;AAChC;ACRO,SAAS+L,GAAU1K,GAAiBrB,GAAmB;AVL3D,MAAAX;AUMD,QAAMY,IAAOD,EAAK,QAAA;AAElB,MAAIA,EAAK,aAAa;AAEpB,UAAMjE,IAAIsF,EAAI,SACR7G,IAAI6G,EAAI,SACR,EAAE,YAAAlB,GAAY,UAAAsF,EAAAA,IAAazF,EAAK,YAChCiH,IAAejH,EAAK;AAC1B,aAAStF,IAAIyF,IAAa,GAAGzF,KAAK+K,GAAU/K,KAAK;AAC/C,YAAM;AAAA,QACJ,YAAY,EAAE,SAAAwI,GAAS,aAAA8I,EAAA;AAAA,MAAY,IACjC/E,EAAavM,CAAC;AAClB,UACEqB,KAAKmH,EAAQ,CAAC,KACdnH,KAAKiQ,EAAY,CAAC,KAClBxR,KAAK0I,EAAQ,CAAC,KACd1I,KAAKwR,EAAY,CAAC;AAElB;AAAA,IAEJ;AACA,UAAM3C,KAAkBhK,IAAAW,EAAK,eAAL,gBAAAX,EAAiB;AACzC,QAAIgK,GAAiB;AAEnB,YAAMI,IAAczJ,EAAK,iBAAkBqJ,CAAe;AAC1D,OACEI,KAAA,gBAAAA,EAAa,UAAStI,EAAY,UACjCsI,EAAY,eAAe7B,EAAa,YACvC6B,EAAY,eAAe7B,EAAa,aACxC6B,EAAY,eAAe7B,EAAa,kBAE1C3H,EAAK,aAAA,EAAe,aAAA,GACpBA,EAAK,mBAAmB,eAAeoB,EAAI,WAAWA,EAAI,SAAS;AAAA,IAEvE;AACA,IAAArB,EAAK,SAASqB,CAAG,GACjBrB,EAAK,cAAc;AACnB;AAAA,EACF;AACA,MAAI,CAACA,EAAK,oBAAoB,CAACA,EAAK,uBAAwB;AAE5D,QAAMuG,IADSlF,EAAI,OACM,QAAQ;AAEjC,EAAIkF,KACFtG,EAAK,UAAU,OAAOsG,CAAS,CAAC;AAGlC,QAAMT,IAAW7F,EAAK,YAAA,GAChBwG,IAAiBX,EAAS,gBAAgB;AAAA,IAC9C,GAAGzE,EAAI;AAAA,IACP,GAAGA,EAAI;AAAA,EAAA,CACR;AACD,MAAI,CAAC,CAACoF,EAAe,MAAO;AAC5B,QAAM;AAAA,IACJ,OAAAC;AAAA,IACA,SAAAK;AAAA,IACA,cAAAC;AAAA,IACA,SAAAsE;AAAA,IACA,SAAAD;AAAA,IACA,SAAAD;AAAA,IACA,MAAAa;AAAA,IACA,MAAAC;AAAA,EAAA,IACEzF,GACE;AAAA,IACJ,OAAOtG;AAAA,IACP,SAASgM;AAAA,IACT,SAASC;AAAA,IACT,SAASC;AAAA,IACT,SAASC;AAAA,EAAA,IACPtM,EAAK,wBACHyF,IAAWsB,IAAUC,IAAgBN,GAErCxG,IAAeD,EAAK,SAAA;AAC1B,MACE8G,KACAoF,MACCb,MAAYc,KAAgBf,MAAYgB;AAEzC,IAAAnM,EAAa;AAAA,MACXuF;AAAA,MACAA;AAAA,MACA2F;AAAA,MACAgB;AAAA,MACAd;AAAA,MACAe;AAAA,MACAhB;AAAA,IAAA,GAEFvF,EAAS,mBAAmB;AAAA,MAC1B,SAAAiB;AAAA,MACA,OAAAL;AAAA,MACA,SAAA2E;AAAA,MACA,SAAAC;AAAA,MACA,MAAAY;AAAA,MACA,MAAAD;AAAA,MACA,SAAAb;AAAA,IAAA,CACD;AAAA,OACI;AACL,QAAImB,IAAM,CAAC9G,IAAWA,IAAW;AAEjC,SAAK0G,KAAgBpF,MAAYuF,MAAiBlB,EAAS;AAE3D,QAAI9K,IAAQH;AAKZ,QAJIG,IAAQiM,MAEV,CAACjM,GAAOiM,CAAG,IAAI,CAACA,GAAKjM,CAAK,IAExBA,MAAUiM,EAAK;AAEnB,UAAMnN,IAAca,EAAK,eAAA,GACnB+E,IAAe5F,EAAYkB,IAAQ,CAAC,GACpCkM,IAAapN,EAAYmN,CAAG;AAClC,SACEvH,KAAA,gBAAAA,EAAc,sBAAqBG,EAAiB,gBACpDqH,KAAA,gBAAAA,EAAY,sBAAqBrH,EAAiB,eAClDH,EAAa,cAAcwH,EAAW;AAEtC;AAEF,IAAAtM,EAAa,SAASI,GAAOiM,CAAG;AAAA,EAClC;AAEA,EAAAtM,EAAK,OAAO;AAAA,IACV,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,EAAA,CACZ;AACH;ACjIO,SAASwM,GAAUpL,GAAoBrB,GAAmB;AXH9D,MAAAX,GAAAgH;AWID,QAAMpG,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,aAAc;AACvB,QAAMC,IAAeD,EAAK,SAAA;AAC1B,MAAI,CAACC,EAAa,WAAY;AAE9B,QAAMwM,IADUzM,EAAK,WAAA,EACU,cAEzB8E,IAAU9E,EAAK,WAAA,GACf6F,IAAW7F,EAAK,YAAA;AACtB,MAAIC,EAAa,kBAAkB;AACjC,UAAMnB,IAAQmB,EAAa,SAAA,GAErBM,IADcP,EAAK,eAAA,EACGlB,EAAM,UAAU;AAC5C,SAAIM,IAAAmB,EAAQ,YAAR,QAAAnB,EAAiB,SAAQgH,IAAA7F,EAAQ,SAAR,QAAA6F,EAAc,MAAM;AAC/C,YAAMsG,IAAW5H,EAAQ,cAAchG,EAAM,UAAU;AACvD,UAAI4N,GAAU;AACZ,QAAA5N,EAAM,aAAa4N,GACnB5N,EAAM,WAAW4N,GACjBzM,EAAa,aAAanB,CAAK;AAC/B,cAAMkI,IAAenB,EAAS,gBAAA;AAC9B,QAAAA,EAAS,kBAAkBmB,EAAa0F,CAAQ,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACA,QAAM,EAAE,YAAAxM,GAAY,UAAAsF,GAAU,eAAAmH,EAAA,IAAkB1M,EAAa,SAAA;AAC7D,MAAIgH;AACJ,MAAI0F,GAAe;AACjB,UAAMC,IAAS5M,EAAK,iBAAA,EAAmB,eAAA;AACvC,QAAI,CAAC4M,EAAQ;AACb,QAAIC,IAAY;AAChB,aAASpW,IAAI,GAAGA,IAAImW,EAAO,QAAQnW,KAAK;AACtC,YAAMqW,IAAMF,EAAOnW,CAAC;AACpB,eAASE,IAAI,GAAGA,IAAImW,EAAI,QAAQnW,KAAK;AACnC,cAAMoW,IAAMD,EAAInW,CAAC;AACjB,QAAIoW,EAAI,MAAM,SAAS,MACrB/M,EAAK,kBAAkB+M,EAAI,OAAO,GAAGA,EAAI,MAAM,SAAS,CAAC,GACzDF,IAAY;AAAA,MAEhB;AAAA,IACF;AACA,IAAA5F,IAAW4F,IAAY,IAAI;AAAA,EAC7B,WACE/H,EAAQ,iBAAA,KACRA,EAAQ;AAER,IAAAmC,IAAWnC,EAAQ,QAAQ1D,CAAG,GAC1B6F,KACFnC,EAAQ,yBAAA;AAAA,OAEL;AACL,UAAMzC,IAAiBwD,EAAS,kBAAA;AAChC,QAAI,CAACxD,EAAgB;AACrB,UAAM,EAAE,OAAAoE,MAAUpE,GACZ2K,IAAc/M,EAAa,eAAA,GAC3Bd,IAAca,EAAK,eAAA;AACzB,QAAIgN,KAAevG,MAAU,GAAG;AAC9B,YAAMwG,IAAe9N,EAAYsH,CAAK;AACtC,UAAIwG,EAAa,UAAUzM,GAAM;AAC/B,QAAIyM,EAAa,UACfjN,EAAK,gBAAA,EAAkB,UAAA,GAEzBoB,EAAI,eAAA;AACJ;AAAA,MACF;AAAA,IACF;AACA,UAAM2D,IAAe5F,EAAYe,CAAU;AAC3C,QAAI8M,KAAejI,EAAa,WAAWA,EAAa,UAAUvE,GAAM;AACtE,YAAM0M,IAAqBjN,EAAa,uBAAA;AACxC,UAAIiN,GAAoB;AACtB,cAAMjI,IAAa9F,EAAYe,IAAa,CAAC;AAC7C,QAAAgN,EAAmB,QAAQ,CAAA3M,MAAW;AACpC,UAAAA,EAAQ,UAAU0E,KAAA,gBAAAA,EAAY;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAK+H;AAkBH,UAAIP,GAAgB;AAClB,cAAMlM,IAAUpB,EAAYsH,CAAK;AACjC,YAAIlG,KAAW,CAACA,EAAQ,YAAY;AAClC,cAAI4M,IAAsB;AAC1B,mBAAShW,IAAIsP,IAAQ,GAAGtP,IAAIgI,EAAY,QAAQhI,KAAK;AACnD,kBAAMkR,IAAKlJ,EAAYhI,CAAC;AACxB,gBAAIkR,KAAMA,EAAG,iBAAiB,YAAYA,EAAG,mBAAmB,QAAQ;AACtE,cAAA8E,IAAsB9E;AACtB;AAAA,YACF;AACA,gBAAIA,KAAM,CAACA,EAAG,WAAY;AAAA,UAC5B;AACA,UAAI8E,KACF5M,EAAQ,aAAa4M,EAAoB,YACzC5M,EAAQ,eAAe,UACvBA,EAAQ,iBAAiB4M,EAAoB,gBAC7C5M,EAAQ,eAAe4M,EAAoB,iBAE3C5M,EAAQ,aAAa,SAAS,KAAK,IAAA,IAAQ,MAAM,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,GACvFA,EAAQ,eAAe,UACvBA,EAAQ,iBAAiB,QACzBA,EAAQ,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,QAEtC;AACA,QAAA0G,IAAWR,IAAQ;AAAA,MACrB;AACE,QAAAzG,EAAK,kBAAkBb,GAAasH,GAAO,CAAC,GAC5CQ,IAAWR,IAAQ;AAAA,aA5CjBgG,GAAgB;AAElB,eAAStV,IAAI+I,IAAa,GAAG/I,KAAKqO,GAAUrO,KAAK;AAC/C,cAAMoJ,IAAUpB,EAAYhI,CAAC;AAC7B,QAAIoJ,KAAW,CAACA,EAAQ,eACtBA,EAAQ,aAAa,SAAS,KAAK,IAAA,IAAQ,MAAM,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,GACvFA,EAAQ,eAAe,UACvBA,EAAQ,iBAAiB,QACzBA,EAAQ,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,MAEtC;AACA,MAAA0G,IAAW/G;AAAA,IACb;AACE,MAAAF,EAAK,kBAAkBb,GAAae,IAAa,GAAGsF,IAAWtF,CAAU,GACzE+G,IAAW/G;AAAA,EAiCjB;AACA,EAAAF,EAAK,eAAA,EAAiB,sBAAA,GAClBiH,MAAa,QACfhH,EAAa,SAASC,GAAYA,CAAU,GAC5CF,EAAK,OAAO;AAAA,IACV,UAAUE;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EAAA,CAClB,MAEDD,EAAa,SAASgH,GAAUA,CAAQ,GACxCjH,EAAK,OAAO;AAAA,IACV,UAAAiH;AAAA,IACA,iBAAiB;AAAA,EAAA,CAClB;AAEL;AC7IO,SAASmG,GAAIhM,GAAoBrB,GAAmB;AZFxD,MAAAX,GAAAgH,GAAAuC;AYGD,QAAM3I,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,aAAc;AAEvB,QAAMC,IAAeD,EAAK,SAAA;AAC1B,MAAI,CAACC,EAAa,WAAY;AAE9B,QAAMwM,IADUzM,EAAK,WAAA,EACU,cAEzB,EAAE,YAAAE,GAAY,UAAAsF,GAAU,eAAAmH,EAAA,IAAkB1M,EAAa,SAAA,GAEvDd,IAAca,EAAK,eAAA,GACnB8E,IAAU9E,EAAK,WAAA;AACrB,MAAIC,EAAa,kBAAkB;AACjC,UAAMmF,IAAcjG,EAAYe,IAAa,CAAC;AAC9C,SAAId,IAAAgG,KAAA,gBAAAA,EAAa,YAAb,QAAAhG,EAAsB,SAAQgH,IAAAhB,KAAA,gBAAAA,EAAa,SAAb,QAAAgB,EAAmB,MAAM;AACzD,YAAMsG,IAAW5H,EAAQ,cAAc5E,IAAa,CAAC;AACrD,UAAIwM,GAAU;AAEZ,cAAM7G,IAAW7F,EAAK,YAAA,GAChBgH,IAAenB,EAAS,gBAAA;AAC9B,QAAAA,EAAS,kBAAkBmB,EAAa0F,CAAQ,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,MAAIzF;AACJ,MAAI0F,GAAe;AAEjB,UAAMC,IAAS5M,EAAK,iBAAA,EAAmB,eAAA;AACvC,QAAI,CAAC4M,EAAQ;AACb,QAAIC,IAAY;AAChB,aAASpW,IAAI,GAAGA,IAAImW,EAAO,QAAQnW,KAAK;AACtC,YAAMqW,IAAMF,EAAOnW,CAAC;AACpB,eAASE,IAAI,GAAGA,IAAImW,EAAI,QAAQnW,KAAK;AACnC,cAAMoW,IAAMD,EAAInW,CAAC;AACjB,QAAIoW,EAAI,MAAM,SAAS,MACrB/M,EAAK,kBAAkB+M,EAAI,OAAO,GAAGA,EAAI,MAAM,SAAS,CAAC,GACzDF,IAAY;AAAA,MAEhB;AAAA,IACF;AAEA,IAAA5F,IAAW4F,IAAY,IAAI;AAAA,EAC7B,WAAW/H,EAAQ,iBAAA,KAAsBA,EAAQ;AAE/C,IAAAmC,IAAWnC,EAAQ,QAAQ1D,CAAG,GAC1B6F,KACFnC,EAAQ,yBAAA;AAAA,YAED6D,IAAAxJ,EAAYqG,IAAW,CAAC,MAAxB,QAAAmD,EAA2B;AAEpC,IAAA1B,IAAWnC,EAAQ,cAAcU,IAAW,CAAC;AAAA,OACxC;AAEL,UAAMK,IAAW7F,EAAK,YAAA,GAChBqC,IAAiBwD,EAAS,kBAAA;AAChC,QAAI,CAACxD,EAAgB;AACrB,UAAM,EAAE,OAAAoE,MAAUpE,GAEZyG,IAAkBjD,EAAS,mBAAA;AACjC,QAAIiD,EAAgB,eAAeA,EAAgB;AACjD,MAAA9I,EAAK,kBAAkBb,GAAasH,GAAO,CAAC,GAC5CQ,IAAWR,IAAQ;AAAA,aAECxG,EAAa,eAAA,GAsB1B;AACL,UAAI,CAACd,EAAYsH,IAAQ,CAAC,EAAG;AAC7B,UAAIgG,GAAgB;AAClB,cAAMlM,IAAUpB,EAAYsH,IAAQ,CAAC;AAErC,YAAIlG,KAAW,CAACA,EAAQ,YAAY;AAClC,gBAAM6E,IAAcjG,EAAYsH,IAAQ,CAAC;AACzC,UAAIrB,KAAeA,EAAY,iBAAiB,YAAYA,EAAY,mBAAmB,UACzF7E,EAAQ,aAAa6E,EAAY,YACjC7E,EAAQ,eAAe,UACvBA,EAAQ,iBAAiB6E,EAAY,gBACrC7E,EAAQ,eAAe6E,EAAY,iBAEnC7E,EAAQ,aAAa,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,IACjFA,EAAQ,eAAe,UACvBA,EAAQ,iBAAiB,QACzBA,EAAQ,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,QAEtC;AACA,QAAA0G,IAAWR;AAAA,MACb;AACE,QAAAzG,EAAK,kBAAkBb,GAAasH,IAAQ,GAAG,CAAC,GAChDQ,IAAWR;AAAA,IAEf,WA5CMgG,GAAgB;AAElB,eAAStV,IAAI+I,IAAa,GAAG/I,KAAKqO,GAAUrO,KAAK;AAC/C,cAAMoJ,IAAUpB,EAAYhI,CAAC;AAC7B,QAAIoJ,KAAW,CAACA,EAAQ,eACtBA,EAAQ,aAAa,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,IACjFA,EAAQ,eAAe,UACvBA,EAAQ,iBAAiB,QACzBA,EAAQ,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,MAEtC;AACA,MAAA0G,IAAW/G;AAAA,IACb;AACE,MAAAF,EAAK;AAAA,QACHb;AAAA,QACAe,IAAa;AAAA,QACbsF,IAAWtF;AAAA,MAAA,GAEb+G,IAAW/G;AAAA,EA4BnB;AACA,EAAAF,EAAK,eAAA,EAAiB,sBAAA,GAClBiH,MAAa,QACfhH,EAAa,SAASC,GAAYA,CAAU,GAC5CF,EAAK,OAAO;AAAA,IACV,UAAUE;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EAAA,CAClB,MAEDD,EAAa,SAASgH,GAAUA,CAAQ,GACxCjH,EAAK,OAAO;AAAA,IACV,UAAAiH;AAAA,IACA,iBAAiB;AAAA,EAAA,CAClB;AAEL;ACvHO,SAASoG,GAAMjM,GAAoBrB,GAAmB;AbZ1D,MAAAX,GAAAgH,GAAAuC;AaaD,QAAM3I,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,aAAc;AACvB,QAAMC,IAAeD,EAAK,SAAA;AAC1B,MAAI,CAACC,EAAa,WAAY;AAC9B,QAAM,EAAE,YAAAC,GAAY,UAAAsF,MAAavF,EAAa,SAAA,GACxC+M,IAAc/M,EAAa,eAAA,GAC3Bd,IAAca,EAAK,eAAA,GACnB+E,IAAe5F,EAAYe,CAAU,GACrCqM,IAAapN,EAAYqG,CAAQ;AAEvC,MACEwH,KACAT,EAAW,UACXA,EAAW,UAAU/L,OACrBpB,IAAAD,EAAYqG,IAAW,CAAC,MAAxB,gBAAApG,EAA2B,YAAWmN,EAAW,QACjD;AACA,IAAAvM,EAAK,gBAAA,EAAkB,UAAA;AACvB;AAAA,EACF;AAEA,MAAIsN,IAAsB;AAAA,IACxB,OAAO9M;AAAAA,EAAA;AAmBT,MAjBIY,EAAI,YAAY2D,EAAa,WAC/BuI,EAAU,WAAW,KAGvB7M,GAAqBtB,GAAa,CAACmO,CAAS,GAAGpN,GAAY;AAAA,IACzD,iBAAiB;AAAA,IACjB,eAAeF,EAAK,WAAA;AAAA,EAAW,CAChC,GAGCoB,EAAI,YACJmL,EAAW,UACXA,EAAW,aAAWnG,IAAAjH,EAAYqG,IAAW,CAAC,MAAxB,gBAAAY,EAA2B,YAEjDkH,IAAYhD,GAAWgD,GAAWC,EAAiB,IAInD,EACEhB,EAAW,WACXA,EAAW,cAAY5D,IAAAxJ,EAAYqG,IAAW,CAAC,MAAxB,gBAAAmD,EAA2B,WAEpD;AAEA,UAAM6E,IAAcvN,EAAa,oBAAoBd,GAAaqG,CAAQ;AAC1E,QAAIgI,GAAa;AACf,YAAMtD,IAAW,CAAC,GAAGuD,EAAe;AAEpC,MAAID,EAAY,qBAAqBtI,EAAiB,WACpDgF,EAAS,KAAK,GAAGC,EAAyB,GAE5CD,EAAS,QAAQ,CAAAG,MAAQ;AACvB,YAAI,CAACjJ,EAAI,YAAYiJ,MAAS;AAC5B;AAEF,cAAMrJ,IAAQwM,EAAYnD,CAAI;AAC9B,QAAIrJ,MAAU,WACZsM,EAAUjD,CAAI,IAAIrJ;AAAA,MAEtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM8D,IAAU9E,EAAK,WAAA,GACfiG,IAAgBnB,EAAQ,iBAAA;AAC9B,MAAImC;AACJ,MAAIhB,KAAiBnB,EAAQ;AAC3B,IAAAmC,IAAWnC,EAAQ,SAAS,CAACwI,CAAS,CAAC,GACvCxI,EAAQ,yBAAA;AAAA,OACH;AAEL,UAAMzC,IADWrC,EAAK,YAAA,EACU,kBAAA;AAChC,QAAI,CAACqC,EAAgB;AACrB,UAAM,EAAE,OAAAoE,MAAUpE;AAClB,IAAI2K,IACFhN,EAAK,kBAAkBb,GAAasH,IAAQ,GAAG,GAAG,CAAC6G,CAAS,CAAC,IAE7DtN,EAAK;AAAA,MACHb;AAAA,MACAe,IAAa;AAAA,MACbsF,IAAWtF;AAAA,MACX,CAACoN,CAAS;AAAA,IAAA,GAGdrG,IAAWR,IAAQ;AAAA,EACrB;AACA,EAAI,CAACQ,MACHhH,EAAa,SAASgH,GAAUA,CAAQ,GACxCjH,EAAK,OAAO,EAAE,UAAAiH,GAAU,IAE1B7F,EAAI,eAAA;AACN;ACnGO,SAASkD,GAAKlD,GAAoBrB,GAAmB;AdRzD,MAAAX,GAAAgH,GAAAuC;AcSD,QAAM3I,IAAOD,EAAK,QAAA;AAElB,MADmBC,EAAK,WAAA,EACR;AAChB,QAAM6F,IAAW7F,EAAK,YAAA,GAChBqC,IAAiBwD,EAAS,kBAAA;AAChC,MAAI,CAACxD,EAAgB;AACrB,QAAMyG,IAAkBjD,EAAS,mBAAA,GAC3B,EAAE,OAAAY,MAAUpE;AAClB,MAAIoE,KAAS,KAAK,CAACqC,EAAgB,QAAS;AAC5C,QAAM7I,IAAeD,EAAK,SAAA,GACpB,EAAE,YAAAE,GAAY,UAAAsF,MAAavF,EAAa,SAAA,GACxC+M,IAAc/M,EAAa,eAAA,GAC3Bd,IAAca,EAAK,eAAA,GAEnB8E,IAAU9E,EAAK,WAAA;AACrB,MACEA,EAAK,QAAA,MAAc0H,GAAW,QAC9B5C,EAAQ,yBACP1F,IAAAD,EAAYsH,CAAK,MAAjB,gBAAArH,EAAoB,sBAAqB8F,EAAiB,YACzDkB,IAAAjH,EAAYsH,CAAK,MAAjB,gBAAAL,EAAoB,sBAAqBlB,EAAiB,WAC5D;AACA,IAAAJ,EAAQ,gBAAgB;AAAA,MACtB,WAAWZ,GAAc;AAAA,IAAA,CAC1B;AACD;AAAA,EACF;AAEA,MAAIwJ,IAAY;AAChB,MAAI3F,GAAM3G,CAAG,GAAG;AACd,UAAMuM,IAAa3N,EAAK,aAAA,GAElB4N,IACJxM,EAAI,YAAY,CAAC4L,KAAe9M,OAAemC,KAAA,gBAAAA,EAAgB,SAC3DmD,IACAtF;AACN,QAAIyN,EAAW,MAAKhF,IAAAxJ,EAAYyO,CAAc,MAA1B,gBAAAjF,EAA6B,KAAK,GAAG;AACvD,UAAIxR,IAAIyW,IAAiB;AACzB,aAAOzW,IAAI,KAAG;AACZ,cAAMoJ,IAAUpB,EAAYhI,CAAC;AAC7B,YAAI,CAACwW,EAAW,KAAKpN,EAAQ,KAAK;AAChC;AAEF,QAAAmN,KACAvW;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM8P,IAAW/G,IAAawN;AAE9B,MAAIG,IAAmB5G,GACnB6G,IAAiB7G;AAgBrB,MAfI7F,EAAI,YAAYiB,MACdnC,MAAesF,IACbtF,MAAemC,EAAe,SAEhCwL,IAAmB3N,GACnB4N,IAAiBtI,IAAWkI,MAE5BG,IAAmB5G,GACnB6G,IAAiBtI,KAGnBsI,IAAiBtI,IAIjB,CAACpE,EAAI,UAAU;AACjB,UAAMb,IAAUpB,EAAYe,CAAU;AAEtC,QAAIK,EAAQ,SAASW,EAAY,OAAO;AACtC,YAAM6M,IAASxN,EAAQ,QACjByN,IAAcD,EAAO,SAAS,GAC9BE,IAASF,EAAOC,CAAW,GAC3BE,IAAcD,EAAO,OAAO,SAAS,GACrCE,IAASF,EAAO,OAAOC,CAAW;AACxC,MAAArI,EAAS,mBAAmB;AAAA,QAC1B,SAAS;AAAA,QACT,OAAO3F;AAAA,QACP,SAAS8N;AAAA,QACT,SAASE;AAAA,QACT,MAAMC,EAAO;AAAA,QACb,MAAMF,EAAO;AAAA,QACb,SAAS1N,EAAQ;AAAA,MAAA,CAClB,GACDsN,IAAmBM,EAAO,MAAM,SAAS,GACzCL,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,OAAA;AAAA,IACtB,WAAWO,EAAQ,WAEbL,MAAe,GAAG;AAEpB,YAAM6N,IADsB/N,EAAK,uBAAA,EACE8I,EAAgB,KAAM,EAAE;AAC3D,MAAAsF,YAAgB3X,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AAC7C,cAAM4X,IAAKN,EAAOtX,CAAC;AACnB,YAAI4X,EAAG,OAAO9N,EAAQ,KAAM;AAC5B,cAAM+N,IAASD,EAAG;AAClB,iBAAS3T,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T;AAEjC,cADW4T,EAAO5T,CAAC,EACZ,OAAO6F,EAAQ,MAEtB;AAAA,gBAAI9J,MAAM,KAAKiE,MAAM;AACnB,cAAAmL,EAAS,mBAAmB;AAAA,gBAC1B,SAAS;AAAA,cAAA,CACV,GACDgI,IAAmB/E,EAAgB,QAAS,GAC5CgF,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,QAAA;AAAA,iBACf;AAEL,kBAAIuO,IAAa9X,GACb+X,IAAa9T,IAAI;AACrB,cAAI8T,IAAa,MACfD,IAAa9X,IAAI,GACjB+X,IAAaT,EAAOQ,CAAU,EAAE,OAAO,SAAS;AAElD,oBAAME,IAAQV,EAAOQ,CAAU,GACzBG,IAAQD,EAAM,OAAOD,CAAU;AACrC,cAAA3I,EAAS,mBAAmB;AAAA,gBAC1B,SAAS;AAAA,gBACT,OAAOiD,EAAgB;AAAA,gBACvB,SAASyF;AAAA,gBACT,SAASC;AAAA,gBACT,MAAME,EAAM;AAAA,gBACZ,MAAMD,EAAM;AAAA,gBACZ,SAASlO,EAAQ;AAAA,cAAA,CAClB,GACDsN,IAAmBa,EAAM,MAAM,SAAS,GACxCZ,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,OAAA;AAAA,YACtB;AACA,kBAAMoO;AAAA;AAAA,MAEV;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,CAAC,CAACP,KAAoB,CAAC,CAACC,EAAgB;AAE5C,QAAMa,IAAiB3O,EAAK,eAAA;AAC5B,EAAA6N,IAAmBe,GAAuBD,GAAgBd,CAAgB,GAC1EC,IAAiBc,GAAuBD,GAAgBb,CAAc,GAEtE7N,EAAa,SAAS4N,GAAkBC,CAAc;AACtD,QAAMe,IAAoBhB,MAAqBC;AAC/C,EAAA9N,EAAK,OAAO;AAAA,IACV,UAAU6O,IAAoBhB,IAAmB;AAAA,IACjD,aAAagB;AAAA,IACb,iBAAiB;AAAA,IACjB,WAAW;AAAA,EAAA,CACZ,GACDzN,EAAI,eAAA;AACN;ACxJO,SAASmD,GAAMnD,GAAoBrB,GAAmB;AfT1D,MAAAX,GAAAgH,GAAAuC;AeUD,QAAM3I,IAAOD,EAAK,QAAA;AAElB,MADmBC,EAAK,WAAA,EACR;AAChB,QAAM6F,IAAW7F,EAAK,YAAA,GAChBqC,IAAiBwD,EAAS,kBAAA;AAChC,MAAI,CAACxD,EAAgB;AACrB,QAAM,EAAE,OAAAoE,MAAUpE,GACZ2E,IAAenB,EAAS,gBAAA,GACxBiD,IAAkBjD,EAAS,mBAAA;AACjC,MAAIY,IAAQO,EAAa,SAAS,KAAK,CAAC8B,EAAgB,QAAS;AACjE,QAAM7I,IAAeD,EAAK,SAAA,GACpB,EAAE,YAAAE,GAAY,UAAAsF,MAAavF,EAAa,SAAA,GACxC+M,IAAc/M,EAAa,eAAA;AACjC,MAAId,IAAca,EAAK,eAAA;AAEvB,QAAM8E,IAAU9E,EAAK,WAAA;AACrB,MACEA,EAAK,cAAc0H,GAAW,QAC9B5C,EAAQ,iBAAA,QACP1F,IAAAD,EAAYsH,IAAQ,CAAC,MAArB,gBAAArH,EAAwB,sBAAqB8F,EAAiB,aAC7DkB,IAAAjH,EAAYsH,IAAQ,CAAC,MAArB,gBAAAL,EAAwB,sBAAqBlB,EAAiB,YAChE;AACA,IAAAJ,EAAQ,gBAAgB;AAAA,MACtB,WAAWZ,GAAc;AAAA,IAAA,CAC1B;AACD;AAAA,EACF;AAEA,MAAIwJ,IAAY;AAChB,MAAI3F,GAAM3G,CAAG,GAAG;AACd,UAAMuM,IAAa3N,EAAK,aAAA,GAElB4N,IACJxM,EAAI,YAAY,CAAC4L,KAAe9M,OAAemC,KAAA,gBAAAA,EAAgB,SAC3DmD,IACAtF;AACN,QAAIyN,EAAW,MAAKhF,IAAAxJ,EAAYyO,IAAiB,CAAC,MAA9B,gBAAAjF,EAAiC,KAAK,GAAG;AAC3D,UAAIxR,IAAIyW,IAAiB;AACzB,aAAOzW,IAAIgI,EAAY,UAAQ;AAC7B,cAAMoB,IAAUpB,EAAYhI,CAAC;AAC7B,YAAI,CAACwW,EAAW,KAAKpN,EAAQ,KAAK;AAChC;AAEF,QAAAmN,KACAvW;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM8P,IAAWzB,IAAWkI;AAE5B,MAAIG,IAAmB5G,GACnB6G,IAAiB7G;AAgBrB,MAfI7F,EAAI,YAAYiB,MACdnC,MAAesF,IACbtF,MAAemC,EAAe,SAEhCwL,IAAmB3N,GACnB4N,IAAiB7G,MAEjB4G,IAAmB3N,IAAawN,GAChCI,IAAiBtI,KAGnBqI,IAAmB3N,IAInB,CAACkB,EAAI,UAAU;AACjB,UAAMb,IAAUpB,EAAYqG,CAAQ,GAC9BJ,IAAcjG,EAAYqG,IAAW,CAAC;AAE5C,SAAIJ,KAAA,gBAAAA,EAAa,UAASlE,EAAY,OAAO;AAE3C,YAAM4N,IADS1J,EAAY,OACL,CAAC,GACjB2J,IAASD,EAAO,OAAO,CAAC;AAC9B,MAAAjJ,EAAS,mBAAmB;AAAA,QAC1B,SAAS;AAAA,QACT,OAAOL,IAAW;AAAA,QAClB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAMuJ,EAAO;AAAA,QACb,MAAMD,EAAO;AAAA,QACb,SAAS1J,EAAY;AAAA,MAAA,CACtB,GACDyI,IAAmB,GACnBC,IAAiB,GACjB9N,EAAK,aAAA,EAAe,OAAA;AAAA,IACtB,WAAWO,EAAQ,WAEb,CAAC6E,GAAa;AAEhB,YAAM2I,IADsB/N,EAAK,uBAAA,EACE8I,EAAgB,KAAM,EAAE;AAC3D,MAAAsF,YAAgB3X,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AAC7C,cAAM4X,IAAKN,EAAOtX,CAAC;AACnB,YAAI4X,EAAG,OAAO9N,EAAQ,KAAM;AAC5B,cAAM+N,IAASD,EAAG;AAClB,iBAAS3T,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T;AAEjC,cADW4T,EAAO5T,CAAC,EACZ,OAAO6F,EAAQ,MAEtB;AAAA,gBAAI9J,MAAMsX,EAAO,SAAS,KAAKrT,MAAM4T,EAAO,SAAS;AACnD,cAAAzI,EAAS,mBAAmB;AAAA,gBAC1B,SAAS;AAAA,cAAA,CACV,GACDgI,IAAmB/E,EAAgB,OACnCgF,IAAiBD,GACjB1O,IAAca,EAAK,eAAA,GACnBA,EAAK,aAAA,EAAe,QAAA;AAAA,iBACf;AAEL,kBAAIgP,IAAcvY,GACdwY,IAAcvU,IAAI;AACtB,cAAIuU,IAAcX,EAAO,SAAS,MAChCU,IAAcvY,IAAI,GAClBwY,IAAc;AAEhB,oBAAMR,IAAQV,EAAOiB,CAAW,GAC1BN,IAAQD,EAAM,OAAOQ,CAAW;AACtC,cAAApJ,EAAS,mBAAmB;AAAA,gBAC1B,SAAS;AAAA,gBACT,OAAOiD,EAAgB;AAAA,gBACvB,SAASkG;AAAA,gBACT,SAASC;AAAA,gBACT,MAAMP,EAAM;AAAA,gBACZ,MAAMD,EAAM;AAAA,gBACZ,SAASlO,EAAQ;AAAA,cAAA,CAClB,GACDsN,IAAmB,GACnBC,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,OAAA;AAAA,YACtB;AACA,kBAAMoO;AAAA;AAAA,MAEV;AAAA,IACF;AAAA,EAEJ;AAEA,QAAMc,IAAsB/P,EAAY,SAAS;AACjD,MACE0O,IAAmBqB,KACnBpB,IAAiBoB;AAEjB;AAGF,QAAMP,IAAiB3O,EAAK,eAAA;AAC5B,EAAA6N,IAAmBe;AAAAA,IACjBD;AAAA,IACAd;AAAA,IACAsB,GAAiB;AAAA,EAAA,GAEnBrB,IAAiBc;AAAAA,IACfD;AAAA,IACAb;AAAA,IACAqB,GAAiB;AAAA,EAAA,GAGnBlP,EAAa,SAAS4N,GAAkBC,CAAc;AACtD,QAAMe,IAAoBhB,MAAqBC;AAC/C,EAAA9N,EAAK,OAAO;AAAA,IACV,UAAU6O,IAAoBhB,IAAmB;AAAA,IACjD,aAAagB;AAAA,IACb,iBAAiB;AAAA,IACjB,WAAW;AAAA,EAAA,CACZ,GACDzN,EAAI,eAAA;AACN;ACzKO,SAASgO,GAAIhO,GAAoBrB,GAAmB;AACzD,QAAMC,IAAOD,EAAK,QAAA;AAElB,MADmBC,EAAK,WAAA,EACR;AAChB,EAAAoB,EAAI,eAAA;AAEJ,QAAM0D,IAAU9E,EAAK,WAAA;AAErB,MADsB8E,EAAQ,iBAAA,KACTA,EAAQ;AAC3B,IAAAA,EAAQ,gBAAgB;AAAA,MACtB,WAAW1D,EAAI,WAAW8C,GAAc,KAAKA,GAAc;AAAA,IAAA,CAC5D;AAAA,OACI;AACL,UAAMjE,IAAeD,EAAK,SAAA,GACpBb,IAAca,EAAK,eAAA,GACnB,EAAE,YAAAE,GAAY,UAAAsF,MAAavF,EAAa,SAAA,GAExCoP,IAAcpP,EAAa,oBAAoBd,GAAaqG,CAAQ,GAKpE8J,IAAuB;AAAA,MAC3B,GAJgBD,IACdE,GAAWF,GAAalF,EAAyB,IACjD;AAAA,MAGF,MAAMjJ,EAAY;AAAA,MAClB,OAAO;AAAA,IAAA;AAETT,IAAAA,GAAqBtB,GAAa,CAACmQ,CAAU,GAAGpP,GAAY;AAAA,MAC1D,eAAeF,EAAK,WAAA;AAAA,IAAW,CAChC,GACDA,EAAK,kBAAkB,CAACsP,CAAU,CAAC;AAAA,EACrC;AACF;AC1BA,SAASE,GAAqBpN,GAAuC;AACnE,QAAM,EAAE,cAAA4E,GAAc,OAAAP,GAAO,MAAAxC,GAAM,OAAAwL,GAAO,SAAAC,MAAYtN;AACtD,MAAI+C,IAAY;AAEhB,QAAMwK,IAAuC,CAAA;AAC7C,MAAI1L,GAAM;AACR,QAAIxJ,IAAIgM,IAAQ;AAEhB,WAAOhM,KAAK,KAAG;AACb,YAAMoL,IAAWmB,EAAavM,CAAC;AAE/B,UADAA,KACIoL,EAAS,UAAU4J,GACvB;AAAA,YAAIE,EAAiB,CAAC,KAAKA,EAAiB,CAAC,EAAE,UAAU9J,EAAS;AAChE;AAEF,QAAA8J,EAAiB,QAAQ9J,CAAQ;AAAA;AAAA,IACnC;AAAA,EACF,OAAO;AACL,QAAIpL,IAAIgM,IAAQ;AAChB,WAAOhM,IAAIuM,EAAa,UAAQ;AAC9B,YAAMnB,IAAWmB,EAAavM,CAAC;AAE/B,UADAA,KACIoL,EAAS,UAAU4J,GACvB;AAAA,YAAIE,EAAiB,CAAC,KAAKA,EAAiB,CAAC,EAAE,UAAU9J,EAAS;AAChE;AAEF,QAAA8J,EAAiB,KAAK9J,CAAQ;AAAA;AAAA,IAChC;AAAA,EACF;AAEA,WAASpL,IAAI,GAAGA,IAAIkV,EAAiB,QAAQlV,KAAK;AAChD,UAAMmV,IAAeD,EAAiBlV,CAAC,GACjC;AAAA,MACJ,YAAY;AAAA,QACV,SAAS,CAACoV,CAAS;AAAA,QACnB,UAAU,CAACC,CAAU;AAAA,MAAA;AAAA,IACvB,IACEF;AAIJ,QAHInV,MAAMkV,EAAiB,SAAS,MAClCxK,IAAYyK,EAAa,QAEvB,EAAAF,IAAUG,KAAaH,IAAUI,IACrC;AAAA,MAAA3K,IAAYyK,EAAa;AACzB;AAAA;AAAA,EACF;AACA,SAAOzK;AACT;AAEO,SAAS4K,GAAO3O,GAAoBrB,GAAmB;AAC5D,QAAMC,IAAOD,EAAK,QAAA;AAElB,MADmBC,EAAK,WAAA,EACR;AAChB,QAAM6F,IAAW7F,EAAK,YAAA,GAChBqC,IAAiBwD,EAAS,kBAAA;AAChC,MAAI,CAACxD,EAAgB;AACrB,QAAMpC,IAAeD,EAAK,SAAA,GACpB,EAAE,YAAAE,GAAY,UAAAsF,MAAavF,EAAa,SAAA;AAC9C,MAAI+G,IAAenB,EAAS,gBAAA;AAC5B,QAAM5B,IAAO7C,EAAI,QAAQqE,GAAO;AAEhC,MAAIoI,IAAmB,IACnBC,IAAiB;AAErB,QAAMhF,IAAkBjD,EAAS,mBAAA;AACjC,MACE,CAACzE,EAAI,YACL0H,EAAgB,YACd7E,KAAQ5B,EAAe,aAAa,KACnC,CAAC4B,KAAQ5B,EAAe,aAAarC,EAAK,YAAA,IAAgB,IAC7D;AACA,UAAM,EAAE,OAAAyG,GAAO,SAAA2E,GAAS,SAAAC,GAAS,SAAAF,MAAYrC;AAC7C,QAAI7E;AAEF,UAAImH,MAAY;AACd,QAAAvF,EAAS,mBAAmB;AAAA,UAC1B,SAAS;AAAA,QAAA,CACV,GACDgI,IAAmBpH,IAAS,GAC5BqH,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,QAAA;AAAA,WACf;AAEL,YAAIuO,IAAa,IACbC,IAAa;AAEjB,cAAMT,IADsB/N,EAAK,uBAAA,EACEyG,CAAM,EAAE,QAErCuJ,IAAgBjC,EAAO3C,CAAQ,EAAE,OAAOC,CAAQ,EAAE;AACxD,QAAA+C,YAAgB3X,IAAI2U,IAAW,GAAG3U,KAAK,GAAGA,KAAK;AAE7C,gBAAM6X,IADKP,EAAOtX,CAAC,EACD;AAClB,mBAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,kBAAMuV,IAAK3B,EAAO5T,CAAC;AACnB,gBACEuV,EAAG,aAAaD,KACfC,EAAG,WAAYA,EAAG,UAAU,KAAKD,KAChCC,EAAG,YAAaD,GAClB;AACA,cAAAzB,IAAa9X,GACb+X,IAAa9T;AACb,oBAAM0T;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,CAACG,KAAc,CAAC,CAACC,EAAY;AAClC,cAAMC,IAAQV,EAAOQ,CAAU,GACzBG,IAAQD,EAAM,OAAOD,CAAU;AACrC,QAAA3I,EAAS,mBAAmB;AAAA,UAC1B,SAAS;AAAA,UACT,OAAAY;AAAA,UACA,SAAS8H;AAAA,UACT,SAASC;AAAA,UACT,MAAME,EAAM;AAAA,UACZ,MAAMD,EAAM;AAAA,UACZ,SAAAtD;AAAA,QAAA,CACD,GACD0C,IAAmBa,EAAM,MAAM,SAAS,GACxCZ,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,OAAA;AAAA,MACtB;AAAA,SACK;AAGL,YAAM+N,IADsB/N,EAAK,uBAAA,EACEyG,CAAM,EAAE;AAC3C,UAAI2E,MAAY2C,EAAO,SAAS;AAC9B,QAAAlI,EAAS,mBAAmB;AAAA,UAC1B,SAAS;AAAA,QAAA,CACV,GACDgI,IAAmBpH,GACnBqH,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,QAAA;AAAA,WACf;AAEL,YAAIkQ,IAAa,IACbjB,IAAc;AAElB,cAAMe,IAAgBjC,EAAO3C,CAAQ,EAAE,OAAOC,CAAQ,EAAE;AACxD,QAAA+C,YAAgB3X,IAAI2U,IAAW,GAAG3U,IAAIsX,EAAO,QAAQtX,KAAK;AAExD,gBAAM6X,IADKP,EAAOtX,CAAC,EACD;AAClB,mBAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,kBAAMuV,IAAK3B,EAAO5T,CAAC;AACnB,gBACEuV,EAAG,aAAaD,KACfC,EAAG,WAAYA,EAAG,UAAU,KAAKD,KAChCC,EAAG,YAAaD,GAClB;AACA,cAAAE,IAAazZ,GACbwY,IAAcvU;AACd,oBAAM0T;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,CAAC8B,KAAc,CAAC,CAACjB,EAAa;AACnC,cAAMH,IAASf,EAAOmC,CAAU,GAC1BnB,IAASD,EAAO,OAAOG,CAAW;AACxC,QAAApJ,EAAS,mBAAmB;AAAA,UAC1B,SAAS;AAAA,UACT,OAAAY;AAAA,UACA,SAASyJ;AAAA,UACT,SAASjB;AAAA,UACT,MAAMF,EAAO;AAAA,UACb,MAAMD,EAAO;AAAA,UACb,SAAA3D;AAAA,QAAA,CACD,GACD0C,IAAmBkB,EAAO,MAAM,SAAS,GACzCjB,IAAiBD,GACjB7N,EAAK,aAAA,EAAe,OAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF,OAAO;AAEL,QAAImQ,IAAmC9N;AAEvC,IAAIjB,EAAI,aACFlB,MAAemC,EAAe,QAChC8N,IAAiBnJ,EAAaxB,CAAQ,IAEtC2K,IAAiBnJ,EAAa9G,CAAU;AAG5C,UAAM;AAAA,MACJ,OAAAuG;AAAA,MACA,OAAAgJ;AAAA,MACA,UAAAW;AAAA,MACA,YAAY;AAAA,QACV,UAAU,CAACC,CAAS;AAAA,MAAA;AAAA,IACtB,IACEF;AAEJ,QACGlM,KAAQmM,MAAa,KACrB,CAACnM,KAAQmM,MAAapQ,EAAK,YAAA,IAAgB;AAE5C;AAGF,UAAMmF,IAAYqK,GAAqB;AAAA,MACrC,cAAAxI;AAAA,MACA,OAAAP;AAAA,MACA,OAAAgJ;AAAA,MACA,MAAAxL;AAAA,MACA,SAASoM;AAAA,IAAA,CACV;AACD,QAAIlL,IAAY,EAAG;AAEnB,IAAA0I,IAAmB1I,GACnB2I,IAAiB3I,GACb/D,EAAI,aACFlB,MAAesF,IACbtF,MAAemC,EAAe,QAChCwL,IAAmB3N,IAEnB4N,IAAiBtI,IAGfvB,IACF6J,IAAiBtI,IAEjBqI,IAAmB3N;AAMzB,UAAMkF,IADcpF,EAAK,eAAA,EACOmF,CAAS;AACzC,QAAIC,EAAY,SAASlE,EAAY,OAAO;AAC1C,YAAM,EAAE,OAAAoB,EAAA,IAAUtC,EAAK,WAAA,GACjBsQ,IAAUtQ,EAAK,WAAA,GACf+N,IAAS3I,EAAY;AAE3B,UAAIgG,IAAU,IACVC,IAAU,IACVkF,IAAkB;AACtB,UAAItM;AACF,QAAAmK,YAAgB3X,IAAIsX,EAAO,SAAS,GAAGtX,KAAK,GAAGA,KAAK;AAElD,gBAAM6X,IADKP,EAAOtX,CAAC,EACD;AAClB,mBAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,kBAAMuV,IAAK3B,EAAO5T,CAAC,GACb8V,IAAMP,EAAG,IAAK3N,IAAQgO,EAAQ,CAAC,GAC/BG,IAAUR,EAAG,QAAS3N;AAC5B,gBAAI+N,KAAaG,KAAOH,KAAaG,IAAMC,GAAS;AAClD,oBAAMC,IAAiBT,EAAG,cACpBU,IAAeD,EAAeA,EAAe,SAAS,CAAC,GACvDE,IACJpB,GAAqB;AAAA,gBACnB,cAAckB;AAAA,gBACd,OAAOC,EAAa,QAAQ;AAAA;AAAA,gBAC5B,OAAOA,EAAa,QAAQ;AAAA;AAAA,gBAC5B,MAAA1M;AAAA,gBACA,SAASoM;AAAA,cAAA,CACV,KAAKM,EAAa;AACrB,cAAAvF,IAAU3U,GACV4U,IAAU3Q,GACV6V,IAAkBK;AAClB,oBAAMxC;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA;AAEA,QAAAA,YAAgB3X,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AAE7C,gBAAM6X,IADKP,EAAOtX,CAAC,EACD;AAClB,mBAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,kBAAMuV,IAAK3B,EAAO5T,CAAC,GACb8V,IAAMP,EAAG,IAAK3N,IAAQgO,EAAQ,CAAC,GAC/BG,IAAUR,EAAG,QAAS3N;AAC5B,gBAAI+N,KAAaG,KAAOH,KAAaG,IAAMC,GAAS;AAClD,oBAAMC,IAAiBT,EAAG,cACpBW,IACJpB,GAAqB;AAAA,gBACnB,cAAckB;AAAA,gBACd,OAAO;AAAA;AAAA,gBACP,OAAO;AAAA;AAAA,gBACP,MAAAzM;AAAA,gBACA,SAASoM;AAAA,cAAA,CACV,KAAK;AACR,cAAAjF,IAAU3U,GACV4U,IAAU3Q,GACV6V,IAAkBK;AAClB,oBAAMxC;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAGF,UAAI,CAAChD,KAAW,CAACC,KAAW,CAACkF,GAAiB;AAC5C,cAAMzB,IAASf,EAAO3C,CAAO,GACvB2D,IAASD,EAAO,OAAOzD,CAAO;AACpC,QAAAxF,EAAS,mBAAmB;AAAA,UAC1B,SAAS;AAAA,UACT,OAAOV;AAAA,UACP,SAAAiG;AAAA,UACA,SAAAC;AAAA,UACA,MAAM0D,EAAO;AAAA,UACb,MAAMD,EAAO;AAAA,UACb,SAAS1J,EAAY;AAAA,QAAA,CACtB,GACDyI,IAAmB0C,GACnBzC,IAAiBD,GACjB7G,IAAenB,EAAS,gBAAA,GACxB7F,EAAK,aAAA,EAAe,OAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,CAAC6N,KAAoB,CAAC,CAACC,EAAgB;AAC5C,EAAID,IAAmBC,MAErB,CAACD,GAAkBC,CAAc,IAAI,CAACA,GAAgBD,CAAgB,IAExE5N,EAAa,SAAS4N,GAAkBC,CAAc;AACtD,QAAMd,IAAca,MAAqBC;AACzC,EAAA9N,EAAK,OAAO;AAAA,IACV,UAAUgN,IAAca,IAAmB;AAAA,IAC3C,aAAab;AAAA,IACb,iBAAiB;AAAA,IACjB,WAAW;AAAA,EAAA,CACZ,GAEDhN,EAAK,UAAA,EAAY,oBAAoB;AAAA,IACnC,gBAAgBgH,EAAa/C,IAAO4J,IAAmBC,CAAc;AAAA,IACrE,WAAW7J,IAAOC,GAAc,KAAKA,GAAc;AAAA,EAAA,CACpD;AACH;ACxUO,SAAS2M,GAAQzP,GAAoBrB,GAAmB;AAC7D,MAAIA,EAAK,YAAa;AACtB,QAAMC,IAAOD,EAAK,QAAA;AAClB,MAAIqB,EAAI,QAAQqE,GAAO;AACrB,IAAA+G,GAAUpL,GAAKrB,CAAI;AAAA,WACVqB,EAAI,QAAQqE,GAAO;AAC5B,IAAA2H,GAAIhM,GAAKrB,CAAI;AAAA,WACJqB,EAAI,QAAQqE,GAAO;AAC5B,IAAA4H,GAAMjM,GAAKrB,CAAI;AAAA,WACNqB,EAAI,QAAQqE,GAAO;AAC5B,IAAAnB,GAAKlD,GAAKrB,CAAI;AAAA,WACLqB,EAAI,QAAQqE,GAAO;AAC5B,IAAAlB,GAAMnD,GAAKrB,CAAI;AAAA,WACNqB,EAAI,QAAQqE,GAAO,MAAMrE,EAAI,QAAQqE,GAAO;AACrD,IAAAsK,GAAO3O,GAAKrB,CAAI;AAAA,WACPqB,EAAI,QAAQqE,GAAO,KAAK;AACjC,IAAA1F,EAAK,kBAAA;AACL,UAAM+Q,IAAc9Q,EAAK,QAAA;AACzB,IAAK8Q,EAAY,kBACfA,EAAY,QAAQC,GAAW,IAAI,GAErC3P,EAAI,eAAA;AAAA,EACN,MAAA,CAAWA,EAAI,QAAQqE,GAAO,OAC5B2J,GAAIhO,GAAKrB,CAAI;AAEjB;ACvBA,IAAIiR,KAAoC,MAEpCC,KAAgB;AAEb,SAASC,GAAMjT,GAAc8B,GAAmB;AnBjBpD,MAAAX,GAAAgH;AmBkBD,QAAMpG,IAAOD,EAAK,QAAA;AAClB,MAAIC,EAAK,WAAA,KAAgBA,EAAK,aAAc;AAE5C,QAAMqC,IADWrC,EAAK,YAAA,EACU,kBAAA;AAChC,MAAI,CAAC/B,KAAQ,CAACoE,EAAgB;AAC9B,QAAM8O,IAAcpR,EAAK;AAEzB,MAAIoR,OAAe/R,IAAAW,EAAK,oBAAL,gBAAAX,EAAsB,WAAUnB,EAAM;AACzD,QAAMgC,IAAeD,EAAK,SAAA;AAC1B,MAAI,CAACC,EAAa,WAAY;AAE9B,QAAMmR,IACJnR,EAAa,gBAAA,OAAqBmG,IAAArG,EAAK,oBAAL,gBAAAqG,EAAsB,iBAAgB;AAE1E,EAAAiL,GAAqBtR,CAAI,GACpBoR,KACYnR,EAAK,UAAA,EACb,mBAAA;AAET,QAAM,EAAE,MAAAsR,GAAM,WAAAC,GAAW,WAAAC,GAAW,aAAAC,GAAa,MAAAC,GAAM,KAAAC,MAAQzQ,GACzDhC,IAAOjB,EAAK,WAAW;AAAA,GAAMuC,CAAI,GACjC,EAAE,YAAAN,GAAY,UAAAsF,MAAavF,EAAa,SAAA,GAExCd,IAAca,EAAK,eAAA,GACnBwN,IAAcvN,EAAa,oBAAoBd,GAAaqG,CAAQ;AAC1E,MAAI,CAACgI,EAAa;AAClB,QAAMoE,IAAe5R,EAAK,aAAA,GAEpByM,IADUzM,EAAK,WAAA,EACU,cACzB6R,IAAwBC,GAAU5S,CAAI,EAAE,IAAI,CAAA8B,MAAS;AnB/C1D,QAAA5B,GAAAgH;AmBgDC,UAAM6D,IAAuB;AAAA,MAC3B,OAAAjJ;AAAA,IAAA;AAQF,QANIyL,MACFxC,EAAW,aAAa,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,IACpFA,EAAW,eAAe,UAC1BA,EAAW,iBAAiB,QAC5BA,EAAW,gBAAe,oBAAI,KAAA,GAAO,YAAA,IAGrC2H,KACC,GAACxS,IAAAoO,EAAY,UAAZ,QAAApO,EAAmB,aAAY,GAACgH,IAAAoH,EAAY,YAAZ,QAAApH,EAAqB,WACvD;AACA,YAAMhB,IAAcjG,EAAYqG,IAAW,CAAC;AAE5C,OACE,CAACgI,EAAY,QACbA,EAAY,SAAS8D,KACpB9D,EAAY,SAAS+D,MAAanM,KAAA,gBAAAA,EAAa,UAASmM,KACxD/D,EAAY,SAASkE,MAAQtM,KAAA,gBAAAA,EAAa,UAASsM,KACnDlE,EAAY,SAASgE,MAAapM,KAAA,gBAAAA,EAAa,UAASoM,KACxDhE,EAAY,SAASiE,MAAerM,KAAA,gBAAAA,EAAa,UAASqM,MAE3DM,GAAyB,QAAQ,CAAA1H,MAAQ;AAEvC,YAAIA,MAAS,cAAc,EAACjF,KAAA,QAAAA,EAAa,UAAU;AACnD,cAAMpE,IAAQwM,EAAYnD,CAAI;AAC9B,QAAIrJ,MAAU,WACZiJ,EAAWI,CAAI,IAAIrJ;AAAAA,MAEvB,CAAC,IAGCoQ,KAAgB5D,EAAY,SAASmE,MACvCxH,GAA0B,QAAQ,CAAAE,MAAQ;AACxC,cAAMrJ,KACJoQ,KAAA,gBAAAA,EAAe/G,OACfmD,EAAYnD,CAAI;AAClB,QAAIrJ,MAAU,WACZiJ,EAAWI,CAAI,IAAIrJ;AAAAA,MAEvB,CAAC,GAECmQ,MACFlH,EAAW,YAAY;AAAA,IAE3B;AACA,WAAOA;AAAA,EACT,CAAC,GAEKnF,IAAU9E,EAAK,WAAA;AACrB,MAAIiH;AACJ,MAAInC,EAAQ,iBAAA,KAAsBA,EAAQ;AACxC,IAAAmC,IAAWnC,EAAQ,SAAS+M,CAAS,GAChCV,KACHrM,EAAQ,yBAAA;AAAA,OAEL;AACL,UAAMzE,IAAQH,IAAa;AAC3B,IAAIA,MAAesF,KACjBxF,EAAK,kBAAkBb,GAAakB,GAAOmF,IAAWtF,CAAU,GAElEO,GAAqBtB,GAAa0S,GAAW3R,GAAY;AAAA,MACvD,eAAeF,EAAK,WAAA;AAAA,IAAW,CAChC,GACDA,EAAK,kBAAkBb,GAAakB,GAAO,GAAGwR,CAAS,GACvD5K,IAAW/G,IAAa2R,EAAU;AAAA,EACpC;AACA,EAAI,CAAC5K,MACHhH,EAAa,SAASgH,GAAUA,CAAQ,GAGpC+J,MACF,OAAO,aAAaA,EAAkB,GAExCC,KAAgB,IAGZE,KACFnR,EAAK,OAAO;AAAA,IACV,UAAAiH;AAAA,IACA,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EAAA,CAClB,GACDgK,KAAgB,MAGhBD,KAAqB,OAAO,WAAW,MAAM;AAC3C,IAAIC,OACFjR,EAAK,OAAO;AAAA,MACV,UAAAiH;AAAA,MACA,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IAAA,CAClB,GACDgK,KAAgB,KAElBD,KAAqB;AAAA,EACvB,GAAG,EAAE,IAGLG,MACFpR,EAAK,kBAAkB;AAAA,IACrB,aAAAZ;AAAA,IACA,OAAOD;AAAA,IACP,YAAY+H,IAAW4K,EAAU;AAAA,IACjC,UAAU5K;AAAA,IACV,cAAAmK;AAAA,EAAA;AAGN;AAEO,SAASC,GAAqBtR,GAAmB;AACtD,MAAI,CAACA,EAAK,gBAAiB;AAC3B,QAAM,EAAE,aAAAZ,GAAa,YAAAe,GAAY,UAAAsF,EAAA,IAAazF,EAAK;AACnD,EAAAZ,EAAY,OAAOe,IAAa,GAAGsF,IAAWtF,CAAU,GACnCH,EAAK,QAAA,EAAU,SAAA,EACvB,SAASG,GAAYA,CAAU,GAC5CH,EAAK,kBAAkB;AACzB;ACnKO,SAASiS,GAAIjS,GAAmB;AACrC,QAAMC,IAAOD,EAAK,QAAA,GACZE,IAAeD,EAAK,SAAA,GACpB,EAAE,YAAAE,GAAY,UAAAsF,MAAavF,EAAa,SAAA;AAE9C,MADI,CAAC,CAACC,KAAc,CAAC,CAACsF,KAClBxF,EAAK,WAAA,KAAgB,CAACC,EAAa,WAAY;AAEnD,QAAMd,IAAca,EAAK,eAAA;AACzB,MAAIK,IAAQH,GACRoM,IAAM9G;AAEV,MAAItF,MAAesF,GAAU;AAE3B,UAAMwB,IADWhH,EAAK,YAAA,EACQ,gBAAA,GACxBsL,IAAgBtE,EAAa9G,CAAU,GACvC+R,IAAW3G,EAAc,OACzB4G,IAAY5G,EAAc,QAC1B6G,IAAgC,CAAA;AACtC,aAAS1X,IAAI,GAAGA,IAAIuM,EAAa,QAAQvM,KAAK;AAC5C,YAAMoL,IAAWmB,EAAavM,CAAC;AAC/B,UAAIoL,EAAS,SAASqM,EAAW;AACjC,MAAIrM,EAAS,WAAWqM,KAAarM,EAAS,UAAUoM,KACtDE,EAAoB,KAAK1X,CAAC;AAAA,IAE9B;AACA,UAAM2X,IAAoBD,EAAoB,CAAC,IAAI;AACnD,IAAA9R,IAAQ+R,IAAoB,IAAI,IAAIA,GACpC9F,IAAM6F,EAAoBA,EAAoB,SAAS,CAAC;AAAA,EAC1D;AACA,QAAMzS,IAAUM,EAAK,WAAA;AAErB,EAAAP,GAAiBN,EAAY,MAAMkB,IAAQ,GAAGiM,IAAM,CAAC,GAAG5M,CAAO;AAC/D,QAAMoF,IAAU9E,EAAK,WAAA;AACrB,MAAIiH;AACJ,EAAInC,EAAQ,iBAAA,KAAsBA,EAAQ,6BACxCmC,IAAWnC,EAAQ,IAAA,GACnBA,EAAQ,yBAAA,MAER9E,EAAK,kBAAkBb,GAAakB,IAAQ,GAAGiM,IAAMjM,CAAK,GAC1D4G,IAAW5G,IAEbJ,EAAa,SAASgH,GAAUA,CAAQ,GACxCjH,EAAK,OAAO,EAAE,UAAAiH,GAAU;AAC1B;ACrCO,SAASoL,GAAKtS,GAAmBL,GAAuB;AAC7D,QAAMM,IAAOD,EAAK,QAAA,GAEZ,EAAE,MAAAsS,MAASrS,EAAK,YAAA;AACtB,MAAIqS,GAAM;AACR,UAAM/Q,IAAiB+Q,EAAAA;AAEvB,SAAsB/Q,KAAA,gBAAAA,EAAiB,oBAAmB,GAAO;AAAA,EACnE;AACA,QAAMrB,IAAeD,EAAK,SAAA;AAE1B,MAAIsS,IAAqC;AAEzC,MADcrS,EAAa,SAAA,EACjB,eAAe;AAEvB,UAAMsS,IAAetS,EAAa,qBAAA;AAClC,QAAI,CAACsS,EAAc;AAEnB,UAAM3F,IAAS5M,EAAK,iBAAA,EAAmB,eAAA;AACvC,QAAI,CAAC4M,EAAQ;AAEb,UAAM4F,IAA6B;AAAA,MACjC,MAAMtR,EAAY;AAAA,MAClB,OAAO;AAAA,MACP,UAAU,CAAA;AAAA,MACV,QAAQ,CAAA;AAAA,IAAC,GAELuR,IAAW7F,EAAO,CAAC,GACnB8F,IAAgBD,EAAS,CAAC,EAAE,UAC5BE,IAAUF,EAASA,EAAS,SAAS,CAAC,GACtCG,IAAcD,EAAQ,WAAYA,EAAQ,UAAU;AAC1D,aAAShc,IAAI+b,GAAe/b,KAAKic,GAAajc;AAC5C,MAAA6b,EAAiB,SAAU,KAAKD,EAAa,SAAU5b,CAAC,CAAC;AAE3D,aAASF,IAAI,GAAGA,IAAImW,EAAO,QAAQnW,KAAK;AACtC,YAAMqW,IAAMF,EAAOnW,CAAC,GACd4X,IAAKkE,EAAa,OAAQzF,EAAI,CAAC,EAAE,QAAS,GAC1C+F,IAAc;AAAA,QAClB,QAAQ,CAAA;AAAA,QACR,QAAQxE,EAAG;AAAA,QACX,WAAWA,EAAG;AAAA,MAAA;AAEhB,eAAS1X,IAAI,GAAGA,IAAImW,EAAI,QAAQnW;AAC9B,QAAAkc,EAAO,OAAO,KAAK/F,EAAInW,CAAC,CAAC;AAE3B,MAAA6b,EAAiB,OAAQ,KAAKK,CAAM;AAAA,IACtC;AACA,IAAAP,IAAkBzS,GAAe,CAAC2S,CAAgB,CAAC;AAAA,EACrD;AACE,IAAAF,IAAkBrS,EAAa,eAAA,IAC3BA,EAAa,uBAAA,IACbA,EAAa,wBAAA;AASnB,EAPIP,KAAA,QAAAA,EAAS,gBAAe4S,KAAA,QAAAA,EAAiB,YAC3CA,IAAkB;AAAA,IAChB;AAAA,MACE,OAAOQ,GAAuBR,CAAe;AAAA,IAAA;AAAA,EAC/C,IAGCA,KAAA,QAAAA,EAAiB,UACtB7S,GAAiB6S,GAAiBtS,EAAK,YAAY;AACrD;ACnEO,SAAS+S,GAAK3R,GAAgBrB,GAAmB;AtBJrD,MAAAX,GAAAgH;AsBKD,QAAMpG,IAAOD,EAAK,QAAA,GAEZ,EAAE,MAAAgT,MAAS/S,EAAK,YAAA;AACtB,MAAI+S,GAAM;AACR,UAAMzR,IAAiByR,EAAK3R,CAAG;AAE/B,SAAsBE,KAAA,gBAAAA,EAAiB,oBAAmB,GAAO;AAAA,EACnE;AACA,EAAAF,EAAI,eAAA;AACJ,QAAMnD,KAAOmB,IAAAgC,EAAI,iBAAJ,gBAAAhC,EAAkB,QAAQ;AACvC,MAAInB;AACF,IAAA8B,EAAK,MAAM9B,CAAI;AAAA,OACV;AACL,UAAM+U,KAAQ5M,IAAAhF,EAAI,iBAAJ,gBAAAgF,EAAkB;AAChC,QAAI,CAAC4M,EAAO;AACZ,aAAS7b,IAAI,GAAGA,IAAI6b,EAAM,QAAQ7b,KAAK;AACrC,YAAM0J,IAAOmS,EAAM7b,CAAC;AACpB,MAAI0J,EAAK,KAAK,WAAW,OAAO,KAC9BD,GAAWb,GAAMc,CAAI;AAAA,IAEzB;AAAA,EACF;AACF;ACxBO,SAASoS,GAAY7R,GAAiBpB,GAAY;AAEvD,QAAM8I,IADW9I,EAAK,YAAA,EACW,mBAAA;AAEjC,MAAI,CAAC8I,EAAgB;AACnB;AAGF,QAAM3J,IAAca,EAAK,uBAAA,GACnB,EAAE,OAAAyG,MAAUqC;AAClB,MAAIyJ,IAAe;AACnB,WAASpb,IAAIsP,GAAQtP,KAAK,GAAGA,KAAK;AAChC,UAAMkR,IAAKlJ,EAAYhI,CAAC;AACxB,QAAIkR,KAAMA,EAAG,SAASnH,EAAY,OAAO;AACvC,MAAAqR,IAAelK;AACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAACkK;AACH;AAGF,EAAAnR,EAAI,eAAA,GACJA,EAAI,gBAAA;AAEJ,QAAM8R,IAAoBlT,EAAa;AACvC,EAAIkT,KACFA,EAAiB,KAAK9R,EAAI,SAASA,EAAI,SAASmR,CAAY;AAEhE;AC7BA,SAASY,GAAwBpT,GAAkC;AxBJhE,MAAAX;AwBKD,MAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,QAAMY,IAAOD,EAAK,QAAA,GACZsC,IAAiBrC,EAAK,YAAA,EAAc,kBAAA;AAC1C,MAAI,CAACqC,EAAgB,QAAO;AAE5B,QAAM+Q,IADepT,EAAK,SAAA,EACS,sBAAA;AACnC,MAAI,CAACoT,EAAe,QAAO;AAE3B,QAAMC,MACJjU,IAAAgU,KAAA,gBAAAA,EAAe,gBAAf,gBAAAhU,EACI;AAAA,IAAI,CAAC7I,MACL,CAACA,EAAE,QACFA,EAAE,SAAS2K,EAAY,WACtBoS,GAAsB,SAAS/c,EAAE,IAAI,IACnCA,EAAE,QACFiK;AAAAA,IAEL,KAAK,QAAO;AACjB,MAAI,CAAC6S,EAAe,QAAO;AAE3B,QAAME,IAAmBlR,EAAe,OAElCmR,IAASJ,EAAc,YAEvBK,IADY,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,QAAQ,EAC5C,QAAQJ,CAAa;AAEhD,MAAInT,IAAa,IACbsF,IAAW;AACf,aAAW,EAAE,SAAAkO,GAAS,OAAAjN,GAAO,YAAAkN,EAAA,KAAgBF,GAAU;AACrD,UAAMG,IAAwBnN,IAAQ+M;AACtC,QACEG,KACAJ,KAAoBK,KACpBL,IAAmBK,IAAwBF,EAAQ,QACnD;AACA,MAAAxT,IAAa0T,IAAwB,GACrCpO,IAAWtF,IAAawT,EAAQ;AAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAACxT,KAAc,CAACsF,IAAW,EAAE,YAAAtF,GAAY,UAAAsF,MAAa;AAC/D;AAGA,SAASqO,GAAqB9T,GAAkC;AAC9D,QAAMC,IAAOD,EAAK,QAAA,GACZsC,IAAiBrC,EAAK,YAAA,EAAc,kBAAA;AAC1C,MAAI,CAACqC,EAAgB,QAAO;AAC5B,QAAM,EAAE,OAAArB,GAAO,OAAAyF,EAAA,IAAUpE,GAEnBsL,IAAa3N,EAAK,aAAA;AACxB,MAAI8T,IAAU,GACVC,IAAY;AAChB,QAAMC,IAAWC,GAAgB,KAAKjT,CAAK;AAC3C,MAAIgT,KAAYrG,EAAW,KAAK3M,CAAK,GAAG;AACtC,UAAM7B,IAAca,EAAK,eAAA;AAEzB,QAAIkU,IAAezN,IAAQ;AAC3B,WAAOyN,IAAe,KAAG;AACvB,YAAMlT,IAAQ7B,EAAY+U,CAAY,EAAE;AACxC,UACGF,KAAYC,GAAgB,KAAKjT,CAAK,KACtC,CAACgT,KAAYrG,EAAW,KAAK3M,CAAK;AAEnC,QAAA8S,KACAI;AAAA;AAEA;AAAA,IAEJ;AAEA,QAAIC,IAAiB1N,IAAQ;AAC7B,WAAO0N,IAAiBhV,EAAY,UAAQ;AAC1C,YAAM6B,IAAQ7B,EAAYgV,CAAc,EAAE;AAC1C,UACGH,KAAYC,GAAgB,KAAKjT,CAAK,KACtC,CAACgT,KAAYrG,EAAW,KAAK3M,CAAK;AAEnC,QAAA+S,KACAI;AAAA;AAEA;AAAA,IAEJ;AAAA,EACF;AAEA,QAAMjU,IAAauG,IAAQqN,IAAU;AACrC,SAAI5T,IAAa,IAAU,OACpB;AAAA,IACL,YAAAA;AAAA,IACA,UAAUuG,IAAQsN;AAAA,EAAA;AAEtB;AAEA,SAASK,GAASrU,GAAmBqB,GAAiB;AACpD,QAAMpB,IAAOD,EAAK,QAAA,GACZ8F,IAAW7F,EAAK,YAAA,GAChB8I,IAAkBjD,EAAS,gBAAgB;AAAA,IAC/C,GAAGzE,EAAI;AAAA,IACP,GAAGA,EAAI;AAAA,EAAA,CACR;AAED,MAAI0H,EAAgB,WAAWA,EAAgB,aAAa;AAC1D,IAAA9I,EAAK,aAAA,EAAe,OAAA;AACpB;AAAA,EACF;AAEA,MAAIA,EAAK,qBACH,CAAC,CAAC8I,EAAgB,SAASA,EAAgB,MAAM;AACnD,IAAA9I,EAAK,QAAA,EAAU,QAAQ8I,EAAgB,IAAI,GAC3C9I,EAAK,gBAAA,GACL6F,EAAS,mBAAmB;AAAA,MAC1B,SAAS;AAAA,IAAA,CACV,GAEoB7F,EAAK,SAAA,EACb,SAAS,GAAG,CAAC,GAC1BA,EAAK,OAAO;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,IAAA,CAClB;AACD;AAAA,EACF;AAGF,OACG8I,EAAgB,cAAcA,EAAgB,YAC/CA,EAAgB;AAEhB;AAGF,QAAM7I,IAAeD,EAAK,SAAA,GACpBqU,IACJlB,GAAwBpT,CAAI,KAAK8T,GAAqB9T,CAAI;AAC5D,EAAKsU,MACLpU,EAAa,SAASoU,EAAe,YAAYA,EAAe,QAAQ,GAExErU,EAAK,OAAO;AAAA,IACV,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,EAAA,CACZ,GAEDC,EAAa,cAAA;AACf;AAEA,SAASqU,GAAkBvU,GAAmB;AxBxJ3C,MAAAX,GAAAgH;AwByJD,QAAMpG,IAAOD,EAAK,QAAA,GAEZsC,IADWrC,EAAK,YAAA,EACU,kBAAA;AAChC,MAAI,CAACqC,EAAgB;AACrB,QAAM,EAAE,OAAAoE,MAAUpE,GACZlD,IAAca,EAAK,eAAA;AAEzB,MAAI8T,IAAU,GACVC,IAAY,GAEZG,IAAezN,IAAQ;AAC3B,SAAOyN,IAAe,KAAG;AACvB,UAAM3T,IAAUpB,EAAY+U,CAAY,GAClCjP,IAAa9F,EAAY+U,IAAe,CAAC;AAC/C,QACEK,GAAqBhU,CAAO,KAC5BA,EAAQ,YAAW0E,KAAA,gBAAAA,EAAY,WAC/B1E,EAAQ,aAAY0E,KAAA,gBAAAA,EAAY;AAEhC;AAEF,IAAA6O,KACAI;AAAA,EACF;AAEA,MAAIC,IAAiB1N,IAAQ;AAC7B,SAAO0N,IAAiBhV,EAAY,UAAQ;AAC1C,UAAMoB,IAAUpB,EAAYgV,CAAc,GACpC/O,IAAcjG,EAAYgV,IAAiB,CAAC;AAClD,QACEI,GAAqBhU,CAAO,KAC5BA,EAAQ,YAAW6E,KAAA,gBAAAA,EAAa,WAChC7E,EAAQ,aAAY6E,KAAA,gBAAAA,EAAa;AAEjC;AAEF,IAAA2O,KACAI;AAAA,EACF;AAEA,QAAMlU,IAAeD,EAAK,SAAA;AAC1B,MAAIwU,IAAgB/N,IAAQqN,IAAU;AAItC,QAHI1U,IAAAD,EAAYqV,CAAa,MAAzB,gBAAApV,EAA4B,WAAUoB,MACxCgU,KAAiB,IAEfA,IAAgB,EAAG;AACvB,MAAIC,IAAchO,IAAQsN,IAAY;AACtC,KACE3N,IAAAjH,EAAYsV,CAAW,MAAvB,gBAAArO,EAA0B,WAAU5F,KACpCiU,IAActV,EAAY,SAAS,OAEnCsV,KAAe,IAEjBxU,EAAa,SAASuU,GAAeC,CAAW,GAEhDzU,EAAK,OAAO;AAAA,IACV,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,EAAA,CACZ;AACH;AAEA,MAAA0U,KAAe;AAAA,EACb,UAAAN;AAAA,EACA,mBAAAE;AACF;ACvNA,SAASK,GAAiB5U,GAAmB;AAC3C,EAAAA,EAAK,cAAc;AACrB;AAEA,SAAS6U,GAAe7U,GAAmBqB,GAAuB;AAChE,EAAArB,EAAK,cAAc;AAEnB,QAAMC,IAAOD,EAAK,QAAA;AAElB,MAAKqB,EAAI;AAUP,IAAIrB,EAAK,mBACPmR,GAAM9P,EAAI,MAAMrB,CAAI;AAAA,OAXT;AACb,IAAAsR,GAAqBtR,CAAI;AACzB,UAAME,IAAeD,EAAK,SAAA,GACpB,EAAE,UAAUiH,MAAahH,EAAa,SAAA;AAC5C,IAAAD,EAAK,OAAO;AAAA,MACV,UAAAiH;AAAA,MACA,iBAAiB;AAAA,IAAA,CAClB;AAAA,EACH;AAQA,EADejH,EAAK,UAAA,EACb,mBAAA;AACT;AAEA,MAAA6U,KAAe;AAAA,EACb,kBAAAF;AAAA,EACA,gBAAAC;AACF;AC7BA,SAASE,GAAS1T,GAA6BrB,GAAmB;A1BL/D,MAAAX;A0BMD,QAAMY,IAAOD,EAAK,QAAA;AAElB,MADmBC,EAAK,WAAA,EACR;AAChB,EAAAoB,EAAI,eAAA;AAEJ,QAAMyK,IAAgB7L,EAAK,iBAAA;AAM3B,MAAI,CALiB+U;AAAAA,IACnB3T,EAAI;AAAA,IACJ,CAAC4T,MAAkBA,MAASnJ;AAAA,EAE9B,EACmB;AAEnB,QAAMvF,IADSlF,EAAI,OACM,QAAQ;AAEjC,EAAIkF,KACFtG,EAAK,UAAU,OAAOsG,CAAS,CAAC;AAElC,QAAMT,IAAW7F,EAAK,YAAA,GAChB8I,IAAkBjD,EAAS,sBAAsB;AAAA,IACrD,GAAGzE,EAAI;AAAA,IACP,GAAGA,EAAI;AAAA,EAAA,CACR;AACD,MAAI,CAAC0H,EAAiB;AACtB,QAAM,EAAE,SAAAhC,GAAS,cAAAC,GAAc,OAAAN,EAAA,IAAUqC,GAEnC9B,IAAenB,EAAS,gBAAA,GACxBoB,IAAWH,IAAUC,IAAgBN;AAC3C,EAAI,CAACA,MACkBzG,EAAK,SAAA,EACb,SAASiH,GAAUA,CAAQ,GACxCpB,EAAS,kBAAkBmB,EAAaC,CAAQ,CAAC;AAEnD,QAAM1E,IAASvC,EAAK,UAAA,GACd;AAAA,IACJ,QAAQ,EAAE,WAAAiV,GAAW,WAAAC,GAAW,wBAAAC,EAAA;AAAA,EAAuB,IACrDnV,EAAK,WAAA;AAET,MAAImV,GAAwB;AAC1B,UAAM3L,KAAcpK,IAAAW,EAAK,qBAAL,gBAAAX,EAAwBW,EAAK,WAAY;AAC7D,SACEyJ,KAAA,gBAAAA,EAAa,UAAStI,EAAY,UACjCsI,EAAY,eAAe7B,EAAa,aACvC6B,EAAY,eAAe7B,EAAa,gBACxC6B,EAAY,eAAe7B,EAAa;AAE1C;AAAA,EAEJ;AACA,EAAApF,EAAO,WAAW;AAAA,IAChB,OAAO2S;AAAA,IACP,OAAOD;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,CACV;AACH;AAEA,MAAAG,KAAe;AAAA,EACb,UAAAN;AACF;ACjCO,MAAMO,GAAY;AAAA,EA8BvB,YAAYrV,GAAY;AA7BjB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,uBAAoD;AACpD,IAAAA,EAAA,2BAAwD;AACxD,IAAAA,EAAA,yBAAsD;AACtD,IAAAA,EAAA,4BAAyD;AACzD,IAAAA,EAAA,2BAAwD;AACxD,IAAAA,EAAA,0BAAuD;AACvD,IAAAA,EAAA,0BAAsD;AACtD,IAAAA,EAAA,sBAAkD;AAClD,IAAAA,EAAA,6BAA0D;AAC1D,IAAAA,EAAA,4BAA0C;AAGhD,SAAK,OAAO/B,GACZ,KAAK,gBAAgBA,EAAK,iBAAA,GAC1B,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,QAAQ,KAAK,KAAK,SAAA,GACvB,KAAK,WAAW,KAAK,KAAK,YAAA,GAE1B,KAAK,mBAAmB,IACxB,KAAK,cAAc,IACnB,KAAK,kBAAkB,MACvB,KAAK,cAAc,IACnB,KAAK,cAAc,IACnB,KAAK,aAAa,MAClB,KAAK,mBAAmB,MACxB,KAAK,oBAAoB,MACzB,KAAK,uBAAuB,MAC5B,KAAK,yBAAyB;AAAA,EAChC;AAAA,EAEO,UAAgB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,WAAW;AAChB,SAAK,gBAAgB,KAAK,MAAM,KAAK,IAAI,GACzC,KAAK,oBAAoB,KAAK,UAAU,KAAK,IAAI,GACjD,KAAK,kBAAkB,KAAK,QAAQ,KAAK,IAAI,GAC7C,KAAK,qBAAqB,KAAK,WAAW,KAAK,IAAI,GACnD,KAAK,oBAAoB,KAAK,UAAU,KAAK,IAAI,GACjD,KAAK,mBAAmB,KAAK,SAAS,KAAK,IAAI,GAC/C,KAAK,mBAAmB,KAAK,SAAS,KAAK,IAAI,GAC/C,KAAK,eAAe,KAAK,KAAK,KAAK,IAAI,GACvC,KAAK,sBAAsB,KAAK,aAAa,KAAK,IAAI,GACtD,KAAK,cAAc,iBAAiB,SAAS,KAAK,aAAa,GAC/D,KAAK,cAAc,iBAAiB,aAAa,KAAK,iBAAiB,GACvE,KAAK,cAAc,iBAAiB,WAAW,KAAK,eAAe,GACnE,KAAK,cAAc,iBAAiB,cAAc,KAAK,kBAAkB,GACzE,KAAK,cAAc,iBAAiB,aAAa,KAAK,iBAAiB,GACvE,KAAK,cAAc,iBAAiB,YAAY,KAAK,gBAAgB,GACrE,KAAK,cAAc,iBAAiB,YAAY,KAAK,gBAAgB,GACrE,KAAK,cAAc,iBAAiB,QAAQ,KAAK,YAAY,GAC7D,KAAK,cAAc,iBAAiB,eAAe,KAAK,mBAAmB,GAC3E,KAAK,qBAAqBsU,GAAkB,KAAK,eAAe,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAAA,EACnG;AAAA,EAEO,cAAc;AACnB,IAAI,KAAK,iBAAe,KAAK,cAAc,oBAAoB,SAAS,KAAK,aAAa,GACtF,KAAK,qBAAmB,KAAK,cAAc,oBAAoB,aAAa,KAAK,iBAAiB,GAClG,KAAK,mBAAiB,KAAK,cAAc,oBAAoB,WAAW,KAAK,eAAe,GAC5F,KAAK,sBAAoB,KAAK,cAAc,oBAAoB,cAAc,KAAK,kBAAkB,GACrG,KAAK,qBAAmB,KAAK,cAAc,oBAAoB,aAAa,KAAK,iBAAiB,GAClG,KAAK,oBAAkB,KAAK,cAAc,oBAAoB,YAAY,KAAK,gBAAgB,GAC/F,KAAK,oBAAkB,KAAK,cAAc,oBAAoB,YAAY,KAAK,gBAAgB,GAC/F,KAAK,gBAAc,KAAK,cAAc,oBAAoB,QAAQ,KAAK,YAAY,GACnF,KAAK,uBAAqB,KAAK,cAAc,oBAAoB,eAAe,KAAK,mBAAmB,GACxG,KAAK,sBAAoB,KAAK,mBAAA,GAClC,KAAK,gBAAgB,MACrB,KAAK,oBAAoB,MACzB,KAAK,kBAAkB,MACvB,KAAK,qBAAqB,MAC1B,KAAK,oBAAoB,MACzB,KAAK,mBAAmB,MACxB,KAAK,mBAAmB,MACxB,KAAK,eAAe,MACpB,KAAK,sBAAsB,MAC3B,KAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEO,oBAAoBlS,GAAkB;AAC3C,SAAK,mBAAmBA,GACnBA,KACH,KAAK,kBAAA;AAAA,EAET;AAAA,EAEO,eAAeA,GAAkB;AACtC,SAAK,cAAcA,GACnB,KAAK,cAAcA;AAAA,EACrB;AAAA,EAEO,oBAAoB;AACzB,SAAK,SAAS,QAAQ,CAAA3H,MAAK;AACzB,MAAAA,EAAE,MAAM,SAAS;AAAA,IACnB,CAAC,GACD,KAAK,KAAK,gBAAgB,IAAI;AAAA,EAChC;AAAA,EAEO,oBAAoB;AACzB,UAAM6a,IAAe,KAAK,KAAK,gBAAA;AAG/B,QAFI,CAACA,KACc,KAAK,KAAK,gBAAgB,KAAK,KAAK,WAAA,EACvC;AAChB,UAAM1W,IAAY,KAAK,MAAM,aAAA;AAC7B,QAAI,CAACA,EAAW;AAChB,UAAM2W,IAAmB,OAAO,KAAKD,CAAY;AACjD,IAAA1W,EAAU,QAAQ,CAAAtH,MAAK;AACrB,MAAAie,EAAiB,QAAQ,CAAAC,MAAQ;AAC/B,cAAM/X,IAAM+X;AACZ,QAAAle,EAAEmG,CAAG,IAAI6X,EAAa7X,CAAG;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC,GACD,KAAK,KAAK,OAAO,EAAE,aAAa,IAAO;AAEvC,UAAMgY,IAAiB,KAAK,KAAK,kBAAA;AACjC,KAAI,CAACA,KAAkB,CAACA,EAAe,eACrC,KAAK,kBAAA;AAAA,EAET;AAAA,EAEO,YAAY;AACjB,UAAM5P,IAAW,KAAK,SAAS,gBAAA;AAC/B,SAAK,MAAM,SAAS,GAAGA,EAAS,SAAS,CAAC,GAC1C,KAAK,KAAK,OAAO;AAAA,MACf,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,WAAW;AAAA,IAAA,CACZ;AAAA,EACH;AAAA,EAEO,UAAUzE,GAAiB;AAChC,IAAA0K,GAAU1K,GAAK,IAAI;AAAA,EACrB;AAAA,EAEO,UAAUA,GAAiB;AAChC,IAAA+E,GAAU/E,GAAK,IAAI;AAAA,EACrB;AAAA,EAEO,QAAQ;AAEb,IAAIsU,MAAS,CAAC,KAAK,KAAK,gBACtB,KAAK,KAAK,UAAA,EAAY,YAAA,EAAc,MAAA;AAAA,EAExC;AAAA,EAEO,QAAQtU,GAAiB;AAC9B,IAAAsH,GAAQtH,GAAK,IAAI;AAAA,EACnB;AAAA,EAEO,WAAWA,GAAiB;AACjC,IAAAwK,GAAWxK,GAAK,IAAI;AAAA,EACtB;AAAA,EAEO,QAAQA,GAAoB;AACjC,IAAAyP,GAAQzP,GAAK,IAAI;AAAA,EACnB;AAAA,EAEO,SAASA,GAAiB;AAC/B,IAAAsT,GAAM,SAAS,MAAMtT,CAAG;AAAA,EAC1B;AAAA,EAEO,oBAAoB;AACzB,IAAAsT,GAAM,kBAAkB,IAAI;AAAA,EAC9B;AAAA,EAEO,MAAMzW,GAAc;AACzB,IAAAiT,GAAMjT,GAAM,IAAI;AAAA,EAClB;AAAA,EAEO,MAAM;AACX,IAAA+T,GAAI,IAAI;AAAA,EACV;AAAA,EAEO,KAAKtS,GAAuB;AACjC,IAAA2S,GAAK,MAAM3S,CAAO;AAAA,EACpB;AAAA,EAEO,mBAAmB;AACxB,IAAAmV,GAAY,iBAAiB,IAAI;AAAA,EACnC;AAAA,EAEO,eAAezT,GAAuB;AAC3C,IAAAyT,GAAY,eAAe,MAAMzT,CAAG;AAAA,EACtC;AAAA,EAEO,KAAKA,GAAgB;AAC1B,IAAA2R,GAAK3R,GAAK,IAAI;AAAA,EAChB;AAAA,EAEO,SAASA,GAA6B;AAC3C,IAAAgU,GAAK,SAAShU,GAAK,IAAI;AAAA,EACzB;AAAA,EAEQ,aAAaA,GAAiB;AACpC,IAAA6R,GAAY7R,GAAK,KAAK,IAAI;AAAA,EAC5B;AACF;ACxOO,MAAMuU,GAAY;AAAA,EAcvB,YAAY3V,GAAY8B,GAA0B;AAb1C,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AA6CD,IAAAA,EAAA,yBAAkB,CAACX,MAAe;AACvC,UAAI,CAAC,KAAK,OAAQ;AAElB,YAAMwU,KAAmBxU,KAAA,gBAAAA,EAAK,eAAe,OAAMA,EAAI,QACjDyU,IAAW,KAAK,KAAK,YAAA;AAM3B,UALuBd;AAAAA,QACrBa;AAAA,QACA,CAACZ,MAAca,EAAS,SAASb,CAAI;AAAA,MAEvC,EACoB;AAQpB,UANuBD;AAAAA,QACrBa;AAAA,QACA,CAACZ,MACC,CAAC,CAACA,KAAQA,EAAK,aAAa,KAAK,CAAC,CAACA,EAAK,aAAac,EAAgB;AAAA,MAEzE,GACoB;AAClB,aAAK,kBAAA;AACL;AAAA,MACF;AACA,WAAK,OAAO,eAAA,GACZ,KAAK,MAAM,mBAAA,GACX,KAAK,UAAU,aAAA,GACf,KAAK,UAAU,QAAA,GACf,KAAK,kBAAkB,oBAAA,GACvB,KAAK,QAAQ,eAAA,GACb,KAAK,aAAa,gBAAA,GAClB,KAAK,cAAc,kBAAA;AAAA,IACrB;AAEO,IAAA/T,EAAA,+BAAwB,MAAM;AACnC,WAAK,YAAY,eAAe,EAAK,GACrC,KAAK,YAAY,oBAAoB,EAAK;AAAA,IAC5C;AAgBO,IAAAA,EAAA,sBAAe,CAACX,MAAoB;AAUzC,UAPE,KAAK,QAAQ,oBAAoB;AAAA,QAC/B2U,GAAsB;AAAA,MAAA,KAMtB,CAAC3U,EAAI,QAAS;AAClB,MAAAA,EAAI,eAAA;AACJ,YAAM,EAAE,OAAAkB,MAAU,KAAK;AACvB,UAAIlB,EAAI,SAAS,GAAG;AAClB,cAAM4U,IAAY,KAAK,MAAM1T,IAAQ,KAAK,CAAC,IAAI;AAC/C,QAAI0T,KAAa,KACf,KAAK,KAAK,aAAaA,CAAS;AAAA,MAEpC,OAAO;AACL,cAAMA,IAAY,KAAK,MAAM1T,IAAQ,KAAK,CAAC,IAAI;AAC/C,QAAI0T,KAAa,OACf,KAAK,KAAK,aAAaA,CAAS;AAAA,MAEpC;AAAA,IACF;AAEQ,IAAAjU,EAAA,iCAA0B,MAAM;AACtC,UAAI,SAAS,oBAAoB,WAAW;AAE1C,cAAMjD,IAAQ,KAAK,MAAM,SAAA,GACnBmX,IACJ,CAAC,CAAC,CAACnX,EAAM,cACT,CAAC,CAAC,CAACA,EAAM,YACTA,EAAM,eAAeA,EAAM;AAC7B,aAAK,MAAM,aAAaA,CAAK,GAC7B,KAAK,KAAK,OAAO;AAAA,UACf,aAAAmX;AAAA,UACA,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB,UAAUnX,EAAM;AAAA,QAAA,CACjB;AAAA,MACH;AAAA,IACF;AAEQ,IAAAiD,EAAA,0BAAmB,MAAM;AAC/B,WAAK,KAAK,mBAAA;AAAA,IACZ;AA3IE,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,cAAc8B,GACnB,KAAK,SAAS,MACd,KAAK,QAAQ9B,EAAK,SAAA,GAClB,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,oBAAoBA,EAAK,qBAAA,GAC9B,KAAK,eAAeA,EAAK,gBAAA,GACzB,KAAK,gBAAgBA,EAAK,iBAAA,GAC1B,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,oBAAoB,OAAO;AAAA,MAC9B,gBAAgB,OAAO,gBAAgB;AAAA,IAAA;AAAA,EAE3C;AAAA,EAEO,WAAW;AAChB,SAAK,SAAS,KAAK,KAAK,UAAA,GACxB,KAAK,SAAA;AAAA,EACP;AAAA,EAEQ,WAAW;AACjB,WAAO,iBAAiB,QAAQ,KAAK,eAAe,GACpD,SAAS,iBAAiB,aAAa,KAAK,eAAe,GAC3D,SAAS,iBAAiB,WAAW,KAAK,qBAAqB,GAC/D,SAAS,iBAAiB,SAAS,KAAK,cAAc,EAAE,SAAS,IAAO,GACxE,SAAS,iBAAiB,oBAAoB,KAAK,uBAAuB,GAC1E,KAAK,kBAAkB,iBAAiB,UAAU,KAAK,gBAAgB;AAAA,EACzE;AAAA,EAEO,cAAc;AACnB,WAAO,oBAAoB,QAAQ,KAAK,eAAe,GACvD,SAAS,oBAAoB,aAAa,KAAK,eAAe,GAC9D,SAAS,oBAAoB,WAAW,KAAK,qBAAqB,GAClE,SAAS,oBAAoB,SAAS,KAAK,YAAY,GACvD,SAAS;AAAA,MACP;AAAA,MACA,KAAK;AAAA,IAAA,GAEP,KAAK,kBAAkB,oBAAoB,UAAU,KAAK,gBAAgB;AAAA,EAC5E;AAAA,EAuCO,oBAAoB;AAEzB,IAAK,KAAK,MAAM,oBAChB,WAAW,MAAM;A5BhHlB,UAAAZ,GAAAgH;A4BkHG,OAAKhH,IAAA,KAAK,WAAL,QAAAA,EAAa,uBAChBgH,IAAA,KAAK,WAAL,QAAAA,EAAa,WAAW;AAAA,QACtB,SAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,IAGf,CAAC;AAAA,EACH;AAiDF;AC/IO,MAAM8P,GAAS;AAAA,EAUpB,YAAYlW,GAAY;AAThB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,eAAe,CAAA,GACpB,KAAK,oBAAoB,CAAA,GACzB,KAAK,iBAAiB,MACtB,KAAK,kBAAkB;AAAA,MACrB,SAAS;AAAA,MACT,WAAW;AAAA,IAAA,GAGb,KAAK,OAAO/B,GACZ,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,uBAAyC;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,qBACLmW,GACoB;AACpB,UAAM,EAAE,OAAA1P,GAAO,SAAA2E,GAAS,SAAAC,EAAA,IAAY,KAAK;AACzC,WACE8K,EAAkB1P,CAAM,EAAE,OAAQ2E,CAAQ,EAAE,OAAOC,CAAQ,EACxD,gBAAgB,CAAA;AAAA,EAEvB;AAAA,EAEO,kBAAsC;AAC3C,WAAO,KAAK,gBAAgB,UACxB,KAAK,qBAAqB,KAAK,KAAK,uBAAA,CAAwB,IAC5D,KAAK,wBAAA;AAAA,EACX;AAAA,EAEO,sBAA0C;AAC/C,WAAO,KAAK,gBAAgB,UACxB,KAAK,qBAAqB,KAAK,KAAK,4BAA4B,IAChE,KAAK;AAAA,EACX;AAAA,EAEO,0BAA8C;AACnD,UAAMyF,IAAc,KAAK,KAAK,QAAA;AAC9B,WAAIA,EAAY,mBACC,KAAK,KAAK,UAAA,EACX,gBAAA,IAEZA,EAAY,mBACC,KAAK,KAAK,UAAA,EACX,gBAAA,IAET,KAAK;AAAA,EACd;AAAA,EAEO,8BAAkD;AACvD,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,2BAAsD;AAC3D,UAAM,EAAE,YAAA5Q,GAAY,UAAAsF,EAAA,IAAa,KAAK,KAAK,SAAA,EAAW,SAAA;AACtD,WAAItF,MAAesF,IAAiB,OACf,KAAK,gBAAA,EACN,MAAMtF,IAAa,GAAGsF,IAAW,CAAC;AAAA,EACxD;AAAA,EAEO,gBAAgBpD,GAA6B;AAClD,SAAK,eAAeA;AAAA,EACtB;AAAA,EAEO,qBAAqBA,GAA2B;AACrD,SAAK,oBAAoBA;AAAA,EAC3B;AAAA,EAEO,uBACLA,GAC+B;AAC/B,UAAM;AAAA,MACJ,cAAA4E;AAAA,MACA,SAAAoP;AAAA,MACA,QAAAhT;AAAA,MACA,QAAAiT;AAAA,MACA,QAAAC;AAAA,MACA,eAAAC;AAAA,MACA,YAAArW;AAAA,MACA,YAAAsW;AAAA,MACA,MAAAC;AAAA,IAAA,IACErU,GACE;AAAA,MACJ,OAAAE;AAAA,MACA,OAAO,EAAE,WAAAoU,EAAA;AAAA,IAAU,IACjB,KAAK;AACT,QAAI5a,IAAIua,GACJ9b,IAAI+b,GACJ7P,IAAQvG;AACZ,aAAS/I,IAAI,GAAGA,IAAIif,EAAQ,QAAQjf,KAAK;AACvC,YAAMwf,IAASP,EAAQjf,CAAC;AAExB,UAAIwf,EAAO,qBAAqBA,EAAO,gBAAgB;AACrD,cAAMC,IAAYD,EAAO,gBAAgB,CAAA,GACnCE,IAASF,EAAO,aAAa;AACnC,YAAIG,IAAOhb;AACX,iBAASnF,IAAI,GAAGA,IAAIggB,EAAO,eAAe,QAAQhgB,KAAK;AACrD,gBAAMogB,IAAaJ,EAAO,eAAehgB,CAAC;AAC1C,cAAIogB,EAAW,SAAS,GAAG;AACzB,iBAAK,uBAAuB;AAAA,cAC1B,cAAA/P;AAAA,cACA,SAAS+P;AAAA,cACT,QAAA3T;AAAA,cACA,QAAQ0T;AAAA,cACR,QAAQvc;AAAA,cACR,eAAegc,IAAgBpf;AAAA,cAC/B,YAAYsP;AAAA,cACZ,YAAYmQ,EAAUjgB,CAAC,KAAK;AAAA,cAC5B,MAAA8f;AAAA,YAAA,CACD;AAED,uBAAWO,KAAUD;AACnB,cAAAtQ,KAASuQ,EAAO,YAAY;AAAA,UAEhC;AACA,UAAAF,MAASF,EAAUjgB,CAAC,KAAK,KAAKkgB;AAAA,QAChC;AACA,QAAAtc,KAAKoc,EAAO;AACZ;AAAA,MACF;AAEA,UAAI,CAACA,EAAO,YAAY;AAEtB,cAAMM,IAAcN,EAAO,SAASA,EAAO,WAAW;AACtD,QAAIA,EAAO,YAAYO,GAAQ,SAC7Bpb,MAAM0a,IAAaS,KAAe,IACzBN,EAAO,YAAYO,GAAQ,UACpCpb,KAAK0a,IAAaS;AAAA,MAEtB;AAEA,MAAAnb,KAAK6a,EAAO,WAAW,GACvBpc,KAAKoc,EAAO,WAAW;AAEvB,YAAMQ,IAAYrb,GACZsb,IAAY7c;AAClB,eAAS5B,IAAI,GAAGA,IAAIge,EAAO,YAAY,QAAQhe,KAAK;AAClD,cAAM4H,IAAUoW,EAAO,YAAYhe,CAAC,GAC9BqK,IAAUzC,EAAQ,SAClB8W,IACJC,GAAe/W,CAAO,KACtBA,EAAQ,SAASW,EAAY,QACzByV,EAAO,SAAS3T,EAAQ,SACxB2T,EAAO;AAEb,QAAIpW,EAAQ,SACVzE,KAAKyE,EAAQ;AAEf,cAAMgX,IAAiC;AAAA,UACrC,QAAAnU;AAAA,UACA,OAAAqD;AAAA,UACA,OAAOlG,EAAQ;AAAA,UACf,UAAUgW,IAAgBpf;AAAA,UAC1B,OAAOA;AAAA,UACP,SAAA6L;AAAA,UACA,MAAMzC,EAAQ,QAAQ;AAAA,UACtB,QAAQ8W;AAAA,UACR,YAAYV,EAAO;AAAA,UACnB,eAAehe,MAAM;AAAA,UACrB,cAAcA,MAAMge,EAAO,YAAY,SAAS;AAAA,UAChD,YAAY;AAAA,YACV,SAAS,CAAC7a,GAAGvB,CAAC;AAAA,YACd,YAAY,CAACuB,GAAGvB,IAAIoc,EAAO,MAAM;AAAA,YACjC,UAAU,CAAC7a,IAAIkH,EAAQ,OAAOzI,CAAC;AAAA,YAC/B,aAAa,CAACuB,IAAIkH,EAAQ,OAAOzI,IAAIoc,EAAO,MAAM;AAAA,UAAA;AAAA,QACpD;AAGF,YACEpW,EAAQ,eAAeoH,EAAa,YACpCpH,EAAQ,eAAeoH,EAAa,aACpCpH,EAAQ,eAAeoH,EAAa,cACpC;AAEA,gBAAM6P,IAAcxQ,EAAaA,EAAa,SAAS,CAAC;AACxD,UAAIwQ,MACFD,EAAa,UAAUC,EAAY,SACnCD,EAAa,aAAaC,EAAY,aAGnCjX,EAAQ,qBACXA,EAAQ,mBAAmB;AAAA,YACzB,GAAAzE;AAAA,YACA,GAAAvB;AAAA,YACA,QAAA6I;AAAA,UAAA,IAGJ,KAAK,kBAAkB,KAAK;AAAA,YAC1B,QAAAA;AAAA,YACA,SAAA7C;AAAA,YACA,UAAUgX;AAAA,YACV,SAASnV,EAAQ;AAAA,YACjB,OAAOA,EAAQ;AAAA,YACf,SAASA,EAAQ;AAAA,YACjB,SAASA,EAAQ;AAAA,YACjB,cAAcqE;AAAA,YACd,MAAAgQ;AAAA,UAAA,CACD;AAAA,QACH;AAKA,YAJAzP,EAAa,KAAKuQ,CAAY,GAC9B9Q,KACA3K,KAAKkH,EAAQ,OAETyU,GAAelX,CAAO,GAAG;AAC3B,gBAAMmX,IAAiBnX,EAAQ,aAAamW;AAC5C,mBAAStf,IAAI,GAAGA,IAAImJ,EAAQ,OAAQ,QAAQnJ,KAAK;AAC/C,kBAAMiX,IAAK9N,EAAQ,OAAQnJ,CAAC;AAC5B,qBAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAQ,QAAQ3T,KAAK;AAC1C,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBid,IAAqB1H,EAAG,WAAWyH,GACnCE,IAAiBD,EAAmB,CAAC,IAAIA,EAAmB,CAAC,GAC7DE,IAAkBF,EAAmB,CAAC,IAAIA,EAAmB,CAAC;AACpE,cAAA1H,EAAG,eAAe,CAAA;AAClB,oBAAMmG,IAAUnG,EAAG,SACb6H,IAAgB,KAAK,uBAAuB;AAAA,gBAChD,cAAc7H,EAAG;AAAA,gBACjB,SAAAmG;AAAAA,gBACA,QAAAhT;AAAA,gBACA,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,SAAS6M,EAAG,IAAK0H,EAAmB,CAAC,KAAKrV,IAAQ6U;AAAA,gBAClD,SAASlH,EAAG,IAAK0H,EAAmB,CAAC,KAAKrV,IAAQ8U;AAAA,gBAClD,aAAanH,EAAG,QAAS2H,KAAkBtV;AAAA,gBAC3C,SAAS;AAAA,gBACT,OAAOmE,IAAQ;AAAA,gBACf,SAAS/L;AAAA,gBACT,SAAStD;AAAA,gBACT,MAAAqf;AAAA,cAAA,CACD;AAED,kBACExG,EAAG,kBAAkB8H,GAAc,UACnC9H,EAAG,kBAAkB8H,GAAc,QACnC;AACA,sBAAMC,IAAa5B,EAAQ;AAAA,kBACzB,CAAC6B,GAAKC,MAAQD,IAAMC,EAAI;AAAA,kBACxB;AAAA,gBAAA,GAEIC,KACHlI,EAAG,SAAU4H,KAAmBvV,IAAQ0V,GACrCI,IACJnI,EAAG,kBAAkB8H,GAAc,SAC/BI,IAAc,IACdA;AACN,gBAAI,KAAK,MAAMC,CAAY,IAAI,KAC7BnI,EAAG,aAAa,QAAQ,CAAAoI,MAAc;AACpC,wBAAM;AAAA,oBACJ,YAAY,EAAE,SAAApV,GAAS,YAAAc,IAAY,aAAAgI,GAAa,UAAA7I,EAAA;AAAA,kBAAS,IACvDmV;AACJ,kBAAApV,EAAQ,CAAC,KAAKmV,GACdrU,GAAW,CAAC,KAAKqU,GACjBrM,EAAY,CAAC,KAAKqM,GAClBlV,EAAS,CAAC,KAAKkV;AAAA,gBACjB,CAAC;AAAA,cAEL;AACA,cAAAtc,IAAIgc,EAAc,GAClBvd,IAAIud,EAAc;AAAA,YACpB;AAAA,UACF;AAEA,UAAAhc,IAAIqb,GACJ5c,IAAI6c;AAAA,QACN;AAAA,MACF;AACA,MAAAtb,IAAIua,GACJ9b,KAAKoc,EAAO;AAAA,IACd;AACA,WAAO,EAAE,GAAA7a,GAAG,GAAAvB,GAAG,OAAAkM,EAAA;AAAA,EACjB;AAAA,EAEO,sBAAsB;A7BxT5B,QAAArH;A6B0TC,SAAK,eAAe,CAAA;AAEpB,UAAMoX,IAAa,KAAK,KAAK,cAAA,GACvB8B,IAAc,KAAK,KAAK,eAAA,GACxBhI,IAAU,KAAK,KAAK,WAAA,GACpB+F,IAAS/F,EAAQ,CAAC,GAGlBiI,IADS,KAAK,KAAK,UAAA,EACE,eAAA,GACrBjC,IAAShG,EAAQ,CAAC,IAAIiI;AAC5B,QAAIhC,IAAgB;AACpB,aAASpf,IAAI,GAAGA,IAAImhB,EAAY,QAAQnhB,KAAK;AAC3C,YAAMif,IAAUkC,EAAYnhB,CAAC,GACvB+I,KAAad,IAAAgX,EAAQ,CAAC,MAAT,gBAAAhX,EAAY;AAC/B,WAAK,uBAAuB;AAAA,QAC1B,cAAc,KAAK;AAAA,QACnB,SAAAgX;AAAA,QACA,QAAQjf;AAAA,QACR,eAAAof;AAAA,QACA,YAAArW;AAAA,QACA,QAAAmW;AAAA,QACA,QAAAC;AAAA,QACA,YAAAE;AAAA,MAAA,CACD,GACDD,KAAiBH,EAAQ;AAAA,IAC3B;AAAA,EACF;AAAA,EAEO,mBACLhU,GACoB;AACpB,UAAM,EAAE,KAAA0K,GAAK,YAAA0J,EAAA,IAAepU,GACtB4E,IAAmC,CAAA;AACzC,gBAAK,uBAAuB;AAAA,MAC1B,cAAAA;AAAA,MACA,YAAAwP;AAAA,MACA,SAAS,CAAC1Q,GAAUgH,CAAG,CAAC;AAAA,MACxB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe;AAAA,IAAA,CAChB,GACM9F;AAAA,EACT;AAAA,EAEO,kBAAkBnB,GAAmC;AAC1D,SAAK,iBAAiBA;AAAA,EACxB;AAAA,EAEO,oBAA6C;AAClD,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,qBAAuC;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,mBAAmBzD,GAA2B;AACnD,SAAK,SAAS,KAAK,yBAAyB;AAAA,MAC1C,OAAOA;AAAA,MACP,UAAU,KAAK;AAAA,IAAA,CAChB,GACD,KAAK,kBAAkBA;AAAA,EACzB;AAAA,EAEO,gBAAgBA,GAAoD;A7B5X1E,QAAAhD,GAAAgH,GAAAuC,GAAAC;A6B6XC,UAAM,EAAE,GAAA9M,GAAG,GAAAvB,GAAG,SAAAuM,EAAA,IAAY1E;AAC1B,QAAI,EAAE,aAAAjD,GAAa,cAAA6H,EAAA,IAAiB5E;AACpC,IAAKjD,MACHA,IAAc,KAAK,KAAK,uBAAA,IAErB6H,MACHA,IAAe,KAAK,wBAAA;AAEtB,UAAM8J,IAAc,KAAK,KAAK,QAAA,GACxBoB,IAAY9P,EAAQ,UAAU,KAAK,KAAK,UAAA,GACxCoW,IAAe1H,EAAY,aAAA,GAC3B2H,IAAaD,IAAetG,IAAY;AAE9C,QAAI,CAACpL,GAAS;AACZ,YAAM4R,IAAmB,KAAK,qBAAqB;AAAA,QACjD,GAAGtW;AAAA,QACH,aAAa,CAACuF,EAAa,WAAWA,EAAa,QAAQ;AAAA,MAAA,CAC5D;AACD,UAAI+Q,EAAkB,QAAOA;AAAA,IAC/B;AAEA,aAAS/f,IAAI,GAAGA,IAAIqO,EAAa,QAAQrO,KAAK;AAC5C,YAAM;AAAA,QACJ,OAAA8N;AAAA,QACA,QAAArD;AAAA,QACA,MAAAkB;AAAA,QACA,eAAAqU;AAAA,QACA,YAAY,EAAE,SAAA1V,GAAS,UAAAC,GAAU,YAAAa,EAAA;AAAA,MAAW,IAC1CiD,EAAarO,CAAC;AAClB,UAAI8f,MAAerV,GACnB;AAAA,YAAIA,IAASqV,EAAY;AAEzB,YACExV,EAAQ,CAAC,IAAIqB,KAAQxI,KACrBoH,EAAS,CAAC,KAAKpH,KACfmH,EAAQ,CAAC,KAAK1I,KACdwJ,EAAW,CAAC,KAAKxJ,GACjB;AACA,cAAIqe,IAAmBjgB;AACvB,gBAAM4H,IAAUpB,EAAYxG,CAAC;AAE7B,cAAI8e,GAAelX,CAAO;AACxB,qBAASnJ,IAAI,GAAGA,IAAImJ,EAAQ,OAAQ,QAAQnJ,KAAK;AAC/C,oBAAMiX,IAAK9N,EAAQ,OAAQnJ,CAAC;AAC5B,uBAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,sBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBme,IAAgB,KAAK,gBAAgB;AAAA,kBACzC,GAAA/c;AAAA,kBACA,GAAAvB;AAAA,kBACA,IAAA0V;AAAA,kBACA,QAAQiC;AAAA,kBACR,eAAelL,EAAarO,CAAC;AAAA,kBAC7B,SAAS;AAAA,kBACT,aAAasX,EAAG;AAAA,kBAChB,cAAcA,EAAG;AAAA,gBAAA,CAClB;AACD,oBAAI,CAAC4I,EAAc,OAAO;AACxB,wBAAM,EAAE,OAAO9R,GAAc,mBAAAlE,MAAsBgW,GAC7CC,IAAiB7I,EAAG,MAAMlJ,CAAY;AAC5C,yBAAO;AAAA,oBACL,OAAAN;AAAA,oBACA,YACEoS,EAAc,cACdC,EAAe,SAAS5X,EAAY,YACpC4X,EAAe,qBACb5T,EAAiB;AAAA,oBACrB,SACE4T,EAAe,SAAS5X,EAAY,SACpC4X,EAAe,qBAAqB5T,EAAiB;AAAA,oBACvD,WAAW,CAAC,CAAC4T,EAAe;AAAA,oBAC5B,SAASD,EAAc;AAAA,oBACvB,aAAaA,EAAc;AAAA,oBAC3B,SAAS;AAAA,oBACT,SAASne;AAAA,oBACT,SAAStD;AAAA,oBACT,cAAA2P;AAAA,oBACA,MAAMkJ,EAAG;AAAA,oBACT,MAAM5B,EAAG;AAAA,oBACT,SAAS9N,EAAQ;AAAA,oBACjB,mBAAAsC;AAAAA,kBAAA;AAAA,gBAEJ;AAAA,cACF;AAAA,YACF;AAGF,cACEyU,GAAe/W,CAAO,KACtBA,EAAQ,SAASW,EAAY;AAE7B,mBAAO;AAAA,cACL,OAAO0X;AAAAA,cACP,aAAa;AAAA,cACb,SAAS;AAAA,YAAA;AAGb,cACErY,EAAQ,SAASW,EAAY,YAC7BX,EAAQ,qBAAqB2E,EAAiB;AAE9C,mBAAO;AAAA,cACL,OAAO0T;AAAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,YAAA;AAGhB,cACErY,EAAQ,SAASW,EAAY,OAC7BX,EAAQ,cAAcwY,GAAU,UAChC;AAEA,gBAAItS,IAAQmS,IAAmB;AAC/B,mBAAOnS,IAAQ,KAAG;AAChB,oBAAMlG,IAAUpB,EAAYsH,CAAK;AACjC,kBACElG,EAAQ,UAAUC,KAClBD,EAAQ,cAAcwY,GAAU;AAEhC;AAEFtS,cAAAA;AAAAA,YACF;AACA,mBAAO;AAAA,cACL,OAAAA;AAAAA,cACA,aAAa;AAAA,cACb,YAAY;AAAA,YAAA;AAAA,UAEhB;AACA,cACElG,EAAQ,SAASW,EAAY,SAC7BX,EAAQ,qBAAqB2E,EAAiB;AAE9C,mBAAO;AAAA,cACL,OAAO0T;AAAAA,cACP,aAAa;AAAA,cACb,SAAS;AAAA,YAAA;AAGb,cAAI/V;AAEJ,cAAI1D,EAAYsH,CAAK,EAAE,UAAUjG,GAAM;AACrC,kBAAMwY,IAAa9V,EAAS,CAAC,IAAID,EAAQ,CAAC;AAC1C,YAAInH,IAAImH,EAAQ,CAAC,IAAI+V,IAAa,MAChCJ,IAAmBjgB,IAAI,GACnBggB,MACF9V,IAAoBlK;AAAA,UAG1B;AACA,iBAAO;AAAA,YACL,aAAa;AAAA,YACb,mBAAAkK;AAAAA,YACA,OAAO+V;AAAAA,YACP,WAAW,CAAC,CAACrY,EAAQ;AAAA,UAAA;AAAA,QAEzB;AAAA;AAAA,IACF;AAEA,QAAI,CAACuG,GAAS;AACZ,YAAMmS,IAAsB,KAAK,qBAAqB;AAAA,QACpD,GAAG7W;AAAA,QACH,aAAa,CAACuF,EAAa,YAAY;AAAA,MAAA,CACxC;AACD,UAAIsR,EAAqB,QAAOA;AAAA,IAClC;AAEA,QAAIC,IAAa,IACbN,IAAmB,IACnB/V;AAEJ,QAAIiE,GAAS;AACX,YAAM,EAAE,OAAAxE,MAAU,KAAK,SACjB,EAAE,IAAA2N,GAAI,eAAA4I,EAAA,IAAkBzW;AAC9B,UAAI6N,KAAM4I,GAAe;AACvB,cAAM,EAAE,SAAA5V,MAAY4V,EAAc,YAC5BrI,IAAMP,EAAG,IAAK3N,IAAQW,EAAQ,CAAC,GAC/BkW,IAAMlJ,EAAG,IAAK3N,IAAQW,EAAQ,CAAC,GAC/BwN,IAAUR,EAAG,QAAS3N,GACtB8W,IAAWnJ,EAAG,SAAU3N;AAC9B,YAAI,EAAEkO,IAAM1U,KAAKA,IAAI0U,IAAMC,KAAW0I,IAAM5e,KAAKA,IAAI4e,IAAMC;AACzD,iBAAO;AAAA,YACL,OAAOR;AAAA,UAAA;AAAA,MAGb;AAAA,IACF;AAEA,UAAMS,IAAiBrS,EAAa;AAAA,MAClC,CAAAvM,MAAKA,EAAE,gBAAgBA,EAAE,WAAWge;AAAA,IAAA;AAEtC,aAAS9f,IAAI,GAAGA,IAAI0gB,EAAe,QAAQ1gB,KAAK;AAC9C,YAAM;AAAA,QACJ,OAAA8N;AAAA,QACA,OAAAgJ;AAAA,QACA,YAAY,EAAE,SAAAxM,GAAS,YAAAc,EAAA;AAAA,MAAW,IAChCsV,EAAe1gB,CAAC;AACpB,UAAI4B,IAAI0I,EAAQ,CAAC,KAAK1I,KAAKwJ,EAAW,CAAC,GAAG;AACxC,cAAMuV,IAAYtS,EAAa;AAAA,UAC7B,CAAAvM,MAAKA,EAAE,WAAWge,KAAche,EAAE,UAAUgV;AAAA,QAAA,GAExC8J,IAAcpa,EAAYma,CAAS,GACnCE,IAAexS,EAAasS,CAAS,GAErCG,IACJF,EAAY,cAAcR,GAAU,WAChC,KAAK,KAAK,WAAA,EAAa,CAAC,IACxBS,EAAa,WAAW,QAAQ,CAAC;AACvC,YAAI1d,IAAI2d;AAEN,UAAI,CAACH,IACCE,EAAa,UAAUhZ,IACzBoY,IAAmBU,KAEnBV,IAAmBU,IAAY,GAC/BzW,IAAoByW,KAGtBV,IAAmBnS;AAAA,aAEhB;AAEL,cAAI8S,EAAY,cAAcR,GAAU,YAAYjd,IAAImH,EAAQ,CAAC;AAC/D,mBAAO;AAAA,cACL,OAAOqW;AAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,YAAA;AAGhB,UAAAV,IAAmBnS;AAAA,QACrB;AACA,QAAAyS,IAAa;AACb;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAACA,GAAY;AAGf,YAAMQ,IADS,KAAK,KAAK,UAAA,EACI,eAAA,IAAmB,KAAK,KAAK,WAAA,EAAa,CAAC,GAElEC,IAAS,KAAK,KAAK,UAAA,GAEnBC,IADa,KAAK,KAAK,UAAA,KAEbD,EAAO,eAAA,IAAmB,KAAK,KAAK,aAAa,CAAC;AAElE,UAAInB,GAAc;AAEhB,YAAIje,IAAImf;AACN,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,MAAM3I,GAAW;AAAA,UAAA;AAIrB,YAAIxW,IAAIqf;AACN,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,MAAM7I,GAAW;AAAA,UAAA;AAAA,MAGvB,WAEMxW,KAAKqf,KAAcrf,KAAKmf;AAC1B,eAAO;AAAA,UACL,OAAO;AAAA,UACP,MAAM3I,GAAW;AAAA,QAAA;AAKvB,YAAMT,IAAU,KAAK,KAAK,WAAA;AAC1B,UAAI/V,KAAK+V,EAAQ,CAAC;AAChB,iBAAS7V,IAAI,GAAGA,IAAIuM,EAAa,QAAQvM,KAAK;AAC5C,gBAAMoL,IAAWmB,EAAavM,CAAC;AAC/B,cAAIoL,EAAS,WAAW4S,KAAc5S,EAAS,UAAU,EAAG;AAC5D,gBAAM,EAAE,SAAA5C,GAAS,UAAAC,EAAA,IAAa2C,EAAS;AAEvC,cACE/J,KAAKwU,EAAQ,CAAC,KACbxU,KAAKmH,EAAQ,CAAC,KAAKnH,KAAKoH,EAAS,CAAC,OACnC9D,IAAA4H,EAAavM,IAAI,CAAC,MAAlB,gBAAA2E,EAAqB,WAAU;AAE/B,mBAAO;AAAA,cACL,OAAOyG,EAAS;AAAA,YAAA;AAAA,QAGtB;AAAA,WACK;AAEL,cAAMgU,IAAaR,EAAeA,EAAe,SAAS,CAAC;AAC3D,YAAIQ,GAAY;AACd,gBAAMC,IAAYD,EAAW;AAC7B,mBAASpf,IAAI,GAAGA,IAAIuM,EAAa,QAAQvM,KAAK;AAC5C,kBAAMoL,IAAWmB,EAAavM,CAAC;AAC/B,gBACEoL,EAAS,WAAW4S,KACpB5S,EAAS,UAAUiU;AAEnB;AAEF,kBAAM,EAAE,SAAA7W,GAAS,UAAAC,EAAA,IAAa2C,EAAS;AAEvC,gBACE/J,KAAKwU,EAAQ,CAAC,KACbxU,KAAKmH,EAAQ,CAAC,KAAKnH,KAAKoH,EAAS,CAAC,OACnCkD,IAAAY,EAAavM,IAAI,CAAC,MAAlB,gBAAA2L,EAAqB,WAAU0T;AAE/B,qBAAO;AAAA,gBACL,OAAOjU,EAAS;AAAA,cAAA;AAAA,UAGtB;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SACE8C,IAAA0Q,EAAeA,EAAe,SAAS,CAAC,MAAxC,gBAAA1Q,EAA2C,UAC3C3B,EAAa,SAAS;AAAA,MAAA;AAAA,IAE5B;AACA,WAAO;AAAA,MACL,mBAAAnE;AAAA,MACA,OAAO+V;AAAA,MACP,WAAW,CAAC,GAAChQ,IAAAzJ,EAAYyZ,CAAgB,MAA5B,QAAAhQ,EAA+B;AAAA,IAAA;AAAA,EAEhD;AAAA,EAEO,qBACLxG,GACyB;AACzB,UAAM,EAAE,GAAAtG,GAAG,GAAAvB,EAAA,IAAM6H,GACX2X,IAAgB3X,EAAQ,UAAU,KAAK,KAAK,UAAA,GAC5C4X,IAAc,KAAK,KAAK,QAAA,EAAU,QAAA,GAClC,EAAE,OAAA1X,MAAU,KAAK;AACvB,aAAS1R,IAAI,GAAGA,IAAI,KAAK,kBAAkB,QAAQA,KAAK;AACtD,YAAM;AAAA,QACJ,UAAAiV;AAAA,QACA,SAAAtF;AAAA,QACA,SAAAuG;AAAA,QACA,OAAAL;AAAA,QACA,SAAA2E;AAAA,QACA,SAAAC;AAAA,QACA,cAAAtE;AAAA,QACA,MAAMkT;AAAA,QACN,QAAA7W;AAAA,MAAA,IACE,KAAK,kBAAkBxS,CAAC;AAC5B,UACEmpB,MAAkB3W,KAClBkU,GAAe/W,CAAO,KACtBA,EAAQ,cACR6B,EAAQ,YAAY,SAAS7B,EAAQ,UAAU,MAC9C,CAAC0Z,KAAoBA,MAAqBD,IAC3C;AACA,cAAMvR,IAAmBlI,EAAQ,kBAC3B2Z,IAAoBzR,EAAiB,IAAInG,GACzC6X,IAAoB1R,EAAiB,IAAInG,GACzC8X,IAAe7Z,EAAQ,QAAS+B,GAChC+X,IAAgB9Z,EAAQ,SAAU+B;AACxC,YACExG,KAAKoe,KACLpe,KAAKoe,IAAoBE,KACzB7f,KAAK4f,KACL5f,KAAK4f,IAAoBE;AAEzB,iBAAIvT,IACK;AAAA,YACL,OAAAL;AAAA,YACA,aAAa;AAAA,YACb,SAAS;AAAA,YACT,SAAAK;AAAA,YACA,SAAAsE;AAAA,YACA,SAAAC;AAAA,YACA,cAAAtE;AAAA,YACA,MAAMxG,EAAQ;AAAA,YACd,MAAMA,EAAQ;AAAA,YACd,SAASA,EAAQ;AAAA,UAAA,IAGd;AAAA,YACL,OAAOsF,EAAS;AAAA,YAChB,aAAa;AAAA,YACb,SAAS;AAAA,UAAA;AAAA,MAGf;AAAA,IACF;AAAA,EACF;AAAA,EAEO,sBACLzD,GACyB;AACzB,UAAMoE,IAAiB,KAAK,gBAAgBpE,CAAO;AACnD,QAAI,CAAC,CAACoE,EAAe,MAAO,QAAO;AAEnC,QACEA,EAAe,aACf,KAAK,KAAK,QAAA,MAAckB,GAAW,UACnC;AACA,YAAM,EAAE,OAAAjB,GAAO,SAAAK,GAAS,SAAAsE,GAAS,SAAAC,GAAS,cAAAtE,EAAA,IAAiBP,GACrD1B,IAAU,KAAK,KAAK,WAAA,GACpB,EAAE,UAAA4H,EAAA,IAAa5H,EAAQ,WAAW;AAAA,QACtC,OAAA2B;AAAAA,QACA,SAAAK;AAAAA,QACA,SAAAsE;AAAAA,QACA,SAAAC;AAAAA,QACA,cAAAtE;AAAA,MAAA,CACD;AACD,MAAID,IACFN,EAAe,eAAekG,IAE9BlG,EAAe,QAAQkG;AAAA,IAE3B;AACA,UAAM;AAAA,MACJ,OAAAjG;AAAA,MACA,YAAAE;AAAA,MACA,SAAAC;AAAA,MACA,WAAA0T;AAAA,MACA,SAAAzT;AAAA,MACA,aAAAH;AAAA,MACA,SAAAI;AAAA,MACA,SAAAsE;AAAA,MACA,SAAAC;AAAA,MACA,MAAAY;AAAA,MACA,MAAAD;AAAA,MACA,SAAAb;AAAA,IAAA,IACE3E;AAEJ,gBAAK,mBAAmB;AAAA,MACtB,SAASM,KAAW;AAAA,MACpB,YAAYH,KAAc;AAAA,MAC1B,SAASC,KAAW;AAAA,MACpB,WAAW0T,KAAa;AAAA,MACxB,SAASzT,KAAW;AAAA,MACpB,aAAaH,KAAe;AAAA,MAC5B,OAAAD;AAAA,MACA,SAAA2E;AAAA,MACA,SAAAC;AAAA,MACA,MAAAY;AAAA,MACA,MAAAD;AAAA,MACA,SAAAb;AAAA,IAAA,CACD,GACM3E;AAAA,EACT;AAAA,EAEO,oBAAoBpE,GAAsC;A7B1zBhE,QAAAhD;A6B2zBC,UAAM;AAAA,MACJ,QAAAgE;AAAA,MACA,KAAA0J;AAAA,MACA,YAAAyN;AAAA,MACA,gBAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,gBAAAC;AAAA,IAAA,IACEtY;AACJ,QAAItG,IAAI0e,EAAe,GACnBG,IAAmB;AACvB,QACEF,EAAoB,UACpB,CAACG,GAAkBL,CAAU,KAC7B,GAACnb,IAAAmb,EAAW,YAAX,QAAAnb,EAAoB;AAErB,eAAS9H,IAAI,GAAGA,IAAImjB,EAAoB,QAAQnjB,KAAK;AACnD,cAAMujB,IAAkBJ,EAAoBnjB,CAAC,GACvCwjB,IAAgBD,EAAgB;AACtC,YAAIC,EAAc,WAAW1X,EAAQ;AACrC,cAAM2X,IAAe;AAAA,UACnB,GAAGD;AAAA,UACH,OAAOD,EAAgB;AAAA,UACvB,QAAQA,EAAgB;AAAA,QAAA;AAE1B,YAAIG,GAAgBR,GAAgBO,CAAY,GAAG;AACjD,UAAAjO,EAAI,aAAa;AAEjB,gBAAMmO,IACJF,EAAa,QAAQA,EAAa,IAAIP,EAAe;AAQvD,cAPAD,EAAW,OAAOU,GAElBnO,EAAI,SAASmO,GACbN,KAAoBM,GAEpBnf,IAAIif,EAAa,IAAIA,EAAa,OAE9BjO,EAAI,QAAQyN,EAAW,QAAQ,QAAQG,GAAgB;AACzD,YAAAH,EAAW,OAAO,GAClBzN,EAAI,SAAS6N;AACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEF,WAAO,EAAE,GAAA7e,GAAG,kBAAA6e,EAAA;AAAA,EACd;AACF;ACz2BA,IAAItnB,KAAK,OAAO,gBACZO,KAAK,CAAC2C,GAAG,GAAGG,MAAM,KAAKH,IAAIlD,GAAGkD,GAAG,GAAG,EAAE,YAAY,IAAI,cAAc,IAAI,UAAU,IAAI,OAAOG,EAAC,CAAE,IAAIH,EAAE,CAAC,IAAIG,GAC3GgB,KAAI,CAACnB,GAAG,GAAGG,MAAM9C,GAAG2C,GAAG,OAAO,KAAK,WAAW,IAAI,KAAK,GAAGG,CAAC,GAkB3D2E,KAAqB,kBAAC9E,OAAOA,EAAE,UAAU,WAAWA,EAAE,QAAQ,SAASA,IAAI8E,MAAK,CAAA,CAAE,GAAG3L,KAAqB,kBAAC6G,OAAOA,EAAE,SAAS,UAAUA,EAAE,YAAY,aAAaA,EAAE,WAAW,YAAYA,EAAE,WAAW,YAAYA,IAAI7G,MAAK,CAAA,CAAE,GAAG0L,KAAqB,kBAAC7E,OAAOA,EAAE,OAAO,QAAQA,EAAE,YAAY,aAAaA,EAAE,UAAU,WAAWA,IAAI6E,MAAK,CAAA,CAAE,GAAGlB,KAAqB,kBAAC3D,OAAOA,EAAE,SAAS,UAAUA,EAAE,UAAU,WAAWA,IAAI2D,MAAK,EAAE,GAAGzC,KAAqB,kBAAClB,OAAOA,EAAE,SAAS,UAAUA,EAAE,UAAU,WAAWA,EAAE,WAAW,WAAWA,EAAE,YAAY,YAAYA,EAAE,cAAc,eAAeA,EAAE,QAAQ,SAASA,EAAE,WAAW,YAAYA,EAAE,QAAQ,SAASA,IAAIkB,MAAK,EAAE,GAAG6D,KAAqB,kBAAC/E,OAAOA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,IAAI+E,MAAK,CAAA,CAAE,GAAGjB,KAAqB,kBAAC9D,OAAOA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,EAAE,QAAQ,SAASA,EAAE,YAAY,aAAaA,EAAE,cAAc,eAAeA,EAAE,YAAY,aAAaA,EAAE,YAAY,aAAaA,EAAE,aAAa,aAAaA,EAAE,UAAU,WAAWA,EAAE,OAAO,QAAQA,EAAE,WAAW,YAAYA,EAAE,QAAQ,SAASA,EAAE,QAAQ,SAASA,EAAE,MAAM,OAAOA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,EAAE,QAAQ,SAASA,EAAE,OAAO,QAAQA,EAAE,cAAc,eAAeA,EAAE,gBAAgB,gBAAgBA,EAAE,mBAAmB,mBAAmBA,EAAE,qBAAqB,qBAAqBA,EAAE,eAAe,eAAeA,EAAE,kBAAkB,kBAAkBA,EAAE,kBAAkB,kBAAkBA,IAAI8D,MAAK,CAAA,CAAE,GAAGzK,KAAqB,kBAAC2G,OAAOA,EAAE,OAAO,QAAQA,EAAE,aAAa,cAAcA,IAAI3G,MAAK,CAAA,CAAE,GAAGuK,KAAqB,kBAAC5D,OAAOA,EAAE,KAAK,MAAMA,EAAE,KAAK,MAAMA,IAAI4D,MAAK,CAAA,CAAE,GAAG3C,KAAqB,kBAACjB,OAAOA,EAAE,OAAO,QAAQA,EAAE,SAAS,UAAUA,EAAE,SAAS,UAAUA,EAAE,WAAW,YAAYA,EAAE,UAAU,WAAWA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,EAAE,WAAW,YAAYA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,EAAE,gBAAgB,iBAAiBA,EAAE,QAAQ,SAASA,EAAE,gBAAgB,iBAAiBA,EAAE,gBAAgB,iBAAiBA,EAAE,eAAe,gBAAgBA,EAAE,OAAO,QAAQA,EAAE,iBAAiB,kBAAkBA,EAAE,aAAa,cAAcA,EAAE,cAAc,eAAeA,EAAE,SAAS,UAAUA,EAAE,WAAW,YAAYA,EAAE,iBAAiB,kBAAkBA,EAAE,kBAAkB,mBAAmBA,IAAIiB,MAAK,CAAA,CAAE,GAAGhG,KAAqB,kBAAC+E,OAAOA,EAAE,OAAO,QAAQA,EAAE,SAAS,UAAUA,EAAE,SAAS,UAAUA,EAAE,WAAW,YAAYA,EAAE,UAAU,WAAWA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,EAAE,UAAU,WAAWA,EAAE,cAAc,eAAeA,EAAE,gBAAgB,iBAAiBA,EAAE,iBAAiB,kBAAkBA,EAAE,kBAAkB,mBAAmBA,EAAE,UAAU,WAAWA,EAAE,kBAAkB,mBAAmBA,EAAE,cAAc,eAAeA,EAAE,kBAAkB,mBAAmBA,IAAI/E,MAAK,CAAA,CAAE,GAAGmK,KAAqB,kBAACpF,OAAOA,EAAE,OAAO,QAAQA,EAAE,SAAS,UAAUA,EAAE,QAAQ,SAASA,EAAE,YAAY,aAAaA,EAAE,UAAU,WAAWA,IAAIoF,MAAK,CAAA,CAAE,GAAGJ,KAAqB,kBAAChF,OAAOA,EAAE,QAAQ,SAASA,EAAE,SAAS,UAAUA,EAAE,QAAQ,SAASA,EAAE,SAAS,UAAUA,EAAE,QAAQ,SAASA,EAAE,QAAQ,SAASA,IAAIgF,MAAK,CAAA,CAAE,GAAGN,KAAqB,kBAAC1E,OAAOA,EAAE,MAAM,OAAOA,EAAE,SAAS,UAAUA,EAAE,SAAS,UAAUA,IAAI0E,MAAK,CAAA,CAAE,GAAGO,KAAqB,kBAACjF,OAAOA,EAAE,OAAO,QAAQA,EAAE,QAAQ,SAASA,IAAIiF,MAAK,CAAA,CAAE;AACtnG,MAAMrK,KAAI;AACViK,GAAE,OAAO,IAAWA,GAAE,YAAY,IAAWA,GAAE,UAAU;AACzD,MAAMzC,KAAI;AAAA,EACR0B,GAAE;AAAA,EACFA,GAAE;AAAA,EACFA,GAAE;AAAA,EACFA,GAAE;AAAA,EACFA,GAAE;AAAA,EACFA,GAAE;AAAA,EACFA,GAAE;AACJ;AACAA,GAAE,OAAOA,GAAE;AACXA,GAAE,OAAOA,GAAE,YAAYA,GAAE,WAAWA,GAAE;AACtCA,GAAE,OAAOA,GAAE;AACXsB,GAAE,QAAQzB,GAAE;AACZA,GAAE,QAAQA,GAAE,QAAQA,GAAE,QAAQA,GAAE,QAAQA,GAAE,QAAQA,GAAE,QAAQA,GAAE,QAAQA,GAAE,SAASA,GAAE;AACnFsB,GAAE,MAAMtB,GAAE;AACVqB,GAAE,QAAQ,IAAIA,GAAE,SAAS,IAAIA,GAAE,QAAQ,IAAIA,GAAE,SAAS,IAAIA,GAAE,QAAQ,IAAIA,GAAE,QAAQ;AAClFA,GAAE,QAAQ,IAAIA,GAAE,SAAS,IAAIA,GAAE,QAAQ,IAAIA,GAAE,SAAS,IAAIA,GAAE,QAAQ,IAAIA,GAAE,QAAQ;AAClFA,GAAE,OAAOA,GAAE,QAAQA,GAAE,OAAOA,GAAE,QAAQA,GAAE,OAAOA,GAAE;AACjD/D,GAAE,OAAO,IAAIA,GAAE,SAAS,IAAIA,GAAE,SAAS,IAAIA,GAAE,WAAW,IAAIA,GAAE,UAAU,IAAIA,GAAE,OAAO,IAAIA,GAAE,QAAQ,IAAIA,GAAE,WAAW,IAAIA,GAAE,OAAO,IAAIA,GAAE,QAAQ,IAAIA,GAAE,gBAAgB,IAAIA,GAAE,QAAQ,IAAIA,GAAE,gBAAgB,IAAIA,GAAE,gBAAgB,IAAIA,GAAE,eAAe,IAAIA,GAAE,OAAO,IAAIA,GAAE,iBAAiB,IAAIA,GAAE,aAAa,IAAIA,GAAE,cAAc,IAAIA,GAAE,SAAS,IAAIA,GAAE,WAAW,IAAIA,GAAE,iBAAiB,IAAIA,GAAE,kBAAkB;AAC9Y2C,GAAE,KAAK,IAAIA,GAAE,KAAK;AAClB3I,GAAE,OAAO,IAAIA,GAAE,SAAS,IAAIA,GAAE,SAAS,IAAIA,GAAE,UAAU,IAAIA,GAAE,cAAc,IAAIA,GAAE,gBAAgB,IAAIA,GAAE,iBAAiB,IAAIA,GAAE,kBAAkB,IAAIA,GAAE,UAAU,IAAIA,GAAE,kBAAkB,IAAIA,GAAE,cAAc,IAAIA,GAAE,kBAAkB,IAAIA,GAAE,WAAW,IAAIA,GAAE,UAAU,IAAIA,GAAE,OAAO,IAAIA,GAAE,QAAQ;AAChS6J,GAAE,OAAO3L,GAAE;AACXuL,GAAE;AACFG,GAAE;AACFA,GAAE;AACFH,GAAE;AACFrL,GAAE;AACF,SAASkF,GAAGyB,GAAG;AACb,SAAOA,KAAKA,EAAE,cAAc,OAAO,UAAU,eAAe,KAAKA,GAAG,SAAS,IAAIA,EAAE,UAAUA;AAC/F;AACA,IAAIxB,KAAKP;AACT,SAASjC,GAAEgE,GAAG;AACZ,SAAOA,aAAa,SAAS,OAAO,KAAKA,CAAC,IAAI,IAAIA,EAAE,YAAYA,EAAE,OAAO,MAAK,GAAIA,EAAE,YAAYA,EAAE,MAAM;AAC1G;AACA,SAAS/B,GAAG+B,GAAG;AACb,MAAIA,IAAIA,KAAK,CAAA,GAAIA,EAAE,QAAS,QAAO9B,GAAG8B,CAAC;AACvC,QAAM,IAAoB,oBAAI,IAAG;AACjC,MAAI,EAAE,IAAI,MAAM,CAACe,MAAM,IAAI,KAAKA,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAACA,GAAG2C,MAAM,IAAI,IAAI5C,EAAE,MAAM,KAAKC,CAAC,GAAG2C,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC3C,GAAG2C,MAAM,IAAI,IAAI5C,EAAE,MAAM,KAAKC,CAAC,GAAG2C,CAAC,CAAC,CAAC,GAAG1D,EAAE;AAC7I,eAAWe,KAAKf,EAAE;AAChB,QAAE,IAAIe,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AACpB,MAAIZ,IAAI;AACR,SAAOH,EAAE,QAAQ6D,IAAIzD;AACrB,WAASU,EAAEC,GAAG2C,GAAG;AACf,UAAMzD,IAAI,OAAO,KAAKc,CAAC,GAAGb,IAAI,IAAI,MAAMD,EAAE,MAAM;AAChD,aAASI,IAAI,GAAGA,IAAIJ,EAAE,QAAQI,KAAK;AACjC,YAAMO,IAAIX,EAAEI,CAAC,GAAGhG,IAAI0G,EAAEH,CAAC;AACvB,aAAOvG,KAAK,YAAYA,MAAM,OAAO6F,EAAEU,CAAC,IAAIvG,IAAIA,EAAE,gBAAgB,WAAW8F,IAAI,EAAE,IAAI9F,EAAE,WAAW,KAAK6F,EAAEU,CAAC,IAAIT,EAAE9F,GAAGqJ,CAAC,IAAI,YAAY,OAAOrJ,CAAC,IAAI6F,EAAEU,CAAC,IAAI5E,GAAE3B,CAAC,IAAI6F,EAAEU,CAAC,IAAI8C,EAAErJ,CAAC;AAAA,IAC5K;AACA,WAAO6F;AAAA,EACT;AACA,WAASE,EAAEW,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAOD,EAAEC,GAAGX,CAAC;AACnC,QAAIW,EAAE,gBAAgB,WAAWZ,IAAI,EAAE,IAAIY,EAAE,WAAW;AACtD,aAAOZ,EAAEY,GAAGX,CAAC;AACf,UAAMsD,IAAI,CAAA;AACV,eAAWzD,KAAKc,GAAG;AACjB,UAAI,OAAO,eAAe,KAAKA,GAAGd,CAAC,MAAM,GAAI;AAC7C,YAAMC,IAAIa,EAAEd,CAAC;AACb,aAAOC,KAAK,YAAYA,MAAM,OAAOwD,EAAEzD,CAAC,IAAIC,IAAIA,EAAE,gBAAgB,WAAWC,IAAI,EAAE,IAAID,EAAE,WAAW,KAAKwD,EAAEzD,CAAC,IAAIE,EAAED,GAAGE,CAAC,IAAI,YAAY,OAAOF,CAAC,IAAIwD,EAAEzD,CAAC,IAAIjE,GAAEkE,CAAC,IAAIwD,EAAEzD,CAAC,IAAIG,EAAEF,CAAC;AAAA,IAC5K;AACA,WAAOwD;AAAA,EACT;AACA,WAASG,EAAE9C,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAOD,EAAEC,GAAG8C,CAAC;AACnC,QAAI9C,EAAE,gBAAgB,WAAWZ,IAAI,EAAE,IAAIY,EAAE,WAAW;AACtD,aAAOZ,EAAEY,GAAG8C,CAAC;AACf,UAAMH,IAAI,CAAA;AACV,eAAWzD,KAAKc,GAAG;AACjB,YAAMb,IAAIa,EAAEd,CAAC;AACb,aAAOC,KAAK,YAAYA,MAAM,OAAOwD,EAAEzD,CAAC,IAAIC,IAAIA,EAAE,gBAAgB,WAAWC,IAAI,EAAE,IAAID,EAAE,WAAW,KAAKwD,EAAEzD,CAAC,IAAIE,EAAED,GAAG2D,CAAC,IAAI,YAAY,OAAO3D,CAAC,IAAIwD,EAAEzD,CAAC,IAAIjE,GAAEkE,CAAC,IAAIwD,EAAEzD,CAAC,IAAI4D,EAAE3D,CAAC;AAAA,IAC5K;AACA,WAAOwD;AAAA,EACT;AACF;AACA,SAASxF,GAAG8B,GAAG;AACb,QAAM,IAAI,CAAA,GAAIG,IAAI,CAAA,GAAIW,IAAoB,oBAAI,IAAG;AACjD,MAAIA,EAAE,IAAI,MAAM,CAACb,MAAM,IAAI,KAAKA,CAAC,CAAC,GAAGa,EAAE,IAAI,KAAK,CAACb,GAAGC,MAAM,IAAI,IAAI2D,EAAE,MAAM,KAAK5D,CAAC,GAAGC,CAAC,CAAC,CAAC,GAAGY,EAAE,IAAI,KAAK,CAACb,GAAGC,MAAM,IAAI,IAAI2D,EAAE,MAAM,KAAK5D,CAAC,GAAGC,CAAC,CAAC,CAAC,GAAGF,EAAE;AAC7I,eAAWC,KAAKD,EAAE;AAChB,MAAAc,EAAE,IAAIb,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AACpB,MAAIG,IAAI;AACR,SAAOJ,EAAE,QAAQ0D,IAAI3C;AACrB,WAAS8C,EAAE5D,GAAGC,GAAG;AACf,UAAMG,IAAI,OAAO,KAAKJ,CAAC,GAAGW,IAAI,IAAI,MAAMP,EAAE,MAAM;AAChD,aAAShG,IAAI,GAAGA,IAAIgG,EAAE,QAAQhG,KAAK;AACjC,YAAM8J,IAAI9D,EAAEhG,CAAC,GAAG,IAAI4F,EAAEkE,CAAC;AACvB,UAAI,OAAO,KAAK,YAAY,MAAM;AAChC,QAAAvD,EAAEuD,CAAC,IAAI;AAAA,eACA,EAAE,gBAAgB,WAAW/D,IAAIU,EAAE,IAAI,EAAE,WAAW;AAC3D,QAAAF,EAAEuD,CAAC,IAAI/D,EAAE,GAAGF,CAAC;AAAA,eACN,YAAY,OAAO,CAAC;AAC3B,QAAAU,EAAEuD,CAAC,IAAInI,GAAE,CAAC;AAAA,WACP;AACH,cAAMgI,IAAI,EAAE,QAAQ,CAAC;AACrB,QAAAA,MAAM,KAAKpD,EAAEuD,CAAC,IAAIhE,EAAE6D,CAAC,IAAIpD,EAAEuD,CAAC,IAAIjE,EAAE,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAOU;AAAA,EACT;AACA,WAASG,EAAEd,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAO4D,EAAE5D,GAAGc,CAAC;AACnC,QAAId,EAAE,gBAAgB,WAAWG,IAAIU,EAAE,IAAIb,EAAE,WAAW;AACtD,aAAOG,EAAEH,GAAGc,CAAC;AACf,UAAMb,IAAI,CAAA;AACV,MAAE,KAAKD,CAAC,GAAGE,EAAE,KAAKD,CAAC;AACnB,eAAWG,KAAKJ,GAAG;AACjB,UAAI,OAAO,eAAe,KAAKA,GAAGI,CAAC,MAAM,GAAI;AAC7C,YAAMO,IAAIX,EAAEI,CAAC;AACb,UAAI,OAAOO,KAAK,YAAYA,MAAM;AAChC,QAAAV,EAAEG,CAAC,IAAIO;AAAA,eACAA,EAAE,gBAAgB,WAAWR,IAAIU,EAAE,IAAIF,EAAE,WAAW;AAC3D,QAAAV,EAAEG,CAAC,IAAID,EAAEQ,GAAGG,CAAC;AAAA,eACN,YAAY,OAAOH,CAAC;AAC3B,QAAAV,EAAEG,CAAC,IAAIrE,GAAE4E,CAAC;AAAA,WACP;AACH,cAAMvG,IAAI,EAAE,QAAQuG,CAAC;AACrB,QAAAvG,MAAM,KAAK6F,EAAEG,CAAC,IAAIF,EAAE9F,CAAC,IAAI6F,EAAEG,CAAC,IAAIU,EAAEH,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAO,EAAE,IAAG,GAAIT,EAAE,IAAG,GAAID;AAAA,EAC3B;AACA,WAASwD,EAAEzD,GAAG;AACZ,QAAI,OAAOA,KAAK,YAAYA,MAAM,KAAM,QAAOA;AAC/C,QAAI,MAAM,QAAQA,CAAC,EAAG,QAAO4D,EAAE5D,GAAGyD,CAAC;AACnC,QAAIzD,EAAE,gBAAgB,WAAWG,IAAIU,EAAE,IAAIb,EAAE,WAAW;AACtD,aAAOG,EAAEH,GAAGyD,CAAC;AACf,UAAMxD,IAAI,CAAA;AACV,MAAE,KAAKD,CAAC,GAAGE,EAAE,KAAKD,CAAC;AACnB,eAAWG,KAAKJ,GAAG;AACjB,YAAMW,IAAIX,EAAEI,CAAC;AACb,UAAI,OAAOO,KAAK,YAAYA,MAAM;AAChC,QAAAV,EAAEG,CAAC,IAAIO;AAAA,eACAA,EAAE,gBAAgB,WAAWR,IAAIU,EAAE,IAAIF,EAAE,WAAW;AAC3D,QAAAV,EAAEG,CAAC,IAAID,EAAEQ,GAAG8C,CAAC;AAAA,eACN,YAAY,OAAO9C,CAAC;AAC3B,QAAAV,EAAEG,CAAC,IAAIrE,GAAE4E,CAAC;AAAA,WACP;AACH,cAAMvG,IAAI,EAAE,QAAQuG,CAAC;AACrB,QAAAvG,MAAM,KAAK6F,EAAEG,CAAC,IAAIF,EAAE9F,CAAC,IAAI6F,EAAEG,CAAC,IAAIqD,EAAE9C,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAO,EAAE,IAAG,GAAIT,EAAE,IAAG,GAAID;AAAA,EAC3B;AACF;AACA,MAAMlF,KAAqB,gBAAAuD,GAAGC,EAAE;AAChCxD,GAAE;AACF,SAASmD,GAAG6B,GAAG,GAAG;AAChB,QAAMG,IAAIH,EAAE,CAAC;AACb,MAAI,CAACG,EAAG,QAAO;AACf,QAAMW,IAAId,EAAE,IAAI,CAAC;AACjB,SAAO,CAACG,EAAE,UAAUA,EAAE,UAAUvF,MAAKkG,KAAKA,EAAE,UAAUlG,MAAKuF,EAAE,WAAWW,EAAE,SAASA,IAAIX;AACzF;AACA,SAASQ,GAAEX,GAAG;AACZ,SAAOA,EAAE,UAAUpF,MAAK,CAACoF,EAAE;AAC7B;AACA,MAAMrC,KAAK,IAAI,OAAO/C,IAAG,GAAG;AAC5B,MAAMuE,GAAG;AAAA,EACP,YAAY,GAAG;AACb,IAAAgC,GAAE,MAAM,MAAM,GACdA,GAAE,MAAM,OAAO,GACfA,GAAE,MAAM,cAAc,GACtB,KAAK,OAAO,GAAG,KAAK,QAAQ;AAAA,MAC1B,YAAY;AAAA,MACZ,UAAU;AAAA,IAChB,GAAO,KAAK,eAAe;AAAA,EACzB;AAAA,EACA,IAAI,UAAU;AACZ,WAAO,KAAK,KAAK,WAAU;AAAA,EAC7B;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK,KAAK,YAAW;AAAA,EAC9B;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK,KAAK,YAAW;AAAA,EAC9B;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK,KAAK,YAAW;AAAA,EAC9B;AAAA,EACA,IAAI,iBAAiB;AACnB,WAAO,KAAK,KAAK,kBAAiB;AAAA,EACpC;AAAA,EACA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EACA,gBAAgB;AACd,WAAO,EAAE,GAAG,KAAK,MAAK;AAAA,EACxB;AAAA,EACA,aAAa;AACX,SAAK,SAAS,IAAI,EAAE;AAAA,EACtB;AAAA,EACA,gBAAgB,GAAG;AACjB,QAAI,KAAK,eAAe;AAAA,MACtB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACT,IAAQ,KAAK,eAAe;AAAA,EAC1B;AAAA,EACA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,oBAAoB,GAAGhB,GAAG;AACxB,UAAMW,IAAI3C,GAAG,GAAGgC,CAAC;AACjB,WAAOW,IAAI;AAAA,MACT,GAAGA;AAAA,MACH,GAAG,KAAK;AAAA,IACd,IAAQ;AAAA,EACN;AAAA,EACA,iBAAiB,GAAGX,GAAGW,GAAGV,GAAGyD,GAAG9C,GAAG2C,GAAG;AACpC,WAAO,KAAK,MAAM,eAAe,KAAK,KAAK,MAAM,aAAavD,KAAK,KAAK,MAAM,YAAYW,KAAK,KAAK,MAAM,iBAAiBV,KAAK,KAAK,MAAM,eAAeyD,KAAK,KAAK,MAAM,iBAAiB9C,KAAK,KAAK,MAAM,eAAe2C;AAAA,EAC5N;AAAA,EACA,iBAAiB;AACf,UAAM,EAAE,YAAY,GAAG,UAAUvD,EAAC,IAAK,KAAK;AAC5C,WAAO,MAAMA;AAAA,EACf;AAAA,EACA,iBAAiB;AACf,UAAM,EAAE,YAAY,GAAG,UAAUA,EAAC,IAAK,KAAK;AAC5C,WAAO,CAAC,CAAC,KAAK,CAAC,CAACA,IAAI,KAAK,MAAMA;AAAA,EACjC;AAAA,EACA,eAAe;AACb,UAAM,EAAE,YAAY,GAAG,UAAUA,EAAC,IAAK,KAAK;AAC5C,WAAO,MAAMA,IAAI,OAAO,KAAK,KAAK,eAAc,EAAG,MAAM,IAAI,GAAGA,IAAI,CAAC;AAAA,EACvE;AAAA,EACA,0BAA0B;AACxB,QAAI,KAAK,MAAM,eAAe;AAC5B,YAAM,IAAI,KAAK,KAAK,iBAAgB,EAAG,eAAc;AACrD,UAAI,CAAC,EAAG,QAAO;AACf,YAAMA,IAAI,CAAA;AACV,eAASW,IAAI,GAAGA,IAAI,EAAE,QAAQA,KAAK;AACjC,cAAMV,IAAI,EAAEU,CAAC;AACb,iBAAS+C,IAAI,GAAGA,IAAIzD,EAAE,QAAQyD,KAAK;AACjC,gBAAM9C,IAAIX,EAAEyD,CAAC;AACb,UAAA1D,EAAE,KAAK,GAAGY,EAAE,KAAK;AAAA,QACnB;AAAA,MACF;AACA,aAAOZ;AAAA,IACT;AACA,WAAO,KAAK,aAAY;AAAA,EAC1B;AAAA,EACA,uBAAuB;AACrB,UAAM,IAAI,KAAK,aAAY;AAC3B,WAAO,IAAI,EAAE;AAAA,MACX,CAACA,MAAM,CAACA,EAAE,QAAQiC,GAAE,SAASjC,EAAE,IAAI;AAAA,IACzC,IAAQ;AAAA,EACN;AAAA,EACA,kCAAkC;AAChC,UAAM,IAAI,KAAK,wBAAuB;AACtC,WAAO,IAAI,EAAE;AAAA,MACX,CAACA,MAAM,CAACA,EAAE,QAAQiC,GAAE,SAASjC,EAAE,IAAI;AAAA,IACzC,IAAQ;AAAA,EACN;AAAA,EACA,cAAc;AACZ,UAAM,EAAE,YAAY,GAAG,UAAUA,EAAC,IAAK,KAAK;AAC5C,QAAI,CAAC,CAAC,KAAK,CAAC,CAACA,EAAG,QAAO;AACvB,UAAMW,IAAI,KAAK,SAAS,gBAAe,GAAIV,IAAoB,oBAAI,IAAG;AACtE,aAASyD,IAAI,GAAGA,IAAI1D,IAAI,GAAG0D,KAAK;AAC9B,YAAM,EAAE,QAAQ9C,GAAG,OAAO2C,EAAC,IAAK5C,EAAE+C,CAAC,GAAG5D,IAAIG,EAAE,IAAIW,CAAC;AACjD,MAAAd,IAAIA,EAAE,IAAIyD,CAAC,KAAKzD,EAAE,IAAIyD,CAAC,IAAItD,EAAE,IAAIW,GAAmB,oBAAI,IAAI,CAAC2C,CAAC,CAAC,CAAC;AAAA,IAClE;AACA,WAAOtD;AAAA,EACT;AAAA,EACA,yBAAyB;AACvB,UAAM,EAAE,YAAY,GAAG,UAAUD,GAAG,eAAeW,MAAM,KAAK;AAC9D,QAAI,CAAC,CAAC,KAAK,CAAC,CAACX,EAAG,QAAO;AACvB,QAAIW;AACF,aAAO,KAAK,wBAAuB;AACrC,UAAMV,IAAI,KAAK,YAAW;AAC1B,QAAI,CAACA,EAAG,QAAO;AACf,UAAMyD,IAAI,KAAK,SAAS,gBAAe,GAAI9C,IAAI,KAAK,KAAK,eAAc,GAAI2C,IAAI,CAAA;AAC/E,aAASzD,IAAI,GAAGA,IAAI4D,EAAE,QAAQ5D,KAAK;AACjC,YAAMC,IAAI2D,EAAE5D,CAAC,GAAGI,IAAID,EAAE,IAAIF,EAAE,MAAM;AAClC,MAAAG,KAAKA,EAAE,IAAIH,EAAE,KAAK,KAAKwD,EAAE,KAAK3C,EAAEd,CAAC,CAAC;AAAA,IACpC;AACA,WAAOyD;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,UAAM,EAAE,YAAY,GAAG,UAAUvD,EAAC,IAAK,KAAK;AAC5C,QAAI,CAAC,CAAC,KAAK,CAAC,CAACA,EAAG,QAAO;AACvB,UAAMW,IAAI,KAAK,SAAS,gBAAe,GAAIV,IAAI,KAAK,KAAK,eAAc,GAAIyD,IAAoB,oBAAI,IAAG;AACtG,QAAI9C,IAAI;AACR,WAAOA,KAAK,KAAK;AACf,YAAM,EAAE,QAAQb,GAAG,OAAOG,EAAC,IAAKS,EAAEC,CAAC;AACnC,UAAIH,IAAIiD,EAAE,IAAI3D,CAAC;AACf,MAAAU,MAAMA,IAAI,CAAA,GAAIiD,EAAE,IAAI3D,GAAGU,CAAC,IAAIA,EAAE,SAASP,CAAC,KAAKO,EAAE,QAAQP,CAAC;AACxD,YAAMhG,IAAI+F,EAAEW,CAAC,GAAGoD,IAAI/D,EAAEW,IAAI,CAAC;AAC3B,UAAIJ,GAAEtG,CAAC,KAAKA,EAAE,YAAY8J,KAAK,OAAO,SAASA,EAAE,WAAW9J,EAAE,aAAa8J,KAAK,OAAO,SAASA,EAAE;AAChG;AACF,MAAApD;AAAA,IACF;AACA,UAAM2C,IAAI,MAAMvD;AAChB,QAAI,CAACuD,GAAG;AACN,UAAIxD,IAAI,IAAI;AACZ,aAAOA,IAAIC,KAAK;AACd,cAAM,EAAE,QAAQE,GAAG,OAAOO,EAAC,IAAKE,EAAEZ,CAAC;AACnC,YAAI7F,IAAIwJ,EAAE,IAAIxD,CAAC;AACf,QAAAhG,MAAMA,IAAI,CAAA,GAAIwJ,EAAE,IAAIxD,GAAGhG,CAAC,IAAIA,EAAE,SAASuG,CAAC,KAAKvG,EAAE,KAAKuG,CAAC,GAAGV;AAAA,MAC1D;AAAA,IACF;AACA,QAAID,IAAIE;AACR,SAAKuD,KAAKtD,EAAE,CAAC,EAAE,UAAUxF,OAAMqF,KAAK,IAAIA,IAAIa,EAAE,UAAU;AACtD,YAAMZ,IAAIE,EAAEH,CAAC,GAAGI,IAAID,EAAEH,IAAI,CAAC;AAC3B,UAAIU,GAAET,CAAC,KAAKA,EAAE,YAAYG,KAAK,OAAO,SAASA,EAAE,WAAWH,EAAE,aAAaG,KAAK,OAAO,SAASA,EAAE;AAChG;AACF,YAAM,EAAE,QAAQO,GAAG,OAAOvG,EAAC,IAAKyG,EAAEb,CAAC;AACnC,UAAIkE,IAAIN,EAAE,IAAIjD,CAAC;AACf,MAAAuD,MAAMA,IAAI,CAAA,GAAIN,EAAE,IAAIjD,GAAGuD,CAAC,IAAIA,EAAE,SAAS9J,CAAC,KAAK8J,EAAE,KAAK9J,CAAC,GAAG4F;AAAA,IAC1D;AACA,WAAO4D;AAAA,EACT;AAAA,EACA,wBAAwB;AACtB,UAAM,EAAE,YAAY,GAAG,UAAU1D,EAAC,IAAK,KAAK;AAC5C,QAAI,CAAC,CAAC,KAAK,CAAC,CAACA,EAAG,QAAO;AACvB,QAAIW,IAAI;AACR,UAAMV,IAAI,CAAA,GAAIyD,IAAI,KAAK,kBAAiB;AACxC,QAAI,CAACA,EAAG,QAAO;AACf,UAAM9C,IAAI,KAAK,KAAK,eAAc,GAAI2C,IAAI,KAAK,SAAS,gBAAe;AACvE,aAASzD,IAAI,GAAGA,IAAIyD,EAAE,QAAQzD,KAAK;AACjC,YAAMC,IAAIwD,EAAEzD,CAAC,GAAGI,IAAIwD,EAAE,IAAI3D,EAAE,MAAM;AAClC,MAAAG,KAAKA,EAAE,SAASH,EAAE,KAAK,MAAM,CAACY,MAAMA,IAAIZ,EAAE,QAAQE,EAAE,KAAKW,EAAEd,CAAC,CAAC;AAAA,IAC/D;AACA,WAAOG,EAAE,SAAS;AAAA,MAChB,aAAaA;AAAA,MACb,YAAYU;AAAA,IAClB,IAAQ;AAAA,EACN;AAAA,EACA,+BAA+B;AAC7B,QAAI;AACJ,aAAS,IAAI,KAAK,sBAAqB,MAAO,OAAO,SAAS,EAAE,gBAAgB;AAAA,EAClF;AAAA,EACA,uBAAuB;AACrB,UAAM,IAAI,KAAK,SAAS,mBAAkB;AAC1C,WAAO,EAAE,UAAU,KAAK,KAAK,yBAAyB,EAAE,KAAK,IAAI;AAAA,EACnE;AAAA,EACA,iBAAiB;AACf,UAAM,IAAI,KAAK,KAAK,eAAc,GAAI,EAAE,YAAYX,GAAG,UAAUW,EAAC,IAAK,KAAK;AAC5E,WAAOX,MAAM,KAAK,EAAE,SAAS,MAAMW,KAAK,CAAC,KAAK,SAAS,mBAAkB,EAAG;AAAA,EAC9E;AAAA,EACA,kBAAkB,GAAGX,GAAG;AACtB,UAAM,EAAE,YAAYW,GAAG,UAAUV,EAAC,IAAK,KAAK,OAAOyD,IAAI,KAAK,SAAS,gBAAe;AACpF,aAAS9C,IAAID,IAAI,GAAGC,KAAKX,KAAKyD,EAAE9C,CAAC,GAAGA,KAAK;AACvC,YAAM;AAAA,QACJ,YAAY,EAAE,SAASd,GAAG,aAAaC,EAAC;AAAA,MAChD,IAAU2D,EAAE9C,CAAC;AACP,UAAI,KAAKd,EAAE,CAAC,KAAK,KAAKC,EAAE,CAAC,KAAKC,KAAKF,EAAE,CAAC,KAAKE,KAAKD,EAAE,CAAC;AACjD,eAAO;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB,GAAG;AACrB,UAAMC,IAAI,KAAK,KAAK,UAAS,EAAG,aAAa,GAAG,KAAK,KAAK,uBAAsB,CAAE,GAAGW,IAAoB,oBAAI,IAAG;AAChH,eAAW+C,KAAK1D,GAAG;AACjB,YAAMY,IAAID,EAAE,IAAI+C,EAAE,OAAO;AACzB,UAAI9C;AACF,QAAAA,EAAE,YAAY;AAAA,WACX;AACH,cAAM,EAAE,MAAM2C,GAAG,SAASzD,GAAG,SAASC,GAAG,OAAOG,GAAG,SAASO,GAAG,SAASvG,EAAC,IAAKwJ,GAAGM,IAAI;AAAA,UACnF,YAAY9D;AAAA,UACZ,UAAUA;AAAA,QACpB;AACQ,QAAAqD,MAAMqB,GAAE,UAAUZ,EAAE,UAAUjE,GAAGiE,EAAE,eAAevD,GAAGuD,EAAE,aAAavD,GAAGuD,EAAE,eAAe9J,GAAG8J,EAAE,aAAa9J,IAAIyG,EAAE,IAAIb,GAAGkE,CAAC;AAAA,MAC1H;AAAA,IACF;AACA,UAAM/D,IAAI,CAAA;AACV,WAAOU,EAAE,QAAQ,CAAC+C,MAAM;AACtB,MAAAzD,EAAE,KAAKyD,CAAC;AAAA,IACV,CAAC,GAAGzD;AAAA,EACN;AAAA,EACA,WAAW;AACT,QAAIW;AACJ,UAAM,EAAE,YAAYF,GAAG,UAAUV,EAAC,IAAK,KAAK,SAAQ;AACpD,QAAI,CAAC,CAACU,KAAK,CAAC,CAACV,EAAG,QAAO;AACvB,UAAMW,IAAI,KAAK,KAAK,eAAc,GAAIV,IAAIU,EAAED,CAAC;AAC7C,QAAIA,MAAMV;AACR,cAAQC,EAAE,qBAAqBc,GAAE,cAAcH,IAAID,EAAED,IAAI,CAAC,MAAM,OAAO,SAASE,EAAE,sBAAsBG,GAAE,aAAad,EAAE,qBAAqBc,GAAE;AAClJ,UAAM2C,IAAI/C,EAAEX,CAAC;AACb,WAAO,CAACC,EAAE,aAAa,CAACyD,EAAE,cAAc,CAACzD,EAAE,aAAaA,EAAE,qBAAqBc,GAAE,aAAa,CAAC2C,EAAE,aAAaA,EAAE,qBAAqB3C,GAAE,YAAY,CAAC,CAACd,EAAE,aAAayD,EAAE,cAAczD,EAAE,aAAayD,EAAE,qBAAqB3C,GAAE,YAAY2C,EAAE,qBAAqB3C,GAAE,aAAa2C,EAAE,qBAAqB3C,GAAE;AAAA,EACzS;AAAA,EACA,SAAS,GAAGf,GAAGW,GAAGV,GAAGyD,GAAG9C,GAAG2C,GAAG;AAC5B,SAAK;AAAA,MACH;AAAA,MACAvD;AAAA,MACAW;AAAA,MACAV;AAAA,MACAyD;AAAA,MACA9C;AAAA,MACA2C;AAAA,IACN,MAAU,KAAK,MAAM,aAAa,GAAG,KAAK,MAAM,WAAWvD,GAAG,KAAK,MAAM,UAAUW,GAAG,KAAK,MAAM,eAAeV,GAAG,KAAK,MAAM,aAAayD,GAAG,KAAK,MAAM,eAAe9C,GAAG,KAAK,MAAM,aAAa2C,GAAG,KAAK,MAAM,gBAAgBtD,MAAM,UAAUyD,MAAM,UAAU9C,MAAM,UAAU2C,MAAM,QAAQ,KAAK,gBAAgB,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,KAAK,QAAO,EAAG,QAAO;AACrW,UAAMxD,IAAI,KAAK,KAAK,WAAU;AAC9B,QAAI,CAAC,KAAK,CAACC,GAAG;AACZ,YAAMS,IAAI,KAAK,KAAK,eAAc,EAAG,CAAC;AACtC,UAAIA,KAAK,QAAQA,EAAE,WAAW;AAC5B,QAAAV,EAAE,YAAW;AACb;AAAA,MACF;AAAA,IACF;AACA,IAAAA,EAAE,eAAc;AAAA,EAClB;AAAA,EACA,aAAa,GAAG;AACd,SAAK;AAAA,MACH,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACR;AAAA,EACE;AAAA,EACA,cAAc;AACZ,UAAM,EAAE,YAAY,GAAG,UAAUC,EAAC,IAAK,KAAK;AAC5C,UAAMA,KAAK,CAAC,CAAC,KAAK,CAAC,CAACA,KAAK,KAAK,aAAa;AAAA,MACzC,GAAG,KAAK;AAAA,MACR,YAAYA;AAAA,IAClB,CAAK;AAAA,EACH;AAAA,EACA,gBAAgB;AACd,QAAI2B;AACJ,UAAMjB,IAAI,KAAK,SAAS,kBAAkBV,IAAI,KAAK,SAAS,eAAe,kBAAkB;AAC7F,QAAI,CAACU,KAAK,CAACV,EAAG;AACd,UAAM,EAAE,YAAYW,GAAG,UAAUV,GAAG,eAAeyD,MAAM,KAAK;AAC9D,QAAI,CAAC,CAAC/C,KAAK,CAAC,CAACV,EAAG;AAChB,QAAIW;AACJ,QAAI8C,GAAG;AACL,YAAMe,IAAI,KAAK,KAAK,uBAAsB,GAAIlL,IAAI,KAAK,SAAS,mBAAkB;AAClF,MAAAqH,IAAI6D,EAAElL,EAAE,KAAK;AAAA,IACf,OAAO;AACL,YAAMkL,IAAI,CAACxE,IAAIA,IAAI,GAAG1G,IAAI,KAAK,KAAK,eAAc;AAClD,MAAAqH,IAAI,KAAK,oBAAoBrH,GAAGkL,CAAC;AAAA,IACnC;AACA,QAAI,CAAC7D,EAAG;AACR,UAAM2C,IAAI,CAAC,GAAG5B,IAAI,KAAK,wBAAuB,MAAO,QAAQA,EAAE,SAAS7B,IAAI,KAAK,aAAY,KAAM,CAACc,CAAC,GAAGb,IAAIa,EAAE,QAAQ+C,GAAE,MAAMzD,IAAIU,EAAE,QAAQ,KAAK,QAAQ,aAAaH,IAAIG,EAAE,QAAQ,KAAK,QAAQ,aAAa1G,IAAI0G,EAAE,kBAAkB,KAAKoD,IAAI,CAAC,CAAClE,EAAE,UAAU,CAAC2E,MAAM,CAACA,EAAE,IAAI,GAAGV,IAAI,CAAC,CAACjE,EAAE,UAAU,CAAC2E,MAAM,CAACA,EAAE,MAAM,GAAGZ,IAAI,CAAC,CAAC/D,EAAE;AAAA,MACzT,CAAC2E,MAAM;AACL,YAAIlL;AACJ,eAAO,CAACkL,EAAE,aAAa,GAAGlL,IAAIkL,EAAE,YAAY,QAAQlL,EAAE;AAAA,MACxD;AAAA,IACN,GAAOV,IAAI,CAAC,CAACiH,EAAE,UAAU,CAAC2E,MAAM,CAACA,EAAE,SAAS,GAAGlK,IAAIqG,EAAE,SAAS,MAAMkD,IAAIlD,EAAE,aAAa,MAAMgD,IAAIhD,EAAE,kBAAkB;AACjH,QAAIjG,IAAI;AACR;AACE,YAAM8J,IAAI,KAAK,KAAK,eAAc;AAClC,eAASlL,IAAI,CAAC0G,IAAIA,IAAI,GAAG1G,KAAK,GAAGA,KAAK;AACpC,cAAM+K,KAAIG,EAAElL,CAAC;AACb,YAAI+K,GAAE,6BAA6B,QAAQ;AACzC,UAAA3J,IAAI2J,GAAE;AACN;AAAA,QACF;AACA,YAAI/K,IAAI,KAAKiH,GAAEiE,EAAElL,IAAI,CAAC,CAAC;AACrB;AAAA,MACJ;AAAA,IACF;AACA,UAAM6L,IAAIxE,EAAE,WAAW,MAAMtG,IAAIsG,EAAE,aAAa,KAAK,QAAQ,kBAAkBtH,IAAIsH,EAAE,cAAc,KAAK,QAAQ,mBAAmBN,IAAIM,EAAE,aAAa,CAAA,GAAI3H,IAAI2H,EAAE,iBAAiB,MAAM1F,IAAI0F,EAAE,sBAAsB,MAAMzF,IAAKyF,EAAE,SAAS,MAAMxF,IAAKwF,EAAE,YAAY,MAAMlF,IAAKkF,EAAE,aAAa,MAAMtF,IAAKuI,KAAKjD,EAAE,kBAAkB,MAAMrE,IAAK,CAAC,CAAC,KAAK,KAAK,gBAAe,GAAIY,IAAK,KAAK,eAAe,UAAS,GAAIX,IAAK,KAAK,eAAe,UAAS,GAAIN,IAAK0E,EAAE,YAAY;AACzc,QAAI4D,IAAI5D,EAAE,aAAa;AACvB,QAAIb,MAAM4D,GAAE,OAAO;AACjB,YAAMc,IAAI;AAAA,QACR,YAAY7D,EAAE,cAAc;AAAA,QAC5B,aAAaA,EAAE,eAAe;AAAA,QAC9B,aAAaA,EAAE,eAAe;AAAA,QAC9B,qBAAqBA,EAAE,uBAAuB;AAAA,MACtD;AACM,MAAA4D,KAAK,OAAOA,KAAK,YAAY,CAAC,MAAM,QAAQA,CAAC,IAAIA,IAAI,EAAE,GAAGA,GAAG,OAAOC,EAAC,IAAKD,IAAI,EAAE,OAAOC,EAAC;AAAA,IAC1F;AACA,UAAM5D,IAAI;AAAA,MACR,MAAMd;AAAA,MACN,cAAcwD;AAAA,MACd,MAAMpG;AAAA,MACN,MAAMX;AAAA,MACN,SAASD;AAAA,MACT,MAAM2D;AAAA,MACN,MAAMO;AAAA,MACN,gBAAgBvG;AAAA,MAChB,MAAM8J;AAAA,MACN,QAAQD;AAAA,MACR,WAAWF;AAAA,MACX,WAAWhL;AAAA,MACX,OAAO0B;AAAA,MACP,WAAWuJ;AAAA,MACX,gBAAgBF;AAAA,MAChB,SAASwB;AAAA,MACT,WAAW9K;AAAA,MACX,YAAYhB;AAAA,MACZ,WAAWgH;AAAA,MACX,eAAerH;AAAA,MACf,oBAAoBiC;AAAA,MACpB,OAAOC;AAAA,MACP,UAAUC;AAAA,MACV,WAAWM;AAAA,MACX,UAAUQ;AAAA,MACV,gBAAgBZ;AAAA,MAChB,0BAA0BX;AAAA,MAC1B,WAAW6J;AAAA,IACjB;AACI,IAAA9D,KAAKA,EAAEG,CAAC,GAAGb,KAAK,KAAK,SAAS,KAAK,oBAAoBa,CAAC;AAAA,EAC1D;AAAA,EACA,qBAAqB;AACnB,UAAM,IAAI,KAAK,SAAS,kBAAkBb,IAAI,KAAK,SAAS,eAAe,kBAAkB;AAC7F,QAAI,CAAC,KAAK,CAACA,EAAG;AACd,UAAMW,IAAI,KAAK,QAAQ,aAAaV,IAAI,KAAK,QAAQ,aAAayD,IAAI,KAAK,QAAQ,kBAAkB9C,IAAI,KAAK,QAAQ,mBAAmB2C,IAAI,CAAC,CAAC,KAAK,KAAK,gBAAe,GAAIzD,IAAI,KAAK,eAAe,UAAS,GAAIC,IAAI,KAAK,eAAe,UAAS,GAAIG,IAAI;AAAA,MACxP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAMJ;AAAA,MACN,MAAMC;AAAA,MACN,SAASwD;AAAA,MACT,MAAM5C;AAAA,MACN,MAAMV;AAAA,MACN,gBAAgB;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,OAAO;AAAA,MACP,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,WAAWyD;AAAA,MACX,YAAY9C;AAAA,MACZ,WAAW,CAAA;AAAA,MACX,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,0BAA0B;AAAA,MAC1B,WAAW;AAAA,IACjB;AACI,SAAK,EAAEV,CAAC,GAAGF,KAAK,KAAK,SAAS,KAAK,oBAAoBE,CAAC;AAAA,EAC1D;AAAA,EACA,eAAe,IAAI,IAAI;AACrB,UAAMF,IAAI,EAAE,eAAe,KAAK,KAAK,eAAc,GAAIW,IAAI,EAAE,SAAS,KAAK,SAAQ,GAAI,EAAE,YAAYV,GAAG,UAAUyD,EAAC,IAAK/C;AACxH,QAAI,CAAC,CAACV,KAAK,CAAC,CAACyD,EAAG;AAChB,UAAM9C,IAAIZ,EAAEC,CAAC,GAAGsD,IAAIvD,EAAE0D,CAAC;AACvB,QAAIzD,MAAMyD;AACR,UAAI9C,EAAE,qBAAqBG,GAAE,aAAa;AACxC,YAAIjB,IAAIG,IAAI;AACZ,eAAOH,IAAI,KAAK;AACd,gBAAMC,IAAIC,EAAEF,CAAC;AACb,cAAIC,EAAE,cAAca,EAAE,aAAab,EAAE,qBAAqBgB,GAAE,UAAUhB,EAAE,qBAAqBgB,GAAE,UAAU;AACvG,YAAAJ,EAAE,aAAab,GAAGa,EAAE,WAAWb;AAC/B;AAAA,UACF;AACA,UAAAA;AAAA,QACF;AAAA,MACF;AAAA,WACK;AACL,UAAIc,EAAE,qBAAqBG,GAAE,eAAewC,EAAE,qBAAqBxC,GAAE,aAAa;AAChF,YAAIjB,IAAI4D,IAAI;AACZ,eAAO5D,IAAI,KAAK;AACd,gBAAMC,IAAIC,EAAEF,CAAC;AACb,cAAIC,EAAE,cAAcwD,EAAE,aAAaxD,EAAE,qBAAqBgB,GAAE,UAAUhB,EAAE,qBAAqBgB,GAAE,UAAU;AACvG,YAAAJ,EAAE,aAAab,GAAGa,EAAE,WAAWb;AAC/B;AAAA,UACF;AACA,UAAAA;AAAA,QACF;AAAA,MACF;AACA,UAAIc,EAAE,qBAAqBG,GAAE,QAAQ;AACnC,YAAIjB,IAAIG,IAAI;AACZ,eAAOH,IAAIE,EAAE,UAAU;AACrB,gBAAMD,IAAIC,EAAEF,CAAC;AACb,cAAIC,EAAE,cAAca,EAAE,aAAab,EAAE,qBAAqBgB,GAAE,OAAO;AACjE,YAAAJ,EAAE,aAAab,IAAI;AACnB;AAAA,UACF,WAAWC,EAAE,qBAAqBgB,GAAE,aAAa;AAC/C,YAAAJ,EAAE,aAAab,IAAI,GAAGa,EAAE,WAAWb,IAAI;AACvC;AAAA,UACF;AACA,UAAAA;AAAA,QACF;AAAA,MACF;AACA,UAAIyD,EAAE,qBAAqBxC,GAAE,OAAO;AAClC,YAAIjB,IAAI4D;AACR,eAAO5D,IAAI,KAAK;AACd,gBAAMC,IAAIC,EAAEF,CAAC;AACb,cAAIC,EAAE,cAAca,EAAE,aAAab,EAAE,qBAAqBgB,GAAE,OAAO;AACjE,YAAAJ,EAAE,aAAab;AACf;AAAA,UACF,WAAWC,EAAE,qBAAqBgB,GAAE,aAAa;AAC/C,YAAAJ,EAAE,aAAab,GAAGa,EAAE,WAAWb;AAC/B;AAAA,UACF;AACA,UAAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,GAAGE,GAAGW,GAAGV,GAAGyD,GAAG;AACpB,MAAE,QAAQ,EAAE,cAAc,KAAK,QAAQ,YAAY,EAAE,YAAY,KAAK,QAAQ,YAAY,EAAE,SAAS1D,GAAGW,GAAGV,GAAGyD,CAAC,GAAG,EAAE,QAAO;AAAA,EAC7H;AAAA,EACA,WAAW;AACT,UAAM,IAAI,KAAK,qBAAoB;AACnC,WAAO,IAAI,EAAE,IAAI,CAAC1D,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQxC,IAAI,EAAE,IAAI;AAAA,EAC9D;AACF;AAIA,IAAI4G,KAAI,EAAE,SAAS,GAAE;AAAA,CACpB,SAASvE,GAAG;AACX,MAAI,IAAI,OAAO,UAAU,gBAAgBG,IAAI;AAC7C,WAASW,IAAI;AAAA,EACb;AACA,SAAO,WAAWA,EAAE,YAA4B,uBAAO,OAAO,IAAI,GAAG,IAAIA,EAAC,EAAG,cAAcX,IAAI;AAC/F,WAASC,EAAEH,GAAGC,GAAGG,GAAG;AAClB,SAAK,KAAKJ,GAAG,KAAK,UAAUC,GAAG,KAAK,OAAOG,KAAK;AAAA,EAClD;AACA,WAASwD,EAAE5D,GAAGC,GAAGG,GAAGO,GAAGvG,GAAG;AACxB,QAAI,OAAOgG,KAAK;AACd,YAAM,IAAI,UAAU,iCAAiC;AACvD,QAAI8D,IAAI,IAAI/D,EAAEC,GAAGO,KAAKX,GAAG5F,CAAC,GAAG,IAAI8F,IAAIA,IAAID,IAAIA;AAC7C,WAAOD,EAAE,QAAQ,CAAC,IAAIA,EAAE,QAAQ,CAAC,EAAE,KAAKA,EAAE,QAAQ,CAAC,IAAI,CAACA,EAAE,QAAQ,CAAC,GAAGkE,CAAC,IAAIlE,EAAE,QAAQ,CAAC,EAAE,KAAKkE,CAAC,KAAKlE,EAAE,QAAQ,CAAC,IAAIkE,GAAGlE,EAAE,iBAAiBA;AAAA,EAC1I;AACA,WAASc,EAAEd,GAAGC,GAAG;AACf,MAAED,EAAE,iBAAiB,IAAIA,EAAE,UAAU,IAAIa,MAAM,OAAOb,EAAE,QAAQC,CAAC;AAAA,EACnE;AACA,WAASwD,IAAI;AACX,SAAK,UAAU,IAAI5C,EAAC,GAAI,KAAK,eAAe;AAAA,EAC9C;AACA,EAAA4C,EAAE,UAAU,aAAa,WAAW;AAClC,QAAIxD,IAAI,IAAIG,GAAGO;AACf,QAAI,KAAK,iBAAiB,EAAG,QAAOV;AACpC,SAAKU,KAAKP,IAAI,KAAK;AACjB,QAAE,KAAKA,GAAGO,CAAC,KAAKV,EAAE,KAAKC,IAAIS,EAAE,MAAM,CAAC,IAAIA,CAAC;AAC3C,WAAO,OAAO,wBAAwBV,EAAE,OAAO,OAAO,sBAAsBG,CAAC,CAAC,IAAIH;AAAA,EACpF,GAAGwD,EAAE,UAAU,YAAY,SAASxD,GAAG;AACrC,QAAIG,IAAIF,IAAIA,IAAID,IAAIA,GAAGU,IAAI,KAAK,QAAQP,CAAC;AACzC,QAAI,CAACO,EAAG,QAAO,CAAA;AACf,QAAIA,EAAE,GAAI,QAAO,CAACA,EAAE,EAAE;AACtB,aAASvG,IAAI,GAAG8J,IAAIvD,EAAE,QAAQsD,IAAI,IAAI,MAAMC,CAAC,GAAG9J,IAAI8J,GAAG9J;AACrD,MAAA6J,EAAE7J,CAAC,IAAIuG,EAAEvG,CAAC,EAAE;AACd,WAAO6J;AAAA,EACT,GAAGR,EAAE,UAAU,gBAAgB,SAASxD,GAAG;AACzC,QAAIG,IAAIF,IAAIA,IAAID,IAAIA,GAAGU,IAAI,KAAK,QAAQP,CAAC;AACzC,WAAOO,IAAIA,EAAE,KAAK,IAAIA,EAAE,SAAS;AAAA,EACnC,GAAG8C,EAAE,UAAU,OAAO,SAASxD,GAAGG,GAAGO,GAAGvG,GAAG8J,GAAGD,GAAG;AAC/C,QAAIF,IAAI7D,IAAIA,IAAID,IAAIA;AACpB,QAAI,CAAC,KAAK,QAAQ8D,CAAC,EAAG,QAAO;AAC7B,QAAIhL,IAAI,KAAK,QAAQgL,CAAC,GAAGtJ,IAAI,UAAU,QAAQuJ,GAAG;AAClD,QAAIjL,EAAE,IAAI;AACR,cAAQA,EAAE,QAAQ,KAAK,eAAekH,GAAGlH,EAAE,IAAI,QAAQ,EAAE,GAAG0B,GAAC;AAAA,QAC3D,KAAK;AACH,iBAAO1B,EAAE,GAAG,KAAKA,EAAE,OAAO,GAAG;AAAA,QAC/B,KAAK;AACH,iBAAOA,EAAE,GAAG,KAAKA,EAAE,SAASqH,CAAC,GAAG;AAAA,QAClC,KAAK;AACH,iBAAOrH,EAAE,GAAG,KAAKA,EAAE,SAASqH,GAAGO,CAAC,GAAG;AAAA,QACrC,KAAK;AACH,iBAAO5H,EAAE,GAAG,KAAKA,EAAE,SAASqH,GAAGO,GAAGvG,CAAC,GAAG;AAAA,QACxC,KAAK;AACH,iBAAOrB,EAAE,GAAG,KAAKA,EAAE,SAASqH,GAAGO,GAAGvG,GAAG8J,CAAC,GAAG;AAAA,QAC3C,KAAK;AACH,iBAAOnL,EAAE,GAAG,KAAKA,EAAE,SAASqH,GAAGO,GAAGvG,GAAG8J,GAAGD,CAAC,GAAG;AAAA,MACtD;AACM,WAAK,IAAI,GAAGD,IAAI,IAAI,MAAMvJ,IAAI,CAAC,GAAG,IAAIA,GAAG;AACvC,QAAAuJ,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC;AACxB,MAAAjL,EAAE,GAAG,MAAMA,EAAE,SAASiL,CAAC;AAAA,IACzB,OAAO;AACL,UAAInJ,IAAI9B,EAAE,QAAQuM;AAClB,WAAK,IAAI,GAAG,IAAIzK,GAAG;AACjB,gBAAQ9B,EAAE,CAAC,EAAE,QAAQ,KAAK,eAAekH,GAAGlH,EAAE,CAAC,EAAE,IAAI,QAAQ,EAAE,GAAG0B,GAAC;AAAA,UACjE,KAAK;AACH,YAAA1B,EAAE,CAAC,EAAE,GAAG,KAAKA,EAAE,CAAC,EAAE,OAAO;AACzB;AAAA,UACF,KAAK;AACH,YAAAA,EAAE,CAAC,EAAE,GAAG,KAAKA,EAAE,CAAC,EAAE,SAASqH,CAAC;AAC5B;AAAA,UACF,KAAK;AACH,YAAArH,EAAE,CAAC,EAAE,GAAG,KAAKA,EAAE,CAAC,EAAE,SAASqH,GAAGO,CAAC;AAC/B;AAAA,UACF,KAAK;AACH,YAAA5H,EAAE,CAAC,EAAE,GAAG,KAAKA,EAAE,CAAC,EAAE,SAASqH,GAAGO,GAAGvG,CAAC;AAClC;AAAA,UACF;AACE,gBAAI,CAAC4J,EAAG,MAAKsB,IAAI,GAAGtB,IAAI,IAAI,MAAMvJ,IAAI,CAAC,GAAG6K,IAAI7K,GAAG6K;AAC/C,cAAAtB,EAAEsB,IAAI,CAAC,IAAI,UAAUA,CAAC;AACxB,YAAAvM,EAAE,CAAC,EAAE,GAAG,MAAMA,EAAE,CAAC,EAAE,SAASiL,CAAC;AAAA,QACzC;AAAA,IACI;AACA,WAAO;AAAA,EACT,GAAGP,EAAE,UAAU,KAAK,SAASxD,GAAGG,GAAGO,GAAG;AACpC,WAAOiD,EAAE,MAAM3D,GAAGG,GAAGO,GAAG,EAAE;AAAA,EAC5B,GAAG8C,EAAE,UAAU,OAAO,SAASxD,GAAGG,GAAGO,GAAG;AACtC,WAAOiD,EAAE,MAAM3D,GAAGG,GAAGO,GAAG,EAAE;AAAA,EAC5B,GAAG8C,EAAE,UAAU,iBAAiB,SAASxD,GAAGG,GAAGO,GAAGvG,GAAG;AACnD,QAAI8J,IAAIhE,IAAIA,IAAID,IAAIA;AACpB,QAAI,CAAC,KAAK,QAAQiE,CAAC,EAAG,QAAO;AAC7B,QAAI,CAAC9D;AACH,aAAOU,EAAE,MAAMoD,CAAC,GAAG;AACrB,QAAID,IAAI,KAAK,QAAQC,CAAC;AACtB,QAAID,EAAE;AACJ,MAAAA,EAAE,OAAO7D,MAAM,CAAChG,KAAK6J,EAAE,UAAU,CAACtD,KAAKsD,EAAE,YAAYtD,MAAMG,EAAE,MAAMoD,CAAC;AAAA,SACjE;AACH,eAASH,IAAI,GAAGhL,IAAI,CAAA,GAAI0B,IAAIwJ,EAAE,QAAQF,IAAItJ,GAAGsJ;AAC3C,SAACE,EAAEF,CAAC,EAAE,OAAO3D,KAAKhG,KAAK,CAAC6J,EAAEF,CAAC,EAAE,QAAQpD,KAAKsD,EAAEF,CAAC,EAAE,YAAYpD,MAAM5H,EAAE,KAAKkL,EAAEF,CAAC,CAAC;AAC9E,MAAAhL,EAAE,SAAS,KAAK,QAAQmL,CAAC,IAAInL,EAAE,WAAW,IAAIA,EAAE,CAAC,IAAIA,IAAI+H,EAAE,MAAMoD,CAAC;AAAA,IACpE;AACA,WAAO;AAAA,EACT,GAAGT,EAAE,UAAU,qBAAqB,SAASxD,GAAG;AAC9C,QAAIG;AACJ,WAAOH,KAAKG,IAAIF,IAAIA,IAAID,IAAIA,GAAG,KAAK,QAAQG,CAAC,KAAKU,EAAE,MAAMV,CAAC,MAAM,KAAK,UAAU,IAAIS,EAAC,GAAI,KAAK,eAAe,IAAI;AAAA,EACnH,GAAG4C,EAAE,UAAU,MAAMA,EAAE,UAAU,gBAAgBA,EAAE,UAAU,cAAcA,EAAE,UAAU,IAAIA,EAAE,WAAWvD,GAAGuD,EAAE,eAAeA,GAAG1D,EAAE,UAAU0D;AAC7I,GAAGa,EAAC;AC3sBG,MAAMogB,GAAW;AAAA,EAKtB,YAAYlb,GAAY;AAJhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,iCAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,uBACNmb,GACA3Y,GACAC,GACAK,GACA;AACA,IAAAqY,EAAI,KAAA,GACJA,EAAI,YAAY3Y,GAChB2Y,EAAI,SAAS,GAAG,GAAG1Y,GAAOK,CAAM,GAChCqY,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,WACNA,GACAla,GACAwB,GACAK,GACA;AACA,UAAM,EAAE,YAAAsY,GAAY,OAAA9Y,EAAA,IAAU,KAAK;AAEnC,QAAI8Y,EAAW,SAASC,GAAe,SAAS;AAC9C,YAAMC,IAAara,EAAa,QAAQqB,GAClCiZ,IAActa,EAAa,SAASqB;AAC1C,UACE,CAAC8Y,EAAW,UACZA,EAAW,WAAWI,GAAiB;AAEvC,QAAAL,EAAI,UAAUla,GAAc,GAAG,GAAGqa,GAAYC,CAAW;AAAA,WACpD;AACL,YAAIlF,IAAS,GACTC,IAAS;AACb,cAAMmF,IACJL,EAAW,WAAWI,GAAiB,UACvCJ,EAAW,WAAWI,GAAiB,WACnC,KAAK,KAAM/Y,IAAQH,IAASgZ,CAAU,IACtC,GACAI,IACJN,EAAW,WAAWI,GAAiB,UACvCJ,EAAW,WAAWI,GAAiB,WACnC,KAAK,KAAM1Y,IAASR,IAASiZ,CAAW,IACxC;AACN,iBAASzf,IAAI,GAAGA,IAAI2f,GAAc3f,KAAK;AACrC,mBAASvB,IAAI,GAAGA,IAAImhB,GAAcnhB;AAChC,YAAA4gB,EAAI,UAAUla,GAAcoV,GAAQC,GAAQgF,GAAYC,CAAW,GACnEjF,KAAUiF;AAEZ,UAAAjF,IAAS,GACTD,KAAUiF;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEE,MAAAH,EAAI,UAAUla,GAAc,GAAG,GAAGwB,IAAQH,GAAOQ,IAASR,CAAK;AAAA,EAEnE;AAAA,EAEQ,uBACN6Y,GACA1Y,GACAK,GACA;AACA,UAAM,EAAE,YAAAsY,MAAe,KAAK,SACtBO,IAAoB,KAAK,WAAW,IAAIP,EAAW,KAAK;AAC9D,QAAIO;AACF,WAAK,WAAWR,GAAKQ,GAAmBlZ,GAAOK,CAAM;AAAA,SAChD;AACL,YAAM8Y,IAAM,IAAI,MAAA;AAChB,MAAAA,EAAI,aAAa,eAAe,WAAW,GAC3CA,EAAI,MAAMR,EAAW,OACrBQ,EAAI,SAAS,MAAM;AACjB,aAAK,WAAW,IAAIR,EAAW,OAAOQ,CAAG,GACzC,KAAK,WAAWT,GAAKS,GAAKnZ,GAAOK,CAAM,GAEvC,KAAK,KAAK,OAAO;AAAA,UACf,WAAW;AAAA,UACX,iBAAiB;AAAA,QAAA,CAClB;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEO,OAAOqY,GAA+B/X,GAAgB;AAC3D,UAAM;AAAA,MACJ,YAAY,EAAE,OAAArC,GAAO,OAAAyB,GAAO,kBAAAqZ,EAAA;AAAA,IAAiB,IAC3C,KAAK;AACT,QACE9a,MACC,EAAC8a,KAAA,QAAAA,EAAkB,WAAUA,EAAiB,SAASzY,CAAM,IAC9D;AACA,YAAM,EAAE,OAAAX,GAAO,QAAAK,EAAA,IAAW,KAAK;AAC/B,WAAK,uBAAuBqY,GAAK1Y,GAAOK,CAAM;AAAA,IAChD,OAAO;AACL,YAAML,IAAQ,KAAK,KAAK,eAAeW,CAAM,GACvCN,IAAS,KAAK,KAAK,gBAAgBM,CAAM;AAC/C,WAAK,uBAAuB+X,GAAK3Y,GAAOC,GAAOK,CAAM;AAAA,IACvD;AAAA,EACF;AACF;AChHA,MAAMgZ,KAAwC,SACxCC,KAA+B,CAAC,GAAG,CAAC;AAEnC,SAASC,GAAiBzb,GAA8C;AAC7E,SAAOA,EAAQ,iBAAiBub;AAClC;AAEO,SAASG,GAAsB1b,GAA+B2b,GAAkC;AACrG,QAAMC,IAAY,OAAO5b,EAAQ,kBAAkB;AACnD,SAAI,OAAO,SAAS4b,CAAS,KAAKA,IAAY,IACrCA,IAEFD;AACT;AAEO,SAASE,GAAsB7b,GAA+BoB,IAAOqa,GAAiBzb,CAAO,GAAa;AAC/G,SAAI,MAAM,QAAQA,EAAQ,SAAS,KAAKA,EAAQ,UAAU,SACjDA,EAAQ,YAEboB,MAAS,WAAiB,CAAC,GAAG,CAAC,IAC/BA,MAAS,WAAiB,CAAC,GAAG,CAAC,IAC5Boa;AACT;AAEO,SAASM,GAAyB9b,GAA+B2b,GAAkC;AACxG,QAAMC,IAAYF,GAAsB1b,GAAS2b,CAAgB;AAEjE,UADaF,GAAiBzb,CAAO,GAC7B;AAAA,IACN,KAAK;AACH,aAAO4b,IAAY,IAAI;AAAA,IACzB,KAAK;AACH,aAAOA,IAAY,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,KAAK,IAAIA,IAAY,GAAG,CAAC;AAAA,IAClC,KAAK;AACH,aAAOA,IAAY;AAAA,IACrB,KAAK;AACH,aAAOA,IAAY,IAAI;AAAA,IACzB;AACE,aAAO,KAAK,IAAIA,GAAW,CAAC;AAAA,EAAA;AAElC;AC1CO,MAAeG,GAAiB;AAAA,EAKrC,cAAc;AAJJ,IAAAva,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGR,SAAK,WAAW,KAAK,cAAA;AAAA,EACvB;AAAA,EAEO,gBAAgB;AACrB,gBAAK,YAAY,QACjB,KAAK,sBAAsB,QAC3B,KAAK,WAAW;AAAA,MACd,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,GAEH,KAAK;AAAA,EACd;AAAA,EAEO,eACLoZ,GACArf,GACAvB,GACAkI,GACAK,GACAN,GACA+Z,GACA;AACA,UAAMC,IAAgB,CAAC,KAAK,SAAS;AAErC,QACE,CAACA,MACA,KAAK,cAAcha,KAAS,KAAK,wBAAwB+Z,IAC1D;AACA,WAAK,OAAOpB,CAAG,GACf,KAAK,cAAA,GAEL,KAAK,eAAeA,GAAKrf,GAAGvB,GAAGkI,GAAOK,GAAQN,GAAO+Z,CAAe;AACpE;AAAA,IACF;AACA,IAAIC,MACF,KAAK,SAAS,IAAI1gB,GAClB,KAAK,SAAS,IAAIvB,IAEhBuI,KAAU,KAAK,SAAS,SAASA,MACnC,KAAK,SAAS,SAASA,IAEzB,KAAK,SAAS,SAASL,GACvB,KAAK,YAAYD,GACjB,KAAK,sBAAsB+Z;AAAA,EAC7B;AAGF;ACtDO,MAAME,WAAkBH,GAAiB;AAAA,EAG9C,YAAYtc,GAAY;AACtB,UAAA;AAHM,IAAA+B,EAAA;AAIN,SAAK,UAAU/B,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,OAAOmb,GAA+B;AAC3C,QAAI,CAAC,KAAK,SAAS,MAAO;AAC1B,UAAM,EAAE,gBAAAuB,MAAmB,KAAK,SAC1B,EAAE,GAAA5gB,GAAG,GAAAvB,GAAG,OAAAkI,GAAO,QAAAK,EAAA,IAAW,KAAK;AACrC,IAAAqY,EAAI,KAAA,GACJA,EAAI,cAAcuB,GAClBvB,EAAI,YAAY,KAAK,WACrBA,EAAI,SAASrf,GAAGvB,GAAGkI,GAAOK,CAAM,GAChCqY,EAAI,QAAA,GACJ,KAAK,cAAA;AAAA,EACP;AACF;ACrBO,MAAMwB,WAAuBL,GAAiB;AAAA,EAC5C,OAAOnB,GAA+B;AAC3C,QAAI,CAAC,KAAK,SAAS,MAAO;AAC1B,UAAM,EAAE,GAAArf,GAAG,GAAAvB,GAAG,OAAAkI,GAAO,QAAAK,EAAA,IAAW,KAAK;AACrC,IAAAqY,EAAI,KAAA,GACJA,EAAI,YAAY,KAAK,WACrBA,EAAI,SAASrf,GAAGvB,GAAGkI,GAAOK,CAAM,GAChCqY,EAAI,QAAA,GACJ,KAAK,cAAA;AAAA,EACP;AACF;ACRO,MAAMyB,GAAO;AAAA,EAIlB,YAAY5c,GAAY;AAHhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,OAAOmb,GAA+B/X,GAAgB;AAC3D,QAAI,KAAK,QAAQ,wBAAyB;AAC1C,UAAM,EAAE,sBAAAyZ,GAAsB,UAAAC,EAAA,IAAa,KAAK,SAC1Cra,IAAQ,KAAK,KAAK,SAAA,GAClBK,IACJga,MAAaC,GAAS,aAClB,KAAK,KAAK,gBAAgB3Z,CAAM,IAAI,KAAK,KAAK,kBAAA,IAC9C,KAAK,KAAK,UAAA,GACVkN,IAAU,KAAK,KAAK,WAAA,GACpB0M,IAAsB,KAAK,KAAK,uBAAA;AACtC,IAAA7B,EAAI,KAAA,GACJA,EAAI,UAAU,KAAK,GAAG,GACtBA,EAAI,cAAc0B,GAClB1B,EAAI,UAAA;AACJ,UAAM8B,IAAiC,CAAC3M,EAAQ,CAAC,GAAGA,EAAQ,CAAC,CAAC,GACxD4M,IAAkC,CAACza,IAAQ6N,EAAQ,CAAC,GAAGA,EAAQ,CAAC,CAAC,GACjE6M,IAAoC,CAAC7M,EAAQ,CAAC,GAAGxN,IAASwN,EAAQ,CAAC,CAAC,GACpE8M,IAAqC;AAAA,MACzC3a,IAAQ6N,EAAQ,CAAC;AAAA,MACjBxN,IAASwN,EAAQ,CAAC;AAAA,IAAA;AAGpB,IAAA6K,EAAI,OAAO8B,EAAa,CAAC,IAAID,GAAqBC,EAAa,CAAC,CAAC,GACjE9B,EAAI,OAAO,GAAG8B,CAAY,GAC1B9B,EAAI,OAAO8B,EAAa,CAAC,GAAGA,EAAa,CAAC,IAAID,CAAmB,GAEjE7B,EAAI,OAAO+B,EAAc,CAAC,IAAIF,GAAqBE,EAAc,CAAC,CAAC,GACnE/B,EAAI,OAAO,GAAG+B,CAAa,GAC3B/B,EAAI,OAAO+B,EAAc,CAAC,GAAGA,EAAc,CAAC,IAAIF,CAAmB,GAEnE7B,EAAI,OAAOgC,EAAgB,CAAC,IAAIH,GAAqBG,EAAgB,CAAC,CAAC,GACvEhC,EAAI,OAAO,GAAGgC,CAAe,GAC7BhC,EAAI,OAAOgC,EAAgB,CAAC,GAAGA,EAAgB,CAAC,IAAIH,CAAmB,GAEvE7B,EAAI,OAAOiC,EAAiB,CAAC,IAAIJ,GAAqBI,EAAiB,CAAC,CAAC,GACzEjC,EAAI,OAAO,GAAGiC,CAAgB,GAC9BjC,EAAI,OAAOiC,EAAiB,CAAC,GAAGA,EAAiB,CAAC,IAAIJ,CAAmB,GACzE7B,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,EACN;AACF;AChCO,MAAMkC,GAAO;AAAA,EAQlB,YAAYrd,GAAY;AAPhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,sBAAsB,MAC3B,KAAK,gBAAgB,MACrB,KAAK,kBAAkB,CAAA;AAAA,EACzB;AAAA,EAEO,mBAAkC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBAAiBoC,GAAwB;AAC9C,SAAK,gBAAgBA,GACrB,KAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEO,oBAAmC;AACxC,QAAI,CAAC,KAAK,gBAAgB,UAAU,CAAC,KAAK,cAAe,QAAO;AAChE,QAAI,KAAK,wBAAwB;AAC/B,WAAK,sBAAsB;AAAA,SACtB;AACL,UAAIqE,IAAQ,KAAK,sBAAsB,GACnC6W,IAAa;AACjB,YAAMC,IACJ,KAAK,gBAAgB,KAAK,mBAAmB,EAAE;AACjD,aAAO9W,KAAS,KAAG;AACjB,cAAM+W,IAAQ,KAAK,gBAAgB/W,CAAK;AACxC,YAAI8W,MAAqBC,EAAM,SAAS;AACtC,UAAAF,IAAa,IACb,KAAK,sBAAsB7W,KAAS,KAAK,cAAc,SAAS;AAChE;AAAA,QACF;AACA,QAAAA;AAAA,MACF;AACA,UAAI,CAAC6W,GAAY;AAGf,YADE,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,CAAC,EAClC,YAAYC,EAAkB,QAAO;AACzD,aAAK,sBACH,KAAK,gBAAgB,SAAS,KAAK,KAAK,cAAc,SAAS;AAAA,MACnE;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,qBAAoC;AACzC,QAAI,CAAC,KAAK,gBAAgB,UAAU,CAAC,KAAK,cAAe,QAAO;AAChE,QAAI,KAAK,wBAAwB;AAC/B,WAAK,sBAAsB;AAAA,SACtB;AACL,UAAI9W,IAAQ,KAAK,sBAAsB,GACnCgX,IAAc;AAClB,YAAMF,IACJ,KAAK,gBAAgB,KAAK,mBAAmB,EAAE;AACjD,aAAO9W,IAAQ,KAAK,gBAAgB,UAAQ;AAC1C,cAAM+W,IAAQ,KAAK,gBAAgB/W,CAAK;AACxC,YAAI8W,MAAqBC,EAAM,SAAS;AACtC,UAAAC,IAAc,IACd,KAAK,sBAAsBhX;AAC3B;AAAA,QACF;AACA,QAAAA;AAAA,MACF;AACA,UAAI,CAACgX,GAAa;AAEhB,YADyB,KAAK,gBAAgB,CAAC,EAC1B,YAAYF,EAAkB,QAAO;AAC1D,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,6BAA6B1X,GAA4B;AAC9D,UAAM;AAAA,MACJ,YAAY,EAAE,SAAA5C,GAAS,YAAAc,GAAY,UAAAb,EAAA;AAAA,MACnC,QAAAE;AAAA,IAAA,IACEyC,GACE/C,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA,GACpBM,IAAOD,KAAUN,IAASC,IAE1B2a,IAAS,SAAS,cAAc,KAAK;AAC3C,IAAAA,EAAO,MAAM,WAAW;AAExB,UAAMC,IAAuB;AAC7B,IAAAD,EAAO,MAAM,QAAQ,GAAGxa,EAAS,CAAC,IAAID,EAAQ,CAAC,IAAI0a,CAAoB,MACvED,EAAO,MAAM,SAAS,GACpB3Z,EAAW,CAAC,IAAId,EAAQ,CAAC,IAAI0a,CAC/B,MACAD,EAAO,MAAM,OAAO,GAAGza,EAAQ,CAAC,CAAC,MACjCya,EAAO,MAAM,MAAM,GAAGza,EAAQ,CAAC,IAAII,CAAI,MACvC,KAAK,KAAK,eAAe,OAAOqa,CAAM,GAEtCA,EAAO,eAAe,EAAK,GAC3BA,EAAO,OAAA;AAAA,EACT;AAAA,EAEO,6BAA6B;AAClC,WAAI,KAAK,wBAAwB,QAAQ,CAAC,KAAK,gBAAsB,CAAA,IAC9D,IAAI,MAAM,KAAK,cAAc,MAAM,EACvC,KAAK,KAAK,mBAAmB,EAC7B,IAAI,CAACE,GAAUnX,MAAUmX,IAAWnX,CAAK;AAAA,EAC9C;AAAA,EAEO,qBAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,wBAA8C;AACnD,QAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,gBAAgB,OAAQ,QAAO;AAChE,UAAMA,IACJ,KAAK,wBAAwB,OACzB,KAAK,sBAAsB,KAAK,cAAc,SAAS,IACvD;AACN,QAAIoX,IAAQ,GACRC,IAAU;AACd,aAASxmB,IAAI,GAAGA,IAAI,KAAK,gBAAgB,QAAQA,KAAK;AACpD,YAAMkmB,IAAQ,KAAK,gBAAgBlmB,CAAC;AACpC,MAAIwmB,MAAYN,EAAM,YACtBM,IAAUN,EAAM,SAChBK,KAAS;AAAA,IACX;AACA,WAAO;AAAA,MACL,OAAApX;AAAA,MACA,OAAAoX;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEO,aACLzb,GACAjC,GACiB;AACjB,UAAM4d,IAAU3b,EAAQ,kBAAA,GAClB4b,IAAmC,CAAA,GAEnCC,IAIA,CAAA,GACAC,IAA4B/d,EAAoB,QAEhDge,IAAiB,CAAA;AACvB,aAAS5nB,IAAI,GAAGA,IAAI2nB,GAA2B3nB;AAE7C,MADgB4J,EAAoB5J,CAAC,EACzB,SAAS2K,EAAY,SAC/Bid,EAAe,KAAK5nB,CAAC;AAGzB,QAAIY,IAAI,GACJinB,IAAe;AACnB,WAAOA,IAAeF,IAA4B,KAAG;AACnD,YAAM1Y,IAAW2Y,EAAe,SAC5BA,EAAehnB,CAAC,IAChB+mB,GACEG,IAAcle,EAAoB,MAAMie,GAAc5Y,CAAQ;AACpE,MAAI6Y,EAAY,UACdJ,EAAiB,KAAK;AAAA,QACpB,OAAOG;AAAA,QACP,MAAME,GAAc;AAAA,QACpB,aAAaD;AAAA,MAAA,CACd;AAEH,YAAM9L,IAAepS,EAAoBqF,CAAQ;AACjD,MAAI+M,KACF0L,EAAiB,KAAK;AAAA,QACpB,OAAOzY;AAAA,QACP,MAAM8Y,GAAc;AAAA,QACpB,aAAa,CAAC/L,CAAY;AAAA,MAAA,CAC3B,GAEH6L,IAAe5Y,IAAW,GAC1BrO;AAAA,IACF;AAEA,aAASonB,EACPnc,GACAT,GACAxC,GACAqf,GACA;AACA,UAAI,CAACpc,EAAS;AACd,YAAMlD,IAAOC,EACV;AAAA,QAAI,CAAA5I,MAAA;ArCtNV,cAAA6I,GAAAgH;AqCuNO,kBAAC7P,EAAE,QACF+c,GAAsB,SAAS/c,EAAE,IAAI,KACpCA,EAAE,qBAAqB2O,EAAiB,YACxC,GAAC9F,IAAA7I,EAAE,YAAF,QAAA6I,EAAW,SACZ,GAACgH,IAAA7P,EAAE,SAAF,QAAA6P,EAAQ,QACP7P,EAAE,QACFiK;AAAAA;AAAAA,MAAA,EAEL,OAAO,OAAO,EACd,KAAK,EAAE,EACP,kBAAA,GACGie,IAAsB,CAAA;AAC5B,UAAIhY,IAAQvH,EAAK,QAAQkD,CAAO;AAChC,aAAOqE,MAAU;AACf,QAAAgY,EAAoB,KAAKhY,CAAK,GAC9BA,IAAQvH,EAAK,QAAQkD,GAASqE,IAAQrE,EAAQ,MAAM;AAEtD,eAASnS,IAAI,GAAGA,IAAIwuB,EAAoB,QAAQxuB,KAAK;AACnD,cAAMiQ,IAAaue,EAAoBxuB,CAAC,GAClC6tB,IAAU3V,GAAA;AAChB,iBAAShR,IAAI,GAAGA,IAAIiL,EAAQ,QAAQjL,KAAK;AACvC,gBAAMsP,IAAQvG,IAAa/I,MAAKqnB,KAAA,gBAAAA,EAAU,eAAc;AACxD,UAAAR,EAAgB,KAAK;AAAA,YACnB,MAAArc;AAAA,YACA,OAAA8E;AAAAA,YACA,SAAAqX;AAAA,YACA,GAAGU;AAAA,UAAA,CACJ;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,aAASjoB,IAAI,GAAGA,IAAI0nB,EAAiB,QAAQ1nB,KAAK;AAChD,YAAMmoB,IAAQT,EAAiB1nB,CAAC;AAChC,UAAImoB,EAAM,SAASJ,GAAc,OAAO;AACtC,cAAM/L,IAAemM,EAAM,YAAY,CAAC;AACxC,iBAAStnB,IAAI,GAAGA,IAAImb,EAAa,OAAQ,QAAQnb,KAAK;AACpD,gBAAMiX,IAAKkE,EAAa,OAAQnb,CAAC;AACjC,mBAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,kBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChB8jB,IAAkC;AAAA,cACtC,SAASjM,EAAa;AAAA,cACtB,YAAYmM,EAAM;AAAA,cAClB,SAAStnB;AAAA,cACT,SAASsD;AAAA,cACT,MAAMuV,EAAG;AAAA,YAAA;AAEX,YAAAsO,EAAcR,GAASW,EAAM,MAAMzO,EAAG,OAAOuO,CAAQ;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AACE,QAAAD,EAAcR,GAASW,EAAM,MAAMA,EAAM,aAAa;AAAA,UACpD,YAAYA,EAAM;AAAA,QAAA,CACnB;AAAA,IAEL;AACA,WAAOV;AAAA,EACT;AAAA,EAEO,QAAQ5b,GAAiB;AAC9B,SAAK,kBAAkB,KAAK;AAAA,MAC1BA;AAAA,MACA,KAAK,KAAK,uBAAA;AAAA,IAAuB;AAAA,EAErC;AAAA,EAEO,OAAO+Y,GAA+B7U,GAAmB;ArCxR/D,QAAAlH,GAAAgH;AqCyRC,QACE,CAAC,KAAK,mBACN,CAAC,KAAK,gBAAgB,UACtB,CAAC,KAAK;AAEN;AAEF,UAAM,EAAE,kBAAAuY,GAAkB,kBAAAC,GAAkB,0BAAAC,EAAA,IAC1C,KAAK,SACD7X,IAAe,KAAK,SAAS,wBAAA,GAC7B7H,IAAc,KAAK,KAAK,uBAAA;AAC9B,IAAAgc,EAAI,KAAA,GACJA,EAAI,cAAcwD;AAClB,aAASrnB,IAAI,GAAGA,IAAI,KAAK,gBAAgB,QAAQA,KAAK;AACpD,YAAMwnB,IAAc,KAAK,gBAAgBxnB,CAAC;AAC1C,UAAIuO,IAAoC;AACxC,UAAIiZ,EAAY,SAASR,GAAc,OAAO;AAC5C,cAAM,EAAE,YAAAS,GAAY,SAAA3T,GAAS,SAAAC,GAAS,OAAA5E,MAAUqY;AAChD,QAAAjZ,KACEO,KAAAhH,IAAAD,EAAY4f,CAAW,MAAvB,gBAAA3f,EAA0B,OAAQgM,GAAU,OAAOC,OAAnD,gBAAAjF,EACI,aAAcK;AAAA,MACtB;AACE,QAAAZ,IAAWmB,EAAa8X,EAAY,KAAK;AAE3C,UAAI,CAACjZ,EAAU;AACf,YAAM;AAAA,QACJ,YAAY,EAAE,SAAA5C,GAAS,YAAAc,GAAY,UAAAb,EAAA;AAAA,QACnC,QAAAE;AAAA,MAAA,IACEyC;AACJ,UAAIzC,MAAWkD,EAAW;AAG1B,UAD6B,KAAK,2BAAA,EACT,SAAShP,CAAC,GAAG;AACpC,QAAA6jB,EAAI,YAAY0D;AAEhB,cAAMG,IAAiB,KAAK,gBAAgB1nB,IAAI,CAAC;AACjD,SAAI,CAAC0nB,KAAkBA,EAAe,YAAYF,EAAY,YAC5D,KAAK,6BAA6BjZ,CAAQ;AAAA,MAE9C;AACE,QAAAsV,EAAI,YAAYyD;AAElB,YAAM9iB,IAAImH,EAAQ,CAAC,GACb1I,IAAI0I,EAAQ,CAAC,GACbR,IAAQS,EAAS,CAAC,IAAID,EAAQ,CAAC,GAC/BH,IAASiB,EAAW,CAAC,IAAId,EAAQ,CAAC;AACxC,MAAAkY,EAAI,SAASrf,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,IAClC;AACA,IAAAqY,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,QAAQ/Y,GAAiB6c,GAAyB;ArC5UxD,QAAA7f,GAAAgH,GAAAuC,GAAAC;AqC+UC,QAFmB,KAAK,KAAK,WAAA,KAEzB,CAACxG,KAAW,IAAI,OAAO,GAAG5B,CAAI,IAAI,GAAG,EAAE,KAAK4B,CAAO,EAAG;AAC1D,QAAI8c,IAAY,KAAK,mBAAA;AAErB,UAAMC,IAAeF,KAAA,gBAAAA,EAAQ;AAC7B,QAAIjL,GAASmL,CAAY,GAAG;AAC1B,YAAMC,IAAgC,CAAA;AACtC,MAAAF,EAAU,QAAQ,CAAA1B,MAAS;AACzB,cAAM6B,IAAOD,EAAWA,EAAW,SAAS,CAAC;AAC7C,QAAI,CAACC,KAAQA,EAAK,CAAC,EAAE,YAAY7B,EAAM,UACrC4B,EAAW,KAAK,CAAC5B,CAAK,CAAC,IAEvB6B,EAAK,KAAK7B,CAAK;AAAA,MAEnB,CAAC,GACD0B,IAAYE,EAAWD,CAAY;AAAA,IACrC;AACA,QAAI,EAACD,KAAA,QAAAA,EAAW,QAAQ;AACxB,UAAMtN,IAAe,KAAK,KAAK,aAAA;AAE/B,QAAI0N,IAAgB,GAChBC,IAAiB,GAEjBC,IAAa,IAEbC,IAAU,IAEVC,IAAkB;AACtB,UAAMvgB,IAAc,KAAK,KAAK,uBAAA;AAC9B,aAASlP,IAAI,GAAGA,IAAIivB,EAAU,QAAQjvB,KAAK;AACzC,YAAMutB,IAAQ0B,EAAUjvB,CAAC;AACzB,UAAIutB,EAAM,SAASc,GAAc,OAAO;AACtC,cAAM,EAAE,YAAAS,GAAY,SAAA3T,GAAS,SAAAC,GAAS,OAAA5E,GAAO,MAAAwF,MAASuR;AACtD,QAAIiC,KAAWxT,MAASwT,MACtBF,IAAiB,IAEnBE,IAAUxT;AACV,cAAM0T,IAAgBZ,IAAcO,GAC9BM,IACJzgB,EAAYwgB,CAAa,EAAE,OAAQvU,CAAQ,EAAE,OAAOC,CAAQ,EAAE,OAE1DpE,IAAWR,IAAQ8Y,GACnBhN,IAAeqN,EAAiB3Y,CAAQ;AAE9C,YACE,CAAC2K,QACAxS,IAAAmT,KAAA,gBAAAA,EAAc,YAAd,gBAAAnT,EAAuB,eAAc,QACpCgH,IAAAmM,KAAA,gBAAAA,EAAc,UAAd,gBAAAnM,EAAqB,eAAc;AAErC;AAEF,YAAIoZ,MAAehC,EAAM,SAAS;AAChC,eAAK,KAAK,kBAAkBoC,GAAkB3Y,GAAU,CAAC,GACzDsY;AACA;AAAA,QACF;AACA,QAAK,CAACG,MACJA,IAAkBzvB;AAEpB,iBAASwK,IAAI,GAAGA,IAAI2H,EAAQ,QAAQ3H,KAAK;AACvC,gBAAMuG,IAAQoB,EAAQ3H,CAAC;AACvB,UAAIA,MAAM,IACR8X,EAAa,QAAQvR,KAErB,KAAK,KAAK,kBAAkB4e,GAAkB3Y,IAAWxM,GAAG,GAAG;AAAA,YAC7D;AAAA,cACE,GAAG8X;AAAA,cACH,OAAAvR;AAAA,YAAA;AAAA,UACF,CACD,GACDue;AAAA,QAEJ;AAAA,MACF,OAAO;AACL,cAAMtY,IAAWuW,EAAM,QAAQ8B,GACzB/e,IAAUpB,EAAY8H,CAAQ;AAEpC,YACG,CAAC2K,QACCjJ,IAAApI,KAAA,gBAAAA,EAAS,YAAT,gBAAAoI,EAAkB,eAAc,QAC/BC,IAAArI,KAAA,gBAAAA,EAAS,UAAT,gBAAAqI,EAAgB,eAAc,OACjCrI,EAAQ,SAASW,EAAY,WAC5BX,EAAQ,qBAAqB2E,EAAiB;AAEhD;AAKF,YAHK,CAACwa,MACJA,IAAkBzvB,IAEhBuvB,MAAehC,EAAM,SAAS;AAChC,eAAK,KAAK,kBAAkBre,GAAa8H,GAAU,CAAC,GACpDqY;AACA;AAAA,QACF;AACA,iBAAS7kB,IAAI,GAAGA,IAAI2H,EAAQ,QAAQ3H,KAAK;AACvC,gBAAMuG,IAAQoB,EAAQ3H,CAAC;AACvB,UAAIA,MAAM,IACR8F,EAAQ,QAAQS,KAEhB,KAAK,KAAK,kBAAkB7B,GAAa8H,IAAWxM,GAAG,GAAG;AAAA,YACxD;AAAA,cACE,GAAG8F;AAAA,cACH,OAAAS;AAAA,YAAA;AAAA,UACF,CACD,GACDse;AAAA,QAEJ;AAAA,MACF;AACA,MAAAE,IAAahC,EAAM;AAAA,IACrB;AACA,QAAI,CAAC,CAACkC,EAAiB;AAEvB,UAAMG,IAAaX,EAAUQ,CAAe,GACtCI,IAAaD,EAAW,SAASzd,EAAQ,SAAS;AACxD,QAAIyd,EAAW,SAASvB,GAAc,OAAO;AAC3C,YAAM,EAAE,YAAAS,GAAY,SAAA3T,GAAS,SAAAC,GAAS,OAAA5E,MAAUoZ,GAC1Ctf,IACJpB,EAAY4f,CAAW,EAAE,OAAQ3T,CAAQ,EAAE,OAAOC,CAAQ,EAAE,MAAM5E,CAAK;AACzE,WAAK,SAAS,mBAAmB;AAAA,QAC/B,SAAS;AAAA,QACT,OAAOsY;AAAA,QACP,SAAA3T;AAAA,QACA,SAAAC;AAAA,QACA,MAAM9K,EAAQ;AAAA,QACd,MAAMA,EAAQ;AAAA,QACd,SAASA,EAAQ;AAAA,MAAA,CAClB;AAAA,IACH;AACE,WAAK,SAAS,mBAAmB;AAAA,QAC/B,SAAS;AAAA,MAAA,CACV;AAEH,SAAK,KAAK,SAAA,EAAW,SAASuf,GAAYA,CAAU,GAEpD,KAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,IAAA,CACX;AAAA,EACH;AACF;ACrdO,MAAMC,WAAkBzD,GAAiB;AAAA,EAG9C,YAAYtc,GAAY;AACtB,UAAA;AAHM,IAAA+B,EAAA;AAIN,SAAK,UAAU/B,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,OAAOmb,GAA+B;AAC3C,QAAI,CAAC,KAAK,SAAS,MAAO;AAC1B,UAAM,EAAE,OAAA7Y,GAAO,gBAAA0d,EAAA,IAAmB,KAAK,SACjC,EAAE,GAAAlkB,GAAG,GAAAvB,GAAG,OAAAkI,EAAA,IAAU,KAAK;AAC7B,IAAA0Y,EAAI,KAAA,GACJA,EAAI,YAAY7Y,GAChB6Y,EAAI,cAAc,KAAK,aAAa6E;AACpC,UAAMC,IAAU1lB,IAAI;AACpB,IAAA4gB,EAAI,UAAA,GACJA,EAAI,OAAOrf,GAAGmkB,CAAO,GACrB9E,EAAI,OAAOrf,IAAI2G,GAAOwd,CAAO,GAC7B9E,EAAI,OAAA,GACJA,EAAI,QAAA,GACJ,KAAK,cAAA;AAAA,EACP;AACF;ACtBO,MAAM+E,WAAkB5D,GAAiB;AAAA,EAG9C,YAAYtc,GAAY;AACtB,UAAA;AAHM,IAAA+B,EAAA;AAIN,SAAK,UAAU/B,EAAK,WAAA;AAAA,EACtB;AAAA;AAAA,EAGQ,UACNmb,GACA9E,GACAC,GACA7T,GACA0d,GACA;AACA,UAAMC,IAAO/J,IAAS5T;AAEtB,YADA0Y,EAAI,UAAA,GACIgF,GAAA;AAAA,MACN,KAAKE,GAAS;AAEZ,QAAAlF,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AACtB;AAAA,MACF,KAAKkF,GAAS;AAEZ,QAAAlF,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AACtB;AAAA,IAAA;AAEJ,IAAAA,EAAI,OAAO9E,GAAQC,CAAM,GACzB6E,EAAI,OAAOiF,GAAM9J,CAAM,GACvB6E,EAAI,OAAA;AAAA,EACN;AAAA;AAAA,EAGQ,YACNA,GACA9E,GACAC,GACA7T,GACA;AAEA,UAAM2d,IAAO/J,IAAS5T,GAChB6d,IAAOhK,IAAS,IAAU,KAAK,QAAQ;AAC7C,IAAA6E,EAAI,UAAA,GACJA,EAAI,OAAO9E,GAAQC,CAAM,GACzB6E,EAAI,OAAOiF,GAAM9J,CAAM,GACvB6E,EAAI,OAAA,GACJA,EAAI,UAAA,GACJA,EAAI,OAAO9E,GAAQiK,CAAI,GACvBnF,EAAI,OAAOiF,GAAME,CAAI,GACrBnF,EAAI,OAAA;AAAA,EACN;AAAA;AAAA,EAGQ,UACNA,GACA9E,GACAC,GACA7T,GACA;AACA,UAAM,EAAE,OAAAH,MAAU,KAAK,SACjBie,IAAY,MAAMje,GAClBke,IAAY,IAAIle,GAChB2d,IAAU3J,IAAS,IAAIiK;AAC7B,IAAApF,EAAI,UAAA;AACJ,aAASrf,IAAI,GAAGA,IAAI2G,GAAO3G,KAAK;AAC9B,YAAMvB,IAAIgmB,IAAY,KAAK,IAAIC,IAAY1kB,CAAC;AAC5C,MAAAqf,EAAI,OAAO9E,IAASva,GAAGmkB,IAAU1lB,CAAC;AAAA,IACpC;AACA,IAAA4gB,EAAI,OAAA;AAAA,EACN;AAAA,EAEO,OAAOA,GAA+B;AAC3C,QAAI,CAAC,KAAK,SAAS,MAAO;AAC1B,UAAM,EAAE,gBAAAsF,GAAgB,OAAAne,EAAA,IAAU,KAAK,SACjC,EAAE,GAAAxG,GAAG,GAAAvB,GAAG,OAAAkI,EAAA,IAAU,KAAK;AAC7B,IAAA0Y,EAAI,KAAA,GACJA,EAAI,cAAc,KAAK,aAAasF,GACpCtF,EAAI,YAAY7Y;AAChB,UAAM2d,IAAU,KAAK,MAAM1lB,IAAI,IAAI4gB,EAAI,SAAS,IAAI;AACpD,YAAQ,KAAK,qBAAA;AAAA,MACX,KAAKuF,GAAoB;AACvB,aAAK,UAAUvF,GAAKrf,GAAGmkB,GAASxd,CAAK;AACrC;AAAA,MACF,KAAKie,GAAoB;AACvB,aAAK,YAAYvF,GAAKrf,GAAGmkB,GAASxd,CAAK;AACvC;AAAA,MACF,KAAKie,GAAoB;AACvB,aAAK,UAAUvF,GAAKrf,GAAGmkB,GAASxd,GAAO4d,GAAS,MAAM;AACtD;AAAA,MACF,KAAKK,GAAoB;AACvB,aAAK,UAAUvF,GAAKrf,GAAGmkB,GAASxd,GAAO4d,GAAS,MAAM;AACtD;AAAA,MACF;AACE,aAAK,UAAUlF,GAAKrf,GAAGmkB,GAASxd,CAAK;AACrC;AAAA,IAAA;AAEJ,IAAA0Y,EAAI,QAAA,GACJ,KAAK,cAAA;AAAA,EACP;AACF;ACjGO,MAAMwF,GAAc;AAAA,EAQzB,YAAY3gB,GAAY;AAPhB,IAAA+B,EAAA;AACE,IAAAA,EAAA;AACA,IAAAA,EAAA;AACF,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,iCAAiB,IAAA,GACtB,KAAK,sBAAsB,MAC3B,KAAK,aAAa;AAAA,EACpB;AAAA,EAEO,2BAAuC;AAC5C,UAAM4gB,IAAwB,CAAA,GACxBC,IAAe,CAAC1hB,MAA4B;AAChD,iBAAWoB,KAAWpB;AACpB,YAAIoB,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,cAAAmmB,EAAa5Q,EAAG,KAAK;AAAA,YACvB;AAAA,UACF;AAAA,QACF,MAAA,CAAW1P,EAAQ,SAASW,EAAY,SACtC0f,EAAU,KAAKrgB,CAAO;AAAA,IAG5B;AAEA,WAAAsgB,EAAa,KAAK,KAAK,4BAA4B,GAC5CD;AAAA,EACT;AAAA,EAEO,iBAAiBrgB,GAAmB;AACzC,UAAM,EAAE,OAAA+B,MAAU,KAAK;AAEvB,QAAIwe,IAAsB,KAAK,qBAC3BC,IAAa,KAAK;AACtB,IAAKD,MACHA,IAAsB,SAAS,cAAc,KAAK,GAClDA,EAAoB,UAAU,IAAI,GAAG7e,CAAa,cAAc,GAChE,KAAK,UAAU,OAAO6e,CAAmB,GACzC,KAAK,sBAAsBA,IAExBC,MACHA,IAAa,SAAS,cAAc,KAAK,GACzCD,EAAoB,OAAOC,CAAU,GACrC,KAAK,aAAaA,IAEpBD,EAAoB,MAAM,UAAU,QACpCC,EAAW,MAAM,QAAQ,GAAGxgB,EAAQ,QAAS+B,CAAK,MAClDye,EAAW,MAAM,SAAS,GAAGxgB,EAAQ,SAAU+B,CAAK;AAEpD,UAAMQ,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA,GACpBM,IAAO,KAAK,KAAK,UAAA,KAAeP,IAASC,IACzC0F,IAAmBlI,EAAQ;AACjC,IAAAugB,EAAoB,MAAM,OAAO,GAAGrY,EAAiB,IAAInG,CAAK,MAC9Dwe,EAAoB,MAAM,MAAM,GAAGzd,IAAOoF,EAAiB,IAAInG,CAAK,MACpEye,EAAW,aAAa,eAAe,WAAW,GAClDA,EAAW,MAAMxgB,EAAQ;AAAA,EAC3B;AAAA,EAEO,eAAeygB,GAAmBC,GAAmB;AAC1D,QAAI,CAAC,KAAK,oBAAqB;AAC/B,SAAK,oBAAoB,MAAM,UAAU;AAEzC,UAAMnlB,IAAI,WAAW,KAAK,oBAAoB,MAAM,IAAI,IAAIklB,GACtDzmB,IAAI,WAAW,KAAK,oBAAoB,MAAM,GAAG,IAAI0mB;AAC3D,SAAK,oBAAoB,MAAM,OAAO,GAAGnlB,CAAC,MAC1C,KAAK,oBAAoB,MAAM,MAAM,GAAGvB,CAAC;AAAA,EAC3C;AAAA,EAEO,oBAAoB;AACzB,IAAI,KAAK,wBACP,KAAK,oBAAoB,MAAM,UAAU;AAAA,EAE7C;AAAA,EAEU,iBAAiB2mB,GAA2B;AACpD,SAAK,KAAK,mBAAmB,IAAIA,CAAO;AAAA,EAC1C;AAAA,EAEU,iBAAiBze,GAAeK,GAAkC;AAE1E,UAAMhH,KAAK2G,IAAQ,KAAK,KAAKA,IAAQ,CAAQ,IAAI,KAAY,GACvDlI,KAAKuI,IAAS,KAAK,KAAKA,IAAS,CAAQ,IAAI,KAAY,GACzDqe,IAAM,kDAAkD1e,CAAK,aAAaK,CAAM,kBAAkBL,CAAK,IAAIK,CAAM;AAAA,iCAC1FL,CAAK,aAAaK,CAAM;AAAA;AAAA,8CAEXhH,CAAC,QAAQvB,CAAC,YAClD,IAAW,CACb,aAAa,IAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMnB6mB,IAAgB,IAAI,MAAA;AAC1B,WAAAA,EAAc,MAAM,6BAA6BC;AAAAA,MAC/CF;AAAA,IAAA,CACD,IACMC;AAAA,EACT;AAAA,EAEO,OACLjG,GACA5a,GACAzE,GACAvB,GACA;AACA,UAAM,EAAE,OAAA+H,MAAU,KAAK,SACjBG,IAAQlC,EAAQ,QAAS+B,GACzBQ,IAASvC,EAAQ,SAAU+B;AACjC,QAAI,KAAK,WAAW,IAAI/B,EAAQ,KAAK,GAAG;AACtC,YAAMqb,IAAM,KAAK,WAAW,IAAIrb,EAAQ,KAAK;AAC7C,MAAA4a,EAAI,UAAUS,GAAK9f,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,IACxC,OAAO;AACL,YAAMwe,IAAmB,KAAK,KAAK,eAAA,GAC7BC,IAAmB,IAAI,QAAQ,CAACC,MAAY;AAChD,cAAM5F,IAAM,IAAI,MAAA;AAChB,QAAAA,EAAI,aAAa,eAAe,WAAW,GAC3CA,EAAI,MAAMrb,EAAQ,OAClBqb,EAAI,SAAS,MAAM;AAIjB,UAHA,KAAK,WAAW,IAAIrb,EAAQ,OAAOqb,CAAG,GACtC4F,EAAQjhB,CAAO,GAEX+gB,MAAqB,KAAK,KAAK,eAAA,MAE/B/gB,EAAQ,eAAeoH,EAAa,eACtC,KAAK,KAAK,OAAO;AAAA,YACf,WAAW;AAAA,YACX,aAAa;AAAA,YACb,iBAAiB;AAAA,UAAA,CAClB,IAEDwT,EAAI,UAAUS,GAAK9f,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,QAE1C,GACA8Y,EAAI,UAAU,MAAM;AAClB,gBAAMwF,IAAgB,KAAK,iBAAiB3e,GAAOK,CAAM;AACzD,UAAAse,EAAc,SAAS,MAAM;AAC3B,YAAAjG,EAAI,UAAUiG,GAAetlB,GAAGvB,GAAGkI,GAAOK,CAAM,GAChD,KAAK,WAAW,IAAIvC,EAAQ,OAAO6gB,CAAa,GAChDI,EAAQjhB,CAAO;AAAA,UACjB,GACA6gB,EAAc,UAAU,MAAM;AAC5B,YAAAI,EAAQjhB,CAAO;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AACD,WAAK,iBAAiBghB,CAAgB;AAAA,IACxC;AAAA,EACF;AACF;AC1JO,MAAME,GAAa;AAAA,EAaxB,YAAYzhB,GAAY;AAZhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACD,IAAAA,EAAA;AAGL,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,MAAMA,EAAK,OAAA,GAChB,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,WAAW,IAChB,KAAK,oBAAoB,KACzB,KAAK,uCAAuB,IAAA;AAAA,EAC9B;AAAA,EAEA,OAAc,uBAAuB0hB,GAAiC;AACpE,UAAMC,IAAqB,KAAK,MAAMD,KAAkB,GAAG;AAC3D,WAAOC,IAAqB,IAAIA,IAAqB,MAAM;AAAA,EAC7D;AAAA,EAEA,OAAc,eACZxG,GACAjc,GACApD,GACAvB,GACAmnB,GACA;AACA,UAAME,IAAQH,GAAa,uBAAuBC,CAAc;AAChE,QAAIE,MAAU,GAAG;AACf,MAAAzG,EAAI,SAASjc,GAAMpD,GAAGvB,CAAC;AACvB;AAAA,IACF;AACA,IAAA4gB,EAAI,KAAA,GACJA,EAAI,UAAUrf,GAAGvB,CAAC,GAClB4gB,EAAI,MAAMyG,GAAO,CAAC,GAClBzG,EAAI,SAASjc,GAAM,GAAG,CAAC,GACvBic,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,iBACLA,GACA0G,GACc;AACd,IAAA1G,EAAI,KAAA,GACJA,EAAI,OAAO0G;AACX,UAAMC,IAAc,KAAK,YAAY3G,GAAK;AAAA,MACxC,OAAO4G;AAAAA,IAAA,CACR;AACD,WAAA5G,EAAI,QAAA,GACG2G;AAAA,EACT;AAAA,EAEO,YACL3G,GACAhc,GACA8H,GACoB;AACpB,UAAM0G,IAAa,KAAK,KAAK,aAAA;AAC7B,QAAIlL,IAAQ,GACR8J,IAAuBpN,EAAY8H,CAAQ,GAC3C9P,IAAI8P;AACR,WAAO9P,IAAIgI,EAAY,UAAQ;AAC7B,YAAMoB,IAAUpB,EAAYhI,CAAC;AAC7B,UACGoJ,EAAQ,QAAQA,EAAQ,SAASW,EAAY,QAC9C,CAACyM,EAAW,KAAKpN,EAAQ,KAAK,GAC9B;AACA,QAAAgM,IAAahM;AACb;AAAA,MACF;AACA,MAAAkC,KAAS,KAAK,YAAY0Y,GAAK5a,CAAO,EAAE,OACxCpJ;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAAsL;AAAA,MACA,YAAA8J;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEO,wBACL4O,GACA5a,GACQ;AACR,WAAI,CAACA,KAAW,CAACyhB,GAAiB,SAASzhB,EAAQ,KAAK,IAAU,IAC3D,KAAK,YAAY4a,GAAK5a,CAAO,EAAE;AAAA,EACxC;AAAA,EAEO,YACL4a,GACA5a,GACc;AAEd,QAAIA,EAAQ,OAAO;AACjB,YAAMuhB,IAAc3G,EAAI,YAAY5a,EAAQ,KAAK;AAEjD,aAAO;AAAA,QACL,OAAOA,EAAQ;AAAA,QACf,yBAAyBuhB,EAAY;AAAA,QACrC,0BAA0BA,EAAY;AAAA,QACtC,uBAAuBA,EAAY;AAAA,QACnC,wBAAwBA,EAAY;AAAA,QACpC,uBAAuBA,EAAY;AAAA,QACnC,wBAAwBA,EAAY;AAAA,MAAA;AAAA,IAExC;AACA,UAAMG,IAAK,GAAG1hB,EAAQ,KAAK,GAAG4a,EAAI,IAAI,IAChC+G,IAAmB,KAAK,iBAAiB,IAAID,CAAE;AACrD,QAAIC;AACF,aAAOA;AAET,UAAMJ,IAAc3G,EAAI,YAAY5a,EAAQ,KAAK;AACjD,gBAAK,iBAAiB,IAAI0hB,GAAIH,CAAW,GAClCA;AAAA,EACT;AAAA,EAEO,WAAW;AAChB,SAAK,QAAA,GACL,KAAK,OAAO;AAAA,EACd;AAAA,EAEO,OACL3G,GACA5a,GACAzE,GACAvB,GACA;AAGA,QAFA,KAAK,MAAM4gB,GAEP,KAAK,QAAQ,eAAegH,GAAW,eAAe;AACxD,WAAK,UAAUrmB,GAAGvB,CAAC,GACnB,KAAK,OAAOgG,EAAQ,OACpB,KAAK,WAAWA,EAAQ,OACxB,KAAK,WAAWA,EAAQ,OACxB,KAAK,SAAA;AACL;AAAA,IACF;AAEA,IAAK,KAAK,QACR,KAAK,UAAUzE,GAAGvB,CAAC,IAIlB,KAAK,YAAYgG,EAAQ,UAAU,KAAK,YACzCA,EAAQ,UAAU,KAAK,aACtBA,EAAQ,kBAAkB,SAAS,KAAK,uBAEzC,KAAK,SAAA,GACL,KAAK,UAAUzE,GAAGvB,CAAC,IAErB,KAAK,QAAQgG,EAAQ,OACrB,KAAK,WAAWA,EAAQ,OACxB,KAAK,WAAWA,EAAQ,OACxB,KAAK,oBAAoBA,EAAQ,kBAAkB;AAAA,EACrD;AAAA,EAEQ,UAAUzE,GAAWvB,GAAW;AACtC,SAAK,OAAOuB,GACZ,KAAK,OAAOvB;AAAA,EACd;AAAA,EAEQ,UAAU;AAChB,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,SACxC,KAAK,IAAI,KAAA,GACT,KAAK,IAAI,OAAO,KAAK,UACrB,KAAK,IAAI,YAAY,KAAK,YAAY,KAAK,QAAQ,cACnDknB,GAAa;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAEP,KAAK,IAAI,QAAA;AAAA,EACX;AACF;AC/LO,MAAMW,GAAW;AAAA,EAItB,YAAYpiB,GAAY;AAHhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEA,OAAO,wBACLd,GACAkE,GACAif,GACAC,GACA;AACA,UAAMC,IACJD,MAAeE,GAAW,UACtBC,GAAuBrf,CAAM,IAC7B,GAAGA,CAAM;AACf,WAAOlE,EAAK,QAAQmjB,GAAYE,CAAU;AAAA,EAC5C;AAAA,EAEO,OAAOpH,GAA+B/X,GAAgB;AAC3D,UAAM;AAAA,MACJ,OAAAd;AAAA,MACA,YAAY;AAAA,QACV,MAAAogB;AAAA,QACA,MAAAb;AAAA,QACA,OAAArf;AAAA,QACA,SAAAmgB;AAAA,QACA,YAAAL;AAAA,QACA,QAAAM;AAAA,QACA,aAAAC;AAAA,QACA,YAAAC;AAAA,MAAA;AAAA,IACF,IACE,KAAK;AACT,QAAI1f,IAAS0f,EAAY;AAEzB,QAAI5jB,IAAO0jB;AACX,UAAMG,IAAY,IAAI,OAAOC,GAAmB,OAAO;AACvD,IAAID,EAAU,KAAK7jB,CAAI,MACrBA,IAAOkjB,GAAW;AAAA,MAChBljB;AAAA,MACAkE,IAASyf,IAAcC;AAAA,MACvBC;AAAA,MACAT;AAAA,IAAA;AAGJ,UAAMW,IAAe,IAAI,OAAOD,GAAmB,UAAU;AAC7D,IAAIC,EAAa,KAAK/jB,CAAI,MACxBA,IAAOkjB,GAAW;AAAA,MAChBljB;AAAA,MACA,KAAK,KAAK,aAAA,IAAiB4jB;AAAA,MAC3BG;AAAA,MACAX;AAAA,IAAA;AAGJ,UAAM7f,IAAQ,KAAK,KAAK,SAAA,GAElBK,IAAS,KAAK,KAAK,UAAA,GACnBogB,IAAmB,KAAK,KAAK,oBAAA,GAC7B3oB,IAAIuI,IAASogB;AACnB,IAAA/H,EAAI,KAAA,GACJA,EAAI,YAAY3Y,GAChB2Y,EAAI,OAAO,GAAGuH,IAAOpgB,CAAK,MAAMuf,CAAI;AAEpC,QAAI/lB,IAAI;AACR,UAAMwU,IAAU,KAAK,KAAK,WAAA,GACpB,EAAE,OAAO6S,EAAA,IAAchI,EAAI,YAAYjc,CAAI;AACjD,IAAIyjB,MAAYzL,GAAQ,SACtBpb,KAAK2G,IAAQ0gB,KAAa,IACjBR,MAAYzL,GAAQ,QAC7Bpb,IAAI2G,IAAQ0gB,IAAY7S,EAAQ,CAAC,IAEjCxU,IAAIwU,EAAQ,CAAC,GAEf6K,EAAI,SAASjc,GAAMpD,GAAGvB,CAAC,GACvB4gB,EAAI,QAAA;AAAA,EACN;AACF;AC1EO,MAAMiI,GAAe;AAAA,EAK1B,YAAYpjB,GAAY;AAJhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAkEA,IAAAA,EAAA,mBAAYshB,GAAS,MAAM;AACjC,YAAM,EAAE,oBAAAC,GAAoB,mBAAAC,MAAsB,KAAK,mBAAA;AACvD,WAAK,KAAK,sBAAsBD,CAAkB,GAClD,KAAK,KAAK,qBAAqBC,CAAiB;AAAA,IAClD,GAAG,GAAG;AAnEJ,SAAK,OAAOvjB,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,kBAAkB,KAAK,mBAAA,GAE5B,WAAW,MAAM;AACf,MAAK,OAAO,WACV,KAAK,UAAA;AAAA,IAET,CAAC,GACD,KAAK,UAAA;AAAA,EACP;AAAA,EAEO,qBAAyC;AAC9C,WAAO,KAAK,QAAQ,2BAChB,SAAS,cAAc,KAAK,QAAQ,uBAAuB,KAAK;AAAA,EAEtE;AAAA,EAEQ,YAAY;AAClB,SAAK,gBAAgB,iBAAiB,UAAU,KAAK,SAAS;AAAA,EAChE;AAAA,EAEO,cAAc;AACnB,SAAK,gBAAgB,oBAAoB,UAAU,KAAK,SAAS;AAAA,EACnE;AAAA,EAEO,sBAAsBO,GAAuC;AAClE,UAAM8D,IAAO9D,EAAQ,sBAAA,GACfijB,IACJ,KAAK,oBAAoB,WACrB,KAAK,IAAI,SAAS,gBAAgB,cAAc,OAAO,WAAW,IACxD,KAAK,gBAAiB,cAChCC,IACJ,KAAK,IAAIpf,EAAK,QAAQmf,CAAU,IAAI,KAAK,IAAInf,EAAK,KAAK,CAAC;AAC1D,WAAO;AAAA,MACL,oBAAoBof,IAAgB,IAAIA,IAAgB;AAAA,IAAA;AAAA,EAE5D;AAAA,EAEO,qBAAuC;AAC5C,UAAM5N,IAAW,KAAK,KAAK,YAAA,GACrB0N,IAA8B,CAAA;AACpC,QAAID,IAAqB,GACrBI,IAAwB;AAC5B,aAASvsB,IAAI,GAAGA,IAAI0e,EAAS,QAAQ1e,KAAK;AACxC,YAAMwsB,IAAU9N,EAAS1e,CAAC,GACpB,EAAE,oBAAAysB,EAAA,IAAuB,KAAK,sBAAsBD,CAAO;AAEjE,UAAID,KAAyB,CAACE,EAAoB;AAClD,MAAIA,KACFL,EAAkB,KAAKpsB,CAAC,GAEtBysB,IAAqBF,MACvBA,IAAwBE,GACxBN,IAAqBnsB;AAAA,IAEzB;AACA,WAAO;AAAA,MACL,oBAAAmsB;AAAA,MACA,mBAAAC;AAAA,IAAA;AAAA,EAEJ;AAOF;ACnFO,MAAMM,GAAkB;AAAA,EAoB7B,YAAY7jB,GAAY;AAlBP;AAAA,IAAA+B,EAAA,cAAe;AAEf;AAAA,IAAAA,EAAA,yBAKb,CAAC,IAAI,IAAI,IAAI,EAAE;AAEX,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAoCA,IAAAA,EAAA,oBAAa,MAAM;AAYzB,UAXA,KAAK,cAAc,IAEnB,KAAK,cACH,KAAK,8BAA8B,WAC/B,SAAS,gBAAgB,cACzB,KAAK,mBAAmB,aAC9B,KAAK,eACH,KAAK,8BAA8B,WAC/B,SAAS,gBAAgB,eACzB,KAAK,mBAAmB,cAE1B,EAAE,KAAK,8BAA8B,WAAW;AAClD,cAAMsC,IAAO,KAAK,mBAAmB,sBAAA;AACrC,aAAK,gBAAgBA;AAAA,MACvB;AAAA,IACF;AAEQ,IAAAtC,EAAA,kBAAW,MAAM;AACvB,WAAK,cAAc,IACnB,KAAK,UAAA;AAAA,IACP;AAEQ,IAAAA,EAAA,oBAAa,CAACX,MAAoB;AACxC,UAAI,CAAC,KAAK,eAAe,KAAK,aAAa,iBAAkB;AAC7D,UAAI,EAAE,GAAAtF,GAAG,GAAAvB,EAAA,IAAM6G;AACf,MAAI,KAAK,kBACPtF,IAAIA,IAAI,KAAK,cAAc,GAC3BvB,IAAIA,IAAI,KAAK,cAAc,IAEzBA,IAAI,KAAK,gBAAgB,CAAC,IAC5B,KAAK,WAAW2J,GAAc,EAAE,IACvB,KAAK,eAAe3J,KAAK,KAAK,gBAAgB,CAAC,IACxD,KAAK,WAAW2J,GAAc,IAAI,IACzBpI,IAAI,KAAK,gBAAgB,CAAC,IACnC,KAAK,WAAWoI,GAAc,IAAI,IACzB,KAAK,cAAcpI,IAAI,KAAK,gBAAgB,CAAC,IACtD,KAAK,WAAWoI,GAAc,KAAK,IAEnC,KAAK,UAAA;AAAA,IAET;AA1EE,SAAK,eAAelE,EAAK,SAAA;AAEzB,UAAM,EAAE,yBAAA8jB,EAAA,IAA4B9jB,EAAK,WAAA;AACzC,SAAK,qBAAqB8jB,KACtB,SAAS,cAAcA,CAAuB,KAAK,UAEvD,KAAK,0BAA0B,MAC/B,KAAK,cAAc,IACnB,KAAK,WAAW,IAEhB,KAAK,cAAc,GACnB,KAAK,eAAe,GACpB,KAAK,gBAAgB,MAErB,KAAK,UAAA;AAAA,EACP;AAAA,EAEQ,YAAY;AAClB,UAAMC,IAAsB,KAAK;AACjC,IAAAA,EAAU,iBAAiB,aAAa,KAAK,UAAU,GACvDA,EAAU,iBAAiB,aAAa,KAAK,UAAU,GACvDA,EAAU,iBAAiB,WAAW,KAAK,QAAQ,GACnD,SAAS,iBAAiB,cAAc,KAAK,QAAQ;AAAA,EACvD;AAAA,EAEO,cAAc;AACnB,UAAMA,IAAsB,KAAK;AACjC,IAAAA,EAAU,oBAAoB,aAAa,KAAK,UAAU,GAC1DA,EAAU,oBAAoB,aAAa,KAAK,UAAU,GAC1DA,EAAU,oBAAoB,WAAW,KAAK,QAAQ,GACtD,SAAS,oBAAoB,cAAc,KAAK,QAAQ;AAAA,EAC1D;AAAA,EA6CQ,MAAMjgB,GAA0B;AAEtC,UAAMigB,IACJ,KAAK,8BAA8B,WAC/B,SACA,KAAK,oBACLjoB,IACJ,KAAK,8BAA8B,WAC/B,OAAO,UACGioB,EAAW,YACrBxpB,IACJ,KAAK,8BAA8B,WAC/B,OAAO,UACGwpB,EAAW;AAC3B,IAAIjgB,MAAcI,GAAc,OAC9B6f,EAAU,SAASjoB,GAAGvB,IAAI,KAAK,IAAI,IAC1BuJ,MAAcI,GAAc,KACrC6f,EAAU,SAASjoB,GAAGvB,IAAI,KAAK,IAAI,IAC1BuJ,MAAcI,GAAc,OACrC6f,EAAU,SAASjoB,IAAI,KAAK,MAAMvB,CAAC,IAEnCwpB,EAAU,SAASjoB,IAAI,KAAK,MAAMvB,CAAC,GAErC,KAAK,0BAA0B,OAAO;AAAA,MACpC,KAAK,MAAM,KAAK,MAAMuJ,CAAS;AAAA,IAAA;AAAA,EAEnC;AAAA,EAEQ,WAAWA,GAA0B;AAC3C,IAAI,KAAK,aACT,KAAK,WAAW,IAChB,KAAK,MAAMA,CAAS;AAAA,EACtB;AAAA,EAEQ,YAAY;AAClB,IAAI,KAAK,4BACP,OAAO,qBAAqB,KAAK,uBAAuB,GACxD,KAAK,0BAA0B,MAC/B,KAAK,WAAW;AAAA,EAEpB;AACF;ACpIO,MAAMkgB,GAAc;AAAA,EAKzB,YAAYhkB,GAAY;AAJhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,oBAAoBoC,GAAuB;A7CrBjD,QAAAhD;A6CsBC,UAAM2O,IAASjI,GAAU1D,CAAO;AAChC,aAAShL,IAAI,GAAGA,IAAIgL,EAAQ,QAAQhL,KAAK;AACvC,YAAMiX,IAAKN,EAAO3W,CAAC;AACnB,eAASsD,IAAI2T,EAAG,OAAO,SAAS,GAAG3T,KAAK,GAAGA,KAAK;AAC9C,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChB,EAAE,SAAAupB,GAAS,UAAA7T,GAAU,UAAA8T,EAAA,IAAajU,GAClCkU,IAAc/T,IAAY6T,IAAU;AAC1C,YAAIE,MAAgBzpB,GAAG;AACrB,gBAAM0pB,IAAW/V,EAAG,OAAO,OAAO3T,GAAG,CAAC,EAAE,CAAC;AACzC,WAAA0E,IAAA2O,EAAOoW,CAAW,MAAlB,QAAA/kB,EAAqB,OAAO,OAAO8kB,GAAW,GAAGE;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,WAAOrW;AAAA,EACT;AAAA,EAEO,iBAAiC;AACtC,UAAM,EAAE,SAAAjH,GAAS,OAAAL,GAAO,SAAA2E,GAAS,SAAAC,MAAY,KAAK,KAC/C,YAAA,EACA,mBAAA;AACH,QAAI,CAACvE,EAAS,QAAO;AACrB,UAAM;AAAA,MACJ,eAAA6F;AAAA,MACA,cAAAR;AAAA,MACA,YAAAkY;AAAA,MACA,cAAAjY;AAAA,MACA,YAAAkY;AAAA,IAAA,IACE,KAAK,MAAM,SAAA,GAGTC,IAFsB,KAAK,KAAK,uBAAA,EACF9d,CAAM,EAChB;AAE1B,QAAI,CAACkG;AACH,aAAO,CAAC,CAAC4X,EAAUnZ,CAAQ,EAAE,OAAOC,CAAQ,CAAC,CAAC;AAEhD,QAAImZ,IAAUD,EAAUnY,CAAa,EAAE,OAAOD,CAAa,GACvDsY,IAAQF,EAAUD,CAAW,EAAE,OAAOD,CAAW;AAErD,KAAIG,EAAQ,IAAKC,EAAM,KAAMD,EAAQ,IAAKC,EAAM,OAE9C,CAACD,GAASC,CAAK,IAAI,CAACA,GAAOD,CAAO;AAEpC,UAAME,IAAgBF,EAAQ,UACxBG,IAAcF,EAAM,YAAaA,EAAM,UAAU,IACjDlO,IAAgBiO,EAAQ,UACxBI,IAAcH,EAAM,YAAaA,EAAM,UAAU,IAEjD7X,IAAkB,CAAA;AACxB,aAASxV,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC,GAChBkX,IAAgB,CAAA;AACtB,eAAS5T,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBmqB,IAAa5U,EAAG,UAChB6U,IAAa7U,EAAG;AACtB,QACE4U,KAAcH,KACdG,KAAcF,KACdG,KAAcvO,KACduO,KAAcF,KAEdtW,EAAO,KAAK2B,CAAE;AAAA,MAElB;AACA,MAAI3B,EAAO,UACT1B,EAAO,KAAK0B,CAAM;AAAA,IAEtB;AACA,WAAO1B,EAAO,SAASA,IAAS;AAAA,EAClC;AAAA,EAEQ,WACNuO,GACAlL,GACAoG,GACAC,GACA;A7ClGD,QAAAlX,GAAAgH;A6CmGC,UAAM,EAAE,OAAA9D,MAAU,KAAK;AACvB,IAAA6Y,EAAI,KAAA;AACJ,UAAM1Y,IAAQwN,EAAG,QAAS3N,GACpBQ,IAASmN,EAAG,SAAU3N,GACtBxG,IAAI,KAAK,MAAMmU,EAAG,IAAK3N,IAAQ+T,CAAM,GACrC9b,IAAI,KAAK,MAAM0V,EAAG,IAAK3N,IAAQgU,CAAM;AAC3C,IAAA6E,EAAI,UAAA,IAEA/b,IAAA6Q,EAAG,eAAH,QAAA7Q,EAAe,SAAS2lB,GAAQ,aAClC5J,EAAI,OAAOrf,IAAI2G,GAAOlI,CAAC,GACvB4gB,EAAI,OAAOrf,GAAGvB,IAAIuI,CAAM,KAGtBsD,IAAA6J,EAAG,eAAH,QAAA7J,EAAe,SAAS2e,GAAQ,UAClC5J,EAAI,OAAOrf,GAAGvB,CAAC,GACf4gB,EAAI,OAAOrf,IAAI2G,GAAOlI,IAAIuI,CAAM,IAElCqY,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,YACNA,GACA5a,GACA8V,GACAC,GACA;A7C7HD,QAAAlX;A6C8HC,UAAM;AAAA,MACJ,UAAA4lB;AAAA,MACA,QAAAjX;AAAA,MACA,YAAAkX;AAAA,MACA,aAAAC;AAAA,MACA,aAAAC,IAAc;AAAA,MACd,qBAAAC;AAAA,IAAA,IACE7kB;AACJ,QAAI,CAACykB,KAAY,CAACjX,EAAQ;AAC1B,UAAM;AAAA,MACJ,OAAAzL;AAAA,MACA,OAAO,EAAE,oBAAA+iB,EAAA;AAAA,IAAmB,IAC1B,KAAK,SACHC,IAAWN,EAAS,QACpBO,IAAWxX,EAAO,QAClByX,IAAYN,KAAeG,GAC3BI,IAAYN,GACZO,IAAaN,KAAuBK,GACpCE,IAAYV,MAAeW,GAAY,OAAO,WAAW,SACzDC,IAAUZ,MAAeW,GAAY,OACrCE,IAAab,MAAeW,GAAY,UACxCG,IAAad,MAAeW,GAAY,UACxCI,IAAY,CAACH,KAAW,CAACE,GACzBE,IAAY,CAACJ,KAAW,CAACC,GAEzBI,IAAY,CAAC5uB,MACbA,MAAM,WAAiB,IACvBA,MAAM,UAAgB,IACtBA,MAAM,WAAiB,IACvBA,MAAM,WAAiB,IACpB,GAGH6uB,IAAgB,CAACC,MAAc;AACnC,YAAM5rB,IAAI,OAAO4rB,KAAA,gBAAAA,EAAM,KAAK,GACtB3jB,IAAQ,OAAO,SAASjI,CAAC,IAAIA,IAAIirB,GACjCjjB,IAAQ,QAAO4jB,KAAA,gBAAAA,EAAM,UAAU,YAAYA,EAAK,QAAQA,EAAK,QAAQZ,GACrEa,MACJD,KAAA,gBAAAA,EAAM,WAAU,aAAYA,KAAA,gBAAAA,EAAM,WAAU,aAAYA,KAAA,gBAAAA,EAAM,WAAU,WACpEA,EAAK,QACLT;AACN,aAAO,EAAE,OAAAljB,GAAO,OAAAD,GAAO,OAAA6jB,GAAA;AAAA,IACzB,GAEMC,IAAW,CAACjvB,GAAQpG,MACnBoG,IACApG,IACDoG,EAAE,UAAUpG,EAAE,QAAcoG,EAAE,QAAQpG,EAAE,QAAQoG,IAAIpG,IACpDoG,EAAE,UAAUpG,EAAE,QAAci1B,EAAU7uB,EAAE,KAAK,KAAK6uB,EAAUj1B,EAAE,KAAK,IAAIoG,IAAIpG,IACxEoG,IAHQA,IADApG,GAQXs1B,wBAAa,IAAA,GAEbC,IAAS,CAAC/oB,GAAagpB,MAAa;AACxC,YAAMC,IAAQH,EAAO,IAAI9oB,CAAG;AAC5B,UAAI,CAACipB,GAAO;AACV,QAAAH,EAAO,IAAI9oB,GAAKgpB,CAAG;AACnB;AAAA,MACF;AACA,YAAME,IAASL,EAASI,GAAOD,CAAG;AAClC,MAAAF,EAAO,IAAI9oB,GAAKkpB,CAAM;AAAA,IACxB,GAEMC,IAAO,CAACC,GAAYC,GAAYvsB,GAAW6rB,MAAc;AAC7D,YAAMW,KAAM,KAAK,IAAIF,GAAIC,CAAE,GACrBE,IAAM,KAAK,IAAIH,GAAIC,CAAE,GACrBrpB,IAAM,KAAKlD,CAAC,IAAIwsB,EAAG,IAAIC,CAAG,IAC1BpwB,KAAIuvB,EAAcC,CAAI;AAC5B,MAAAI,EAAO/oB,GAAK,EAAE,IAAIspB,IAAK,IAAIxsB,GAAG,IAAIysB,GAAK,IAAIzsB,GAAG,GAAG3D,GAAA,CAAG;AAAA,IACtD,GAEMqwB,IAAO,CAACnrB,GAAWorB,GAAYC,GAAYf,MAAc;AAC7D,YAAMgB,KAAM,KAAK,IAAIF,GAAIC,CAAE,GACrBE,IAAM,KAAK,IAAIH,GAAIC,CAAE,GACrB1pB,IAAM,KAAK3B,CAAC,IAAIsrB,EAAG,IAAIC,CAAG,IAC1BzwB,KAAIuvB,EAAcC,CAAI;AAC5B,MAAAI,EAAO/oB,GAAK,EAAE,IAAI3B,GAAG,IAAIsrB,IAAK,IAAItrB,GAAG,IAAIurB,GAAK,GAAGzwB,GAAA,CAAG;AAAA,IACtD,GAEM0wB,IAAkB,CAACC,OAA0B;AAAA,MACjD,OAAOA,IAAc7B,IAAaD;AAAA,MAClC,OAAOD;AAAA,MACP,OAAOG;AAAA,IAAA,IAGH6B,IAAY,CAACvX,GAASwX,GAAgBC,MAAyB;A7CrNtE,UAAAtoB,IAAAgH;A6CsNG,YAAMuhB,KAAYvoB,KAAA6Q,EAAG,gBAAH,gBAAA7Q,GAAiBqoB;AACnC,aAAIE,OACAvhB,IAAA6J,EAAG,gBAAH,QAAA7J,EAAgB,SAASqhB,KACpB;AAAA,QACL,OAAOhC;AAAA,QACP,OAAOD;AAAA,QACP,OAAOG;AAAA,MAAA,IAGJ+B;AAAA,IACT;AAEA,IAAAvM,EAAI,KAAA,GACJA,EAAI,UAAU,KAAK,GAAG;AAEtB,aAAS/jB,IAAI,GAAGA,IAAI2W,EAAO,QAAQ3W,KAAK;AACtC,YAAMiX,IAAKN,EAAO3W,CAAC;AACnB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,SAAI0E,IAAA6Q,EAAG,eAAH,QAAA7Q,EAAe,UACjB,KAAK,WAAW+b,GAAKlL,GAAIoG,GAAQC,CAAM;AAGzC,cAAMhS,KAAO,KAAK,MAAM2L,EAAG,IAAK3N,IAAQ+T,CAAM,GACxC7R,IAAM,KAAK,MAAMyL,EAAG,IAAK3N,IAAQgU,CAAM,GACvC/R,IAAQ,KAAK,OAAO0L,EAAG,IAAKA,EAAG,SAAU3N,IAAQ+T,CAAM,GACvD5R,KAAS,KAAK,OAAOwL,EAAG,IAAKA,EAAG,UAAW3N,IAAQgU,CAAM,GAEzDsR,KAAc3X,EAAG,aAAa,GAC9B4X,IAAe5X,EAAG,WAAYA,EAAG,YAAYqV,GAC7CwC,IAAa7X,EAAG,aAAa,GAC7B8X,IAAgB9X,EAAG,WAAYA,EAAG,YAAYsV,GAE9CyC,KAAchC,KAAa8B,IAAaR,EAAgB,EAAI,IAAI,MAChEW,KAAiBjC,KAAa+B,IAAgBT,EAAgB,EAAI,IAAI,MACtEY,KAAelC,KAAa4B,KAAcN,EAAgB,EAAI,IAAI,MAClEa,KAAgBnC,KAAa6B,IAAeP,EAAgB,EAAI,IAAI,MAEpEc,KACJnC,KAAahW,EAAG,WAAYA,EAAG,UAAUqV,IACrCgC,EAAgB,EAAK,IACrB,MACAe,IACJpC,KAAahW,EAAG,WAAYA,EAAG,UAAUsV,IACrC+B,EAAgB,EAAK,IACrB,MAEAgB,KAAUd,EAAUvX,GAAIsY,GAAS,KAAKP,EAAW,GACjDQ,KAAahB,EAAUvX,GAAIsY,GAAS,QAAQN,MAAkBI,CAAmB,GACjFI,KAAWjB,EAAUvX,GAAIsY,GAAS,MAAML,EAAY,GACpDQ,KAAYlB,EAAUvX,GAAIsY,GAAS,OAAOJ,MAAiBC,EAAkB;AAEnF,QAAIE,MAAWA,GAAQ,UAAU,YAAahkB,IAAMC,GAAOC,GAAK8jB,EAAO,GACnEE,MAAcA,GAAW,UAAU,YAAalkB,IAAMC,GAAOE,IAAQ+jB,EAAU,GAC/EC,MAAYA,GAAS,UAAU,YAAankB,IAAME,GAAKC,IAAQgkB,EAAQ,GACvEC,MAAaA,GAAU,UAAU,YAAankB,GAAOC,GAAKC,IAAQikB,EAAS;AAAA,MACjF;AAAA,IACF;AAEA,UAAMC,IAAW,CAACrxB,MAAW,GAAGA,EAAE,KAAK,IAAIA,EAAE,KAAK,IAAIA,EAAE,KAAK,IACvDsxB,wBAAa,IAAA;AACnB,eAAWnC,KAAOF,EAAO,UAAU;AACjC,YAAMvrB,IAAI2tB,EAASlC,CAAG,GAChBoC,IAAMD,EAAO,IAAI5tB,CAAC;AACxB,MAAI6tB,IAAKA,EAAI,KAAKpC,CAAG,IAChBmC,EAAO,IAAI5tB,GAAG,CAACyrB,CAAG,CAAC;AAAA,IAC1B;AAEA,eAAW,CAACzrB,GAAG8tB,CAAI,KAAKF,GAAQ;AAC9B,YAAM,CAACpmB,GAAOumB,GAAU1C,EAAK,IAAIrrB,EAAE,MAAM,GAAG,GACtCguB,IAAK,OAAOD,CAAQ;AAC1B,MAAA5N,EAAI,cAAc3Y;AAClB,YAAMymB,KAAe,OAAO,SAASD,CAAE,IAAIA,IAAKvD,KAAanjB;AAC7D,UAAI+jB,OAAU,UAAU;AACtB,cAAM6C,KAAc,KAAK,IAAI,MAAM5mB,GAAO,KAAK,MAAO2mB,IAAc,IAAK,EAAE,IAAI,EAAE,GAC3EE,KAAM,KAAK,IAAI,MAAM7mB,GAAO,KAAK,MAAM4mB,KAAc,MAAM,EAAE,IAAI,EAAE,GACnE1V,KAAU0V,KAAcC,MAAO;AACrC,QAAAhO,EAAI,YAAY,EAAE,GAClBA,EAAI,YAAY+N,IAChB/N,EAAI,UAAA;AACJ,mBAAW7jB,KAAKwxB,GAAM;AACpB,gBAAMM,IAAM9xB,EAAE,OAAOA,EAAE,IACjB+xB,KAAM/xB,EAAE,OAAOA,EAAE;AACvB,UAAI8xB,KACFjO,EAAI,OAAO7jB,EAAE,IAAIA,EAAE,KAAKkc,CAAM,GAC9B2H,EAAI,OAAO7jB,EAAE,IAAIA,EAAE,KAAKkc,CAAM,GAC9B2H,EAAI,OAAO7jB,EAAE,IAAIA,EAAE,KAAKkc,CAAM,GAC9B2H,EAAI,OAAO7jB,EAAE,IAAIA,EAAE,KAAKkc,CAAM,KACrB6V,MACTlO,EAAI,OAAO7jB,EAAE,KAAKkc,GAAQlc,EAAE,EAAE,GAC9B6jB,EAAI,OAAO7jB,EAAE,KAAKkc,GAAQlc,EAAE,EAAE,GAC9B6jB,EAAI,OAAO7jB,EAAE,KAAKkc,GAAQlc,EAAE,EAAE,GAC9B6jB,EAAI,OAAO7jB,EAAE,KAAKkc,GAAQlc,EAAE,EAAE,MAE9B6jB,EAAI,OAAO7jB,EAAE,IAAIA,EAAE,EAAE,GACrB6jB,EAAI,OAAO7jB,EAAE,IAAIA,EAAE,EAAE;AAAA,QAEzB;AACA,QAAA6jB,EAAI,OAAA;AAAA,MACN,OAAO;AACL,QAAAA,EAAI,YAAY8N,GACZ5C,OAAU,WAAUlL,EAAI,YAAY,CAAC,IAAI7Y,GAAO,IAAIA,CAAK,CAAC,IACrD+jB,OAAU,WAAUlL,EAAI,YAAY,CAAC,IAAI7Y,GAAO,IAAIA,CAAK,CAAC,IAC9D6Y,EAAI,YAAY,EAAE,GACvBA,EAAI,UAAA;AACJ,mBAAW7jB,MAAKwxB;AACd,UAAA3N,EAAI,OAAO7jB,GAAE,IAAIA,GAAE,EAAE,GACrB6jB,EAAI,OAAO7jB,GAAE,IAAIA,GAAE,EAAE;AAEvB,QAAA6jB,EAAI,OAAA;AAAA,MACN;AAAA,IACF;AAEA,IAAAA,EAAI,YAAY,EAAE,GAClBA,EAAI,UAAU,MAAM,IAAI,GACxBA,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,qBACNA,GACA5a,GACA8V,GACAC,GACA;AACA,UAAM,EAAE,QAAAvI,MAAWxN;AACnB,QAAI,CAACwN,EAAQ;AACb,UAAM,EAAE,OAAAzL,MAAU,KAAK;AACvB,aAASlL,IAAI,GAAGA,IAAI2W,EAAO,QAAQ3W,KAAK;AACtC,YAAMiX,IAAKN,EAAO3W,CAAC;AACnB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,YAAI,CAACuV,EAAG,gBAAiB;AACzB,QAAAkL,EAAI,KAAA;AACJ,cAAM1Y,IAAQwN,EAAG,QAAS3N,GACpBQ,IAASmN,EAAG,SAAU3N,GACtBxG,IAAI,KAAK,MAAMmU,EAAG,IAAK3N,IAAQ+T,CAAM,GACrC9b,IAAI,KAAK,MAAM0V,EAAG,IAAK3N,IAAQgU,CAAM;AAC3C,QAAA6E,EAAI,YAAYlL,EAAG,iBACnBkL,EAAI,SAASrf,GAAGvB,GAAGkI,GAAOK,CAAM,GAChCqY,EAAI,QAAA;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEO,cAAc5a,GAA2B;AAC9C,WAAOA,EAAQ,SAAU,OAAO,CAAC0X,GAAKC,MAAQD,IAAMC,EAAI,OAAO,CAAC;AAAA,EAClE;AAAA,EAEO,eAAe3X,GAA2B;AAC/C,UAAMwN,IAASxN,EAAQ;AACvB,WAAKwN,KAAA,QAAAA,EAAQ,SACN,KAAK,oBAAoBA,GAAQ,CAAC,EAAE;AAAA,MACzC,CAACkK,GAAKC,MAAQD,IAAMC,EAAI;AAAA,MACxB;AAAA,IAAA,IAH0B;AAAA,EAK9B;AAAA,EAEO,sBAAsBnK,GAAemW,GAA0B;AACpE,WAAO,KAAK,oBAAoBnW,GAAQmW,CAAQ,EAAE;AAAA,MAChD,CAACjM,GAAKC,MAAQD,IAAMC,EAAI;AAAA,MACxB;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEO,oBAAoBnK,GAAemW,GAAyB;AACjE,UAAMjmB,IAAc,CAAA;AACpB,aAASxH,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,YAAM6X,IAASP,EAAOtX,CAAC,EAAE;AACzB,eAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,cAAMuV,IAAK3B,EAAO5T,CAAC,GACb4uB,IAAMrZ,EAAG,UACTsZ,IAAMD,IAAMrZ,EAAG,UAAU;AAC/B,QAAIiU,KAAYoF,KAAOpF,KAAYqF,KACjCtrB,EAAK,KAAKgS,CAAE;AAAA,MAEhB;AAAA,IACF;AACA,WAAOhS;AAAA,EACT;AAAA,EAEO,oBAAoB8P,GAAeqC,GAAkB;AAC1D,UAAMnS,IAAc,CAAA;AACpB,aAASxH,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,YAAM6X,IAASP,EAAOtX,CAAC,EAAE;AACzB,eAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,cAAMuV,IAAK3B,EAAO5T,CAAC,GACb4uB,IAAMrZ,EAAG,UACTsZ,IAAMD,IAAMrZ,EAAG,UAAU;AAC/B,QAAIG,KAAYkZ,KAAOlZ,KAAYmZ,KACjCtrB,EAAK,KAAKgS,CAAE;AAAA,MAEhB;AAAA,IACF;AACA,WAAOhS;AAAA,EACT;AAAA,EAEO,kBAAkBsC,GAAmB;AAC1C,UAAM,EAAE,UAAAykB,GAAU,QAAAjX,EAAA,IAAWxN;AAC7B,QAAI,CAACykB,KAAY,CAACjX,EAAQ;AAC1B,UAAMuX,IAAWN,EAAS,QACpBO,IAAWxX,EAAO;AACxB,QAAI,CAACuX,KAAY,CAACC,EAAU;AAE5B,UAAMiE,IAA0B,IAAI,MAAMlE,CAAQ,EAAE,KAAK,CAAC;AAC1D,QAAImE,IAAY;AAChB,aAAS9yB,IAAI,GAAGA,IAAI2uB,GAAU3uB;AAC5B,MAAA6yB,EAAc7yB,CAAC,IAAI8yB,GACnBA,KAAazE,EAASruB,CAAC,EAAE;AAG3B,UAAM+yB,IAA0B,IAAI,MAAMnE,CAAQ,EAAE,KAAK,CAAC;AAC1D,QAAIoE,IAAY;AAChB,aAASlzB,IAAI,GAAGA,IAAI8uB,GAAU9uB;AAC5B,MAAAizB,EAAcjzB,CAAC,IAAIkzB,GACnBA,KAAa5b,EAAOtX,CAAC,EAAE;AAGzB,UAAMmzB,IAA4B,IAAI,MAAMtE,CAAQ,EAAE,KAAK,CAAC,GACtDuE,IAAa,CAACnF,GAAuBoF,MAAoB;AAE7D,UADIpF,IAAgB,KAChBA,IAAgBoF,IAAUxE,EAAU,QAAO;AAC/C,eAAS3uB,IAAI+tB,GAAe/tB,IAAI+tB,IAAgBoF,GAASnzB;AACvD,YAAIizB,EAAgBjzB,CAAC,IAAI,EAAG,QAAO;AAErC,aAAO;AAAA,IACT;AAEA,aAASS,IAAI,GAAGA,IAAImuB,GAAUnuB,KAAK;AACjC,eAAST,IAAI,GAAGA,IAAI2uB,GAAU3uB;AAC5B,QAAIizB,EAAgBjzB,CAAC,IAAI,MAAGizB,EAAgBjzB,CAAC,KAAK;AAGpD,YAAM0X,IAAKN,EAAO3W,CAAC;AACnB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBovB,IAAU,KAAK,IAAI,GAAG7Z,EAAG,WAAW,CAAC,GACrCgU,IAAU,KAAK,IAAI,GAAGhU,EAAG,WAAW,CAAC;AAE3C,YAAIiU,IAAW,GACX6F,IAAU;AACd,cAAMC,IAAW,KAAK,IAAI,GAAG1E,IAAWwE,CAAO;AAC/C,iBAASpF,IAAgB,GAAGA,KAAiBsF,GAAUtF;AACrD,cAAImF,EAAWnF,GAAeoF,CAAO,GAAG;AACtC,YAAA5F,IAAWQ,GACXqF,IAAU;AACV;AAAA,UACF;AAEF,QAAKA,MACH7F,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIoB,IAAW,GAAGA,IAAWwE,CAAO,CAAC;AAGnE,iBAASnzB,IAAIutB,GAAUvtB,IAAIutB,IAAW4F,KAAWnzB,IAAI2uB,GAAU3uB;AAC7D,UAAAizB,EAAgBjzB,CAAC,IAAI,KAAK,IAAIizB,EAAgBjzB,CAAC,GAAGstB,CAAO;AAG3D,YAAIxhB,IAAQ;AACZ,iBAASsK,IAAM,GAAGA,IAAM+c,GAAS/c,KAAO;AACtC,gBAAMkd,IAAUjF,EAASd,IAAWnX,CAAG;AACvC,cAAI,CAACkd,EAAS;AACd,UAAAxnB,KAASwnB,EAAQ;AAAA,QACnB;AAEA,YAAInnB,IAAS;AACb,iBAASgK,IAAM,GAAGA,IAAMmX,GAASnX,KAAO;AACtC,gBAAMod,IAAQnc,EAAO3W,IAAI0V,CAAG;AAC5B,cAAI,CAACod,EAAO;AACZ,UAAApnB,KAAUonB,EAAM;AAAA,QAClB;AAEA,cAAMC,IAAc9b,EAAG,OAAO,SAAS,MAAM3T,GACvC0vB,IAAchzB,IAAI6sB,MAAYsB,GAC9B8E,IAAWF,KAAeC,KAAelG,IAAW4F,MAAYxE;AAEtE,QAAArV,EAAG,cAAcka,GACjBla,EAAG,cAAcma,GACjBna,EAAG,WAAWoa,GAEdpa,EAAG,IAAIuZ,EAActF,CAAQ,GAC7BjU,EAAG,IAAIyZ,EAActyB,CAAC,GACtB6Y,EAAG,QAAQxN,GACXwN,EAAG,SAASnN,GACZmN,EAAG,WAAW7Y,GACd6Y,EAAG,WAAWiU,GACdjU,EAAG,UAAU7Y,GACb6Y,EAAG,UAAUvV;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEO,UACLygB,GACA5a,GACA8V,GACAC,GACA;AACA,UAAM,EAAE,OAAAhU,GAAO,YAAAgoB,GAAY,YAAAC,EAAA,IAAe,KAAK,SACzC,EAAE,MAAA5oB,GAAM,QAAAoM,EAAA,IAAWxN;AACzB,QAAI,CAACwN,KAAUpM,MAAST,EAAY,MAAO;AAC3C,UAAM;AAAA,MACJ,eAAAyL;AAAA,MACA,cAAAR;AAAA,MACA,YAAAkY;AAAA,MACA,cAAAjY;AAAA,MACA,YAAAkY;AAAA,IAAA,IACE,KAAK,MAAM,SAAA;AAEf,QAAI,CAAC3X,EAAe;AACpB,QAAI6X,IAAUzW,EAAO3B,CAAa,EAAE,OAAOD,CAAa,GACpDsY,IAAQ1W,EAAOuW,CAAW,EAAE,OAAOD,CAAW;AAElD,KAAIG,EAAQ,IAAKC,EAAM,KAAMD,EAAQ,IAAKC,EAAM,OAE9C,CAACD,GAASC,CAAK,IAAI,CAACA,GAAOD,CAAO;AAEpC,UAAME,IAAgBF,EAAQ,UACxBG,IAAcF,EAAM,YAAaA,EAAM,UAAU,IACjDlO,IAAgBiO,EAAQ,UACxBI,IAAcH,EAAM,YAAaA,EAAM,UAAU;AACvD,IAAAtJ,EAAI,KAAA;AACJ,aAAS/jB,IAAI,GAAGA,IAAI2W,EAAO,QAAQ3W,KAAK;AACtC,YAAMiX,IAAKN,EAAO3W,CAAC;AACnB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBmqB,IAAa5U,EAAG,UAChB6U,IAAa7U,EAAG;AACtB,YACE4U,KAAcH,KACdG,KAAcF,KACdG,KAAcvO,KACduO,KAAcF,GACd;AACA,gBAAM9oB,IAAImU,EAAG,IAAK3N,GACZ/H,IAAI0V,EAAG,IAAK3N,GACZG,IAAQwN,EAAG,QAAS3N,GACpBQ,IAASmN,EAAG,SAAU3N;AAC5B,UAAA6Y,EAAI,cAAcmP,GAClBnP,EAAI,YAAYoP,GAChBpP,EAAI,SAASrf,IAAIua,GAAQ9b,IAAI+b,GAAQ7T,GAAOK,CAAM;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AACA,IAAAqY,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,OACLA,GACA5a,GACA8V,GACAC,GACA;AACA,SAAK,qBAAqB6E,GAAK5a,GAAS8V,GAAQC,CAAM,GACtD,KAAK,YAAY6E,GAAK5a,GAAS8V,GAAQC,CAAM;AAAA,EAC/C;AACF;ACxiBO,MAAMkU,GAAU;AAAA,EAiCrB,YAAYxqB,GAAY;AA/BP;AAAA,IAAA+B,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,wBAAiB;AAEjB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,gCACf,KAAK,kBAAkB,KAAK,iBAAiB,KAAK,uBAAuB;AAE1D;AAAA,IAAAA,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,6BAAsB;AAE/B,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,SAASA,EAAK,QAAA,GACnB,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,YAAYA,EAAK,aAAA,GAEtB,KAAK,mBAAmB,MACxB,KAAK,gBAAgB,MACrB,KAAK,gBAAgB,MACrB,KAAK,qBAAqB,MAC1B,KAAK,mBAAmB,MACxB,KAAK,sBAAsB,MAC3B,KAAK,aAAa,MAClB,KAAK,aAAa,GAClB,KAAK,aAAa;AAAA,EACpB;AAAA,EAEO,UAAU;A9CpEhB,QAAAZ,GAAAgH,GAAAuC,GAAAC,GAAA5S,GAAA6S;A8CqEC,KAAAzJ,IAAA,KAAK,qBAAL,QAAAA,EAAuB,WACvBgH,IAAA,KAAK,kBAAL,QAAAA,EAAoB,WACpBuC,IAAA,KAAK,kBAAL,QAAAA,EAAoB,WACpBC,IAAA,KAAK,uBAAL,QAAAA,EAAyB,WACzB5S,IAAA,KAAK,qBAAL,QAAAA,EAAuB,WACvB6S,IAAA,KAAK,wBAAL,QAAAA,EAA0B,UAC1B,KAAK,mBAAmB,MACxB,KAAK,gBAAgB,MACrB,KAAK,gBAAgB,MACrB,KAAK,qBAAqB,MAC1B,KAAK,mBAAmB,MACxB,KAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEO,SAAS;AACd,UAAM,EAAE,SAAA/B,GAAS,OAAAL,GAAO,SAAA2E,GAAS,SAAAC,MAC/B,KAAK,SAAS,mBAAA;AAChB,QAAI,CAACvE,EAAS;AAEd,SAAK,QAAA;AACL,UAAM3H,IAAc,KAAK,KAAK,uBAAA,GACxB6H,IAAe,KAAK,SAAS,wBAAA,GAC7BzG,IAAUpB,EAAYsH,CAAM;AAElC,QAAIlG,EAAQ,qBAAqB,CAAC,KAAK,KAAK,eAAgB;AAE5D,UAAM,EAAE,OAAA+B,MAAU,KAAK,SACjBuD,IAAWmB,EAAaP,CAAM,GAC9B,EAAE,UAAAue,GAAU,QAAAjX,EAAA,IAAWxN,GACvB;AAAA,MACJ,YAAY,EAAE,SAAA0C,EAAA;AAAA,IAAQ,IACpB4C,GACE/C,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA,GACpB0nB,IAAgB,KAAK,KAAK,UAAA,KAAe3nB,IAASC,IAClD2nB,IAASznB,EAAQ,CAAC,GAClB0nB,IAAS1nB,EAAQ,CAAC,IAAIwnB,GACtBxa,IAAK1P,EAAQ,OAAQ6K,CAAQ,EAAE,OAAOC,CAAQ,GAC9C+E,IAAWH,EAAG,UACdiU,IAAWjU,EAAG,UACd2a,IAAcrqB,EAAQ,SAAU+B,GAChCuoB,IAAatqB,EAAQ,QAAS+B,GAE9BwoB,IAAiB,SAAS,cAAc,KAAK;AACnD,IAAAA,EAAe,UAAU,IAAI,GAAG7oB,CAAa,qBAAqB,GAClE6oB,EAAe,MAAM,SAAS,GAAGF,IAActoB,CAAK,IACpDwoB,EAAe,MAAM,OAAO,GAAGJ,CAAM,MACrCI,EAAe,MAAM,MAAM,GAAGH,CAAM,MACpCG,EAAe,MAAM,YAAY,cAC/B,KAAK,sBAAsBxoB,CAC7B,OAAO,CAAC,KAAK,sBAAsBA,CAAK,OAExCwoB,EAAe,UAAU,MAAM;AAC7B,WAAK,KAAK,gBAAA,EAAkB,eAAA;AAAA,IAC9B,GACA,KAAK,UAAU,OAAOA,CAAc,GACpC,KAAK,qBAAqBA;AAE1B,UAAMC,IAAgBhd,EAAQ,IAAI,CAAAM,MAAMA,EAAG,MAAM,GAC3C2c,IAAe,SAAS,cAAc,KAAK;AACjD,IAAAA,EAAa,UAAU,IAAI,GAAG/oB,CAAa,kBAAkB,GAC7D+oB,EAAa,MAAM,YAAY,eAC7B,KAAK,iBAAiB1oB,CACxB;AACA,aAAS7L,IAAI,GAAGA,IAAIs0B,EAAc,QAAQt0B,KAAK;AAC7C,YAAMw0B,IAAYF,EAAct0B,CAAC,IAAI6L,GAC/B4oB,IAAU,SAAS,cAAc,KAAK;AAC5C,MAAAA,EAAQ,UAAU,IAAI,GAAGjpB,CAAa,wBAAwB,GAC1DxL,MAAM2Z,KACR8a,EAAQ,UAAU,IAAI,QAAQ,GAGhCA,EAAQ,UAAU,MAAM;AACtB,cAAM5c,IAAS,KAAK,KACjB,mBACA,oBAAoBP,GAAStX,CAAC,GAC3B00B,IAAU7c,EAAO,CAAC,GAClBH,IAASG,EAAOA,EAAO,SAAS,CAAC;AACvC,aAAK,SAAS,mBAAmB;AAAA,UAC/B,OAAA7H;AAAA,UACA,SAAS;AAAA,UACT,SAAS0kB,EAAQ;AAAA,UACjB,SAASA,EAAQ;AAAA,UACjB,SAAS5qB,EAAQ;AAAA,QAAA,CAClB,GACD,KAAK,MAAM;AAAA,UACT;AAAA,UACA;AAAA,UACAA,EAAQ;AAAA,UACR4qB,EAAQ;AAAA,UACRhd,EAAO;AAAA,UACPgd,EAAQ;AAAA,UACRhd,EAAO;AAAA,QAAA,GAET,KAAK,KAAK,OAAO;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,iBAAiB;AAAA,QAAA,CAClB,GACD,KAAK,iBAAiB6c,GAAcv0B,CAAC;AAAA,MACvC;AACA,YAAM20B,IAAgB,SAAS,cAAc,KAAK;AAClD,MAAAA,EAAc,UAAU,IAAI,GAAGnpB,CAAa,qBAAqB,GAEjEmpB,EAAc,cAAc,CAAAhqB,MAAO;AACjC,aAAK,WAAW;AAAA,UACd,KAAAA;AAAA,UACA,SAAAb;AAAA,UACA,OAAO9J;AAAA,UACP,OAAO40B,GAAW;AAAA,QAAA,CACnB;AAAA,MACH,GACAH,EAAQ,OAAOE,CAAa,GAC5BF,EAAQ,MAAM,SAAS,GAAGD,CAAS,MACnCD,EAAa,OAAOE,CAAO;AAAA,IAC7B;AACA,IAAAF,EAAa,MAAM,OAAO,GAAGN,CAAM,MACnCM,EAAa,MAAM,MAAM,GAAGL,CAAM,MAClC,KAAK,UAAU,OAAOK,CAAY,GAClC,KAAK,mBAAmBA;AAExB,UAAMM,IAAY,SAAS,cAAc,KAAK;AAC9C,IAAAA,EAAU,UAAU,IAAI,GAAGrpB,CAAa,yBAAyB,GACjEqpB,EAAU,MAAM,OAAO,GAAGZ,IAASG,IAAa,CAAC,MACjDS,EAAU,MAAM,MAAM,GAAGX,IAASC,CAAW,MAC7CU,EAAU,MAAM,YAAY,mBAAmB,KAAK,uBAAuBhpB,CAAK,OAEhFgpB,EAAU,UAAU,MAAM;AACxB,WAAK,SAAS,mBAAmB;AAAA,QAC/B,OAAA7kB;AAAA,QACA,SAAS;AAAA,QACT,SAASsH,EAAQ,SAAS;AAAA,QAC1B,SAAS;AAAA,QACT,SAASxN,EAAQ;AAAA,MAAA,CAClB,GACD,KAAK,KAAK,gBAAA,EAAkB,qBAAA;AAAA,IAC9B,GACA,KAAK,UAAU,OAAO+qB,CAAS,GAC/B,KAAK,gBAAgBA;AAErB,UAAMC,IAAevG,EAAU,IAAI,CAAAjY,MAAOA,EAAI,KAAK,GAC7Cye,IAAe,SAAS,cAAc,KAAK;AACjD,IAAAA,EAAa,UAAU,IAAI,GAAGvpB,CAAa,kBAAkB,GAC7DupB,EAAa,MAAM,YAAY,eAC7B,KAAK,iBAAiBlpB,CACxB;AACA,aAAS3L,IAAI,GAAGA,IAAI40B,EAAa,QAAQ50B,KAAK;AAC5C,YAAM80B,IAAWF,EAAa50B,CAAC,IAAI2L,GAC7B2nB,IAAU,SAAS,cAAc,KAAK;AAC5C,MAAAA,EAAQ,UAAU,IAAI,GAAGhoB,CAAa,wBAAwB,GAC1DtL,MAAMutB,KACR+F,EAAQ,UAAU,IAAI,QAAQ,GAGhCA,EAAQ,UAAU,MAAM;AACtB,cAAM3b,IAAS,KAAK,KACjB,mBACA,oBAAoBP,GAASpX,CAAC,GAC3Bw0B,IAAU7c,EAAO,CAAC,GAClBH,IAASG,EAAOA,EAAO,SAAS,CAAC;AACvC,aAAK,SAAS,mBAAmB;AAAA,UAC/B,OAAA7H;AAAA,UACA,SAAS;AAAA,UACT,SAAS0kB,EAAQ;AAAA,UACjB,SAASA,EAAQ;AAAA,UACjB,SAAS5qB,EAAQ;AAAA,QAAA,CAClB,GACD,KAAK,MAAM;AAAA,UACT;AAAA,UACA;AAAA,UACAA,EAAQ;AAAA,UACR4qB,EAAQ;AAAA,UACRhd,EAAO;AAAA,UACPgd,EAAQ;AAAA,UACRhd,EAAO;AAAA,QAAA,GAET,KAAK,KAAK,OAAO;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,iBAAiB;AAAA,QAAA,CAClB,GACD,KAAK,iBAAiBqd,GAAc70B,CAAC;AAAA,MACvC;AACA,YAAM+0B,IAAgB,SAAS,cAAc,KAAK;AAClD,MAAAA,EAAc,UAAU,IAAI,GAAGzpB,CAAa,qBAAqB,GAEjEypB,EAAc,cAAc,CAAAtqB,MAAO;AACjC,aAAK,WAAW;AAAA,UACd,KAAAA;AAAA,UACA,SAAAb;AAAA,UACA,OAAO5J;AAAA,UACP,OAAO00B,GAAW;AAAA,QAAA,CACnB;AAAA,MACH,GACApB,EAAQ,OAAOyB,CAAa,GAC5BzB,EAAQ,MAAM,QAAQ,GAAGwB,CAAQ,MACjCD,EAAa,OAAOvB,CAAO;AAAA,IAC7B;AACA,IAAAuB,EAAa,MAAM,OAAO,GAAGd,CAAM,MACnCc,EAAa,MAAM,MAAM,GAAGb,CAAM,MAClC,KAAK,UAAU,OAAOa,CAAY,GAClC,KAAK,mBAAmBA;AAExB,UAAMG,IAAY,SAAS,cAAc,KAAK;AAC9C,IAAAA,EAAU,UAAU,IAAI,GAAG1pB,CAAa,yBAAyB,GACjE0pB,EAAU,MAAM,SAAS,GAAGf,IAActoB,CAAK,IAC/CqpB,EAAU,MAAM,OAAO,GAAGjB,IAASG,CAAU,MAC7Cc,EAAU,MAAM,MAAM,GAAGhB,CAAM,MAC/BgB,EAAU,MAAM,YAAY,aAC1B,KAAK,uBAAuBrpB,CAC9B,QAAQ,KAAK,yBAAyBA,CAAK,OAE3CqpB,EAAU,UAAU,MAAM;AACxB,WAAK,SAAS,mBAAmB;AAAA,QAC/B,OAAAllB;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAASsH,EAAQ,CAAC,EAAE,OAAO,SAAS,KAAK;AAAA,QACzC,SAASxN,EAAQ;AAAA,MAAA,CAClB,GACD,KAAK,KAAK,gBAAA,EAAkB,oBAAA;AAAA,IAC9B,GACA,KAAK,UAAU,OAAOorB,CAAS,GAC/B,KAAK,gBAAgBA;AAErB,UAAMC,IAAkB,SAAS,cAAc,KAAK;AACpD,IAAAA,EAAgB,UAAU,IAAI,GAAG3pB,CAAa,qBAAqB,GACnE2pB,EAAgB,MAAM,SAAS,GAAGhB,CAAW,MAC7CgB,EAAgB,MAAM,QAAQ,GAAGf,CAAU,MAC3Ce,EAAgB,MAAM,OAAO,GAAGlB,CAAM,MACtCkB,EAAgB,MAAM,MAAM,GAAGjB,CAAM;AACrC,aAASl0B,IAAI,GAAGA,IAAIsX,EAAQ,QAAQtX,KAAK;AACvC,YAAM4X,IAAKN,EAAQtX,CAAC;AACpB,eAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBmxB,IAAY,SAAS,cAAc,KAAK;AAC9C,QAAAA,EAAU,UAAU,IAAI,GAAG5pB,CAAa,0BAA0B,GAClE4pB,EAAU,MAAM,QAAQ,GAAG5b,EAAG,QAAS3N,CAAK,MAC5CupB,EAAU,MAAM,SAAS,GAAG,KAAK,YAAY,MAC7CA,EAAU,MAAM,MAAM,IACnB5b,EAAG,IAAKA,EAAG,UAAW3N,IAAQ,KAAK,eAAe,CACrD,MACAupB,EAAU,MAAM,OAAO,GAAG5b,EAAG,IAAK3N,CAAK,MAEvCupB,EAAU,cAAc,CAAAzqB,MAAO;AAC7B,eAAK,WAAW;AAAA,YACd,KAAAA;AAAA,YACA,SAAAb;AAAA,YACA,OAAO0P,EAAG,WAAYA,EAAG,UAAU;AAAA,YACnC,OAAOob,GAAW;AAAA,UAAA,CACnB;AAAA,QACH,GACAO,EAAgB,YAAYC,CAAS;AACrC,cAAMC,IAAY,SAAS,cAAc,KAAK;AAC9C,QAAAA,EAAU,UAAU,IAAI,GAAG7pB,CAAa,0BAA0B,GAClE6pB,EAAU,MAAM,QAAQ,GAAG,KAAK,YAAY,MAC5CA,EAAU,MAAM,SAAS,GAAG7b,EAAG,SAAU3N,CAAK,MAC9CwpB,EAAU,MAAM,MAAM,GAAG7b,EAAG,IAAK3N,CAAK,MACtCwpB,EAAU,MAAM,OAAO,IACpB7b,EAAG,IAAKA,EAAG,SAAU3N,IAAQ,KAAK,eAAe,CACpD,MAEAwpB,EAAU,cAAc,CAAA1qB,MAAO;AAC7B,eAAK,WAAW;AAAA,YACd,KAAAA;AAAA,YACA,SAAAb;AAAA,YACA,OAAO0P,EAAG,WAAYA,EAAG,UAAU;AAAA,YACnC,OAAOob,GAAW;AAAA,UAAA,CACnB;AAAA,QACH,GACAO,EAAgB,YAAYE,CAAS;AAAA,MACvC;AAAA,IACF;AACA,SAAK,UAAU,OAAOF,CAAe,GACrC,KAAK,sBAAsBA;AAAA,EAC7B;AAAA,EAEQ,iBAAiB7H,GAA2Btd,GAAe;AACjE,UAAMslB,IAAWhI,EAAU;AAC3B,aAASptB,IAAI,GAAGA,IAAIo1B,EAAS,QAAQp1B,KAAK;AACxC,YAAMq1B,IAAQD,EAASp1B,CAAC;AACxB,MAAIA,MAAM8P,IACRulB,EAAM,UAAU,IAAI,QAAQ,IAE5BA,EAAM,UAAU,OAAO,QAAQ;AAAA,IAEnC;AAAA,EACF;AAAA,EAEQ,WAAW5pB,GAA2B;AAC5C,UAAM,EAAE,KAAAhB,GAAK,OAAAqF,GAAO,OAAAwlB,GAAO,SAAA1rB,MAAY6B;AACvC,SAAK,SAAS,KAAK,KAAK,QAAA;AACxB,UAAM,EAAE,OAAAE,MAAU,KAAK,SACjBG,IAAQ,KAAK,KAAK,SAAA,GAClBK,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA,GACpB0nB,IAAgB,KAAK,KAAK,UAAA,KAAe3nB,IAASC;AACxD,SAAK,aAAa3B,EAAI,GACtB,KAAK,aAAaA,EAAI;AACtB,UAAMwU,IAASxU,EAAI,QACb8qB,IAAa,KAAK,OAAO,sBAAA,GAEzB3pB,IAAS,OAAO,iBAAiBqT,CAAM,EAAE;AAC/C,aAAS,KAAK,MAAM,SAASrT,GAC7B,KAAK,OAAO,MAAM,SAASA;AAE3B,QAAI8T,IAAS,GACTC,IAAS;AACb,UAAM6V,IAAa,SAAS,cAAc,KAAK;AAC/C,IAAAA,EAAW,UAAU,IAAI,GAAGlqB,CAAa,qBAAqB,GAC1DgqB,MAAUZ,GAAW,OACvBc,EAAW,UAAU,IAAI,GAAGlqB,CAAa,0BAA0B,GACnEkqB,EAAW,MAAM,QAAQ,GAAG1pB,CAAK,MACjC4T,IAAS,GACTC,IAASmU,IAAgB,KAAK,aAAayB,EAAW,QAEtDC,EAAW,UAAU,IAAI,GAAGlqB,CAAa,0BAA0B,GACnEkqB,EAAW,MAAM,SAAS,GAAGrpB,CAAM,MACnCuT,IAAS,KAAK,aAAa6V,EAAW,MACtC5V,IAASmU,IAEX0B,EAAW,MAAM,OAAO,GAAG9V,CAAM,MACjC8V,EAAW,MAAM,MAAM,GAAG7V,CAAM,MAChC,KAAK,UAAU,OAAO6V,CAAU,GAChC,KAAK,aAAaA;AAElB,QAAIC,IAAK,GACLC,IAAK;AACT,UAAMC,IAAc,CAAClrB,MAAoB;AACvC,YAAMmrB,IAAe,KAAK,WAAWnrB,GAAK6qB,GAAO5V,GAAQC,CAAM;AAC/D,MAAIiW,MACFH,IAAKG,EAAa,IAClBF,IAAKE,EAAa;AAAA,IAEtB;AACA,aAAS,iBAAiB,aAAaD,CAAW,GAClD,SAAS;AAAA,MACP;AAAA,MACA,MAAM;A9CvZT,YAAAltB;A8CwZK,YAAIotB,IAAe;AAEnB,YAAIP,MAAUZ,GAAW,KAAK;AAC5B,gBAAMtd,IAASxN,EAAQ,QACjB8N,IAAKN,EAAOtH,CAAK,KAAKsH,EAAOtH,IAAQ,CAAC,GAEtC,EAAE,oBAAAgmB,EAAA,IAAuB,KAAK,QAAQ;AAC5C,UAAIJ,IAAK,KAAKhe,EAAG,SAASge,IAAKI,MAC7BJ,IAAKI,IAAqBpe,EAAG,SAE3Bge,MACFhe,EAAG,UAAUge,GACbhe,EAAG,YAAYA,EAAG,QAClBme,IAAe;AAAA,QAEnB,OAAO;AACL,gBAAM,EAAE,UAAAxH,MAAazkB;AACrB,cAAIykB,KAAYoH,GAAI;AAElB,kBAAM5V,IAAa,KAAK,KAAK,cAAA,GACvBkW,IAAc1H,EAASve,CAAK,EAAE;AAEpC,YAAI2lB,IAAK,KAAKM,IAAcN,IAAK,KAAK,iBACpCA,IAAK,KAAK,eAAeM;AAG3B,kBAAMC,KAAevtB,IAAA4lB,EAASve,IAAQ,CAAC,MAAlB,gBAAArH,EAAqB;AAC1C,YACEgtB,IAAK,KACLO,KACAA,IAAeP,IAAK,KAAK,iBAEzBA,IAAKO,IAAe,KAAK;AAE3B,kBAAMC,IAAeF,IAAcN;AAEnC,gBAAI3lB,MAAUue,EAAS,SAAS,GAAG;AACjC,kBAAI6H,IAAiB;AACrB,uBAASl2B,IAAI,GAAGA,IAAIquB,EAAS,QAAQruB,KAAK;AACxC,sBAAM+nB,IAAQsG,EAASruB,CAAC;AAExB,gBAAIA,MAAM8P,IAAQ,MAChBomB,KAAkBT,IAGhBz1B,MAAM8P,MACRomB,KAAkBD,IAEhBj2B,MAAM8P,MACRomB,KAAkBnO,EAAM;AAAA,cAE5B;AACA,kBAAImO,IAAiBrW,GAAY;AAC/B,sBAAMqU,IAAatqB,EAAQ;AAC3B,gBAAA6rB,IAAK5V,IAAaqU;AAAA,cACpB;AAAA,YACF;AACA,YAAIuB,MAEEpH,EAAS,SAAS,MAAMve,MAC1Bue,EAASve,IAAQ,CAAC,EAAE,SAAS2lB,IAAK9pB,IAEpC0iB,EAASve,CAAK,EAAE,SAAS2lB,IAAK9pB,GAC9BkqB,IAAe;AAAA,UAEnB;AAAA,QACF;AACA,QAAIA,KACF,KAAK,KAAK,OAAO,EAAE,aAAa,IAAO,GAGzCL,EAAW,OAAA,GACX,SAAS,oBAAoB,aAAaG,CAAW,GACrD,SAAS,KAAK,MAAM,SAAS,IAC7B,KAAK,OAAO,MAAM,SAAS;AAAA,MAC7B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,IACR,GAEFlrB,EAAI,eAAA;AAAA,EACN;AAAA,EAEQ,WACNA,GACA0rB,GACAzW,GACAC,GACmC;AACnC,QAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,UAAM8V,IAAKhrB,EAAI,IAAI,KAAK,YAClBirB,IAAKjrB,EAAI,IAAI,KAAK;AACxB,WAAI0rB,MAAezB,GAAW,MAC5B,KAAK,WAAW,MAAM,MAAM,GAAG/U,IAAS+V,CAAE,OAE1C,KAAK,WAAW,MAAM,OAAO,GAAGhW,IAAS+V,CAAE,MAE7ChrB,EAAI,eAAA,GACG,EAAE,IAAAgrB,GAAI,IAAAC,EAAA;AAAA,EACf;AACF;ACpfO,MAAMU,GAAkB;AAAA,EAO7B,YAAY/sB,GAAY;AANhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,YAAYA,EAAK,aAAA;AACtB,UAAM,EAAE,yBAAAgtB,GAAyB,cAAAC,MAC/B,KAAK,yBAAA;AACP,SAAK,eAAeA,GACpB,KAAK,0BAA0BD;AAAA,EACjC;AAAA,EAEQ,2BAA2B;AACjC,UAAMA,IAA0B,SAAS,cAAc,KAAK;AAC5D,IAAAA,EAAwB,UAAU,IAAI,GAAG/qB,CAAa,kBAAkB;AACxE,UAAMgrB,IAAe,SAAS,cAAc,GAAG;AAC/C,WAAAA,EAAa,SAAS,UACtBA,EAAa,MAAM,YACnBD,EAAwB,OAAOC,CAAY,GAC3C,KAAK,UAAU,OAAOD,CAAuB,GACtC,EAAE,yBAAAA,GAAyB,cAAAC,EAAA;AAAA,EACpC;AAAA,EAEQ,WAAWC,GAAsB;AACvC,QAAI;AACF,YAAMC,IAAS,IAAI,IAAID,GAAK,2BAA2B;AACvD,aAAOC,EAAO,aAAa,WAAWA,EAAO,aAAa;AAAA,IAC5D,QAAQ;AACN,aAAOD,EAAI,WAAW,GAAG,KAAKA,EAAI,WAAW,GAAG;AAAA,IAClD;AAAA,EACF;AAAA,EAEO,mBAAmB3sB,GAAmBsF,GAA4B;AACvE,UAAM;AAAA,MACJ,YAAY;AAAA,QACV,SAAS,CAACvB,GAAME,CAAG;AAAA,MAAA;AAAA,MAErB,YAAA4oB;AAAA,IAAA,IACEvnB,GACE/C,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA,GACpBM,IAAO,KAAK,KAAK,UAAA,KAAeP,IAASC;AAE/C,SAAK,wBAAwB,MAAM,UAAU,SAC7C,KAAK,wBAAwB,MAAM,OAAO,GAAGuB,CAAI,MACjD,KAAK,wBAAwB,MAAM,MAAM,GAAGE,IAAMnB,IAAO+pB,CAAU;AAEnE,UAAMF,IAAM3sB,EAAQ,OAAO;AAC3B,IAAI,KAAK,WAAW2sB,CAAG,IACrB,KAAK,aAAa,OAAOA,IAEzB,KAAK,aAAa,gBAAgB,MAAM,GAE1C,KAAK,aAAa,QAAQA,GAC1B,KAAK,aAAa,YAAYA;AAAA,EAChC;AAAA,EAEO,sBAAsB;AAC3B,SAAK,wBAAwB,MAAM,UAAU;AAAA,EAC/C;AAAA,EAEO,cAAc3sB,GAAmB;AACtC,UAAM2sB,IAAM3sB,EAAQ;AACpB,QAAI,CAAC2sB,KAAO,CAAC,KAAK,WAAWA,CAAG,GAAG;AACjC,cAAQ,KAAK,oDAAoDA,CAAG,EAAE;AACtE;AAAA,IACF;AACA,UAAMG,IAAS,OAAO,KAAKH,GAAK,UAAU,UAAU;AACpD,IAAIG,MACFA,EAAO,SAAS;AAAA,EAEpB;AAAA,EAEO,OACLlS,GACA5a,GACAzE,GACAvB,GACA;AACA,IAAA4gB,EAAI,KAAA,GACJA,EAAI,OAAO5a,EAAQ,OACdA,EAAQ,UACXA,EAAQ,QAAQ,KAAK,QAAQ,wBAE/B4a,EAAI,YAAY5a,EAAQ,OACpBA,EAAQ,cAAc,WACxBA,EAAQ,YAAY,KAEtBkhB,GAAa;AAAA,MACXtG;AAAA,MACA5a,EAAQ;AAAA,MACRzE;AAAA,MACAvB;AAAA,MACAgG,EAAQ;AAAA,IAAA,GAEV4a,EAAI,QAAA;AAAA,EACN;AACF;ACnGO,MAAMmS,GAAO;AAAA,EAUlB,YAAYttB,GAAY/B,GAAmB;AATnC,IAAA8D,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,OAAOA,EAAK,QAAA,GACjB,KAAK,UAAUA,EAAK,WAAA,GAEpB,KAAK,cAAc/B,KAAQ,CAAA,GAC3B,KAAK,UAAU,CAAA,GACf,KAAK,eAAe,CAAA;AAAA,EACtB;AAAA,EAEO,aAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,eAAekB,GAAyB;AAC7C,SAAK,cAAcA;AAAA,EACrB;AAAA,EAEO,iBAA6B;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,kBAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAAU;AACf,SAAK,SAAA,GACL,KAAK,gBAAA,GACL,KAAK,qBAAA;AAAA,EACP;AAAA,EAEO,WAAW;AAChB,SAAK,UAAU,CAAA,GACf,KAAK,eAAe,CAAA;AAAA,EACtB;AAAA,EAEQ,kBAAkB;AACxB,UAAMqX,IAAa,KAAK,KAAK,cAAA,GACvBlG,IAAU,KAAK,KAAK,WAAA,GACpBmK,IAAsB8S,GAAwB,KAAK,WAAW;AACpE,SAAK,UAAU,KAAK,KAAK,eAAe;AAAA,MACtC,QAAQjd,EAAQ,CAAC;AAAA,MACjB,QAAQ,KAAK,aAAA;AAAA,MACb,YAAAkG;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,qBAAAiE;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEQ,uBAAuB;AAC7B,UAAM+S,IAAY,KAAK,aAAA,GACjBhX,IAAa,KAAK,KAAK,cAAA,GAEvBH,IADU,KAAK,KAAK,WAAA,EACH,CAAC,GAClBC,IAASkX;AACf,SAAK,SAAS,uBAAuB;AAAA,MACnC,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,QAAAnX;AAAA,MACA,QAAAC;AAAA,MACA,YAAAE;AAAA,MACA,MAAMzF,GAAW;AAAA,IAAA,CAClB;AAAA,EACH;AAAA,EAEO,eAAuB;AAC5B,UAAM;AAAA,MACJ,QAAQ,EAAE,KAAAvM,GAAK,UAAAipB,EAAA;AAAA,MACf,OAAAnrB;AAAA,IAAA,IACE,KAAK;AACT,WAAImrB,IAAiB,IACd,KAAK,MAAMjpB,IAAMlC,CAAK;AAAA,EAC/B;AAAA,EAEO,eAAuB;AAC5B,UAAM;AAAA,MACJ,QAAQ,EAAE,gBAAAorB,EAAA;AAAA,IAAe,IACvB,KAAK,SACH5qB,IAAS,KAAK,KAAK,UAAA;AACzB,WAAO,KAAK,MAAMA,IAAS6qB,GAAsBD,CAAc,CAAC;AAAA,EAClE;AAAA,EAEO,YAAoB;AACzB,UAAME,IAAY,KAAK,aAAA,GACjB3C,IAAY,KAAK,aAAA;AACvB,WAAOA,IAAY2C,IAAYA,IAAY3C;AAAA,EAC7C;AAAA,EAEO,eAAuB;AAC5B,WAAO,KAAK,QAAQ,OAAO,CAAChT,GAAKC,MAAQD,IAAMC,EAAI,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEO,iBAAyB;AAE9B,UAAM5H,IAAU,KAAK,KAAK,WAAA,GACpBud,IAAe,KAAK,UAAA,GAEpBtV,IADY,KAAK,aAAA,IACSsV,IAAevd,EAAQ,CAAC;AACxD,WAAOiI,KAAe,IAAI,IAAIA;AAAA,EAChC;AAAA,EAEO,OAAO4C,GAA+B/X,GAAgB;AAC3D,IAAA+X,EAAI,KAAA,GACJA,EAAI,cAAc,KAAK,KAAK,mBACxB,IACA,KAAK,QAAQ,OAAO;AACxB,UAAM3E,IAAa,KAAK,KAAK,cAAA,GACvBoX,IAAY,KAAK,aAAA,GAEjBxX,IAAkB,CAAA;AACxB,QAAI0X,IAAe;AACnB,aAASr3B,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA,KAAK;AAC5C,YAAMqW,IAAM,KAAK,QAAQrW,CAAC;AAC1B,UAAIq3B,IAAehhB,EAAI,SAAS8gB;AAC9B;AAEF,MAAAxX,EAAQ,KAAKtJ,CAAG,GAChBghB,KAAgBhhB,EAAI;AAAA,IACtB;AACA,SAAK,KAAK,QAAQqO,GAAK;AAAA,MACrB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,SAAA/E;AAAA,MACA,QAAAhT;AAAA,MACA,YAAY;AAAA,MACZ,YAAAoT;AAAA,MACA,MAAMzF,GAAW;AAAA,MACjB,iBAAiB;AAAA,IAAA,CAClB,GACDoK,EAAI,QAAA;AAAA,EACN;AACF;AC1JO,MAAM4S,GAAoB;AAAA;AAAA,EAExB,WAAWxtB,GAA8B;AAC9C,WAAO,CAACA,EAAQ,QAAQ,SAAS;AAAA,EACnC;AAAA,EAEO,OACL4a,GACA5a,GACAzE,GACAvB,GACA;AACA,IAAA4gB,EAAI,KAAA,GACJA,EAAI,OAAO5a,EAAQ,OACfA,EAAQ,UACV4a,EAAI,YAAY5a,EAAQ,QAE1BkhB,GAAa;AAAA,MACXtG;AAAA,MACA5a,EAAQ;AAAA,MACRzE;AAAA,MACAvB,IAAI,KAAK,WAAWgG,CAAO;AAAA,MAC3BA,EAAQ;AAAA,IAAA,GAEV4a,EAAI,QAAA;AAAA,EACN;AACF;AC1BO,MAAM6S,GAAkB;AAAA;AAAA,EAEtB,WAAWztB,GAA8B;AAC9C,WAAOA,EAAQ,QAAQ,SAAS;AAAA,EAClC;AAAA,EAEO,OACL4a,GACA5a,GACAzE,GACAvB,GACA;AACA,IAAA4gB,EAAI,KAAA,GACJA,EAAI,OAAO5a,EAAQ,OACfA,EAAQ,UACV4a,EAAI,YAAY5a,EAAQ,QAE1BkhB,GAAa;AAAA,MACXtG;AAAA,MACA5a,EAAQ;AAAA,MACRzE;AAAA,MACAvB,IAAI,KAAK,WAAWgG,CAAO;AAAA,MAC3BA,EAAQ;AAAA,IAAA,GAEV4a,EAAI,QAAA;AAAA,EACN;AACF;ACvBO,MAAM8S,GAAkB;AAAA,EAG7B,YAAYjuB,GAAY;AAFhB,IAAA+B,EAAA;AAGN,SAAK,UAAU/B,EAAK,WAAA;AAAA,EACtB;AAAA,EAEQ,UAAUwC,GAAe0rB,GAAe;AAC9C,UAAMC,IAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGD,CAAK,CAAC;AACtD,QAAI1rB,EAAM,WAAW,GAAG,GAAG;AACzB,YAAM4rB,IAAM5rB,EAAM,MAAM,CAAC,GACnB6rB,IACJD,EAAI,WAAW,IACXA,EAAI,MAAM,EAAE,EAAE,IAAI,OAAQE,IAAOA,CAAI,EAAE,KAAK,EAAE,IAC9CF,EAAI,WAAW,IACbA,IACA;AACR,UAAIC,GAAS;AACX,cAAM53B,IAAI,OAAO,SAAS43B,EAAQ,MAAM,GAAG,CAAC,GAAG,EAAE,GAC3Cj0B,IAAI,OAAO,SAASi0B,EAAQ,MAAM,GAAG,CAAC,GAAG,EAAE,GAC3Cp9B,IAAI,OAAO,SAASo9B,EAAQ,MAAM,GAAG,CAAC,GAAG,EAAE;AACjD,eAAO,QAAQ53B,CAAC,KAAK2D,CAAC,KAAKnJ,CAAC,KAAKk9B,CAAe;AAAA,MAClD;AAAA,IACF;AACA,UAAMI,IAAW/rB,EAAM,MAAM,qBAAqB;AAClD,QAAI+rB,GAAU;AACZ,YAAM,CAAC,IAAI,KAAKn0B,IAAI,KAAKnJ,IAAI,GAAG,IAAIs9B,EAAS,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAAhwB,MAAQA,EAAK,MAAM;AAClF,aAAO,QAAQ,CAAC,KAAKnE,CAAC,KAAKnJ,CAAC,KAAKk9B,CAAe;AAAA,IAClD;AACA,WAAO3rB;AAAA,EACT;AAAA,EAEQ,eAAegsB,GAAqBlsB,GAAe6Z,GAAmB;AAC5E,WAAKqS,EAAU,KAAK,CAAAjwB,MAAQA,IAAO,CAAC,IAC7BiwB,EAAU,IAAI,CAAAjwB,MACfA,KAAQ,IAAU,IACf,KAAK,IAAIA,IAAO,KAAK,IAAI+D,IAAQ,KAAK,IAAI6Z,GAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CACtE,IAJ6C,CAAA;AAAA,EAKhD;AAAA,EAEQ,iBACNhB,GACA9E,GACA+J,GACA7lB,GACA4hB,GACA3Z,GACAgsB,IAAsB,IACtB;AACA,IAAArT,EAAI,KAAA,GACJA,EAAI,YAAYgB,GAChBhB,EAAI,cAAc3Y,GAClB2Y,EAAI,UAAUqT,EAAU,SAAS,UAAU,QAC3CrT,EAAI,YAAYqT,CAAS,GACzBrT,EAAI,UAAA,GACJA,EAAI,OAAO9E,GAAQ9b,CAAC,GACpB4gB,EAAI,OAAOiF,GAAM7lB,CAAC,GAClB4gB,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,aACNA,GACA9E,GACA+J,GACAqO,GACAtS,GACA3Z,GACA;AACA,UAAMksB,IAAY,KAAK,IAAIvS,GAAW,CAAC,GACjCwS,IAAa,KAAK,IAAIxS,IAAY,GAAG,EAAE;AAC7C,IAAAhB,EAAI,KAAA,GACJA,EAAI,YAAYgB,GAChBhB,EAAI,cAAc3Y,GAClB2Y,EAAI,UAAU,SACdA,EAAI,WAAW,SACfA,EAAI,UAAA,GACJA,EAAI,OAAO9E,GAAQoY,CAAO;AAC1B,QAAIG,IAAWvY;AACf,WAAOuY,IAAWxO,KAAM;AACtB,YAAMyO,IAAO,KAAK,IAAID,IAAWD,IAAa,GAAGvO,CAAI,GAC/C0O,IAAQ,KAAK,IAAIF,IAAWD,GAAYvO,CAAI;AAClD,MAAAjF,EAAI;AAAA,QACFyT,IAAWD,IAAa;AAAA,QACxBF,IAAUC;AAAA,QACVG;AAAA,QACAJ;AAAA,MAAA,GAEEI,IAAOzO,KACTjF,EAAI;AAAA,QACFyT,IAAYD,IAAa,IAAK;AAAA,QAC9BF,IAAUC;AAAA,QACVI;AAAA,QACAL;AAAA,MAAA,GAGJG,IAAWE;AAAA,IACb;AACA,IAAA3T,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,OACLA,GACA5a,GACAzE,GACAvB,GACA;AACA,IAAA4gB,EAAI,KAAA;AACJ,UAAM;AAAA,MACJ,OAAA7Y;AAAA,MACA,WAAW,EAAE,WAAA6Z,GAAW,aAAA4S,EAAA;AAAA,IAAY,IAClC,KAAK,SACH1Y,IAASva,GACTskB,IAAOtkB,KAAKyE,EAAQ,SAAS,KAAK+B,GAClCX,IAAOqa,GAAiBzb,CAAO,GAC/ByuB,IAAkB/S,GAAsB1b,GAAS4b,CAAS,IAAI7Z,GAC9D2sB,IAAkB,KAAK,eAAe7S,GAAsB7b,GAASoB,CAAI,GAAGW,GAAO0sB,CAAe,GAClGxsB,IAAQjC,EAAQ,SAASwuB,GACzBG,IAAe7S,GAAyB9b,GAAS4b,CAAS,IAAI7Z,GAC9DmsB,IAAU,KAAK,MAAMl0B,IAAI20B,IAAe,CAAC;AAE/C,QAAI9O,KAAQ/J,GAAQ;AAClB,MAAA8E,EAAI,QAAA;AACJ;AAAA,IACF;AAEA,QAAIxZ,MAAS,UAAU;AACrB,YAAMwnB,IAAM,KAAK,IAAI6F,IAAkB1sB,GAAO,CAAC;AAC/C,WAAK,iBAAiB6Y,GAAK9E,GAAQ+J,GAAMqO,IAAUtF,IAAM,GAAG6F,GAAiBxsB,GAAOysB,CAAe,GACnG,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,IAAUtF,IAAM,GAAG6F,GAAiBxsB,GAAOysB,CAAe;AAAA,IACrG,WAAWttB,MAAS,UAAU;AAC5B,YAAMwnB,IAAM,KAAK,IAAI6F,IAAkB1sB,GAAO,CAAC;AAC/C,WAAK,iBAAiB6Y,GAAK9E,GAAQ+J,GAAMqO,IAAUtF,GAAK6F,GAAiBxsB,GAAOysB,CAAe,GAC/F,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,GAASO,GAAiBxsB,GAAOysB,CAAe,GACzF,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,IAAUtF,GAAK6F,GAAiBxsB,GAAOysB,CAAe;AAAA,IACjG,WAAWttB,MAAS;AAClB,WAAK,aAAawZ,GAAK9E,GAAQ+J,GAAMqO,GAASO,GAAiBxsB,CAAK;AAAA,aAC3Db,MAAS,YAAY;AAC9B,YAAMwtB,IAAWhU,EAAI,qBAAqB9E,GAAQoY,GAASrO,GAAMqO,CAAO;AACxE,MAAAU,EAAS,aAAa,GAAG,KAAK,UAAU3sB,GAAO,CAAC,CAAC,GACjD2sB,EAAS,aAAa,KAAK,KAAK,UAAU3sB,GAAO,GAAG,CAAC,GACrD2sB,EAAS,aAAa,KAAK,KAAK,UAAU3sB,GAAO,CAAC,CAAC,GACnD2sB,EAAS,aAAa,KAAK,KAAK,UAAU3sB,GAAO,GAAG,CAAC,GACrD2sB,EAAS,aAAa,GAAG,KAAK,UAAU3sB,GAAO,CAAC,CAAC,GACjD,KAAK,iBAAiB2Y,GAAK9E,GAAQ+J,GAAMqO,GAASO,GAAiBG,GAA+BF,CAAe;AAAA,IACnH,MAAA,CAAWttB,MAAS,YAClB,KAAK,iBAAiBwZ,GAAK9E,IAAS/T,GAAO8d,IAAO9d,GAAOmsB,IAAUnsB,GAAO0sB,GAAiB,KAAK,UAAU,WAAW,IAAI,GAAGC,CAAe,GAC3I,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,GAASO,GAAiBxsB,GAAOysB,CAAe,KAChFttB,MAAS,YAClB,KAAK,iBAAiBwZ,GAAK9E,GAAQ+J,GAAMqO,IAAUnsB,GAAO,KAAK,IAAI0sB,IAAkB,GAAG,CAAC,GAAG,KAAK,UAAU,WAAW,IAAI,GAAGC,CAAe,GAC5I,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,GAASO,GAAiBxsB,GAAOysB,CAAe,GACzF,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,IAAUnsB,GAAO,KAAK,IAAI0sB,IAAkB,GAAG,CAAC,GAAG,KAAK,UAAU,WAAW,IAAI,GAAGC,CAAe,KAE5I,KAAK,iBAAiB9T,GAAK9E,GAAQ+J,GAAMqO,GAASO,GAAiBxsB,GAAOysB,CAAe;AAE3F,IAAA9T,EAAI,QAAA;AAAA,EACN;AACF;AC9JO,MAAMiU,GAAkB;AAAA,EAK7B,YAAYpvB,GAAY;AAJhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,OAAOA,EAAK,QAAA;AAAA,EACnB;AAAA,EAEO,OACLmb,GACA5a,GACAzE,GACAvB,GACA;AACA,UAAM;AAAA,MACJ,WAAW,EAAE,MAAAsnB,GAAM,UAAAwN,GAAU,UAAAC,EAAA;AAAA,IAAS,IACpC,KAAK,KAAK,WAAA,GAERC,IAAc,KAAK,KAAK,EAAE,uBAAuB,GACjD,EAAE,OAAAjtB,GAAO,kBAAAktB,EAAA,IAAqB,KAAK,SACnC9M,IAAO2M,IAAW/sB,GAClB8X,IAAe7Z,EAAQ,QAAS+B,GAChC+U,IACJ,KAAK,KAAK,+BAAA,IAAmCmY;AAC/C,IAAArU,EAAI,KAAA,GACJA,EAAI,OAAO,GAAGuH,CAAI,MAAMb,CAAI;AAC5B,UAAM4N,IAActU,EAAI,YAAYoU,CAAW,GACzCG,KAAStV,IAAeqV,EAAY,SAAS;AAEnD,IAAAtU,EAAI,YAAYmU,CAAQ,GACxBnU,EAAI,UAAU,GAAG,MAAM9D,CAAO,GAC9B8D,EAAI,UAAA,GACJA,EAAI,OAAOrf,GAAGvB,CAAC,GACf4gB,EAAI,OAAOrf,IAAI4zB,GAAOn1B,CAAC,GACvB4gB,EAAI,OAAOrf,IAAI4zB,IAAQD,EAAY,OAAOl1B,CAAC,GAC3C4gB,EAAI,OAAOrf,IAAIse,GAAc7f,CAAC,GAC9B4gB,EAAI,OAAA,GAEJA,EAAI;AAAA,MACFoU;AAAA,MACAzzB,IAAI4zB;AAAA,MACJn1B,IAAIk1B,EAAY,0BAA0B/M,IAAO;AAAA,IAAA,GAEnDvH,EAAI,QAAA;AAAA,EACN;AACF;AC/CO,MAAMwU,GAAU;AAAA,EAKrB,YAAY3vB,GAAY;AAJhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAuCA,EAAK,WAAA,GACjD,KAAK,iCAAiB,IAAA;AAAA,EACxB;AAAA,EAEO,WAAWmb,GAA+B/X,GAAgB;AAC/D,UAAM;AAAA,MACJ,WAAW,EAAE,MAAAnF,GAAM,SAAA2xB,GAAS,MAAA/N,GAAM,MAAAa,GAAM,OAAAlgB,GAAO,QAAAqtB,GAAQ,KAAA1G,GAAK,YAAA7G,EAAA;AAAA,MAC5D,OAAAhgB;AAAA,IAAA,IACE,KAAK,SACHG,IAAQ,KAAK,KAAK,SAAA,GAClBK,IAAS,KAAK,KAAK,UAAA;AAEzB,IAAAqY,EAAI,KAAA,GACJA,EAAI,cAAcyU,GAClBzU,EAAI,OAAO,GAAGuH,IAAOpgB,CAAK,MAAMuf,CAAI;AAEpC,QAAI3iB,IAAOjB;AACX,UAAM8kB,IAAY,IAAI,OAAOC,GAAmB,OAAO;AACvD,IAAID,EAAU,KAAK7jB,CAAI,MACrBA,IAAOkjB,GAAW;AAAA,MAChBljB;AAAA,MACAkE,IAAS;AAAA,MACT2f;AAAA,MACAT;AAAA,IAAA;AAGJ,UAAMW,IAAe,IAAI,OAAOD,GAAmB,UAAU;AAC7D,IAAIC,EAAa,KAAK/jB,CAAI,MACxBA,IAAOkjB,GAAW;AAAA,MAChBljB;AAAA,MACA,KAAK,KAAK,aAAA;AAAA,MACV+jB;AAAA,MACAX;AAAA,IAAA;AAIJ,UAAMwN,IAAc3U,EAAI,YAAYjc,CAAI;AACxC,QAAI2wB,GAAQ;AAEV,UAAIE,GACAC;AACJ,MAAI,OAAO,kBAAoB,OAC7BD,IAAkB,IAAI,gBAAgB,GAAG,CAAC,GAC1CC,IAAeD,EAAgB,WAAW,IAAI,MAE9CA,IAAkB,SAAS,cAAc,QAAQ,GACjDC,IAAeD,EAAgB,WAAW,IAAI;AAGhD,YAAM5M,IAAY2M,EAAY,OACxBG,IACJH,EAAY,0BACZA,EAAY,0BACRI,IAAiB,KAAK;AAAA,QAC1B,KAAK,IAAI/M,GAAW,CAAC,IAAI,KAAK,IAAI8M,GAAY,CAAC;AAAA,MAAA,GAG3CE,IAAeD,IAAiB,IAAI/G,EAAI,CAAC,IAAI7mB,GAC7C8tB,IAAgBF,IAAiB,IAAI/G,EAAI,CAAC,IAAI7mB;AAEpD,MAAAytB,EAAgB,QAAQI,GACxBJ,EAAgB,SAASK,GAEzBJ,EAAa,UAAUG,IAAe,GAAGC,IAAgB,CAAC,GAC1DJ,EAAa,OAAQ,MAAM,KAAK,KAAM,GAAG,GACzCA,EAAa,UAAU,CAACG,IAAe,GAAG,CAACC,IAAgB,CAAC,GAE5DJ,EAAa,OAAO,GAAGtN,IAAOpgB,CAAK,MAAMuf,CAAI,IAC7CmO,EAAa,YAAYxtB,GACzBwtB,EAAa;AAAA,QACX9wB;AAAA,SACCixB,IAAehN,KAAa;AAAA,SAC5BiN,IAAgBH,KAAc,IAAIH,EAAY;AAAA,MAAA;AAGjD,YAAMO,IAAUlV,EAAI,cAAc4U,GAAiB,QAAQ;AAC3D,MAAIM,MACFlV,EAAI,YAAYkV,GAChBlV,EAAI,SAAS,GAAG,GAAG1Y,GAAOK,CAAM;AAAA,IAEpC,OAAO;AACL,YAAMhH,IAAI2G,IAAQ,GACZlI,IAAIuI,IAAS;AACnB,MAAAqY,EAAI,YAAY3Y,GAChB2Y,EAAI,UAAUrf,GAAGvB,CAAC,GAClB4gB,EAAI,OAAQ,MAAM,KAAK,KAAM,GAAG,GAChCA,EAAI;AAAA,QACFjc;AAAA,QACA,CAAC4wB,EAAY,QAAQ;AAAA,QACrBA,EAAY,0BAA2BpN,IAAOpgB,IAAS;AAAA,MAAA;AAAA,IAE3D;AACA,IAAA6Y,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,YAAYA,GAA+B;AAChD,UAAM;AAAA,MACJ,WAAW,EAAE,OAAA1Y,GAAO,QAAAK,GAAQ,MAAA7E,GAAM,SAAA2xB,GAAS,QAAAC,GAAQ,KAAA1G,EAAA;AAAA,MACnD,OAAA7mB;AAAA,IAAA,IACE,KAAK;AACT,QAAI,CAAC,KAAK,WAAW,IAAIrE,CAAI,GAAG;AAC9B,YAAM2d,IAAM,IAAI,MAAA;AAChB,MAAAA,EAAI,aAAa,eAAe,WAAW,GAC3CA,EAAI,MAAM3d,GACV2d,EAAI,SAAS,MAAM;AACjB,aAAK,WAAW,IAAI3d,GAAM2d,CAAG,GAE7B,KAAK,KAAK,OAAO;AAAA,UACf,WAAW;AAAA,UACX,iBAAiB;AAAA,QAAA,CAClB;AAAA,MACH;AACA;AAAA,IACF;AACA,UAAM0U,IAAW,KAAK,KAAK,SAAA,GACrBC,IAAY,KAAK,KAAK,UAAA,GACtBjV,IAAa7Y,IAAQH,GACrBiZ,IAAczY,IAASR;AAI7B,QAFA6Y,EAAI,KAAA,GACJA,EAAI,cAAcyU,GACdC,GAAQ;AAEV,UAAIE,GACAC;AACJ,MAAI,OAAO,kBAAoB,OAC7BD,IAAkB,IAAI,gBAAgB,GAAG,CAAC,GAC1CC,IAAeD,EAAgB,WAAW,IAAI,MAE9CA,IAAkB,SAAS,cAAc,QAAQ,GACjDC,IAAeD,EAAgB,WAAW,IAAI;AAGhD,YAAMG,IAAiB,KAAK;AAAA,QAC1B,KAAK,IAAI5U,GAAY,CAAC,IAAI,KAAK,IAAIC,GAAa,CAAC;AAAA,MAAA,GAG7C4U,IAAeD,IAAiB,IAAI/G,EAAI,CAAC,IAAI7mB,GAC7C8tB,IAAgBF,IAAiB,IAAI/G,EAAI,CAAC,IAAI7mB;AAEpD,MAAAytB,EAAgB,QAAQI,GACxBJ,EAAgB,SAASK,GAEzBJ,EAAa,UAAUG,IAAe,GAAGC,IAAgB,CAAC,GAC1DJ,EAAa,OAAQ,MAAM,KAAK,KAAM,GAAG,GACzCA,EAAa,UAAU,CAACG,IAAe,GAAG,CAACC,IAAgB,CAAC,GAE5DJ,EAAa;AAAA,QACX,KAAK,WAAW,IAAI/xB,CAAI;AAAA,SACvBkyB,IAAe7U,KAAc;AAAA,SAC7B8U,IAAgB7U,KAAe;AAAA,QAChCD;AAAA,QACAC;AAAA,MAAA;AAGF,YAAM8U,IAAUlV,EAAI,cAAc4U,GAAiB,QAAQ;AAC3D,MAAIM,MACFlV,EAAI,YAAYkV,GAChBlV,EAAI,SAAS,GAAG,GAAGmV,GAAUC,CAAS;AAAA,IAE1C,OAAO;AACL,YAAMz0B,IAAIw0B,IAAW,GACf/1B,IAAIg2B,IAAY;AACtB,MAAApV,EAAI,UAAUrf,GAAGvB,CAAC,GAClB4gB,EAAI,OAAQ,MAAM,KAAK,KAAM,GAAG,GAChCA,EAAI;AAAA,QACF,KAAK,WAAW,IAAIld,CAAI;AAAA,QACxB,CAACqd,IAAa;AAAA,QACd,CAACC,IAAc;AAAA,QACfD;AAAA,QACAC;AAAA,MAAA;AAAA,IAEJ;AACA,IAAAJ,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,OAAOA,GAA+B/X,GAAgB;AAC3D,IAAI,KAAK,QAAQ,UAAU,SAASotB,GAAc,QAChD,KAAK,YAAYrV,CAAG,IAEpB,KAAK,WAAWA,GAAK/X,CAAM;AAAA,EAE/B;AACF;AClLO,MAAMqtB,GAAc;AAAA,EAOzB,YAAY3rB,GAAkB;AANtB,IAAA/C,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO+C,EAAQ,QAAA,GACpB,KAAK,UAAUA,GACf,KAAK,UAAU,KAAK,KAAK,WAAA,GAEzB,KAAK,gBAAgB,CAAA,GACrB,KAAK,uBAAuB,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGO,oBAAoB3F,GAAyBsH,GAAe;AtDpClE,QAAArH,GAAAgH;AsDqCC,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,uBAAAsqB;AAAA,QACA,yBAAAC;AAAA,QACA,2BAAAC;AAAA,QACA,wBAAAC;AAAA,MAAA;AAAA,IACF,IACE,KAAK,SACHtwB,IAAUpB,EAAYsH,CAAK,GAC3BqqB,IAAc,KAAK,KAAK,YAAA,GACxBC,KAAuB3xB,IAAA,KAAK,QAAQ,iBAAA,MAAb,gBAAAA,EAAiC;AAE9D,QAAI4xB,IAA2B,IAC3BC,IAA6B,IAC7BC,IAA+B,IAC/BC,IAA4B;AAChC,WAAK5wB,EAAQ,cAEXywB,IACE,CAACF,KACD,CAAC,CAACJ,KACF,CAAC,CAACK,KACFxwB,EAAQ,cAAcwwB,EAAqB,aAC3C,CAAC,KAAK,QAAQ,oBAAA,IAEbC,MAEHC,IACE,CAACH,KAAe,CAAC,CAACH,KAA2B,CAAC,GAACvqB,IAAA7F,EAAQ,YAAR,QAAA6F,EAAiB,YAE/D6qB,MAEHC,IACE,CAACJ,KACD,CAAC,CAACF,KACF,CAAC,CAACrwB,EAAQ,aACV,KAAK,QAAQ,kCAAkCpB,GAAasH,CAAK,IAEhEyqB,MAEHC,IACE,CAACL,KACD,CAAC,CAACD,KACF,CAAC,CAACtwB,EAAQ,aACV,CAAC,KAAK,QAAQ,kCAAkCpB,GAAasH,CAAK,KAGnEuqB,IAA2BN,IAAwB,QACnDO,IAA6BN,IAA0B,QACvDO,IAA+BN,IAA4B,QAC3DO,IAA4BN,IAAyB;AAAA,EAE1D;AAAA,EAEO,0BAAiD;AACtD,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,mBAAwC;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBAAiBzuB,GAA8B;AACpD,SAAK,gBAAgBA;AAAA,EACvB;AAAA,EAEO,uBAAuB;AAC5B,UAAMgvB,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAmB,CACvBlyB,GACAqf,MACG;AACH,UAAIrnB,IAAI;AACR,aAAOA,IAAIgI,EAAY,UAAQ;AAC7B,cAAMoB,IAAUpB,EAAYhI,CAAC;AAG7B,YAFAA,KAEIoJ,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChB8jB,IAAkC;AAAA,gBACtC,SAASje,EAAQ;AAAA,gBACjB,YAAYpJ,IAAI;AAAA,gBAChB,SAASV;AAAA,gBACT,SAASiE;AAAA,gBACT,MAAMuV,EAAG;AAAA,cAAA;AAEX,cAAAohB,EAAiBphB,EAAG,OAAOuO,CAAQ;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AACA,cAAM8S,IAAiB/wB,KAAA,gBAAAA,EAAS;AAChC,YAAI,CAAC+wB,EAAgB;AACrB,cAAMC,IAAiB,KAAK,cAAc;AAAA,UACxC,CAAAC,MACEA,EAAU,OAAOjxB,EAAQ,aACxB+wB,EAAe,aACdA,EAAe,cAAcE,EAAU;AAAA,QAAA;AAE7C,YAAI,CAAC,CAACD,EAAgB;AAEtB,cAAMrxB,IAAa/I;AACnB,YAAIsd,IAActd;AAClB,eAAOsd,IAActV,EAAY,UACXA,EAAYsV,CAAW,EAC3B,cAAclU,EAAQ;AACtC,UAAAkU;AAEF,QAAAtd,IAAIsd;AAEJ,cAAMgd,IAAqBtyB,EACxB,MAAMe,GAAYuU,CAAW,EAC7B;AAAA,UAAI,CAAAlU,MACHA,EAAQ,qBAAqB2E,EAAiB,QAC1C3E,IACA,EAAE,OAAOC,EAAA;AAAA,QAAK,GAEhBgxB,IAAY,KAAK,cAAcD,CAAc,GAC7C,EAAE,UAAAG,MAAaF;AACrB,iBAAS/6B,IAAI,GAAGA,IAAIi7B,EAAS,QAAQj7B,KAAK;AACxC,gBAAMk7B,IAAOD,EAASj7B,CAAC,GACjBm7B,IAAeR,EAAO;AAAA,YAC1BO,EAAK;AAAA,YACLF;AAAA,UAAA;AAEF,eAAK,qBAAqB;AAAA,YACxB,GAAGG,EAAa,IAAI,CAAAC,OAAW;AAAA,cAC7B,GAAGA;AAAA,cACH,GAAGF;AAAA,cACH,GAAGnT;AAAA,cACH,OAAOqT,EAAO,QAAQ3xB;AAAA;AAAA,YAAA,EACtB;AAAA,UAAA;AAAA,QAEN;AAAA,MACF;AAAA,IACF;AACA,SAAK,uBAAuB,CAAA,GAC5BmxB,EAAiB,KAAK,KAAK,4BAA4B;AAAA,EACzD;AAAA,EAEO,oBAAoBlW,GAA+B7U,GAAmB;AtDpL5E,QAAAlH,GAAAgH,GAAAuC;AsDqLC,QAAI,GAACvJ,IAAA,KAAK,yBAAL,QAAAA,EAA2B,QAAQ;AACxC,UAAM,EAAE,kBAAAuf,GAAkB,kBAAAC,EAAA,IAAqB,KAAK,SAC9C5X,IAAe,KAAK,KAAK,YAAA,EAAc,wBAAA,GACvC7H,IAAc,KAAK,KAAK,uBAAA;AAC9B,IAAAgc,EAAI,KAAA;AACJ,aAAS7jB,IAAI,GAAGA,IAAI,KAAK,qBAAqB,QAAQA,KAAK;AACzD,YAAMwnB,IAAc,KAAK,qBAAqBxnB,CAAC;AAC/C,UAAIuO,IAAoC;AACxC,UAAIiZ,EAAY,SAAS;AACvB,cAAM,EAAE,YAAAC,GAAY,SAAA3T,GAAS,SAAAC,GAAS,OAAA5E,MAAUqY;AAChD,QAAAjZ,KACE8C,KAAAvC,IAAAjH,EAAY4f,CAAW,MAAvB,gBAAA3Y,EAA0B,OAAQgF,GAAU,OAAOC,OAAnD,gBAAA1C,EACI,aAAclC;AAAA,MACtB;AACE,QAAAZ,IAAWmB,EAAa8X,EAAY,KAAK;AAE3C,UAAI,CAACjZ,EAAU;AACf,YAAM;AAAA,QACJ,YAAY,EAAE,SAAA5C,GAAS,YAAAc,GAAY,UAAAb,EAAA;AAAA,QACnC,QAAAE;AAAA,MAAA,IACEyC;AACJ,UAAIzC,MAAWkD,EAAW;AAC1B,MAAA6U,EAAI,YAAY2D,EAAY,mBAAmBF,GAC/CzD,EAAI,cAAc2D,EAAY,SAASH;AACvC,YAAM7iB,IAAImH,EAAQ,CAAC,GACb1I,IAAI0I,EAAQ,CAAC,GACbR,IAAQS,EAAS,CAAC,IAAID,EAAQ,CAAC,GAC/BH,IAASiB,EAAW,CAAC,IAAId,EAAQ,CAAC;AACxC,MAAAkY,EAAI,SAASrf,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,IAClC;AACA,IAAAqY,EAAI,QAAA;AAAA,EACN;AACF;AChNO,MAAM2W,GAAc;AAAA,EAIzB,YAAY9xB,GAAY;AAHd,IAAA+B,EAAA;AACF,IAAAA,EAAA;AAGN,SAAK,aAAa,KAAK,gBAAA,GACvB,KAAK,UAAU/B,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,kBAAkB;AACvB,gBAAK,aAAa;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,GAEH,KAAK;AAAA,EACd;AAAA,EAEO,iBAAiBlE,GAAWvB,GAAWkI,GAAeK,GAAgB;AAE3E,IADsB,CAAC,KAAK,WAAW,UAErC,KAAK,WAAW,IAAIhH,GACpB,KAAK,WAAW,IAAIvB,GACpB,KAAK,WAAW,SAASuI,IAE3B,KAAK,WAAW,SAASL;AAAA,EAC3B;AAAA,EAEO,OAAO0Y,GAA+B;AAC3C,QAAI,CAAC,KAAK,WAAW,MAAO;AAC5B,UAAM;AAAA,MACJ,OAAA7Y;AAAA,MACA,SAAS,EAAE,aAAA6iB,GAAa,aAAAD,EAAA;AAAA,IAAY,IAClC,KAAK,SACH,EAAE,GAAAppB,GAAG,GAAAvB,GAAG,OAAAkI,GAAO,QAAAK,EAAA,IAAW,KAAK;AACrC,IAAAqY,EAAI,KAAA,GACJA,EAAI,UAAU,GAAG,IAAI7Y,CAAK,GAC1B6Y,EAAI,YAAYgK,IAAc7iB,GAC9B6Y,EAAI,cAAc+J,GAClB/J,EAAI,UAAA,GACJA,EAAI,KAAKrf,GAAGvB,GAAGkI,GAAOK,CAAM,GAC5BqY,EAAI,OAAA,GACJA,EAAI,QAAA,GACJ,KAAK,gBAAA;AAAA,EACP;AACF;ACpBO,MAAM4W,GAA0C;AAAA,EASrD,YAAYxxB,GAAmBuE,GAAkB;AARzC,IAAA/C,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,wCAAiC;AAGvC,UAAM/B,IAAO8E,EAAQ,QAAA;AACrB,SAAK,UAAU9E,EAAK,WAAA,GACpB,KAAK,UAAUO,GACf,KAAK,UAAUuE,GACf,KAAK,UAAU,IACf,KAAK,YAAY;AAAA,EACnB;AAAA,EAEO,WAAWvE,GAAmB;AACnC,SAAK,UAAUA;AAAA,EACjB;AAAA,EAEO,aAAuB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,aAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,WAAqB;AxD7D3B,QAAAnB,GAAAgH;AwD8DC,YAAOA,KAAAhH,IAAA,KAAK,YAAL,gBAAAA,EAAc,YAAd,QAAAgH,EAAuB,OAC1B,KAAK,QAAQ,QAAQ,KAAK,MAAM,GAAG,IACnC,CAAA;AAAA,EACN;AAAA,EAEO,QAAQf,GAAgC;AxDnE9C,QAAAjG,GAAAgH;AwDoEC,QAAI,GAAChH,IAAA,KAAK,YAAL,QAAAA,EAAc,SAAS,QAAO;AACnC,UAAM0F,IAAU,KAAK,QAAQ;AAC7B,QAAI,GAACsB,IAAAtB,EAAQ,cAAR,QAAAsB,EAAmB,QAAQ,QAAO;AACvC,UAAM4rB,KACJltB,KAAA,gBAAAA,EAAS,yBAAwB,KAAK,gCAClCmtB,IAAYntB,EAAQ,WACpBotB,IAAsB,CAAA;AAC5B,WAAA7sB,EAAM,QAAQ,CAAA8sB,MAAQ;AACpB,YAAMC,IAAWH,EAAU,KAAK,CAAA/2B,MAAKA,EAAE,SAASi3B,CAAI;AACpD,MAAIC,KAAY,CAACC,GAAWD,EAAS,KAAK,KACxCF,EAAU,KAAKE,EAAS,KAAK;AAAA,IAEjC,CAAC,GACMF,EAAU,KAAKF,CAAoB,KAAK;AAAA,EACjD;AAAA,EAEO,SAAS1sB,IAA2B,IAAgB;AACzD,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClD,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAC/CP,IAAe5F,EAAYe,CAAU,GACrCjC,IAAmB,CAAA;AAEzB,QAAI+G,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD;AAEF,MAAID,EAAW,qBAAqBC,EAAiB,SACnDjH,EAAK,QAAQgH,CAAU,GAEzBD;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,MAAIE,EAAY,qBAAqBF,EAAiB,SACpDjH,EAAK,KAAKmH,CAAW,GAEvBD;AAAA,IACF;AACA,WAAOlH;AAAA,EACT;AAAA,EAEO,SACLA,GACAqH,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GACtB;AxDhIT,QAAAN,GAAAgH;AwDkIC,QACE,GAACA,KAAAhH,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB,2BAAtB,QAAAgH,EAA8C,cAC9C,CAAC1G,EAAQ,wBACR,KAAK,QAAQ,qBAAqB4F,CAAO;AAE3C,aAAO;AAET,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQwG,EAAQ,SAAS,KAAK,QAAQ,SAAA;AAE5C,SAAK,QAAQ,eAAeA,CAAO;AACnC,UAAM,EAAE,YAAApF,GAAY,UAAAsF,EAAA,IAAa1G,GAC3BkB,IAAO,KAAK,QAAQ,QAAA;AAE1B,IAAIE,MAAesF,IACjBxF,EAAK,kBAAkBb,GAAae,IAAa,GAAGsF,IAAWtF,CAAU,IAGzE,KAAK,QAAQ,kBAAkBA,GAAYoF,CAAO;AAGpD,UAAMP,IAAe5F,EAAYe,CAAU,GACrCE,IACH2E,EAAa,QACZ,CAACuO,GAAsB,SAASvO,EAAa,IAAI,KACnDA,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,WAC/CqK,GAAWxK,GAAc;AAAA,MACvB;AAAA,MACA;AAAA,MACA,GAAGutB;AAAAA,IAAA,CACJ,IACDhoB,GAAWvF,GAAc,CAAC,MAAM,CAAC,GAEjC1E,IAAQvB,EAAM,aAAa;AACjC,aAAS3H,IAAI,GAAGA,IAAI8G,EAAK,QAAQ9G,KAAK;AACpC,YAAM8S,IAAuB;AAAA,QAC3B,GAAG7J;AAAA,QACH,GAAGnC,EAAK9G,CAAC;AAAA,QACT,kBAAkB+N,EAAiB;AAAA,MAAA;AAErCzE,MAAAA,GAAqBtB,GAAa,CAAC8K,CAAU,GAAG/J,GAAY;AAAA,QAC1D,eAAe,KAAK;AAAA,MAAA,CACrB,GACDF,EAAK,kBAAkBb,GAAakB,IAAQlJ,GAAG,GAAG,CAAC8S,CAAU,CAAC;AAAA,IAChE;AACA,WAAO5J,IAAQpC,EAAK,SAAS;AAAA,EAC/B;AAAA,EAEO,QAAQmD,GAAmC;AAChD,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,UAAMjC,IAAc,KAAK,QAAQ,eAAA,GAC3BL,IAAQ,KAAK,QAAQ,SAAA;AAE3B,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAoB,GAAY,UAAAsF,EAAA,IAAa1G,GAC3BiG,IAAe5F,EAAYe,CAAU,GACrCqM,IAAapN,EAAYqG,CAAQ;AAEvC,QAAIpE,EAAI,QAAQqE,GAAO;AAErB,aAAIvF,MAAesF,IACV,KAAK,YAAA,IAGVT,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,YACnDqH,EAAW,qBAAqBrH,EAAiB,WACjDqH,EAAW,qBAAqBrH,EAAiB,aACjDH,EAAa,qBAAqBG,EAAiB,cAG5C,KAAK,QAAQ,cAAchF,CAAU,IAGrC,KAAK,YAAA;AAGlB,QAAWkB,EAAI,QAAQqE,GAAO,QAAQ;AAEpC,UAAIvF,MAAesF;AAEjB,eAAO,KAAK,YAAA;AACP;AACL,cAAM+sB,IAAiBpzB,EAAYqG,IAAW,CAAC;AAC/C,gBACIT,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,aACnDqtB,EAAe,qBAAqBrtB,EAAiB,eACvDqtB,EAAe,qBAAqBrtB,EAAiB,WACrDqtB,EAAe,qBAAqBrtB,EAAiB,aACrDH,EAAa,qBAAqBG,EAAiB,cAG5C,KAAK,QAAQ,cAAchF,CAAU,IAGrC,KAAK,YAAA;AAAA,MAEhB;AAAA,IACF;AACA,WAAOsF;AAAA,EACT;AAAA,EAEO,MAAc;AACnB,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAtF,GAAY,UAAAsF,EAAA,IAAa,KAAK,QAAQ,SAAA;AAC9C,WAAItF,MAAesF,IACVtF,IAGF,KAAK,YAAA;AAAA,EACd;AAAA,EAEO,YACLoF,IAA2B,IAC3B5F,IAA8B,CAAA,GACtB;AACR,UAAM,EAAE,sBAAA8yB,IAAuB,IAAO,kBAAAC,IAAmB,OAAS/yB;AAElE,QAAI,CAAC8yB,KAAwB,KAAK,QAAQ,qBAAqBltB,CAAO;AACpE,aAAO;AAET,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClD,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAC/CP,IAAe5F,EAAYe,CAAU;AAC3C,QAAIwyB,IAAY,IACZC,IAAa,IAEb3tB,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB,UACjD;AACA,QAAAwtB,IAAY1tB;AACZ;AAAA,MACF;AACA,MAAAA;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB,WAClD;AACA,QAAAytB,IAAaxtB,IAAY;AACzB;AAAA,MACF;AACA,MAAAA;AAAA,IACF;AACA,WAAI,CAAC,CAACutB,KAAa,CAAC,CAACC,IAAmB,MAE3B,KAAK,QAAQ,QAAA,EACrB;AAAA,MACHxzB;AAAA,MACAuzB,IAAY;AAAA,MACZC,IAAaD;AAAA,MACb,CAAA;AAAA,MACA;AAAA,QACE,qBAAqBhzB,EAAQ;AAAA,MAAA;AAAA,IAC/B,GAGE+yB,KACF,KAAK,QAAQ,eAAeztB,GAAUM,CAAO,GAE/C,KAAK,QAAQ;AAAA,MACX;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,aAAAnG;AAAA,QACA,OAAO,EAAE,YAAY6F,GAAU,UAAUA,EAAA;AAAA,MAAS;AAAA,IACpD,GAEKA;AAAA,EACT;AAAA,EAEO,UACLmtB,GACA7sB,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GAC9B;AxDnUD,QAAAN;AwDqUC,QACE,CAACM,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC;AAEF,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQwG,EAAQ,SAAS,KAAK,QAAQ,SAAA,GACtCR,IAAU,KAAK,QAAQ,SACvB8tB,KAAWT,KAAA,gBAAAA,EAAM,MAAM,KAAK,qBAAoB,CAAA,GAEhDU,IAAU/tB,EAAQ,MAClBguB,MAAW1zB,IAAA0F,EAAQ,SAAR,gBAAA1F,EAAc,MAAM,KAAK,qBAAoB,CAAA,GAExD2zB,IAAgBjuB,EAAQ;AAC9B,QACG,CAACiuB,KAAiBZ,MAASU,KAC3BE,KAAiBC,GAAaF,GAAUF,CAAQ,GACjD;AACA,WAAK,QAAQ,eAAe;AAAA,QAC1B,UAAU9zB,EAAM;AAAA,QAChB,WAAW;AAAA,QACX,iBAAiB;AAAA,MAAA,CAClB,GACD,KAAK,QAAA;AACL;AAAA,IACF;AACA,UAAMmzB,IAAYntB,EAAQ;AAC1B,QAAI,CAAC,MAAM,QAAQmtB,CAAS,KAAK,CAACA,EAAU,OAAQ;AAEpD,UAAM/yB,IAAO,KAAK,QAAQ0zB,CAAQ;AAClC,QAAI,CAAC1zB,GAAM;AAET,UAAI2zB,GAAS;AACX,cAAMI,IAAc,KAAK,YAAY3tB,GAAS;AAAA,UAC5C,qBAAqB5F,EAAQ;AAAA,QAAA,CAC9B;AACD,QAAI,CAACuzB,MACH,KAAK,QAAQ,eAAe;AAAA,UAC1B,UAAUA;AAAAA,QAAA,CACX,GACD,KAAK,QAAQ,yBAAyB;AAAA,UACpC,cAAc,CAAA;AAAA,QAAC,CAChB;AAAA,MAEL;AACA;AAAA,IACF;AAEA,UAAMC,IAAe,KAAK,SAAS5tB,CAAO,EAAE,CAAC,GACvC6tB,IAAeD,IACjB3jB,GAAW2jB,GAAc/oB,EAAyB,IAClDoF,GAAWpQ,EAAYL,EAAM,UAAU,GAAGwzB,EAAkB,GAE1DW,IAAc,KAAK,YAAY3tB,GAAS;AAAA,MAC5C,kBAAkB;AAAA,MAClB,qBAAqB5F,EAAQ;AAAA,IAAA,CAC9B;AACD,QAAI,CAAC,CAACuzB,EAAa;AAEnB,IAAKJ,KACH,KAAK,QAAQ,kBAAkBI,GAAa3tB,CAAO;AAGrD,UAAM8tB,IAAkB9oB;AAAAA,MACtBnL,EAAY8zB,CAAW;AAAA,MACvB9oB;AAAAA,IAAA,GAEI9J,IAAQ4yB,IAAc,GACtBh1B,IAAO6T,GAAU5S,CAAI,GACrBc,IAAO,KAAK,QAAQ,QAAA;AAC1B,aAAS7I,IAAI,GAAGA,IAAI8G,EAAK,QAAQ9G,KAAK;AACpC,YAAM8S,IAAuB;AAAA,QAC3B,GAAGkpB;AAAA,QACH,GAAGC;AAAA,QACH,MAAMlyB,EAAY;AAAA,QAClB,OAAOjD,EAAK9G,CAAC;AAAA,QACb,kBAAkB+N,EAAiB;AAAA,MAAA;AAErCzE,MAAAA,GAAqBtB,GAAa,CAAC8K,CAAU,GAAGgpB,GAAa;AAAA,QAC3D,eAAe,KAAK;AAAA,MAAA,CACrB,GACDjzB,EAAK,kBAAkBb,GAAakB,IAAQlJ,GAAG,GAAG,CAAC8S,CAAU,CAAC;AAAA,IAChE;AAYA,QAVA,KAAK,QAAQ;AAAA,MACX;AAAA,QACE,MAAAkoB;AAAA,MAAA;AAAA,MAEF;AAAA,QACE,aAAAhzB;AAAA,QACA,OAAO,EAAE,YAAY8zB,GAAa,UAAUA,EAAA;AAAA,MAAY;AAAA,IAC1D,GAGE,CAAC3tB,EAAQ,OAAO;AAClB,YAAMoH,IAAWrM,IAAQpC,EAAK,SAAS;AACvC,WAAK,QAAQ,eAAe;AAAA,QAC1B,UAAUyO;AAAA,MAAA,CACX,GACD,KAAK,QAAQ,yBAAyB;AAAA,QACpC,SAAApH;AAAA,MAAA,CACD,GACIytB,KACH,KAAK,QAAA;AAAA,IAET;AAAA,EACF;AAAA,EAEQ,wBAAwB;AAC9B,UAAMjuB,IAAU,KAAK,QAAQ,SACvBmtB,IAAYntB,EAAQ;AAC1B,QAAI,CAAC,MAAM,QAAQmtB,CAAS,KAAK,CAACA,EAAU,OAAQ;AACpD,UAAMpsB,IAAW,KAAK,QAAQ,YAAA;AAC9B,QAAI,CAACA,EAAU;AAEf,UAAMwtB,IAAuB,SAAS,cAAc,KAAK;AACzD,IAAAA,EAAqB,UAAU,IAAI,GAAGpxB,CAAa,uBAAuB,GAC1EoxB,EAAqB,aAAavd,IAAkBwd,GAAgB,KAAK;AACzE,UAAMC,IAAK,SAAS,cAAc,IAAI;AACtC,aAASr4B,IAAI,GAAGA,IAAI+2B,EAAU,QAAQ/2B,KAAK;AACzC,YAAMk3B,IAAWH,EAAU/2B,CAAC,GACtBs4B,IAAK,SAAS,cAAc,IAAI;AACtC,UAAInuB,IAAQ,KAAK,SAAA;AACjB,MAAIA,EAAM,SAAS+sB,EAAS,IAAI,KAC9BoB,EAAG,UAAU,IAAI,QAAQ,GAE3BA,EAAG,UAAU,MAAM;AACjB,cAAMxtB,IAAYX,EAAM,UAAU,CAAA8sB,MAAQA,MAASC,EAAS,IAAI;AAChE,QAAIttB,EAAQ,gBACN,CAACkB,IACHX,EAAM,OAAOW,GAAW,CAAC,IAEzBX,EAAM,KAAK+sB,EAAS,IAAI,IAGtB,CAACpsB,IACHX,IAAQ,CAAA,IAERA,IAAQ,CAAC+sB,EAAS,IAAI,GAG1B,KAAK,UAAU/sB,EAAM,KAAK,KAAK,eAAe,CAAC;AAAA,MACjD,GACAmuB,EAAG,OAAO,SAAS,eAAepB,EAAS,KAAK,CAAC,GACjDmB,EAAG,OAAOC,CAAE;AAAA,IACd;AACA,IAAAH,EAAqB,OAAOE,CAAE;AAE9B,UAAM;AAAA,MACJ,YAAY;AAAA,QACV,SAAS,CAACjvB,GAAME,CAAG;AAAA,MAAA;AAAA,MAErB,YAAA4oB;AAAA,IAAA,IACEvnB,GACExC,IAAO,KAAK,QAAQ,QAAA;AAC1B,IAAAgwB,EAAqB,MAAM,OAAO,GAAG/uB,CAAI,MACzC+uB,EAAqB,MAAM,MAAM,GAAG7uB,IAAMnB,IAAO+pB,CAAU,MAEzC,KAAK,QAAQ,aAAA,EACrB,OAAOiG,CAAoB,GACrC,KAAK,YAAYA;AAAA,EACnB;AAAA,EAEO,QAAQ;AxDzed,QAAAj0B;AwD0eC,QACE,KAAK,WACL,KAAK,QAAQ,qBAAA,KACb,CAAC,KAAK,QAAQ;AAEd;AAEF,UAAM,EAAE,YAAAc,EAAA,IAAe,KAAK,QAAQ,SAAA;AAEpC,MAAId,IADgB,KAAK,QAAQ,eAAA,EACjBc,IAAa,CAAC,MAA1B,gBAAAd,EAA6B,eAAc,KAAK,QAAQ,cAG5D,KAAK,sBAAA,GACL,KAAK,UAAU;AAAA,EACjB;AAAA,EAEO,UAAU;AxD1fhB,QAAAA;AwD2fC,IAAK,KAAK,aACVA,IAAA,KAAK,cAAL,QAAAA,EAAgB,UAChB,KAAK,UAAU;AAAA,EACjB;AACF;AC7eO,MAAMq0B,GAAwC;AAAA,EAKnD,YAAYlzB,GAAmBuE,GAAkB;AAJzC,IAAA/C,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,UAAM/B,IAAO8E,EAAQ,QAAA;AACrB,SAAK,UAAU9E,EAAK,WAAA,GACpB,KAAK,UAAUO,GACf,KAAK,UAAUuE;AAAA,EACjB;AAAA,EAEO,WAAWvE,GAAmB;AACnC,SAAK,UAAUA;AAAA,EACjB;AAAA,EAEO,aAAuB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,SAAS+E,IAA2B,IAAgB;AACzD,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClD,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAC/CP,IAAe5F,EAAYe,CAAU,GACrCjC,IAAmB,CAAA;AAEzB,QAAI+G,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD;AAEF,MAAID,EAAW,qBAAqBC,EAAiB,SACnDjH,EAAK,QAAQgH,CAAU,GAEzBD;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,MAAIE,EAAY,qBAAqBF,EAAiB,SACpDjH,EAAK,KAAKmH,CAAW,GAEvBD;AAAA,IACF;AACA,WAAOlH;AAAA,EACT;AAAA,EAEO,SACLA,GACAqH,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GACtB;AAER,QACE,CAACA,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC,aAAO;AAET,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQwG,EAAQ,SAAS,KAAK,QAAQ,SAAA;AAE5C,SAAK,QAAQ,eAAeA,CAAO;AACnC,UAAM,EAAE,YAAApF,GAAY,UAAAsF,EAAA,IAAa1G,GAC3BkB,IAAO,KAAK,QAAQ,QAAA;AAE1B,IAAIE,MAAesF,IACjBxF,EAAK;AAAA,MACHb;AAAA,MACAe,IAAa;AAAA,MACbsF,IAAWtF;AAAA,MACX,CAAA;AAAA,MACA;AAAA,QACE,qBAAqBR,EAAQ;AAAA,MAAA;AAAA,IAC/B,IAIF,KAAK,QAAQ,kBAAkBQ,GAAYoF,CAAO;AAGpD,UAAMP,IAAe5F,EAAYe,CAAU,GACrCE,IACH2E,EAAa,QACZ,CAACuO,GAAsB,SAASvO,EAAa,IAAI,KACnDA,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,WAC/CqK,GAAWxK,GAAc;AAAA,MACvB;AAAA,MACA;AAAA,MACA,GAAGutB;AAAAA,IAAA,CACJ,IACDhoB,GAAWvF,GAAc,CAAC,MAAM,CAAC,GAEjC1E,IAAQvB,EAAM,aAAa;AACjC,aAAS3H,IAAI,GAAGA,IAAI8G,EAAK,QAAQ9G,KAAK;AACpC,YAAM8S,IAAuB;AAAA,QAC3B,GAAG7J;AAAA,QACH,GAAGnC,EAAK9G,CAAC;AAAA,QACT,kBAAkB+N,EAAiB;AAAA,MAAA;AAErCzE,MAAAA,GAAqBtB,GAAa,CAAC8K,CAAU,GAAG/J,GAAY;AAAA,QAC1D,eAAe,KAAK;AAAA,MAAA,CACrB,GACDF,EAAK,kBAAkBb,GAAakB,IAAQlJ,GAAG,GAAG,CAAC8S,CAAU,CAAC;AAAA,IAChE;AACA,WAAO5J,IAAQpC,EAAK,SAAS;AAAA,EAC/B;AAAA,EAEO,WACLqH,IAA2B,IAC3B5F,IAA8B,CAAA,GACtB;AAER,QACE,CAACA,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC,aAAO;AAET,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQwG,EAAQ,SAAS,KAAK,QAAQ,SAAA,GACtC,EAAE,YAAApF,GAAY,UAAAsF,EAAA,IAAa1G;AACjC,gBAAK,QACF,UACA;AAAA,MACCK;AAAA,MACAe,IAAa;AAAA,MACbsF,IAAWtF;AAAA,MACX,CAAA;AAAA,MACA;AAAA,QACE,qBAAqBR,EAAQ;AAAA,MAAA;AAAA,IAC/B,GAEU,KAAK,SAAS4F,CAAO,EACxB,UACT,KAAK,QAAQ,eAAepF,GAAYoF,CAAO,GAE1CpF;AAAA,EACT;AAAA,EAEO,QAAQkB,GAAmC;AAChD,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,UAAMjC,IAAc,KAAK,QAAQ,eAAA,GAC3BL,IAAQ,KAAK,QAAQ,SAAA;AAE3B,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAoB,GAAY,UAAAsF,EAAA,IAAa1G,GAC3BiG,IAAe5F,EAAYe,CAAU,GACrCqM,IAAapN,EAAYqG,CAAQ,GACjCxF,IAAO,KAAK,QAAQ,QAAA;AAE1B,QAAIoB,EAAI,QAAQqE,GAAO;AAErB,aAAIvF,MAAesF,KACjBxF,EAAK;AAAA,QACHb;AAAA,QACAe,IAAa;AAAA,QACbsF,IAAWtF;AAAA,MAAA,GAEC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA,KAGL6E,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,YACnDqH,EAAW,qBAAqBrH,EAAiB,WACjDqH,EAAW,qBAAqBrH,EAAiB,aACjDH,EAAa,qBAAqBG,EAAiB,cAG5C,KAAK,QAAQ,cAAchF,CAAU,KAG5CF,EAAK,kBAAkBb,GAAae,GAAY,CAAC,GACnC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,IAAa,CAAC,GAErCA,IAAa;AAG1B,QAAWkB,EAAI,QAAQqE,GAAO,QAAQ;AAEpC,UAAIvF,MAAesF;AACjB,eAAAxF,EAAK;AAAA,UACHb;AAAA,UACAe,IAAa;AAAA,UACbsF,IAAWtF;AAAA,QAAA,GAEC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA;AACF;AACL,cAAMqyB,IAAiBpzB,EAAYqG,IAAW,CAAC;AAC/C,gBACIT,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,aACnDqtB,EAAe,qBAAqBrtB,EAAiB,eACvDqtB,EAAe,qBAAqBrtB,EAAiB,WACrDqtB,EAAe,qBAAqBrtB,EAAiB,aACrDH,EAAa,qBAAqBG,EAAiB,cAG5C,KAAK,QAAQ,cAAchF,CAAU,KAG5CF,EAAK,kBAAkBb,GAAae,IAAa,GAAG,CAAC,GACvC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA;AAAA,MAEX;AAAA,IACF;AACA,WAAOsF;AAAA,EACT;AAAA,EAEO,MAAc;AACnB,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAtF,GAAY,UAAAsF,EAAA,IAAa,KAAK,QAAQ,SAAA;AAC9C,QAAItF,MAAesF;AACjB,aAAOtF;AAET,UAAMF,IAAO,KAAK,QAAQ,QAAA,GACpBb,IAAc,KAAK,QAAQ,eAAA;AACjC,WAAAa,EAAK,kBAAkBb,GAAae,IAAa,GAAGsF,IAAWtF,CAAU,GAC3D,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA;AAAA,EACT;AACF;AC7PO,MAAMwzB,GAAwC;AAAA,EAQnD,YAAYnzB,GAAmBuE,GAAkB;AAPzC,IAAA/C,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,UAAM/B,IAAO8E,EAAQ,QAAA;AACrB,SAAK,OAAO9E,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,UAAUO,GACf,KAAK,UAAUuE,GACf,KAAK,UAAU,IACf,KAAK,aAAa;AAAA,EACpB;AAAA,EAEO,WAAWvE,GAAmB;AACnC,SAAK,UAAUA;AAAA,EACjB;AAAA,EAEO,aAAuB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,aAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,cAAc+E,IAA2B,IAA6B;AAC3E,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClD,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAC/CP,IAAe5F,EAAYe,CAAU;AAE3C,QAAI8E,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UACEC,EAAW,cAAcF,EAAa,aACtCE,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD;AAEF,MAAAF;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UACEC,EAAY,cAAcL,EAAa,aACvCK,EAAY,qBAAqBF,EAAiB,WAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,MAAAC;AAAA,IACF;AACA,WAAIH,MAAaG,IAAkB,OAC5B,CAACH,GAAUG,IAAY,CAAC;AAAA,EACjC;AAAA,EAEO,SAASG,IAA2B,IAAgB;AACzD,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQ,KAAK,cAAcwG,CAAO;AACxC,QAAI,CAACxG,EAAO,QAAO,CAAA;AACnB,UAAMb,IAAmB,CAAA,GACnB,CAACiC,GAAYsF,CAAQ,IAAI1G;AAC/B,aAAS3H,IAAI+I,GAAY/I,KAAKqO,GAAUrO,KAAK;AAC3C,YAAMoJ,IAAUpB,EAAYhI,CAAC;AAC7B,MAAIoJ,EAAQ,qBAAqB2E,EAAiB,SAChDjH,EAAK,KAAKsC,CAAO;AAAA,IAErB;AACA,WAAOtC;AAAA,EACT;AAAA,EAEO,SACLA,GACAqH,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GACtB;AAER,QACE,CAACA,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC,aAAO;AAET,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQwG,EAAQ,SAAS,KAAK,QAAQ,SAAA;AAE5C,SAAK,QAAQ,eAAeA,CAAO;AACnC,UAAM,EAAE,YAAApF,GAAY,UAAAsF,EAAA,IAAa1G,GAC3BkB,IAAO,KAAK,QAAQ,QAAA;AAE1B,IAAIE,MAAesF,IACjBxF,EAAK,kBAAkBb,GAAae,IAAa,GAAGsF,IAAWtF,CAAU,IAGzE,KAAK,QAAQ,kBAAkBA,GAAYoF,CAAO;AAGpD,UAAMP,IAAe5F,EAAYe,CAAU,GACrCE,IACH2E,EAAa,QACZ,CAACuO,GAAsB,SAASvO,EAAa,IAAI,KACnDA,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,WAC/CqK,GAAWxK,GAAc;AAAA,MACvB;AAAA,MACA;AAAA,MACA,GAAGutB;AAAAA,IAAA,CACJ,IACDhoB,GAAWvF,GAAc,CAAC,MAAM,CAAC,GAEjC1E,IAAQvB,EAAM,aAAa;AACjC,aAAS3H,IAAI,GAAGA,IAAI8G,EAAK,QAAQ9G,KAAK;AACpC,YAAM8S,IAAuB;AAAA,QAC3B,GAAG7J;AAAA,QACH,GAAGnC,EAAK9G,CAAC;AAAA,QACT,kBAAkB+N,EAAiB;AAAA,MAAA;AAErCzE,MAAAA,GAAqBtB,GAAa,CAAC8K,CAAU,GAAG/J,GAAY;AAAA,QAC1D,eAAe,KAAK;AAAA,MAAA,CACrB,GACDF,EAAK,kBAAkBb,GAAakB,IAAQlJ,GAAG,GAAG,CAAC8S,CAAU,CAAC;AAAA,IAChE;AACA,WAAO5J,IAAQpC,EAAK,SAAS;AAAA,EAC/B;AAAA,EAEO,YACLqH,IAA2B,IAC3B5F,IAA8B,CAAA,GACtB;AACR,UAAM,EAAE,sBAAA8yB,IAAuB,IAAO,kBAAAC,IAAmB,OAAS/yB;AAElE,QAAI,CAAC8yB,KAAwB,KAAK,QAAQ,qBAAqBltB,CAAO;AACpE,aAAO;AAET,UAAMxG,IAAQ,KAAK,cAAcwG,CAAO;AACxC,QAAI,CAACxG,EAAO,QAAO;AACnB,UAAM,CAAC4zB,GAAWC,CAAU,IAAI7zB;AAChC,QAAI,CAAC,CAAC4zB,KAAa,CAAC,CAACC,EAAY,QAAO;AACxC,UAAMxzB,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA;AAGxD,WADa,KAAK,QAAQ,QAAA,EACrB;AAAA,MACHnG;AAAA,MACAuzB,IAAY;AAAA,MACZC,IAAaD;AAAA,MACb,CAAA;AAAA,MACA;AAAA,QACE,qBAAqBhzB,EAAQ;AAAA,MAAA;AAAA,IAC/B,GAGE+yB,KACF,KAAK,QAAQ,eAAeC,GAAWptB,CAAO,GAEzCotB;AAAA,EACT;AAAA,EAEO,UACLiB,GACAruB,IAA2B,CAAA,GAC3B5F,IAA8B,CAAA,GAC9B;AAEA,QACE,CAACA,EAAQ,wBACT,KAAK,QAAQ,qBAAqB4F,CAAO;AAEzC;AAEF,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,QAAQ,eAAA,GAClDxG,IAAQwG,EAAQ,SAAS,KAAK,QAAQ,SAAA,GAEtC4tB,IAAe,KAAK,SAAS5tB,CAAO,EAAE,CAAC,GACvC6tB,IAAeD,IACjB3jB,GAAW2jB,GAAc/oB,EAAyB,IAClDoF,GAAWpQ,EAAYL,EAAM,UAAU,GAAGwzB,EAAkB,GAE1DW,IAAc,KAAK,YAAY3tB,GAAS;AAAA,MAC5C,kBAAkB;AAAA,MAClB,qBAAqB5F,EAAQ;AAAA,IAAA,CAC9B;AACD,QAAI,CAAC,CAACuzB,EAAa;AAEnB,UAAMG,IAAkB9oB;AAAAA,MACtBnL,EAAY8zB,CAAW;AAAA,MACvB9oB;AAAAA,IAAA,GAEI9J,IAAQ4yB,IAAc,GACtBjzB,IAAO,KAAK,QAAQ,QAAA;AAC1B,aAAS7I,IAAI,GAAGA,IAAIw8B,EAAK,QAAQx8B,KAAK;AACpC,YAAM8S,IAAuB;AAAA,QAC3B,GAAGkpB;AAAA,QACH,GAAGC;AAAA,QACH,MAAMlyB,EAAY;AAAA,QAClB,OAAOyyB,EAAKx8B,CAAC;AAAA,QACb,kBAAkB+N,EAAiB;AAAA,MAAA;AAErCzE,MAAAA,GAAqBtB,GAAa,CAAC8K,CAAU,GAAGgpB,GAAa;AAAA,QAC3D,eAAe,KAAK;AAAA,MAAA,CACrB,GACDjzB,EAAK,kBAAkBb,GAAakB,IAAQlJ,GAAG,GAAG,CAAC8S,CAAU,CAAC;AAAA,IAChE;AAEA,QAAI,CAAC3E,EAAQ,OAAO;AAClB,YAAMoH,IAAWrM,IAAQszB,EAAK,SAAS;AACvC,WAAK,QAAQ,eAAe;AAAA,QAC1B,UAAUjnB;AAAA,MAAA,CACX,GACD,KAAK,QAAQ,yBAAyB;AAAA,QACpC,SAAApH;AAAA,MAAA,CACD,GACD,KAAK,QAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEO,QAAQlE,GAAmC;AAChD,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,UAAMjC,IAAc,KAAK,QAAQ,eAAA,GAC3BL,IAAQ,KAAK,QAAQ,SAAA;AAE3B,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAoB,GAAY,UAAAsF,EAAA,IAAa1G,GAC3BiG,IAAe5F,EAAYe,CAAU,GACrCqM,IAAapN,EAAYqG,CAAQ,GACjCxF,IAAO,KAAK,QAAQ,QAAA;AAE1B,QAAIoB,EAAI,QAAQqE,GAAO;AAErB,aAAIvF,MAAesF,KACjBxF,EAAK;AAAA,QACHb;AAAA,QACAe,IAAa;AAAA,QACbsF,IAAWtF;AAAA,MAAA,GAEC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA,KAGL6E,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,YACnDqH,EAAW,qBAAqBrH,EAAiB,WACjDqH,EAAW,qBAAqBrH,EAAiB,aACjDH,EAAa,qBAAqBG,EAAiB,cAG5C,KAAK,QAAQ,cAAchF,CAAU,KAG5CF,EAAK,kBAAkBb,GAAae,GAAY,CAAC,GACnC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,IAAa,CAAC,GAErCA,IAAa;AAG1B,QAAWkB,EAAI,QAAQqE,GAAO,QAAQ;AAEpC,UAAIvF,MAAesF;AACjB,eAAAxF,EAAK;AAAA,UACHb;AAAA,UACAe,IAAa;AAAA,UACbsF,IAAWtF;AAAA,QAAA,GAEC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA;AACF;AACL,cAAMqyB,IAAiBpzB,EAAYqG,IAAW,CAAC;AAC/C,gBACIT,EAAa,qBAAqBG,EAAiB,UACnDH,EAAa,qBAAqBG,EAAiB,aACnDqtB,EAAe,qBAAqBrtB,EAAiB,eACvDqtB,EAAe,qBAAqBrtB,EAAiB,WACrDqtB,EAAe,qBAAqBrtB,EAAiB,aACrDH,EAAa,qBAAqBG,EAAiB,cAG5C,KAAK,QAAQ,cAAchF,CAAU,KAG5CF,EAAK,kBAAkBb,GAAae,IAAa,GAAG,CAAC,GACvC,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA;AAAA,MAEX;AAAA,IACF;AACA,WAAOsF;AAAA,EACT;AAAA,EAEO,MAAc;AACnB,QAAI,KAAK,QAAQ;AACf,aAAO;AAET,SAAK,QAAQ,eAAA;AACb,UAAM,EAAE,YAAAtF,GAAY,UAAAsF,EAAA,IAAa,KAAK,QAAQ,SAAA;AAC9C,QAAItF,MAAesF;AACjB,aAAOtF;AAET,UAAMF,IAAO,KAAK,QAAQ,QAAA,GACpBb,IAAc,KAAK,QAAQ,eAAA;AACjC,WAAAa,EAAK,kBAAkBb,GAAae,IAAa,GAAGsF,IAAWtF,CAAU,GAC3D,KAAK,SAAA,EACR,UACT,KAAK,QAAQ,eAAeA,CAAU,GAEjCA;AAAA,EACT;AAAA,EAEO,QAAQ;A1D7Vd,QAAAd,GAAAgH;A0D8VC,QACE,KAAK,WACL,KAAK,QAAQ,qBAAA,KACb,CAAC,KAAK,QAAQ;AAEd;AAEF,UAAMP,IAAW,KAAK,QAAQ,YAAA;AAC9B,QAAI,CAACA,EAAU;AACf,UAAM1G,IAAc,KAAK,KAAK,eAAA,GACxB,EAAE,YAAAe,EAAA,IAAe,KAAK,QAAQ,SAAA;AACpC,UAAId,IAAAD,EAAYe,IAAa,CAAC,MAA1B,gBAAAd,EAA6B,eAAc,KAAK,QAAQ;AAC1D;AAGF,SAAK,aAAa,IAAIrB,GAAW,KAAK,MAAM;AAAA,MAC1C,UAAU,KAAK,SAAS,KAAK,IAAI;AAAA,IAAA,CAClC;AACD,UAAMiD,IACJ,KAAK,SAAA,EACF,IAAI,CAAAqH,MAAMA,EAAG,KAAK,EAClB,KAAK,EAAE,KAAK,IACXurB,KAAaxtB,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB;AACzC,SAAK,WAAW,OAAO;AAAA,MACrB,OAAApF;AAAA,MACA,UAAA6E;AAAA,MACA,YAAA+tB;AAAA,IAAA,CACD,GAED,KAAK,UAAU;AAAA,EACjB;AAAA,EAEO,UAAU;A1D9XhB,QAAAx0B;A0D+XC,IAAK,KAAK,aACVA,IAAA,KAAK,eAAL,QAAAA,EAAiB,WACjB,KAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,SAASu0B,GAAc;AAC7B,IAAKA,IAGH,KAAK,UAAUA,CAAI,IAFnB,KAAK,YAAA,GAIP,KAAK,QAAA;AAAA,EACP;AACF;AC1YO,MAAME,WAAsBJ,GAAY;AAAC;AC0EzC,MAAMK,GAAQ;AAAA,EAanB,YAAY9zB,GAAY;AAZhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,gBAAgB,IAAI+vB,GAAc9xB,CAAI,GAE3C,KAAK,OAAOA,GACZ,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,gBAAgB,IAAIywB,GAAc,IAAI,GAE3C,KAAK,UAAUzwB,EAAK,WAAA,GACpB,KAAK,iBAAiB,KAAK,QAAQ,SACnC,KAAK,gBAAgB,MACrB,KAAK,qBAAqB,CAAA,GAC1B,KAAK,aAAa;AAAA,EACpB;AAAA;AAAA,EAGO,iBAAiBoC,GAA8B;AACpD,SAAK,cAAc,iBAAiBA,CAAO;AAAA,EAC7C;AAAA,EAEO,uBAAuB;AAE5B,IADsB,KAAK,cAAc,iBAAA,EACvB,UAChB,KAAK,cAAc,qBAAA;AAAA,EAEvB;AAAA,EAEO,oBAAoB+Y,GAA+B/X,GAAgB;AAExE,IAD6B,KAAK,cAAc,wBAAA,EACvB,UACvB,KAAK,cAAc,oBAAoB+X,GAAK/X,CAAM;AAAA,EAEtD;AAAA,EAEO,UAAgB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGO,oBAAoBjE,GAAqC;AAC9D,WAAOA,EAAY,OAAO,CAACoB,GAASkG,MAAU;A5DlI/C,UAAArH,GAAAgH,GAAAuC;A4DmIG,UAAIpI,EAAQ,SAASW,EAAY,OAAO;AACtC,cAAM6M,IAASxN,EAAQ;AACvB,iBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,gBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,mBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,kBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,YAAAuV,EAAG,QAAQ,KAAK,oBAAoBA,EAAG,KAAK;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC1P,EAAQ,UAAW,QAAO;AAC/B,WAAInB,IAAAmB,EAAQ,YAAR,QAAAnB,EAAiB;AACnB,YACEmB,EAAQ,qBAAqB2E,EAAiB,UAC9C3E,EAAQ,qBAAqB2E,EAAiB;AAE9C,iBAAA3E,EAAQ,QAAQ,IACT;AAAA,aAEJ;AAEL,aACE6F,IAAA7F,EAAQ,YAAR,QAAA6F,EAAiB,WACjB7F,EAAQ,qBAAqB2E,EAAiB,UAC9C;AACA,cAAI6uB,IAAe,IACf1zB,IAAQoG,IAAQ;AACpB,iBAAOpG,IAAQlB,EAAY,UAAQ;AACjC,kBAAMiG,IAAcjG,EAAYkB,CAAK;AACrC,gBAAIE,EAAQ,cAAc6E,EAAY,UAAW;AACjD,gBAAIA,EAAY,qBAAqBF,EAAiB,OAAO;AAC3D,cAAA6uB,IAAe;AACf;AAAA,YACF;AACA,YAAA1zB;AAAA,UACF;AACA,iBAAO0zB;AAAA,QACT;AACA,aACEprB,IAAApI,EAAQ,YAAR,QAAAoI,EAAiB,YACjBpI,EAAQ,qBAAqB2E,EAAiB,WAC9C;AACA,cAAI6uB,IAAe,IACf1zB,IAAQoG,IAAQ;AACpB,iBAAOpG,IAAQlB,EAAY,UAAQ;AACjC,kBAAM8F,IAAa9F,EAAYkB,CAAK;AACpC,gBAAIE,EAAQ,cAAc0E,EAAW,UAAW;AAChD,gBAAIA,EAAW,qBAAqBC,EAAiB,OAAO;AAC1D,cAAA6uB,IAAe;AACf;AAAA,YACF;AACA,YAAA1zB;AAAA,UACF;AACA,iBAAO0zB;AAAA,QACT;AAAA,MACF;AACA,aACExzB,EAAQ,qBAAqB2E,EAAiB,UAC9C3E,EAAQ,qBAAqB2E,EAAiB,WAC9C3E,EAAQ,qBAAqB2E,EAAiB;AAAA,IAElD,CAAC;AAAA,EACH;AAAA;AAAA,EAGO,4BAAqC;AAC1C,QAAI,CAAC,KAAK,cAAe,QAAO;AAChC,UAAM,EAAE,YAAAhF,GAAY,UAAAsF,MAAa,KAAK,SAAA;AACtC,QAAI,CAAC,CAACtF,KAAc,CAAC,CAACsF,EAAU,QAAO;AACvC,UAAMrG,IAAc,KAAK,eAAA,GACnB4F,IAAe5F,EAAYe,CAAU;AAE3C,QACEA,MAAesF,KACfT,EAAa,qBAAqBG,EAAiB;AAEnD,aAAO;AAGT,UAAMqH,IAAapN,EAAYqG,CAAQ;AACvC,WACE,GAAAT,EAAa,aACbA,EAAa,cAAcwH,EAAW,aACtCA,EAAW,qBAAqBrH,EAAiB;AAAA,EAKrD;AAAA;AAAA,EAGO,sBAA+B;AACpC,QAAI,CAAC,KAAK,cAAe,QAAO;AAChC,UAAM,EAAE,YAAAhF,GAAY,UAAAsF,MAAa,KAAK,SAAA;AACtC,WAAItF,MAAesF,IAAiB,KAChB,KAAK,eAAA,EACGtF,CAAU,EACvB,qBAAqBgF,EAAiB;AAAA,EACvD;AAAA;AAAA,EAGO,0BAAmC;AACxC,UAAM,EAAE,YAAAhF,GAAY,UAAAsF,MAAa,KAAK,SAAA;AACtC,QAAI,CAAC,CAACtF,KAAc,CAAC,CAACsF,EAAU,QAAO;AACvC,UAAMrG,IAAc,KAAK,eAAA,GACnB4F,IAAe5F,EAAYe,CAAU,GACrCqM,IAAapN,EAAYqG,CAAQ;AACvC,WACE,GAAAT,KAAA,QAAAA,EAAc,aACdA,EAAa,cAAcwH,EAAW,aACtCA,EAAW,qBAAqBrH,EAAiB;AAAA,EAKrD;AAAA;AAAA,EAGO,mCAAmC/F,GAAkC;AAC1E,QAAI,CAACA,EAAY,KAAK,OAAWoB,EAAQ,SAAS,EAAG,QAAO;AAC5D,QAAIyzB,IAAc,GACdC,IAAe;AACnB,aAAS19B,IAAI,GAAGA,IAAI4I,EAAY,QAAQ5I,KAAK;AAC3C,YAAMgK,IAAUpB,EAAY5I,CAAC;AAC7B,MAAIgK,EAAQ,qBAAqB2E,EAAiB,SAChD8uB,MACSzzB,EAAQ,qBAAqB2E,EAAiB,WACvD+uB;AAAA,IAEJ;AACA,WAAI,CAACD,KAAe,CAACC,IAAqB,KACnCD,MAAgBC;AAAA,EACzB;AAAA,EAEO,qBAAqB3uB,IAA2B,IAAa;A5DzQnE,QAAAlG,GAAAgH;A4D0QC,QAAI,KAAK,KAAK,aAAA,KAAkB,CAAC,KAAK,cAAe,QAAO;AAC5D,UAAM,EAAE,YAAAlG,GAAY,UAAAsF,MAAaF,EAAQ,SAAS,KAAK,MAAM,SAAA;AAC7D,WAAIpF,MAAesF,KAAY,CAACtF,KAAc,CAACsF,MACzBF,EAAQ,eAAe,KAAK,eAAA,GACfpF,CAAU,EAC1B,qBAAqBgF,EAAiB,UAC9C,KAGJ,CAAC,GAACkB,KAAAhH,IAAA,KAAK,cAAc,WAAA,MAAnB,gBAAAA,EAAiC,YAAjC,QAAAgH,EAA0C;AAAA,EACrD;AAAA,EAEO,0BAA0Bd,IAA2B,IAAa;A5DtRxE,QAAAlG,GAAAgH;A4DuRC,QAAI,KAAK,KAAK,aAAA,KAAkB,CAAC,KAAK,cAAe,QAAO;AAC5D,UAAM,EAAE,YAAAlG,GAAY,UAAAsF,MAAaF,EAAQ,SAAS,KAAK,MAAM,SAAA;AAC7D,WAAIpF,MAAesF,KAAY,CAACtF,KAAc,CAACsF,MACzBF,EAAQ,eAAe,KAAK,eAAA,GACfpF,CAAU,EAC1B,qBAAqBgF,EAAiB,UAC9C,KAGJ,CAAC,GAACkB,KAAAhH,IAAA,KAAK,cAAc,WAAA,MAAnB,gBAAAA,EAAiC,YAAjC,QAAAgH,EAA0C;AAAA,EACrD;AAAA;AAAA,EAGO,kCACLjH,GACAsH,GACS;A5DvSV,QAAArH,GAAAgH,GAAAuC;A4DwSC,UAAMpI,IAAUpB,EAAYsH,CAAK;AAEjC,QAAI,CAAClG,EAAQ,UAAW,QAAO;AAE/B,UACEnB,IAAAmB,EAAQ,YAAR,gBAAAnB,EAAiB,UAASmI,GAAY,cACtCnB,IAAA7F,EAAQ,YAAR,gBAAA6F,EAAiB,UAASmB,GAAY;AAEtC,aAAO,CAAC,GAACoB,IAAApI,EAAQ,YAAR,QAAAoI,EAAiB;AAG5B,QAAIpI,EAAQ,qBAAqB2E,EAAiB;AAChD,aAAO;AAET,QAAI3E,EAAQ,qBAAqB2E,EAAiB;AAChD,aAAO;AAGT,QACE3E,EAAQ,qBAAqB2E,EAAiB,UAC9C3E,EAAQ,qBAAqB2E,EAAiB,UAC9C;AACA,UAAI/N,IAAIsP,IAAQ;AAChB,aAAOtP,IAAIgI,EAAY,UAAQ;AAC7B,cAAMiG,IAAcjG,EAAYhI,CAAC;AACjC,YAAIiO,EAAY,cAAc7E,EAAQ;AACpC,iBAAO;AAET,YAAI6E,EAAY,qBAAqBF,EAAiB;AACpD,iBAAO;AAET,YAAIE,EAAY,qBAAqBF,EAAiB;AACpD,iBAAO;AAET,QAAA/N;AAAA,MACF;AAAA,IACF;AAEA,QACEoJ,EAAQ,qBAAqB2E,EAAiB,WAC9C3E,EAAQ,qBAAqB2E,EAAiB,WAC9C;AACA,UAAI/N,IAAIsP,IAAQ;AAChB,aAAOtP,KAAK,KAAG;AACb,cAAM8N,IAAa9F,EAAYhI,CAAC;AAChC,YAAI8N,EAAW,cAAc1E,EAAQ;AACnC,iBAAO;AAET,YAAI0E,EAAW,qBAAqBC,EAAiB;AACnD,iBAAO;AAET,YAAID,EAAW,qBAAqBC,EAAiB;AACnD,iBAAO;AAET,QAAA/N;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEO,oBAAoBgI,GAAyBsH,GAAe;AACjE,WAAO,KAAK,cAAc,oBAAoBtH,GAAasH,CAAK;AAAA,EAClE;AAAA,EAEO,eAA+B;AACpC,WAAO,KAAK,KAAK,aAAA;AAAA,EACnB;AAAA,EAEO,iBAA6B;AAClC,WAAO,KAAK,KAAK,eAAA;AAAA,EACnB;AAAA,EAEO,cAAuC;AAC5C,UAAMO,IAAe,KAAK,KAAK,YAAA,EAAc,gBAAA,GACvC,EAAE,UAAAxB,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,WAAOwB,EAAaxB,CAAQ,KAAK;AAAA,EACnC;AAAA,EAEO,UAAkB;A5DtXxB,QAAApG;A4DuXC,UAAM0D,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA;AAE1B,cADe3D,IAAA,KAAK,YAAA,MAAL,gBAAAA,EAAoB,WAAU,KAAK,KAAK,UAAA,MACtC0D,IAASC;AAAA,EAC5B;AAAA,EAEO,WAAmB;AACxB,WAAO,KAAK,MAAM,SAAA;AAAA,EACpB;AAAA,EAEO,eAAeuC,IAA2B,IAAI;AACnD,SAAK,MAAM,eAAeA,CAAO;AAAA,EACnC;AAAA,EAEO,mBAA4C;AACjD,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,sBAAsBA,IAA2B,IAAgB;AACtE,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,eAAA,GAC1C,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,SAAA,GACvCP,IAAe5F,EAAYe,CAAU;AAC3C,QAAI,EAAC6E,KAAA,QAAAA,EAAc,WAAW,QAAO,CAAA;AACrC,UAAM9G,IAAmB,CAAA;AAEzB,QAAI+G,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UAAIC,EAAW,cAAcF,EAAa,UAAW;AACrD,MAAA9G,EAAK,QAAQgH,CAAU,GACvBD;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UAAIC,EAAY,cAAcL,EAAa,UAAW;AACtD,MAAA9G,EAAK,KAAKmH,CAAW,GACrBD;AAAA,IACF;AACA,WAAOlH;AAAA,EACT;AAAA,EAEO,2BAA2B;AAChC,IAAI,KAAK,kBACP,KAAK,qBAAqB,KAAK,sBAAA;AAAA,EAEnC;AAAA,EAEO,kBAAkBi2B,GAAqB;A5Dxa7C,QAAA90B,GAAAgH;A4DyaC,QAAI,CAAC,KAAK,cAAe;AACzB,UAAM+tB,IAA2B,KAAK,SAAS,eAAe,eAAe;AAC7E,QAAI,CAAC,KAAK,SAAS,iBAAiB,CAACA,EAA0B;AAC/D,QAAIrvB;AACJ,UAAM9D,IAAQ,KAAK,oBACbozB,IAAgB,KAAK,cAAc,WAAA;AACzC,IAAIpzB,KAAA,QAAAA,EAAO,SACT8D,IAAUjF,GAAemB,CAAK,EAAE,CAAC,EAAE,WAEnC8D,IAAUuvB,GAAgBvuB,GAAUsuB,CAAa,CAAC,EAAE,SACpDtvB,EAAQ,QAAQ,CAAA;AAElB,UAAM1C,IAAgC;AAAA,MACpC,OAAA8xB;AAAA,MACA,SAAApvB;AAAA,MACA,WAAWsvB,EAAc;AAAA,IAAA;AAE3B,KAAAhuB,KAAAhH,IAAA,KAAK,UAAS,kBAAd,QAAAgH,EAAA,KAAAhH,GAA8BgD,IAC1B+xB,KACF,KAAK,SAAS,KAAK,iBAAiB/xB,CAAO;AAAA,EAE/C;AAAA,EAEO,cAAc;A5DhcpB,QAAAhD,GAAAgH;A4DicC,UAAMjH,IAAc,KAAK,eAAA,GACnBL,IAAQ,KAAK,SAAA,GACbyB,IAAUpB,EAAYL,EAAM,UAAU;AAE5C,QAAI,KAAK,eAAe;AAEtB,OACE,KAAK,yBAAyBizB,MAC9B,KAAK,yBAAyB2B,QAE1BnzB,EAAQ,qBAAqB2E,EAAiB,UAChD,KAAK,cAAc,QAAA,IAEnB,KAAK,cAAc,MAAA,MAInB9F,IAAA,KAAK,eAAL,gBAAAA,EAAiB,eAAcmB,EAAQ,cAErCA,EAAQ,qBAAqB2E,EAAiB,UAChD,KAAK,kBAAkBovB,GAAa,QAAQ;AAAA;AAAA,UAG5CluB,IAAA,KAAK,eAAL,gBAAAA,EAAiB,sBAAqBlB,EAAiB,WAEvD,KAAK,kBAAkBovB,GAAa,MAAM;AAAA;AAI9C,YAAMC,IAAiB,KAAK,cAAc,WAAA;AAC1C,UAAIh0B,EAAQ,cAAcg0B,EAAe,WAAW;AAClD,aAAK,yBAAA,GACL,KAAK,aAAah0B;AAClB;AAAA,MACF;AAAA,IACF;AAKA,QAHA,KAAK,eAAA,GAEc,KAAK,KAAK,WAAA,EACb;AAChB,UAAMuE,IAAUvE,EAAQ;AACxB,QAAIuE,EAAQ,SAASyC,GAAY;AAC/B,WAAK,gBAAgB,IAAIksB,GAAYlzB,GAAS,IAAI;AAAA,aACzCuE,EAAQ,SAASyC,GAAY,QAAQ;AAC9C,YAAMitB,IAAgB,IAAIzC,GAAcxxB,GAAS,IAAI;AACrD,WAAK,gBAAgBi0B,GACrBA,EAAc,MAAA;AAAA,IAChB,WAAW1vB,EAAQ,SAASyC,GAAY;AACtC,WAAK,gBAAgB,IAAI1C,GAAgBtE,GAAS,IAAI;AAAA,aAC7CuE,EAAQ,SAASyC,GAAY;AACtC,WAAK,gBAAgB,IAAI7B,GAAanF,GAAS,IAAI;AAAA,aAC1CuE,EAAQ,SAASyC,GAAY,MAAM;AAC5C,YAAMktB,IAAc,IAAIf,GAAYnzB,GAAS,IAAI;AACjD,WAAK,gBAAgBk0B,GACrBA,EAAY,MAAA;AAAA,IACd,MAAA,CAAW3vB,EAAQ,SAASyC,GAAY,WACtC,KAAK,gBAAgB,IAAIssB,GAActzB,GAAS,IAAI;AAGtD,SAAK,yBAAA,GACL,KAAK,aAAaA,GAEdA,EAAQ,qBAAqB2E,EAAiB,WAChD,KAAK,kBAAkBovB,GAAa,MAAM;AAAA,EAE9C;AAAA,EAEO,eAAe50B,IAAiC,IAAI;A5DrgB1D,QAAAN;A4DsgBC,QAAI,CAAC,KAAK,cAAe;AACzB,UAAM,EAAE,aAAAs1B,IAAc,GAAA,IAASh1B;AAC/B,KACE,KAAK,yBAAyBqyB,MAC9B,KAAK,yBAAyB2B,OAE9B,KAAK,cAAc,QAAA,GAInBgB,OACAt1B,IAAA,KAAK,eAAL,gBAAAA,EAAiB,sBAAqB8F,EAAiB,WAEvD,KAAK,kBAAkBovB,GAAa,QAAQ,GAG9C,KAAK,aAAa,MAClB,KAAK,gBAAgB,MACrB,KAAK,qBAAqB,CAAA;AAAA,EAC5B;AAAA,EAEO,eAAe50B,IAAiC,IAAI;AACzD,UAAM;AAAA,MACJ,UAAAuH;AAAA,MACA,WAAAsC,IAAY;AAAA,MACZ,iBAAAD,IAAkB;AAAA,MAClB,aAAA2M,IAAc;AAAA,IAAA,IACZvW;AAEJ,IAAIuH,MAAa,UACf,KAAK,MAAM,WAAA,GACX,KAAK,KAAK,OAAO;AAAA,MACf,WAAAsC;AAAA,MACA,iBAAAD;AAAA,MACA,aAAa;AAAA,IAAA,CACd,MAED,KAAK,MAAM,SAASrC,GAAUA,CAAQ,GACtC,KAAK,KAAK,OAAO;AAAA,MACf,UAAAA;AAAA,MACA,WAAAsC;AAAA,MACA,aAAA0M;AAAA,MACA,iBAAA3M;AAAA,IAAA,CACD;AAAA,EAEL;AAAA,EAEO,yBAAyB5J,GAAgC;A5DrjB/D,QAAAN,GAAAgH,GAAAuC,GAAAC,GAAA5S,GAAA6S;A4DsjBC,UAAM8rB,IAAkC,KAAK,SAAS;AAAA,MACpD;AAAA,IAAA;AAEF,QACE,CAACA,KACD,CAAC,KAAK,SAAS;AAEf;AAEF,UAAMJ,KACJ70B,KAAA,gBAAAA,EAAS,qBAAkBN,IAAA,KAAK,kBAAL,gBAAAA,EAAoB;AACjD,QAAI,CAACm1B,EAAgB;AAErB,UAAMp1B,MAAciH,IAAA1G,KAAA,gBAAAA,EAAS,YAAT,gBAAA0G,EAAkB,gBAAe,KAAK,eAAA,GACpD,EAAE,YAAAlG,EAAA,MAAeyI,IAAAjJ,KAAA,gBAAAA,EAAS,YAAT,gBAAAiJ,EAAkB,UAAS,KAAK,SAAA;AACvD,QAAI,GAACC,IAAAzJ,EAAYe,CAAU,MAAtB,QAAA0I,EAAyB,WAAW;AAEzC,UAAMgsB,KACJl1B,KAAA,gBAAAA,EAAS,iBAAgB,KAAK,sBAAsBA,KAAA,gBAAAA,EAAS,OAAO;AACtE,QAAIoF;AAOJ,QANI8vB,KAAA,QAAAA,EAAc,SAChB9vB,IAAUjF,GAAe+0B,CAAY,EAAE,CAAC,EAAE,WAE1C9vB,IAAUyvB,EAAe,SACzBzvB,EAAQ,QAAQ,CAAA,IAEd,CAACA,EAAS;AACd,UAAM1C,IAAuC;AAAA,MAC3C,SAAA0C;AAAA,MACA,WAAWyvB,EAAe;AAAA,IAAA;AAE5B,KAAA1rB,KAAA7S,IAAA,KAAK,UAAS,yBAAd,QAAA6S,EAAA,KAAA7S,GAAqCoM,IACjCuyB,KACF,KAAK,SAAS,KAAK,wBAAwBvyB,CAAO;AAAA,EAEtD;AAAA,EAEO,iBAAiB;AACtB,QAAI,CAAC,KAAK,cAAe;AACzB,UAAMjD,IAAc,KAAK,eAAA,GACnBL,IAAQ,KAAK,SAAA,GACbyB,IAAUpB,EAAYL,EAAM,UAAU;AAC5C,SAAK,cAAc,WAAWyB,CAAO,IAElC,KAAK,yBAAyBmzB,MAC7B,KAAK,yBAAyB3B,OAChC,KAAK,cAAc,iBAEnB,KAAK,cAAc,QAAA,GACnB,KAAK,cAAc,MAAA;AAAA,EAEvB;AAAA,EAEO,WAAWlsB,GAAiD;A5D3mBlE,QAAAzG,GAAAgH;A4D4mBC,UAAM,EAAE,OAAAK,GAAO,SAAA2E,GAAS,SAAAC,GAAS,cAAAtE,MAAiBlB;AAClD,QAAI1G,IAAc,KAAK,KAAK,uBAAA,GACxBoB;AACJ,UAAMmM,IAAW7G,EAAS,UAAUkB,IAAgBN;AAQpD,QAPIZ,EAAS,WACX1G,IAAcA,EAAYsH,CAAM,EAAE,OAAQ2E,CAAQ,EAAE,OAAOC,CAAQ,EAAE,OACrE9K,IAAUpB,EAAY4H,CAAa,KAEnCxG,IAAUpB,EAAYsH,CAAK,IAGzBrH,IAAAmB,EAAQ,YAAR,QAAAnB,EAAiB,SAAQgH,IAAA7F,EAAQ,SAAR,QAAA6F,EAAc,MAAM;AAC/C,YAAMyuB,IAAejmB,GAAuBzP,GAAauN,CAAQ;AACjE,aAAO;AAAA,QACL,UAAUmoB;AAAA,QACV,YAAY11B,EAAY01B,CAAY;AAAA,MAAA;AAAA,IAExC;AAEA,QAAIt0B,EAAQ,qBAAqB2E,EAAiB;AAEhD,aAAO;AAAA,QACL,UAAAwH;AAAA,QACA,YAAYnM;AAAA,MAAA;AAEhB,QAAWA,EAAQ,qBAAqB2E,EAAiB,SAAS;AAEhE,UAAIhF,IAAawM,IAAW;AAC5B,aAAOxM,IAAaf,EAAY,UAAQ;AAEtC,YADoBA,EAAYe,CAAU,EAC1B,cAAcK,EAAQ;AACpC,iBAAO;AAAA,YACL,UAAUL,IAAa;AAAA,YACvB,YAAYf,EAAYe,IAAa,CAAC;AAAA,UAAA;AAG1C,QAAAA;AAAA,MACF;AAAA,IACF,WACEK,EAAQ,qBAAqB2E,EAAiB,UAC9C3E,EAAQ,qBAAqB2E,EAAiB,UAC9C;AAEA,UAAIhF,IAAawM,IAAW;AAC5B,aAAOxM,IAAaf,EAAY,UAAQ;AACtC,cAAMiG,IAAcjG,EAAYe,CAAU;AAC1C,YACEkF,EAAY,cAAc7E,EAAQ,aACjC6E,EAAY,qBAAqBF,EAAiB,UACjDE,EAAY,qBAAqBF,EAAiB;AAEpD,iBAAO;AAAA,YACL,UAAUhF,IAAa;AAAA,YACvB,YAAYf,EAAYe,IAAa,CAAC;AAAA,UAAA;AAG1C,QAAAA;AAAA,MACF;AAAA,IACF,WACEK,EAAQ,qBAAqB2E,EAAiB,eAC9C3E,EAAQ,qBAAqB2E,EAAiB,WAC9C;AAEA,UAAIhF,IAAawM,IAAW;AAC5B,aAAOxM,IAAa,KAAG;AACrB,cAAM+E,IAAa9F,EAAYe,CAAU;AACzC,YACE+E,EAAW,cAAc1E,EAAQ,aACjC0E,EAAW,qBAAqBC,EAAiB,SACjDD,EAAW,qBAAqBC,EAAiB,UACjDD,EAAW,qBAAqBC,EAAiB;AAEjD,iBAAO;AAAA,YACL,UAAUhF;AAAA,YACV,YAAYf,EAAYe,CAAU;AAAA,UAAA;AAGtC,QAAAA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAAwM;AAAA,MACA,YAAYnM;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEO,cACLL,GACAoF,IAA2B,IACZ;A5DrsBhB,QAAAlG,GAAAgH;A4DssBC,UAAMjH,IAAcmG,EAAQ,eAAe,KAAK,eAAA,GAC1CP,IAAe5F,EAAYe,CAAU;AAE3C,QACE,CAAC,KAAK,KAAK,aAAA,KACX,GAACd,IAAA2F,KAAA,gBAAAA,EAAc,YAAd,QAAA3F,EAAuB,SACxB,GAACgH,IAAArB,KAAA,gBAAAA,EAAc,SAAd,QAAAqB,EAAoB,OACrB;AACA,YAAM,EAAE,WAAA0uB,IAAY,GAAA,IAAS/vB,EAAa;AAC1C,UAAI,CAAC+vB,EAAW,QAAO;AAEvB,YAAMC,IAAO,KAAK,KAAK,QAAA;AACvB,UACEA,MAASrtB,GAAW,QACpB,KAAK,QAAQ,SAASqtB,CAAI,EAAE;AAE5B,eAAO;AAAA,IAEX;AACA,QAAIrC,IAAY,IACZC,IAAa,IAEb3tB,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AAEnB,UADmB7F,EAAY6F,CAAQ,EACxB,cAAcD,EAAa,WAAW;AACnD,QAAA2tB,IAAY1tB;AACZ;AAAA,MACF;AACA,MAAAA;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AAErC,UADoBA,EAAYgG,CAAS,EACzB,cAAcJ,EAAa,WAAW;AACpD,QAAA4tB,IAAaxtB,IAAY;AACzB;AAAA,MACF;AACA,MAAAA;AAAA,IACF;AAKA,WAHIA,MAAchG,EAAY,WAC5BwzB,IAAaxtB,IAAY,IAEvB,CAAC,CAACutB,KAAa,CAAC,CAACC,IAAmBzyB,KACxCwyB,IAAY,CAACA,IAAYA,IAAY,GAErC,KAAK,KAAK;AAAA,MACRvzB;AAAA,MACAuzB,IAAY;AAAA,MACZC,IAAaD;AAAA,IAAA,GAERA;AAAA,EACT;AAAA,EAEO,kBAAkBxyB,GAAoBoF,IAA2B,IAAI;AAC1E,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,eAAA,GAC1CP,IAAe5F,EAAYe,CAAU,GACrCkF,IAAcjG,EAAYe,IAAa,CAAC;AAC9C,QACE6E,EAAa,qBAAqBG,EAAiB,eACnDE,EAAY,qBAAqBF,EAAiB,aAClD;AACA,UAAI8vB,IAAqB,IACrBvuB,IAAQvG;AACZ,aAAOuG,IAAQtH,EAAY,UAAQ;AACjC,cAAM+H,IAAa/H,EAAYsH,CAAK;AACpC,YAAIS,EAAW,cAAcnC,EAAa,UAAW;AACrD,QAAImC,EAAW,qBAAqBhC,EAAiB,eAE9C8vB,MACHA,IAAqB,IACrB,KAAK,KAAK,kBAAA,EAAoB,QAAA,GAC9B,KAAK,KAAK,cAAc90B,CAAU,IAEpCf,EAAY,OAAOsH,GAAO,CAAC,KAE3BA;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AAAA,EAEO,eAAevG,GAAoBoF,IAA2B,IAAI;AACvE,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,eAAA,GAC1CP,IAAe5F,EAAYe,CAAU,GACrC4E,IAAUC,EAAa;AAC7B,QAAI,CAACD,EAAQ,YAAa;AAC1B,UAAMmwB,IAAqBnjB,GAAUhN,EAAQ,WAAW,GAElDowB,IAAyB3lB,GAAWxK,GAAcutB,EAAkB;AAC1E,aAAS73B,IAAI,GAAGA,IAAIw6B,EAAmB,QAAQx6B,KAAK;AAClD,YAAMuG,IAAQi0B,EAAmBx6B,CAAC,GAC5BwP,IAAuB;AAAA,QAC3B,GAAGirB;AAAA,QACH,OAAOl0B,MAAU;AAAA,IAAOR,IAAOQ;AAAA,QAC/B,WAAW+D,EAAa;AAAA,QACxB,MAAM7D,EAAY;AAAA,QAClB,SAAS6D,EAAa;AAAA,QACtB,kBAAkBG,EAAiB;AAAA,QACnC,OAAO,KAAK,eAAe;AAAA,MAAA;AAE7BzE,MAAAA,GAAqBtB,GAAa,CAAC8K,CAAU,GAAG/J,GAAY;AAAA,QAC1D,eAAe,KAAK;AAAA,MAAA,CACrB,GACD,KAAK,KAAK,kBAAkBf,GAAae,IAAazF,IAAI,GAAG,GAAG;AAAA,QAC9DwP;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF;AAAA,EAEO,SAAShM,GAA0B;AACxC,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,wBAAwB;AAE1C,WAAO,KAAK,cAAc,SAASA,CAAI;AAAA,EACzC;AAAA,EAEO,qBACLk3B,GACA7vB,IAA2B,IAC3B;AACA,UAAMnG,IAAcmG,EAAQ,eAAe,KAAK,eAAA,GAC1C,EAAE,YAAApF,EAAA,IAAeoF,EAAQ,SAAS,KAAK,SAAA,GACvCP,IAAe5F,EAAYe,CAAU;AAE3C,QAAI8E,IAAW9E;AACf,WAAO8E,IAAW,KAAG;AACnB,YAAMC,IAAa9F,EAAY6F,CAAQ;AACvC,UAAIC,EAAW,cAAcF,EAAa,UAAW;AACrD,MAAAE,EAAW,UAAU;AAAA,QACnB,GAAGA,EAAW;AAAA,QACd,GAAGkwB;AAAA,MAAA,GAELnwB;AAAA,IACF;AAEA,QAAIG,IAAYjF,IAAa;AAC7B,WAAOiF,IAAYhG,EAAY,UAAQ;AACrC,YAAMiG,IAAcjG,EAAYgG,CAAS;AACzC,UAAIC,EAAY,cAAcL,EAAa,UAAW;AACtD,MAAAK,EAAY,UAAU;AAAA,QACpB,GAAGA,EAAY;AAAA,QACf,GAAG+vB;AAAA,MAAA,GAELhwB;AAAA,IACF;AAAA,EACF;AAAA,EAEO,QAAQ/D,GAAmC;AAChD,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,wBAAwB;AAE1C,WAAO,KAAK,cAAc,QAAQA,CAAG;AAAA,EACvC;AAAA,EAEO,MAAc;AACnB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,wBAAwB;AAE1C,WAAO,KAAK,cAAc,IAAA;AAAA,EAC5B;AAAA,EAEO,aAAagB,GAAyD;AAC3E,UAAM,EAAE,IAAA6f,GAAI,WAAAmT,GAAW,QAAAC,EAAA,IAAWjzB,GAC5ByvB,IAAiC,CAAA;AACvC,QAAI,CAAC5P,KAAM,CAACmT,EAAW,QAAOvD;AAC9B,UAAMyD,IAAW,CAACn2B,GAAyBsX,MAAqB;AAC9D,UAAItf,IAAI;AACR,aAAOA,IAAIgI,EAAY,UAAQ;AAC7B,cAAMoB,IAAUpB,EAAYhI,CAAC;AAG7B,YAFAA,KAEIoJ,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,cAAA46B,EAASrlB,EAAG,OAAOwG,CAAI;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AACA,YACE,CAAClW,EAAQ,WACR0hB,KAAM1hB,EAAQ,cAAc0hB,KAC5BmT,KAAa70B,EAAQ,QAAQ,cAAc60B,KAC3CC,KAAU90B,EAAQ,WAAW80B;AAE9B;AAEF,cAAM,EAAE,MAAA1zB,GAAM,MAAAwwB,GAAM,WAAAF,EAAA,IAAc1xB,EAAQ;AAC1C,YAAI5H,IAAIxB,GACJo+B,IAAmB;AACvB,cAAMC,IAAyB,CAAA;AAC/B,eAAO78B,IAAIwG,EAAY,UAAQ;AAC7B,gBAAMiG,IAAcjG,EAAYxG,CAAC;AACjC,cAAIyM,EAAY,cAAc7E,EAAQ,UAAW;AACjD,WACGoB,MAAS4F,GAAY,QACpB5F,MAAS4F,GAAY,QACrB5F,MAAS4F,GAAY,WACvBnC,EAAY,qBAAqBF,EAAiB,UAElDqwB,KAAoBnwB,EAAY,OAChCowB,EAAuB;AAAA,YACrBlrB,GAAWlF,GAAagF,EAAoB;AAAA,UAAA,IAGhDzR;AAAA,QACF;AACA,YACEgJ,MAAS4F,GAAY,QACrB5F,MAAS4F,GAAY,QACrB5F,MAAS4F,GAAY;AAErB,UAAAsqB,EAAO,KAAK;AAAA,YACV,GAAGtxB,EAAQ;AAAA,YACX,MAAAkW;AAAA,YACA,OAAO8e,KAAoB;AAAA,YAC3B,WAAWA,KAAoB;AAAA,YAC/B,aAAa11B,GAAe21B,CAAsB;AAAA,UAAA,CACnD;AAAA,iBAED7zB,MAAS4F,GAAY,UACrB5F,MAAS4F,GAAY,YACrB5F,MAAS4F,GAAY,OACrB;AACA,gBAAMkuB,IAAYtD,KAAA,gBAAAA,EACd,MAAM,KACP;AAAA,YACC;A5D96BX,kBAAA/yB;A4D+6Ba,sBAAAA,IAAA6yB,KAAA,gBAAAA,EAAW,KAAK,OAAYG,EAAS,SAASsD,OAA9C,gBAAAt2B,EAA2D;AAAA;AAAA,YAE9D,OAAO,SACP,KAAK;AACR,UAAAyyB,EAAO,KAAK;AAAA,YACV,GAAGtxB,EAAQ;AAAA,YACX,MAAAkW;AAAA,YACA,OAAO0b,KAAQ;AAAA,YACf,WAAWsD,KAAa;AAAA,UAAA,CACzB;AAAA,QACH;AACA,QAAAt+B,IAAIwB;AAAA,MACN;AAAA,IACF,GACMsF,IAAO;AAAA,MACX;AAAA,QACE,MAAM8S,GAAW;AAAA,QACjB,aAAa,KAAK,KAAK,qBAAA;AAAA,MAAqB;AAAA,MAE9C;AAAA,QACE,MAAMA,GAAW;AAAA,QACjB,aAAa,KAAK,KAAK,2BAAA;AAAA,MAA2B;AAAA,MAEpD;AAAA,QACE,MAAMA,GAAW;AAAA,QACjB,aAAa,KAAK,KAAK,qBAAA;AAAA,MAAqB;AAAA,IAC9C;AAEF,eAAW,EAAE,MAAA0F,GAAM,aAAAtX,EAAA,KAAiBlB;AAClC,MAAAq3B,EAASn2B,GAAasX,CAAI;AAE5B,WAAOob;AAAA,EACT;AAAA,EAEO,iBAAiBzvB,GAAmC;AACzD,QAAI,CAACA,EAAQ,OAAQ;AACrB,QAAIuzB,IAAa,IACbC,IAAuB;AAE3B,UAAMC,IAAW,CAAC12B,MAA4B;AAC5C,UAAIhI,IAAI;AACR,aAAOA,IAAIgI,EAAY,UAAQ;AAC7B,cAAMoB,IAAUpB,EAAYhI,CAAC;AAG7B,YAFAA,KAEIoJ,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,cAAAm7B,EAAS5lB,EAAG,KAAK;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC1P,EAAQ,QAAS;AAEtB,cAAMu1B,IAAc1zB,EAAQ;AAAA,UAC1B,OACG3H,EAAE,MAAM8F,EAAQ,cAAc9F,EAAE,MAChCA,EAAE,aAAa8F,EAAQ,QAAS,cAAc9F,EAAE,aAChDA,EAAE,UAAU8F,EAAQ,WAAW9F,EAAE;AAAA,QAAA;AAEtC,YAAI,CAACq7B,EAAa;AAClB,cAAM,EAAE,OAAA90B,GAAO,iBAAAsI,IAAkB,GAAA,IAASwsB;AAE1C,QAAAH,IAAa,IACTrsB,MACFssB,IAAuB;AAEzB,cAAM,EAAE,MAAAj0B,MAASpB,EAAQ;AAEzB,YAAIw1B,IAAkB5+B;AACtB,eAAO4+B,IAAkB52B,EAAY,UACfA,EAAY42B,CAAe,EAC/B,cAAcx1B,EAAQ;AACtC,UAAAw1B;AAOF,cAAMC,IAAkC;AAAA,UACtC,OALgB;AAAA,YAChB,YAAY7+B,IAAI;AAAA,YAChB,UAAU4+B,IAAkB;AAAA,UAAA;AAAA,UAI5B,aAAA52B;AAAA,QAAA,GAEI82B,IAAkC;AAAA,UACtC,sBAAsB;AAAA,UACtB,qBAAqB;AAAA,QAAA;AAEvB,YAAIt0B,MAAS4F,GAAY,MAAM;AAC7B,gBAAM2uB,IAAc,MAAM,QAAQl1B,CAAK,IACnCA,IACAA,IACA,CAAC,EAAE,OAAAA,EAAA,CAAO,IACV,CAAA;AACJ,UAAIk1B,EAAY,UACd3rB,GAAkB2rB,GAAa;AAAA,YAC7B,sBAAsB;AAAA,YACtB,eAAe,KAAK;AAAA,UAAA,CACrB;AAEH,gBAAMh3B,IAAO,IAAIu0B,GAAYlzB,GAAS,IAAI;AAC1C,eAAK,gBAAgBrB,GACjBg3B,EAAY,SACdh3B,EAAK,SAASg3B,GAAaF,GAAgBC,CAAW,IAEtD/2B,EAAK,WAAW82B,GAAgBC,CAAW;AAAA,QAE/C,WAAWt0B,MAAS4F,GAAY,QAAQ;AACtC,cAAI,MAAM,QAAQvG,CAAK,EAAG;AAC1B,gBAAMm1B,IAAS,IAAIpE,GAAcxxB,GAAS,IAAI;AAC9C,eAAK,gBAAgB41B,GACjBn1B,IACFm1B,EAAO,UAAUn1B,GAAOg1B,GAAgBC,CAAW,IAEnDE,EAAO,YAAYH,GAAgBC,CAAW;AAAA,QAElD,WAAWt0B,MAAS4F,GAAY,UAAU;AACxC,cAAI,MAAM,QAAQvG,CAAK,EAAG;AAC1B,gBAAMuE,IAAW,IAAIV,GAAgBtE,GAAS,IAAI;AAClD,eAAK,gBAAgBgF;AACrB,gBAAMF,IAAQrE,IAAQA,EAAM,MAAM,GAAG,IAAI,CAAA;AACzC,UAAAuE,EAAS,UAAUF,GAAO2wB,GAAgBC,CAAW;AAAA,QACvD,WAAWt0B,MAAS4F,GAAY,OAAO;AACrC,cAAI,MAAM,QAAQvG,CAAK,EAAG;AAC1B,gBAAM2E,IAAQ,IAAID,GAAanF,GAAS,IAAI;AAC5C,eAAK,gBAAgBoF;AACrB,gBAAMN,IAAQrE,IAAQ,CAACA,CAAK,IAAI,CAAA;AAChC,UAAA2E,EAAM,UAAUN,GAAO2wB,GAAgBC,CAAW;AAAA,QACpD,WAAWt0B,MAAS4F,GAAY,MAAM;AACpC,gBAAMosB,IAAO,IAAID,GAAYnzB,GAAS,IAAI;AAC1C,eAAK,gBAAgBozB,GACjByC,GAAQp1B,CAAK,KACXA,EAAM,UACRuJ,GAAkBvJ,GAAO;AAAA,YACvB,sBAAsB;AAAA,YACtB,eAAe,KAAK;AAAA,UAAA,CACrB,GAEH2yB,EAAK,SAAS3yB,GAAOg1B,GAAgBC,CAAW,KACvCI,GAASr1B,CAAK,IACvB2yB,EAAK,UAAU3yB,GAAOg1B,GAAgBC,CAAW,IAEjDtC,EAAK,YAAYqC,GAAgBC,CAAW;AAAA,QAEhD,WAAWt0B,MAAS4F,GAAY,QAAQ;AACtC,gBAAM2uB,IAAc,MAAM,QAAQl1B,CAAK,IACnCA,IACAA,IACA,CAAC,EAAE,OAAAA,EAAA,CAAO,IACV,CAAA;AACJ,UAAIk1B,EAAY,UACd3rB,GAAkB2rB,GAAa;AAAA,YAC7B,sBAAsB;AAAA,YACtB,eAAe,KAAK;AAAA,UAAA,CACrB;AAEH,gBAAMh3B,IAAO,IAAI20B,GAActzB,GAAS,IAAI;AAC5C,eAAK,gBAAgBrB,GACjBg3B,EAAY,SACdh3B,EAAK,SAASg3B,GAAaF,GAAgBC,CAAW,IAEtD/2B,EAAK,WAAW82B,GAAgBC,CAAW;AAAA,QAE/C;AAEA,aAAK,yBAAyB;AAAA,UAC5B,SAASD;AAAA,QAAA,CACV,GAED,KAAK,gBAAgB;AAErB,YAAIvhB,IAActd;AAClB,eAAOsd,IAActV,EAAY,UACXA,EAAYsV,CAAW,EAC3B,cAAclU,EAAQ;AACtC,UAAAkU;AAEF,QAAAtd,IAAIsd;AAAA,MACN;AAAA,IACF;AAEA,SAAK,eAAe;AAAA,MAClB,aAAa;AAAA,IAAA,CACd;AAED,UAAMxW,IAAO;AAAA,MACX,KAAK,KAAK,qBAAA;AAAA,MACV,KAAK,KAAK,2BAAA;AAAA,MACV,KAAK,KAAK,qBAAA;AAAA,IAAqB;AAEjC,eAAWkB,KAAelB;AACxB,MAAA43B,EAAS12B,CAAW;AAEtB,IAAIw2B,MAEGC,KACH,KAAK,KAAK,kBAAA,EAAoB,SAAA,GAEhC,KAAK,KAAK,OAAO;AAAA,MACf,iBAAiBA;AAAA,MACjB,aAAa;AAAA,IAAA,CACd;AAAA,EAEL;AAAA,EAEO,qBAAqBxzB,GAAuC;AACjE,QAAI,CAACA,EAAQ,OAAQ;AACrB,UAAMk0B,IAAe,CAACn3B,MAA4B;AAChD,UAAIhI,IAAI;AACR,aAAOA,IAAIgI,EAAY,UAAQ;AAC7B,cAAMoB,IAAUpB,EAAYhI,CAAC;AAG7B,YAFAA,KAEIoJ,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,cAAA47B,EAAarmB,EAAG,KAAK;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC1P,EAAQ,QAAS;AAEtB,cAAMu1B,IAAc1zB,EAAQ;AAAA,UAC1B,OACG3H,EAAE,MAAM8F,EAAQ,cAAc9F,EAAE,MAChCA,EAAE,aAAa8F,EAAQ,QAAS,cAAc9F,EAAE,aAChDA,EAAE,UAAU8F,EAAQ,WAAW9F,EAAE;AAAA,QAAA;AAEtC,YAAI,CAACq7B,EAAa;AAClB,cAAM,EAAE,WAAAS,MAAcT;AAEtB,aAAK;AAAA,UACH;AAAA,YACE,WAAAS;AAAA,UAAA;AAAA,UAEF;AAAA,YACE,aAAAp3B;AAAA,YACA,OAAO,EAAE,YAAYhI,GAAG,UAAUA,EAAA;AAAA,UAAE;AAAA,QACtC;AAGF,YAAIsd,IAActd;AAClB,eAAOsd,IAActV,EAAY,UACXA,EAAYsV,CAAW,EAC3B,cAAclU,EAAQ;AACtC,UAAAkU;AAEF,QAAAtd,IAAIsd;AAAA,MACN;AAAA,IACF,GACMxW,IAAO;AAAA,MACX,KAAK,KAAK,qBAAA;AAAA,MACV,KAAK,KAAK,2BAAA;AAAA,MACV,KAAK,KAAK,qBAAA;AAAA,IAAqB;AAEjC,eAAWkB,KAAelB;AACxB,MAAAq4B,EAAan3B,CAAW;AAAA,EAE5B;AAAA,EAEO,sBAAsBiD,GAAkC;AAC7D,QAAI,CAACA,EAAQ,OAAQ;AACrB,QAAIo0B,IAAgB,IAChBZ,IAAuB;AAC3B,UAAMa,IAAgB,CAACt3B,MAA4B;AACjD,UAAIhI,IAAI;AACR,aAAOA,IAAIgI,EAAY,UAAQ;AAC7B,cAAMoB,IAAUpB,EAAYhI,CAAC;AAE7B,YADAA,KACIoJ,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,oBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,cAAA+7B,EAAcxmB,EAAG,KAAK;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC1P,EAAQ,QAAS;AAEtB,cAAMu1B,IAAc1zB,EAAQ;AAAA,UAC1B,OACG3H,EAAE,MAAM8F,EAAQ,cAAc9F,EAAE,MAChCA,EAAE,aAAa8F,EAAQ,QAAS,cAAc9F,EAAE,aAChDA,EAAE,UAAU8F,EAAQ,WAAW9F,EAAE;AAAA,QAAA;AAEtC,YAAI,CAACq7B,EAAa;AAClB,cAAM,EAAE,YAAAX,GAAY,iBAAA7rB,IAAkB,GAAA,IAASwsB;AAC/C,QAAAU,IAAgB,IACZltB,MACFssB,IAAuB,KAGzB,KAAK;AAAA,UACH;AAAA,YACE,GAAGr1B,EAAQ;AAAA,YACX,GAAG40B;AAAA,YACH,OAAO50B,EAAQ,QAAQ;AAAA,UAAA;AAAA,UAEzB;AAAA,YACE,aAAApB;AAAA,YACA,OAAO,EAAE,YAAYhI,GAAG,UAAUA,EAAA;AAAA,UAAE;AAAA,QACtC,GAGFm7B,GAAmB,QAAQ,CAAA70B,MAAO;AAChC,gBAAMi5B,IAAuBvB,EAAW13B,CAAG;AAC3C,UAAIi5B,KACF,QAAQ,IAAIn2B,GAAS9C,GAAKi5B,CAAoB;AAAA,QAElD,CAAC;AAED,YAAIjiB,IAActd;AAClB,eAAOsd,IAActV,EAAY,UACXA,EAAYsV,CAAW,EAC3B,cAAclU,EAAQ;AACtC,UAAAkU;AAEF,QAAAtd,IAAIsd;AAAA,MACN;AAAA,IACF,GAEMkiB,IAAiC;AAAA,MACrC,QAAQ,KAAK,KAAK,qBAAA;AAAA,MAClB,MAAM,KAAK,KAAK,2BAAA;AAAA,MAChB,QAAQ,KAAK,KAAK,qBAAA;AAAA,IAAqB;AAEzC,eAAWl5B,KAAOk5B,GAAmB;AACnC,YAAMx3B,IAAcw3B,EAAqCl5B,CAAG;AAC5D,MAAAg5B,EAAct3B,CAAW;AAAA,IAC3B;AACA,QAAKq3B,GAEL;AAAA,iBAAW/4B,KAAOk5B,GAAmB;AACnC,cAAMC,IAAsCn5B,GACtC0B,IAAcU,GAAe82B,EAAkBC,CAAgB,GAAI;AAAA,UACvE,gBAAgB;AAAA,UAChB,gBAAgB,CAAC,IAAI;AAAA,QAAA,CACtB;AACD,QAAAD,EAAkBC,CAAgB,IAAIz3B,GACtCoL,GAAkBpL,GAAa;AAAA,UAC7B,eAAe,KAAK;AAAA,UACpB,qBAAqB;AAAA,QAAA,CACtB;AAAA,MACH;AACA,WAAK,KAAK,cAAcw3B,CAAiB,GAEpCf,KACH,KAAK,KAAK,kBAAA,EAAoB,SAAA,GAEhC,KAAK,KAAK,OAAO;AAAA,QACf,iBAAiBA;AAAA,QACjB,aAAa;AAAA,MAAA,CACd;AAAA;AAAA,EACH;AAAA,EAEO,UAAsB;AAC3B,UAAMnE,IAAiC,CAAA;AACvC,aAASoF,EAAsB13B,GAAyB;AACtD,eAAS5I,IAAI,GAAGA,IAAI4I,EAAY,QAAQ5I,KAAK;AAC3C,cAAMgK,IAAUpB,EAAY5I,CAAC;AAC7B,YAAIgK,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ;AACvB,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,qBAASiE,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AAEzC,oBAAMo8B,IADKzoB,EAAG,OAAO3T,CAAC,EACD;AACrB,cAAAm8B,EAAsBC,CAAS;AAAA,YACjC;AAAA,UACF;AAAA,QACF;AACA,YAAIv2B,EAAQ,WAAW;AAErB,gBAAMg0B,IAAiBjqB,GAAW/J,GAAS;AAAA,YACzC,GAAGw2B;AAAAA,YACH,GAAGC;AAAAA,UAAA,CACJ;AACD,UAAAvF,EAAmB,KAAK8C,CAAc;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AACA,UAAMt2B,IAAO;AAAA,MACX,KAAK,KAAK,UAAA,EAAY,eAAA;AAAA,MACtB,KAAK,KAAK,2BAAA;AAAA,MACV,KAAK,KAAK,UAAA,EAAY,eAAA;AAAA,IAAe;AAEvC,eAAWkB,KAAelB;AACxB,MAAA44B,EAAsB13B,CAAW;AAEnC,WAAOU,GAAe4xB,GAAoB;AAAA,MACxC,gBAAgB,CAAC,WAAW;AAAA,IAAA,CAC7B;AAAA,EACH;AAAA,EAEO,iBAAiB31B,GAAWvB,GAAWkI,GAAeK,GAAgB;AAC3E,SAAK,cAAc,iBAAiBhH,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,EACzD;AAAA,EAEO,WAAWqY,GAA+B;AAC/C,SAAK,cAAc,OAAOA,CAAG;AAAA,EAC/B;AAAA,EAEO,uBAAmD;AACxD,QAAI,CAAC,KAAK,cAAe,QAAO;AAEhC,UAAMrS,IADW,KAAK,KAAK,YAAA,EACM,mBAAA;AACjC,QAAI,CAACA,EAAiB,QAAO;AAC7B,UAAMyrB,IAAiB,KAAK,cAAc,WAAA;AAE1C,aAAS0C,EACP93B,GACAkB,GAC4B;AAC5B,eAAS9J,IAAI8J,GAAO9J,IAAI,GAAGA,KAAK;AAC9B,cAAMgK,IAAUpB,EAAY5I,CAAC;AAE7B,YAAIgK,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ,UAAU,CAAA;AACjC,mBAAS9J,IAAIsX,EAAO,SAAS,GAAGtX,KAAK,GAAGA,KAAK;AAC3C,kBAAM4X,IAAKN,EAAOtX,CAAC,GACb6X,IAASD,EAAG;AAClB,qBAAS3T,IAAI4T,EAAO,SAAS,GAAG5T,KAAK,GAAGA,KAAK;AAC3C,oBAAMuV,IAAK3B,EAAO5T,CAAC,GACb4K,IAAU2xB,EAAchnB,EAAG,OAAOA,EAAG,MAAM,SAAS,CAAC;AAC3D,kBAAI3K;AACF,uBAAO;AAAA,kBACL,iBAAiB;AAAA,oBACf,SAAS;AAAA,oBACT,OAAO/O;AAAA,oBACP,SAASE;AAAA,oBACT,SAASiE;AAAA,oBACT,MAAMuV,EAAG;AAAA,oBACT,MAAM5B,EAAG;AAAA,oBACT,SAAS9N,EAAQ;AAAA,kBAAA;AAAA,kBAEnB,WAAW+E,EAAQ;AAAA,gBAAA;AAAA,YAGzB;AAAA,UACF;AAAA,QACF;AACA,YACE,CAAC/E,EAAQ,aACTA,EAAQ,cAAcg0B,EAAe;AAErC;AAGF,YAAIpvB,IAAY5O;AAChB,eAAO4O,IAAY,KAAG;AACpB,gBAAMC,IAAcjG,EAAYgG,CAAS;AACzC,cACEC,EAAY,qBAAqBF,EAAiB,SAClDE,EAAY,qBAAqBF,EAAiB,UAClDE,EAAY,qBAAqBF,EAAiB;AAElD;AAEF,UAAAC;AAAA,QACF;AACA,eAAO;AAAA,UACL,iBAAiB;AAAA,YACf,SAAS;AAAA,UAAA;AAAA,UAEX,WAAAA;AAAA,QAAA;AAAA,MAEJ;AACA,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,YAAAjF,EAAA,IAAe,KAAK,MAAM,SAAA,GAC5Bf,IAAc,KAAK,eAAA,GACnBmG,IAAU2xB,EAAc93B,GAAae,CAAU;AACrD,QAAIoF;AACF,aAAO;AAAA,QACL,iBAAiBwD,EAAgB,UAC7BA,IACAxD,EAAQ;AAAA,QACZ,WAAWA,EAAQ;AAAA,MAAA;AAIvB,QAAIivB,EAAe,SAAS;AAC1B,YAAMp0B,IAAsB,KAAK,KAAK,uBAAA,GAChC,EAAE,OAAAsG,GAAO,SAAA2E,GAAS,SAAAC,EAAA,IAAYvC,GAC9BiF,IAAS5N,EAAoBsG,CAAM,EAAE;AAC3C,eAAShQ,IAAI2U,GAAU3U,KAAK,GAAGA,KAAK;AAClC,cAAM4X,IAAKN,EAAOtX,CAAC,GACb6X,IAASD,EAAG;AAClB,iBAAS3T,IAAI4T,EAAO,SAAS,GAAG5T,KAAK,GAAGA,KAAK;AAC3C,cAAI0Q,MAAY3U,KAAKiE,KAAK2Q,EAAU;AACpC,gBAAM4E,IAAK3B,EAAO5T,CAAC,GACb4K,IAAU2xB,EAAchnB,EAAG,OAAOA,EAAG,MAAM,SAAS,CAAC;AAC3D,cAAI3K;AACF,mBAAO;AAAA,cACL,iBAAiB;AAAA,gBACf,SAAS;AAAA,gBACT,OAAOwD,EAAgB;AAAA,gBACvB,SAASrS;AAAA,gBACT,SAASiE;AAAA,gBACT,MAAMuV,EAAG;AAAA,gBACT,MAAM5B,EAAG;AAAA,gBACT,SAASkmB,EAAe;AAAA,cAAA;AAAA,cAE1B,WAAWjvB,EAAQ;AAAA,YAAA;AAAA,QAGzB;AAAA,MACF;AAEA,YAAMA,IAAU2xB,EAAc92B,GAAqBsG,IAAS,CAAC;AAC7D,UAAInB;AACF,eAAO;AAAA,UACL,iBAAiB;AAAA,YACf,SAAS;AAAA,UAAA;AAAA,UAEX,WAAWA,EAAQ;AAAA,QAAA;AAAA,IAGzB;AACA,WAAO;AAAA,EACT;AAAA,EAEO,wBAAoD;AACzD,QAAI,CAAC,KAAK,cAAe,QAAO;AAEhC,UAAMwD,IADW,KAAK,KAAK,YAAA,EACM,mBAAA;AACjC,QAAI,CAACA,EAAiB,QAAO;AAC7B,UAAMyrB,IAAiB,KAAK,cAAc,WAAA;AAE1C,aAAS2C,EACP/3B,GACAkB,GAC4B;A5D58C/B,UAAAjB,GAAAgH;A4D68CG,eAAS7P,IAAI8J,GAAO9J,IAAI4I,EAAY,QAAQ5I,KAAK;AAC/C,cAAMgK,IAAUpB,EAAY5I,CAAC;AAE7B,YAAIgK,EAAQ,SAASW,EAAY,OAAO;AACtC,gBAAM6M,IAASxN,EAAQ,UAAU,CAAA;AACjC,mBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,kBAAM4X,IAAKN,EAAOtX,CAAC,GACb6X,IAASD,EAAG;AAClB,qBAAS3T,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,oBAAMuV,IAAK3B,EAAO5T,CAAC,GACb4K,IAAU4xB,EAAejnB,EAAG,OAAQ,CAAC;AAC3C,kBAAI3K;AACF,uBAAO;AAAA,kBACL,iBAAiB;AAAA,oBACf,SAAS;AAAA,oBACT,OAAO/O;AAAA,oBACP,SAASE;AAAA,oBACT,SAASiE;AAAA,oBACT,MAAMuV,EAAG;AAAA,oBACT,MAAM5B,EAAG;AAAA,oBACT,SAAS9N,EAAQ;AAAA,kBAAA;AAAA,kBAEnB,WAAW+E,EAAQ;AAAA,gBAAA;AAAA,YAGzB;AAAA,UACF;AAAA,QACF;AACA,YACE,GAAC/E,EAAQ,aACTA,EAAQ,cAAcg0B,EAAe,eACrCp1B,IAAAA,EAAY5I,IAAI,CAAC,MAAjB4I,gBAAAA,EAAoB,sBAAqB+F,EAAiB,YAC1D/F,IAAAA,EAAY5I,IAAI,CAAC,MAAjB4I,gBAAAA,EAAoB,sBAAqB+F,EAAiB;AAI5D,iBAAO;AAAA,YACL,iBAAiB;AAAA,cACf,SAAS;AAAA,YAAA;AAAA,YAEX,WAAW3O;AAAA,UAAA;AAAA,MAEf;AACA,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,UAAAiP,EAAA,IAAa,KAAK,MAAM,SAAA,GAC1BrG,IAAc,KAAK,eAAA,GACnBmG,IAAU4xB,EAAe/3B,GAAaqG,CAAQ;AACpD,QAAIF;AACF,aAAO;AAAA,QACL,iBAAiBwD,EAAgB,UAC7BA,IACAxD,EAAQ;AAAA,QACZ,WAAWA,EAAQ;AAAA,MAAA;AAIvB,QAAIivB,EAAe,SAAS;AAC1B,YAAMp0B,IAAsB,KAAK,KAAK,uBAAA,GAChC,EAAE,OAAAsG,GAAO,SAAA2E,GAAS,SAAAC,EAAA,IAAYvC,GAC9BiF,IAAS5N,EAAoBsG,CAAM,EAAE;AAC3C,eAAShQ,IAAI2U,GAAU3U,IAAIsX,EAAO,QAAQtX,KAAK;AAC7C,cAAM4X,IAAKN,EAAOtX,CAAC,GACb6X,IAASD,EAAG;AAClB,iBAAS3T,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,cAAI0Q,MAAY3U,KAAKiE,KAAK2Q,EAAU;AACpC,gBAAM4E,IAAK3B,EAAO5T,CAAC,GACb4K,IAAU4xB,EAAejnB,EAAG,OAAO,CAAC;AAC1C,cAAI3K;AACF,mBAAO;AAAA,cACL,iBAAiB;AAAA,gBACf,SAAS;AAAA,gBACT,OAAOwD,EAAgB;AAAA,gBACvB,SAASrS;AAAA,gBACT,SAASiE;AAAA,gBACT,MAAMuV,EAAG;AAAA,gBACT,MAAM5B,EAAG;AAAA,gBACT,SAASkmB,EAAe;AAAA,cAAA;AAAA,cAE1B,WAAWjvB,EAAQ;AAAA,YAAA;AAAA,QAGzB;AAAA,MACF;AAEA,YAAMA,IAAU4xB,EAAe/2B,GAAqBsG,IAAS,CAAC;AAC9D,UAAInB;AACF,eAAO;AAAA,UACL,iBAAiB;AAAA,YACf,SAAS;AAAA,UAAA;AAAA,UAEX,WAAWA,EAAQ;AAAA,QAAA;AAAA,IAGzB;AACA,WAAO;AAAA,EACT;AAAA,EAEO,gBAAgB2Z,IAAiC,IAAI;AAC1D,UAAM,EAAE,WAAAnb,IAAYI,GAAc,KAAA,IAAS+a;AAC3C,QAAI3Z,IAAsC;AAM1C,QALIxB,MAAcI,GAAc,KAC9BoB,IAAU,KAAK,qBAAA,IAEfA,IAAU,KAAK,sBAAA,GAEb,CAACA,EAAS;AACd,UAAM,EAAE,WAAAH,GAAW,iBAAA2D,EAAA,IAAoBxD,GACjCO,IAAW,KAAK,KAAK,YAAA;AAE3B,IAAAA,EAAS,mBAAmBiD,CAAe,GAC3C,KAAK,KAAK,SAAA,EAAW,aAAa;AAAA,MAChC,YAAY3D;AAAA,MACZ,UAAUA;AAAA,IAAA,CACX,GAED,KAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,MACV,WAAW;AAAA,MACX,aAAa;AAAA,MACb,iBAAiB;AAAA,IAAA,CAClB;AACD,UAAM6B,IAAenB,EAAS,gBAAA;AAC9B,SAAK,KAAK,UAAA,EAAY,oBAAoB;AAAA,MACxC,gBAAgBmB,EAAa7B,CAAS;AAAA,MACtC,WAAArB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEO,uBAAuBmb,GAAkC;A5D/kD/D,QAAA7f,GAAAgH,GAAAuC,GAAAC,GAAA5S;A4DglDC,UAAM,EAAE,KAAA8W,GAAK,YAAAyN,GAAY,kBAAA4c,GAAkB,gBAAAzc,MAAmBuE;AAC9D,QAAI,GAAC7f,IAAAmb,EAAW,YAAX,QAAAnb,EAAoB,UAAU;AACnC,UAAM,EAAE,OAAAkD,MAAU,KAAK,SACjB80B,IAAkB7c,EAAW,QAAQ,WAAWjY;AAEtD,QAAI+0B,IAA0C;AAC9C,SACEjxB,IAAAmU,EAAW,YAAX,QAAAnU,EAAoB,eACnBuC,IAAA4R,EAAW,YAAX,gBAAA5R,EAAoB,aAAYuO,GAAQ,YACvCtO,IAAA2R,EAAW,YAAX,gBAAA3R,EAAoB,aAAYsO,GAAQ,QAC1C;AAEA,UAAIogB,IAAsB/c,EAAW,QAAQ,OACzCgd,IAAsBzqB,EAAI,YAAY,SAAS;AACnD,aAAOyqB,KAAuB,KAAG;AAC/B,cAAMC,IAAoB1qB,EAAI,YAAYyqB,CAAmB;AAG7D,YAFAD,KAAuBE,EAAkB,QAAQ,SAG/CxhC,IAAA8W,EAAI,YAAYyqB,IAAsB,CAAC,MAAvC,gBAAAvhC,EAA0C,sBAC1CkP,EAAiB,QACjB;AACA,UAAAmyB,IAAsBG;AACtB;AAAA,QACF;AACA,QAAAD;AAAA,MACF;AAEA,MAAIF,KACEC,IAAsBF,MACpB7c,EAAW,QAAQ,YAAYrD,GAAQ,SACzCmgB,EAAoB,QACjBD,IAAkBE,KAAuB,IACnC/c,EAAW,QAAQ,YAAYrD,GAAQ,UAEhDmgB,EAAoB,OAClBD,IAAkBE,IAAsB/c,EAAW,QAAQ;AAAA,IAIrE;AAEA,UAAMkd,IAAaL,IAAkBD;AACrC,QAAIM,IAAa,GAAG;AAClB,YAAMC,KAA0BL,KAAA,gBAAAA,EAAqB,SAAQ,GAEvDM,IACJjd,IAAiB5N,EAAI,QAAQyN,EAAW,QAAQ,OAC5CjW,IAAO,KAAK,IAAIqzB,GAAmBF,CAAU;AAEnD,MAAAld,EAAW,OAAOjW,IAAOozB,GACzB5qB,EAAI,SAASxI,IAAOozB;AAAA,IACtB;AAAA,EACF;AACF;ACtnDO,MAAME,GAAiB;AAAA,EAI5B,YAAY53B,GAAY;AAHhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,UAAUO,GAAmB;AAClC,UAAM,EAAE,UAAAgF,MAAahF;AACrB,IAAIgF,IACFA,EAAS,QAAQ,CAACA,EAAS,QAE3BhF,EAAQ,WAAW;AAAA,MACjB,OAAO;AAAA,IAAA,GAGX,KAAK,KAAK,OAAO;AAAA,MACf,WAAW;AAAA,MACX,aAAa;AAAA,IAAA,CACd;AAAA,EACH;AAAA,EAEO,OAAO6B,GAAgC;AAC5C,UAAM,EAAE,KAAA+Y,GAAK,GAAArf,GAAG,OAAA2K,GAAO,KAAAqG,MAAQ1K;AAC/B,QAAI,EAAE,GAAA7H,MAAM6H;AACZ,UAAM;AAAA,MACJ,UAAU,EAAE,KAAA+mB,GAAK,WAAAhN,GAAW,WAAA0b,GAAW,aAAA9I,GAAa,eAAA+I,EAAA;AAAA,MACpD,OAAAx1B;AAAA,IAAA,IACE,KAAK,SACH,EAAE,SAAAU,GAAS,UAAAuC,EAAA,IAAauH,EAAI,YAAYrG,CAAK;AAEnD,QACEqxB,MAAkB/f,GAAc,OAChC+f,MAAkB/f,GAAc,QAChC;AACA,UAAI5S,IAAYsB,IAAQ,GACpBrB,IAAkC;AACtC,aAAOD,IAAY2H,EAAI,YAAY,WACjC1H,IAAc0H,EAAI,YAAY3H,CAAS,GACnC,EAAAC,EAAY,UAAU5E,KAAQ4E,EAAY,UAAU2yB;AACxD,QAAA5yB;AAGF,UAAIC,GAAa;AACf,cAAM;AAAA,UACJ,SAAS,EAAE,mBAAA4yB,GAAmB,oBAAAC,EAAA;AAAA,QAAmB,IAC/C7yB,GACE6qB,IAAa+H,IAAoBC;AACvC,QAAIhI,IAAajtB,EAAQ,WACnB80B,MAAkB/f,GAAc,MAClCxd,KAAKy9B,IAAoBh1B,EAAQ,SACxB80B,MAAkB/f,GAAc,WACzCxd,MAAM01B,IAAajtB,EAAQ,UAAU;AAAA,MAG3C;AAAA,IACF;AAEA,UAAMsB,IAAO,KAAK,MAAMxI,IAAIqtB,IAAM7mB,CAAK,GACjCkC,IAAM,KAAK,MAAMjK,IAAIyI,EAAQ,SAASmZ,CAAS,GAC/C1Z,IAAQO,EAAQ,QAAQmmB,IAAM,IAAI7mB,GAClCQ,IAASE,EAAQ;AACvB,IAAAmY,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,UAAU,KAAK,GAAG,GAElB5V,KAAA,QAAAA,EAAU,SAEZ4V,EAAI,YAAYgB,GAChBhB,EAAI,cAAc0c,GAClB1c,EAAI,KAAK7W,GAAME,GAAK/B,GAAOK,CAAM,GACjCqY,EAAI,OAAA,GAEJA,EAAI,UAAA,GACJA,EAAI,YAAY0c,GAChB1c,EAAI,SAAS7W,GAAME,GAAK/B,GAAOK,CAAM,GAErCqY,EAAI,UAAA,GACJA,EAAI,cAAc4T,GAClB5T,EAAI,YAAYgB,IAAY,IAAI7Z,GAChC6Y,EAAI,OAAO7W,IAAO,IAAIhC,GAAOkC,IAAM1B,IAAS,CAAC,GAC7CqY,EAAI,OAAO7W,IAAO7B,IAAQ,GAAG+B,IAAM1B,IAAS,IAAIR,CAAK,GACrD6Y,EAAI,OAAO7W,IAAO7B,IAAQ,IAAIH,GAAOkC,IAAM,IAAIlC,CAAK,GACpD6Y,EAAI,OAAA,MAEJA,EAAI,YAAYgB,GAChBhB,EAAI,KAAK7W,GAAME,GAAK/B,GAAOK,CAAM,GACjCqY,EAAI,OAAA,IAENA,EAAI,UAAA,GACJA,EAAI,QAAA;AAAA,EACN;AACF;AC9FO,MAAM+c,GAAc;AAAA,EAIzB,YAAYl4B,GAAY;AAHhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,UAAUO,GAAmB;AAClC,UAAM,EAAE,OAAAoF,MAAUpF;AAClB,IAAIoF,IACFA,EAAM,QAAQ,CAACA,EAAM,QAErBpF,EAAQ,QAAQ;AAAA,MACd,OAAO;AAAA,IAAA,GAGX,KAAK,KAAK,OAAO;AAAA,MACf,WAAW;AAAA,MACX,aAAa;AAAA,IAAA,CACd;AAAA,EACH;AAAA,EAEO,OAAO6B,GAA6B;AACzC,UAAM,EAAE,KAAA+Y,GAAK,GAAArf,GAAG,OAAA2K,GAAO,KAAAqG,MAAQ1K;AAC/B,QAAI,EAAE,GAAA7H,MAAM6H;AACZ,UAAM;AAAA,MACJ,OAAO,EAAE,KAAA+mB,GAAK,WAAAhN,GAAW,WAAA0b,GAAW,aAAA9I,GAAa,eAAA+I,EAAA;AAAA,MACjD,OAAAx1B;AAAA,IAAA,IACE,KAAK,SACH,EAAE,SAAAU,GAAS,OAAA2C,EAAA,IAAUmH,EAAI,YAAYrG,CAAK;AAEhD,QACEqxB,MAAkB/f,GAAc,OAChC+f,MAAkB/f,GAAc,QAChC;AACA,UAAI5S,IAAYsB,IAAQ,GACpBrB,IAAkC;AACtC,aAAOD,IAAY2H,EAAI,YAAY,WACjC1H,IAAc0H,EAAI,YAAY3H,CAAS,GACnC,EAAAC,EAAY,UAAU5E,KAAQ4E,EAAY,UAAU2yB;AACxD,QAAA5yB;AAGF,UAAIC,GAAa;AACf,cAAM;AAAA,UACJ,SAAS,EAAE,mBAAA4yB,GAAmB,oBAAAC,EAAA;AAAA,QAAmB,IAC/C7yB,GACE6qB,IAAa+H,IAAoBC;AACvC,QAAIhI,IAAajtB,EAAQ,WACnB80B,MAAkB/f,GAAc,MAClCxd,KAAKy9B,IAAoBh1B,EAAQ,SACxB80B,MAAkB/f,GAAc,WACzCxd,MAAM01B,IAAajtB,EAAQ,UAAU;AAAA,MAG3C;AAAA,IACF;AAEA,UAAMsB,IAAO,KAAK,MAAMxI,IAAIqtB,IAAM7mB,CAAK,GACjCkC,IAAM,KAAK,MAAMjK,IAAIyI,EAAQ,SAASmZ,CAAS,GAC/C1Z,IAAQO,EAAQ,QAAQmmB,IAAM,IAAI7mB,GAClCQ,IAASE,EAAQ;AACvB,IAAAmY,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,UAAU,KAAK,GAAG,GAEtBA,EAAI,cAAcxV,KAAA,QAAAA,EAAO,QAAQkyB,IAAY9I,GAC7C5T,EAAI,YAAYgB,GAChBhB,EAAI,IAAI7W,IAAO7B,IAAQ,GAAG+B,IAAM1B,IAAS,GAAGL,IAAQ,GAAG,GAAG,KAAK,KAAK,CAAC,GACrE0Y,EAAI,OAAA,GAEAxV,KAAA,QAAAA,EAAO,UACTwV,EAAI,UAAA,GACJA,EAAI,YAAY0c,GAChB1c,EAAI,IAAI7W,IAAO7B,IAAQ,GAAG+B,IAAM1B,IAAS,GAAGL,IAAQ,GAAG,GAAG,KAAK,KAAK,CAAC,GACrE0Y,EAAI,KAAA,IAENA,EAAI,UAAA,GACJA,EAAI,QAAA;AAAA,EACN;AACF;ACrFO,MAAMgd,GAAU;AAAA,EA+BrB,YAAYn4B,GAAY;AA9BhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AA+GA,IAAAA,EAAA,kBAAW,MAAM;AAEvB,MAAI,KAAK,iBAAiB,MAAM,YAAY,YAC1C,KAAK,aAAA,GACL,SAAS,oBAAoB,WAAW,KAAK,QAAQ;AAAA,IAEzD;AAlHE,SAAK,YAAY/B,EAAK,aAAA,GACtB,KAAK,SAASA,EAAK,QAAA,GACnB,KAAK,OAAOA,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,aAAa,MAClB,KAAK,gBAAgB,IACrB,KAAK,sBAAsB,CAAA,GAC3B,KAAK,cAAc,MACnB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,YAAY,CAAA,GACjB,KAAK,iBAAiB,MACtB,KAAK,aAAa,MAClB,KAAK,WAAW,MAChB,KAAK,YAAY;AAEjB,UAAM;AAAA,MACJ,kBAAAo4B;AAAA,MACA,mBAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,IAAA,IACE,KAAK,kBAAA;AACT,SAAK,mBAAmBJ,GACxB,KAAK,oBAAoBC,GACzB,KAAK,wBAAwBC,GAC7B,KAAK,eAAeC,GACpB,KAAK,cAAcC,GACnB,KAAK,QAAQ,GACb,KAAK,SAAS,GACd,KAAK,aAAa,GAClB,KAAK,aAAa,GAClB,KAAK,iBAAiB,GACtB,KAAK,qBAAqB,MAC1B,KAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,oBACNj4B,GACAsF,IAAoC,MACV;AAC1B,UAAM,EAAE,OAAAvD,MAAU,KAAK;AACvB,QAAIxG,IAAI,GACJvB,IAAI;AACR,UAAMuI,IAAS,KAAK,KAAK,UAAA,GACnBC,IAAU,KAAK,KAAK,WAAA,GAEpBM,MADSwC,KAAA,gBAAAA,EAAU,WAAU,KAAK,KAAK,UAAA,MACtB/C,IAASC;AAEhC,QAAIxC,EAAQ;AACV,MAAAzE,IAAIyE,EAAQ,iBAAiB,IAAK+B,GAClC/H,IAAIgG,EAAQ,iBAAiB,IAAI+B,IAAQe;AAAA,aAChCwC,GAAU;AACnB,YAAM;AAAA,QACJ,YAAY;AAAA,UACV,SAAS,CAACvB,GAAME,CAAG;AAAA,QAAA;AAAA,QAErB,QAAArB;AAAA,MAAA,IACE0C;AACJ,MAAA/J,IAAIwI,GACJ/J,IAAIiK,IAAMnB,IAAOF;AAAA,IACnB;AACA,WAAO,EAAE,GAAArH,GAAG,GAAAvB,EAAA;AAAA,EACd;AAAA,EAEQ,oBAA4C;AAClD,UAAM,EAAE,OAAA+H,MAAU,KAAK,SAEjB81B,IAAmB,SAAS,cAAc,KAAK;AACrD,IAAAA,EAAiB,UAAU,IAAI,GAAGn2B,CAAa,oBAAoB,GACnEm2B,EAAiB,MAAM,UAAU,QACjCA,EAAiB,MAAM,cAAc,KAAK,QAAQ,cAClDA,EAAiB,MAAM,cAAc,GAAG91B,CAAK;AAE7C,UAAM+1B,IAAsC,CAAA;AAC5C,aAASlhC,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,YAAMshC,IAAY,SAAS,cAAc,KAAK;AAC9C,MAAAA,EAAU,MAAM,aAAa,KAAK,QAAQ,cAC1CA,EAAU,UAAU,IAAI,gBAAgB,GACxCA,EAAU,UAAU,IAAI,UAAUthC,CAAC,EAAE,GACrCshC,EAAU,aAAa,cAAc,OAAOthC,CAAC,CAAC,GAC9CshC,EAAU,cAAc,KAAK,WAAW,KAAK,IAAI,GACjDL,EAAiB,OAAOK,CAAS,GACjCJ,EAAkB,KAAKI,CAAS;AAAA,IAClC;AACA,SAAK,UAAU,OAAOL,CAAgB;AAEtC,UAAMM,IAAkB,SAAS,cAAc,KAAK;AACpD,IAAAA,EAAgB,UAAU,IAAI,GAAGz2B,CAAa,oBAAoB;AAClE,UAAMu2B,IAAc,SAAS,cAAc,MAAM;AACjD,IAAAE,EAAgB,OAAOF,CAAW,GAClCJ,EAAiB,OAAOM,CAAe;AAEvC,UAAMJ,IAAwB,SAAS,cAAc,KAAK;AAC1D,IAAAA,EAAsB,UAAU,IAAI,GAAGr2B,CAAa,gBAAgB,GACpEq2B,EAAsB,MAAM,UAAU;AACtC,UAAMC,IAAe,SAAS,cAAc,KAAK;AACjD,WAAAA,EAAa,aAAa,eAAe,WAAW,GACpDD,EAAsB,OAAOC,CAAY,GACzC,KAAK,UAAU,OAAOD,CAAqB,GACpC;AAAA,MACL,kBAAAF;AAAA,MACA,mBAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAUQ,WAAWp3B,GAAiB;AAElC,QADA,KAAK,SAAS,KAAK,KAAK,QAAA,GACpB,CAAC,KAAK,WAAY;AACtB,UAAM,EAAE,OAAAkB,MAAU,KAAK;AACvB,SAAK,aAAalB,EAAI,GACtB,KAAK,aAAaA,EAAI;AACtB,UAAMwU,IAASxU,EAAI;AACnB,SAAK,iBAAiB,OAAOwU,EAAO,QAAQ,KAAK;AAEjD,UAAMrT,IAAS,OAAO,iBAAiBqT,CAAM,EAAE;AAC/C,aAAS,KAAK,MAAM,SAASrT,GAC7B,KAAK,OAAO,MAAM,SAASA,GAE3B,KAAK,aAAa,MAAM,KAAK,eAC7B,KAAK,sBAAsB,MAAM,UAAU;AAE3C,UAAM,EAAE,GAAGo2B,GAAa,GAAGC,EAAA,IAAe,KAAK;AAAA,MAC7C,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAEP,SAAK,sBAAsB,MAAM,OAAO,GAAGD,CAAW,MACtD,KAAK,sBAAsB,MAAM,MAAM,GAAGC,CAAU,MACpD,KAAK,aAAa,MAAM,QAAQ,GAAG,KAAK,WAAW,QAASt2B,CAAK,MACjE,KAAK,aAAa,MAAM,SAAS,GAAG,KAAK,WAAW,SAAUA,CAAK;AAEnE,UAAMgqB,IAAc,KAAK,WAAW,KAAK,IAAI;AAC7C,aAAS,iBAAiB,aAAaA,CAAW,GAClD,SAAS;AAAA,MACP;AAAA,MACA,MAAM;A/D9LT,YAAAltB;A+DgMK,QAAI,KAAK,cAAc,CAAC,KAAK,oBAAoB,gBAC/C,KAAK,WAAW,QAAQ,KAAK,OAC7B,KAAK,WAAW,SAAS,KAAK,QAC9B,KAAK,KAAK,OAAO;AAAA,UACf,aAAa;AAAA,UACb,WAAUA,IAAA,KAAK,gBAAL,gBAAAA,EAAkB;AAAA,QAAA,CAC7B,IAGH,KAAK,sBAAsB,MAAM,UAAU,QAC3C,SAAS,oBAAoB,aAAaktB,CAAW,GACrD,SAAS,KAAK,MAAM,SAAS,IAC7B,KAAK,OAAO,MAAM,SAAS;AAAA,MAC7B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,IACR,GAEFlrB,EAAI,eAAA;AAAA,EACN;AAAA,EAEQ,WAAWA,GAAiB;AAClC,QAAI,CAAC,KAAK,cAAc,KAAK,oBAAoB,YAAa;AAC9D,UAAM,EAAE,OAAAkB,MAAU,KAAK;AACvB,QAAI8pB,IAAK,GACLC,IAAK;AACT,YAAQ,KAAK,gBAAA;AAAA,MACX,KAAK;AACH;AACE,gBAAMwM,IAAU,KAAK,aAAaz3B,EAAI,GAChCiW,IAAU,KAAK,aAAajW,EAAI;AACtC,UAAAgrB,IAAK,KAAK,KAAKyM,KAAW,IAAIxhB,KAAW,CAAC,GAC1CgV,IAAM,KAAK,WAAW,SAAUD,IAAM,KAAK,WAAW;AAAA,QACxD;AACA;AAAA,MACF,KAAK;AACH,QAAAC,IAAK,KAAK,aAAajrB,EAAI;AAC3B;AAAA,MACF,KAAK;AACH;AACE,gBAAMy3B,IAAUz3B,EAAI,IAAI,KAAK,YACvBiW,IAAU,KAAK,aAAajW,EAAI;AACtC,UAAAgrB,IAAK,KAAK,KAAKyM,KAAW,IAAIxhB,KAAW,CAAC,GAC1CgV,IAAM,KAAK,WAAW,SAAUD,IAAM,KAAK,WAAW;AAAA,QACxD;AACA;AAAA,MACF,KAAK;AACH;AACE,gBAAMyM,IAAUz3B,EAAI,IAAI,KAAK,YACvBiW,IAAUjW,EAAI,IAAI,KAAK;AAC7B,UAAAgrB,IAAK,KAAK,KAAKyM,KAAW,IAAIxhB,KAAW,CAAC,GAC1CgV,IAAM,KAAK,WAAW,SAAUD,IAAM,KAAK,WAAW;AAAA,QACxD;AACA;AAAA,MACF,KAAK;AACH,QAAAA,IAAKhrB,EAAI,IAAI,KAAK;AAClB;AAAA,MACF,KAAK;AACH,QAAAirB,IAAKjrB,EAAI,IAAI,KAAK;AAClB;AAAA,MACF,KAAK;AACH;AACE,gBAAMy3B,IAAU,KAAK,aAAaz3B,EAAI,GAChCiW,IAAUjW,EAAI,IAAI,KAAK;AAC7B,UAAAgrB,IAAK,KAAK,KAAKyM,KAAW,IAAIxhB,KAAW,CAAC,GAC1CgV,IAAM,KAAK,WAAW,SAAUD,IAAM,KAAK,WAAW;AAAA,QACxD;AACA;AAAA,MACF,KAAK;AACH,QAAAA,IAAK,KAAK,aAAahrB,EAAI;AAC3B;AAAA,IAAA;AAGJ,UAAM03B,IAAK,KAAK,WAAW,QAAS1M,IAAK9pB,GACnCy2B,IAAK,KAAK,WAAW,SAAU1M,IAAK/pB;AAC1C,QAAIw2B,KAAM,KAAKC,KAAM,EAAG;AACxB,SAAK,QAAQD,GACb,KAAK,SAASC;AAEd,UAAM3e,IAAe0e,IAAKx2B,GACpB+X,IAAgB0e,IAAKz2B;AAE3B,SAAK,aAAa,MAAM,QAAQ,GAAG8X,CAAY,MAC/C,KAAK,aAAa,MAAM,SAAS,GAAGC,CAAa,MAEjD,KAAK,mBAAmBD,GAAcC,CAAa,GAEnD,KAAK,uBAAuBD,GAAcC,CAAa,GACvDjZ,EAAI,eAAA,GAEA,KAAK,SAAS,eAAe,iBAAiB,KAChD,KAAK,SAAS,KAAK,mBAAmB;AAAA,MACpC,SAAS,KAAK;AAAA,IAAA,CACf;AAAA,EAEL;AAAA,EAEQ,iBAAiB;AACvB,UAAM43B,IAAqB,SAAS,cAAc,KAAK;AACvD,IAAAA,EAAmB,UAAU,IAAI,GAAG/2B,CAAa,kBAAkB;AAEnE,UAAMg3B,IAAW,SAAS,cAAc,GAAG;AAC3C,IAAAA,EAAS,UAAU,IAAI,aAAa,GACpCA,EAAS,UAAU,MAAM;AACvB,WAAK,gBAAA;AAAA,IACP,GACAD,EAAmB,OAAOC,CAAQ;AAElC,UAAMC,IAAe,SAAS,cAAc,KAAK;AACjD,IAAAA,EAAa,UAAU,IAAI,GAAGj3B,CAAa,kBAAkB;AAC7D,UAAM2Z,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,aAAa,eAAe,WAAW,GAC3CA,EAAI,MAAM,KAAK,eACfA,EAAI,YAAY,IAChBsd,EAAa,OAAOtd,CAAG,GACvB,KAAK,iBAAiBA,GACtBod,EAAmB,OAAOE,CAAY;AAEtC,QAAIp9B,IAAI,GACJvB,IAAI,GACJ4+B,IAAY,GACZC,IAAa;AACjB,UAAMC,IAAgB,SAAS,cAAc,KAAK;AAClD,IAAAA,EAAc,UAAU,IAAI,GAAGp3B,CAAa,aAAa;AAEzD,UAAMq3B,IAAoB,SAAS,cAAc,KAAK;AACtD,IAAAA,EAAkB,UAAU,IAAI,gBAAgB;AAChD,UAAMC,IAAW,SAAS,cAAc,GAAG;AAC3C,IAAAA,EAAS,UAAU,IAAI,WAAW,GAClCA,EAAS,UAAU,MAAM;AACvB,YAAMtyB,IAAW,KAAK,UAAU;AAAA,QAC9B,CAAAoB,MAAA;A/DnUL,cAAAjJ;A+DmUW,iBAAAiJ,EAAG,SAAOjJ,IAAA,KAAK,mBAAL,gBAAAA,EAAqB;AAAA;AAAA,MAAA;AAEvC,MAAI6H,KAAY,MAChB,KAAK,iBAAiB,KAAK,UAAUA,IAAW,CAAC,GACjD2U,EAAI,MAAM,KAAK,eAAe,OAC9B,KAAK,qBAAA;AAAA,IACP,GACA0d,EAAkB,OAAOC,CAAQ,GACjC,KAAK,WAAWA;AAChB,UAAMC,IAAa,SAAS,cAAc,MAAM;AAChD,IAAAA,EAAW,UAAU,IAAI,aAAa,GACtC,KAAK,aAAaA,GAClBF,EAAkB,OAAOE,CAAU;AACnC,UAAMC,IAAY,SAAS,cAAc,GAAG;AAC5C,IAAAA,EAAU,UAAU,IAAI,YAAY,GACpCA,EAAU,UAAU,MAAM;AACxB,YAAMxyB,IAAW,KAAK,UAAU;AAAA,QAC9B,CAAAoB,MAAA;A/DpVL,cAAAjJ;A+DoVW,iBAAAiJ,EAAG,SAAOjJ,IAAA,KAAK,mBAAL,gBAAAA,EAAqB;AAAA;AAAA,MAAA;AAEvC,MAAI6H,KAAY,KAAK,UAAU,SAAS,MACxC,KAAK,iBAAiB,KAAK,UAAUA,IAAW,CAAC,GACjD2U,EAAI,MAAM,KAAK,eAAe,OAC9B,KAAK,qBAAA;AAAA,IACP,GACA,KAAK,YAAY6d,GACjBH,EAAkB,OAAOG,CAAS,GAClCJ,EAAc,OAAOC,CAAiB;AAEtC,UAAMI,IAAS,SAAS,cAAc,GAAG;AACzC,IAAAA,EAAO,UAAU,IAAI,SAAS,GAC9BA,EAAO,UAAU,MAAM;AACrB,MAAAP,KAAa,KACb,KAAK,uBAAuBA,GAAWC,GAAYt9B,GAAGvB,CAAC;AAAA,IACzD,GACA8+B,EAAc,OAAOK,CAAM;AAC3B,UAAMC,IAAU,SAAS,cAAc,GAAG;AAC1C,IAAAA,EAAQ,UAAU,MAAM;AACtB,MAAIR,IAAY,OAAO,QACvBA,KAAa,KACb,KAAK,uBAAuBA,GAAWC,GAAYt9B,GAAGvB,CAAC;AAAA,IACzD,GACAo/B,EAAQ,UAAU,IAAI,UAAU,GAChCN,EAAc,OAAOM,CAAO;AAE5B,UAAMC,IAAS,SAAS,cAAc,GAAG;AACzC,IAAAA,EAAO,UAAU,IAAI,QAAQ,GAC7BA,EAAO,UAAU,MAAM;AACrB,MAAAR,KAAc,GACd,KAAK,uBAAuBD,GAAWC,GAAYt9B,GAAGvB,CAAC;AAAA,IACzD,GACA8+B,EAAc,OAAOO,CAAM;AAE3B,UAAMC,IAAe,SAAS,cAAc,GAAG;AAC/C,IAAAA,EAAa,UAAU,IAAI,eAAe,GAC1CA,EAAa,UAAU,MAAM;AAC3B,MAAA/9B,IAAI,GACJvB,IAAI,GACJ4+B,IAAY,GACZC,IAAa,GACb,KAAK,uBAAuBD,GAAWC,GAAYt9B,GAAGvB,CAAC;AAAA,IACzD,GACA8+B,EAAc,OAAOQ,CAAY;AAEjC,UAAMC,IAAgB,SAAS,cAAc,GAAG;AAChD,IAAAA,EAAc,UAAU,IAAI,gBAAgB,GAC5CA,EAAc,UAAU,MAAM;A/DpY/B,UAAA16B;A+DqYG,YAAM,EAAE,MAAA26B,MAAS,KAAK;AACtBC,MAAAA,GAAape,EAAI,KAAK,IAAGxc,IAAA,KAAK,eAAL,gBAAAA,EAAiB,EAAE,IAAI26B,KAAQ,KAAK,EAAE;AAAA,IACjE,GACAV,EAAc,OAAOS,CAAa,GAClCd,EAAmB,OAAOK,CAAa,GACvC,KAAK,qBAAqBL,GAC1B,SAAS,KAAK,OAAOA,CAAkB;AAEvC,QAAI3iB,IAAS,GACTC,IAAS,GACT2jB,IAAc;AAClB,IAAAre,EAAI,cAAc,CAAAxa,MAAO;AACvB,MAAA64B,IAAc,IACd5jB,IAASjV,EAAI,GACbkV,IAASlV,EAAI,GACb43B,EAAmB,MAAM,SAAS;AAAA,IACpC,GACAA,EAAmB,cAAc,CAAC53B,MAAoB;AACpD,MAAK64B,MACLn+B,KAAKsF,EAAI,IAAIiV,GACb9b,KAAK6G,EAAI,IAAIkV,GACbD,IAASjV,EAAI,GACbkV,IAASlV,EAAI,GACb,KAAK,uBAAuB+3B,GAAWC,GAAYt9B,GAAGvB,CAAC;AAAA,IACzD,GACAy+B,EAAmB,YAAY,MAAM;AACnC,MAAAiB,IAAc,IACdjB,EAAmB,MAAM,SAAS;AAAA,IACpC,GACAA,EAAmB,UAAU,CAAA53B,MAAO;AAGlC,UAFAA,EAAI,eAAA,GACJA,EAAI,gBAAA,GACAA,EAAI,SAAS;AAEf,QAAA+3B,KAAa;AAAA,WACR;AAEL,YAAIA,IAAY,OAAO,IAAK;AAC5B,QAAAA,KAAa;AAAA,MACf;AACA,WAAK,uBAAuBA,GAAWC,GAAYt9B,GAAGvB,CAAC;AAAA,IACzD,GAEA,KAAK,qBAAA;AAAA,EACP;AAAA,EAEQ,uBAAuB;AAE7B,UAAM2/B,IAAe,KAAK,UAAU;AAAA,MAClC,CAAA7xB,MAAA;A/DtbH,YAAAjJ;A+DsbS,eAAAiJ,EAAG,SAAOjJ,IAAA,KAAK,mBAAL,gBAAAA,EAAqB;AAAA;AAAA,IAAA;AAEvC,SAAK,WAAY,YAAY,GAAG86B,IAAe,CAAC,MAC9C,KAAK,UAAU,MACjB,IAEIA,KAAgB,IAClB,KAAK,SAAU,UAAU,IAAI,UAAU,IAEvC,KAAK,SAAU,UAAU,OAAO,UAAU,GAExCA,KAAgB,KAAK,UAAU,SAAS,IAC1C,KAAK,UAAW,UAAU,IAAI,UAAU,IAExC,KAAK,UAAW,UAAU,OAAO,UAAU;AAAA,EAE/C;AAAA,EAEO,uBACL53B,GACAs3B,GACA99B,GACAvB,GACA;AACA,IAAK,KAAK,mBACV,KAAK,eAAe,MAAM,OAAO,GAAGuB,CAAC,MACrC,KAAK,eAAe,MAAM,MAAM,GAAGvB,CAAC,MACpC,KAAK,eAAe,MAAM,YAAY,SAAS+H,CAAK,YAClDs3B,IAAS,EACX;AAAA,EACF;AAAA,EAEQ,kBAAkB;A/DtdzB,QAAAx6B;A+DudC,KAAAA,IAAA,KAAK,uBAAL,QAAAA,EAAyB,UACzB,KAAK,qBAAqB,MAC1B,SAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EAEO,mBAAmBqD,GAAeK,GAAgB;AACvD,UAAM,EAAE,aAAaq3B,GAAY,OAAA73B,EAAA,IAAU,KAAK,SAC1CuB,IAAa,KAAK,KAAK,WAAA;AAC7B,SAAK,iBAAiB,MAAM,QAAQ,GAAGpB,CAAK,MAC5C,KAAK,iBAAiB,MAAM,SAAS,GAAGK,CAAM;AAE9C,aAAS3L,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,YAAMmN,IACJnN,MAAM,KAAKA,MAAM,KAAKA,MAAM,IACxB,CAACgjC,IACDhjC,MAAM,KAAKA,MAAM,IACjBsL,IAAQ,IACRA,IAAQ03B,GACR31B,IACJrN,MAAM,KAAKA,MAAM,KAAKA,MAAM,IACxB,CAACgjC,IACDhjC,MAAM,KAAKA,MAAM,IACjB2L,IAAS,IAAIq3B,IACbr3B,IAASq3B;AACf,WAAK,kBAAkBhjC,CAAC,EAAE,MAAM,YAAY,SAASmL,CAAK,KAC1D,KAAK,kBAAkBnL,CAAC,EAAE,MAAM,OAAO,GAAGmN,CAAI,MAC9C,KAAK,kBAAkBnN,CAAC,EAAE,MAAM,MAAM,GAAGqN,CAAG,MAC5C,KAAK,kBAAkBrN,CAAC,EAAE,MAAM,UAAU0M,IAAa,SAAS;AAAA,IAClE;AAAA,EACF;AAAA,EAEO,uBAAuBpB,GAAeK,GAAgB;AAC3D,SAAK,YAAY,YAAY,GAAG,KAAK,MAAML,CAAK,CAAC,MAAM,KAAK,MAAMK,CAAM,CAAC;AAAA,EAC3E;AAAA,EAEO,SAAS;A/D1ff,QAAA1D,GAAAgH;A+D4fC,UAAM2uB,IAAO,KAAK,KAAK,QAAA;AACvB,IACE,CAAC,KAAK,cACL,KAAK,WAAW,mBAAmB,CAAC,KAAK,KAAK,aAAA,KAC9CA,MAASrtB,GAAW,WACnBtI,IAAA,KAAK,QAAQ,SAASsI,GAAW,KAAK,MAAtC,QAAAtI,EAAyC,2BAC1C21B,MAASrtB,GAAW,cACnBtB,IAAA,KAAK,QAAQ,SAASsB,GAAW,QAAQ,MAAzC,QAAAtB,EAA4C,4BAKhD,KAAK,YAAY,KAAK,KAAK,iBAAA,EAAmB,yBAAA,GAC9C,KAAK,iBAAiB,KAAK,YAE3B,KAAK,eAAA,GACL,SAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EAEO,YACL7F,GACAsF,IAAoC,MACpCnG,IAAgC,CAAA,GAChC;A/DnhBD,QAAAN,GAAAgH;A+DqhBC,UAAM2uB,IAAO,KAAK,KAAK,QAAA;AACvB,IACGx0B,EAAQ,mBAAmB,CAAC,KAAK,KAAK,kBACtCw0B,MAASrtB,GAAW,WACnBtI,IAAA,KAAK,QAAQ,SAASsI,GAAW,KAAK,MAAtC,QAAAtI,EAAyC,2BAC1C21B,MAASrtB,GAAW,cACnBtB,IAAA,KAAK,QAAQ,SAASsB,GAAW,QAAQ,MAAzC,QAAAtB,EAA4C,4BAKhD,KAAK,sBAAsB1G,GAC3B,KAAK,gBAAgBa,EAAQb,EAAQ,UAAU,OAAO,KAAK,IAE3D,KAAK,cAAca,GAASsF,CAAQ,GAEpC,SAAS,iBAAiB,WAAW,KAAK,QAAQ;AAAA,EACpD;AAAA,EAEO,cACLtF,GACAsF,IAAoC,MACpC;AACA,UAAM,EAAE,OAAAvD,MAAU,KAAK,SACjB8X,IAAe7Z,EAAQ,QAAS+B,GAChC+X,IAAgB9Z,EAAQ,SAAU+B;AAExC,SAAK,uBAAuB8X,GAAcC,CAAa;AAEvD,UAAM,EAAE,GAAGse,GAAa,GAAGC,EAAA,IAAe,KAAK;AAAA,MAC7Cr4B;AAAA,MACAsF;AAAA,IAAA;AAEF,SAAK,iBAAiB,MAAM,OAAO,GAAG8yB,CAAW,MACjD,KAAK,iBAAiB,MAAM,MAAM,GAAGC,CAAU,MAC/C,KAAK,iBAAiB,MAAM,cAAc,GAAGt2B,CAAK,MAElD,KAAK,mBAAmB8X,GAAcC,CAAa,GACnD,KAAK,iBAAiB,MAAM,UAAU,SAEtC,KAAK,aAAa9Z,GAClB,KAAK,cAAcsF,GACnB,KAAK,QAAQuU,GACb,KAAK,SAASC;AAAA,EAChB;AAAA,EAEO,eAAe;AACpB,SAAK,iBAAiB,MAAM,UAAU,QACtC,SAAS,oBAAoB,WAAW,KAAK,QAAQ;AAAA,EACvD;AACF;ACvkBO,MAAM+f,GAAc;AAAA,EAGzB,cAAc;AAFN,IAAAr4B,EAAA;AAGN,SAAK,cAAc,CAAA;AAAA,EACrB;AAAA,EAEO,IAAIK,GAA2B;AACpC,SAAK,YAAY,KAAKA,CAAO;AAAA,EAC/B;AAAA,EAEO,WAAW;AAChB,SAAK,cAAc,CAAA;AAAA,EACrB;AAAA,EAEO,aAAa;AAClB,WAAO,QAAQ,WAAW,KAAK,WAAW;AAAA,EAC5C;AACF;ACXO,MAAMi4B,GAAQ;AAAA,EAYnB,YAAYr6B,GAAYyW,GAAY;AAX5B,IAAA1U,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,OAAOyW,GACZ,KAAK,OAAOzW,EAAK,QAAA,GACjB,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,gBAAgBA,EAAK,iBAAA;AAE1B,UAAM,EAAE,cAAAs6B,GAAc,YAAAC,MAAe,KAAK,aAAA;AAC1C,SAAK,eAAeD,GACpB,KAAK,aAAaC,GAClB,KAAK,qBAAqB,IAC1B,KAAK,kBAAkBxpB,GAAW;AAElC,UAAMypB,IAA2B,CAAA,GAC3B,EAAE,QAAAC,GAAQ,QAAA9gB,MAAW3Z,EAAK,WAAA;AAChC,IAAKy6B,EAAO,YACVD,EAAW,KAAKzpB,GAAW,MAAM,GAE9B4I,EAAO,YACV6gB,EAAW,KAAKzpB,GAAW,MAAM,GAE/BypB,EAAW,UACb,KAAK,0BAA0BA,CAAU;AAAA,EAE7C;AAAA,EAEQ,0BAA0BA,GAA0B;AAC1D,SAAK,cAAc;AAAA,MACjB;AAAA,MACAE,GAAS,CAACt5B,MAAoB;AAC5B,YAAI,OAAK,sBAAsB,CAAC,KAAK,KAAK,sBACrCA,EAAI;AACT,cAAIA,EAAI,kBAAkB,mBAAmB;AAC3C,kBAAMu5B,IAAgB,KAAK,KAAK,WAAWv5B,EAAI,OAAO;AACtD,gBAAI,CAACo5B,EAAW,SAASG,CAAa,GAAG;AACvC,mBAAK,eAAe,EAAK;AACzB;AAAA,YACF;AACA,iBAAK,kBAAkBA,GAEvB,KAAK;AAAA,cACH,KAAK,KAAK,QAAA,MAAc5pB,GAAW,SAChC4pB,MAAkB5pB,GAAW,UAC5B4pB,MAAkB5pB,GAAW;AAAA,cACjC3P,EAAI;AAAA,cACJA,EAAI;AAAA,YAAA;AAAA,UAER;AACE,iBAAK,eAAe,EAAK;AAAA,MAE7B,GAAG,GAAG;AAAA,IAAA,GAGR,KAAK,cAAc,iBAAiB,cAAc,MAAM;AACtD,WAAK,qBAAqB;AAAA,IAC5B,CAAC,GACD,KAAK,cAAc,iBAAiB,cAAc,MAAM;AACtD,WAAK,qBAAqB,IAC1B,KAAK,eAAe,EAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe;AACrB,UAAMk5B,IAAe,SAAS,cAAc,KAAK;AACjD,IAAAA,EAAa,UAAU,IAAI,GAAGr4B,CAAa,WAAW;AACtD,UAAMs4B,IAAa,SAAS,cAAc,MAAM;AAChD,WAAAD,EAAa,OAAOC,CAAU,GAC9B,KAAK,UAAU,OAAOD,CAAY,GAC3B;AAAA,MACL,cAAAA;AAAA,MACA,YAAAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,eAAeK,GAAkBt2B,GAAeE,GAAc;AACpE,IAAIo2B,KACF,KAAK,aAAa,UAAU,IAAI,MAAM,GACtC,KAAK,aAAa,MAAM,OAAO,GAAGt2B,CAAI,MACtC,KAAK,aAAa,MAAM,MAAM,GAAGE,CAAG,MACpC,KAAK,WAAW,YAAY,KAAK,KAAK;AAAA,MACpC,QACE,KAAK,oBAAoBuM,GAAW,SAAS,cAAc,WAC7D;AAAA,IAAA,KAGF,KAAK,aAAa,UAAU,OAAO,MAAM;AAAA,EAE7C;AACF;AClGO,MAAM8pB,GAAK;AAAA,EAWhB,YAAY76B,GAAY;AAVP,IAAA+B,EAAA,2BAAoB;AAC7B,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,OAAOA,EAAK,QAAA,GACjB,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,cAAc+Q,GAAW,MAC9B,KAAK,qBAAqB,MAC1B,KAAK,iBAAiB,MAEjB,KAAK,QAAQ,KAAK,eACrB,IAAIspB,GAAQr6B,GAAM,IAAI;AAAA,EAE1B;AAAA,EAEO,iBAA0B;AAC/B,WAAO,KAAK,cAAc+Q,GAAW;AAAA,EACvC;AAAA,EAEO,eAAwB;AAC7B,WAAO,KAAK,cAAcA,GAAW;AAAA,EACvC;AAAA,EAEO,iBAA0B;AAC/B,WAAO,KAAK,cAAcA,GAAW;AAAA,EACvC;AAAA,EAEO,UAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,QAAQ3O,GAAqB;AAClC,UAAM,EAAE,QAAAq4B,GAAQ,QAAA9gB,EAAA,IAAW,KAAK;AAChC,IACG,CAAC8gB,EAAO,YAAYr4B,MAAY2O,GAAW,UAC3C,CAAC4I,EAAO,YAAYvX,MAAY2O,GAAW,UAI1C,KAAK,gBAAgB3O,MACzB,KAAK,cAAcA,GACnB,KAAK,KAAK,SAAA,EAAW,WAAA,GACrB,KAAK,KAAK,OAAO;AAAA,MACf,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,WAAW;AAAA,IAAA,CACZ,GAED,KAAK,kBAAA,GAEL04B,GAAS,MAAM;AACb,YAAMC,IAAW,KAAK,KAAK,YAAA;AAC3B,MAAIA,EAAS,cACXA,EAAS,WAAW34B,CAAO;AAE7B,YAAMwF,IAAW,KAAK,KAAK,YAAA;AAC3B,MAAIA,EAAS,eAAe,YAAY,KACtCA,EAAS,KAAK,cAAcxF,CAAO;AAAA,IAEvC,CAAC;AAAA,EACH;AAAA,EAEO,WAAW7H,GAAuB;AAGvC,UAAMmf,IADS,KAAK,KAAK,UAAA,EACI,eAAA,IAAmB,KAAK,KAAK,WAAA,EAAa,CAAC,GAElEC,IAAS,KAAK,KAAK,UAAA,GAEnBC,IADa,KAAK,KAAK,UAAA,KAEbD,EAAO,eAAA,IAAmB,KAAK,KAAK,aAAa,CAAC;AAElE,WAAIpf,IAAImf,IACC3I,GAAW,SAGhBxW,IAAIqf,IACC7I,GAAW,SAEbA,GAAW;AAAA,EACpB;AAAA,EAEO,oBAAoB;AAEzB,QADA,KAAK,oBAAA,GACD,CAAC,KAAK,eAAA,KAAoB,CAAC,KAAK,iBAAkB;AACtD,UAAM,EAAE,OAAAzO,MAAU,KAAK,SACjB04B,IAAiB,KAAK,eAAA,GACtBnlB,IAAW,KAAK,KAAK,YAAA,GACrBvF,IAAU,KAAK,KAAK,WAAA,GACpBkG,IAAa,KAAK,KAAK,cAAA,GACvBykB,IAAa,KAAK,KAAK,UAAA,GACvBl4B,IAAU,KAAK,KAAK,WAAA,GACpBM,IAAO43B,IAAal4B;AAE1B,SAAK,qBAAqB,SAAS,cAAc,KAAK,GACtD,KAAK,mBAAmB,UAAU,IAAI,GAAGd,CAAa,iBAAiB;AAEvE,UAAMw4B,IAAS,KAAK,KAAK,UAAA,GACnB9gB,IAAS,KAAK,KAAK,UAAA,GACnBuhB,IAAkBF,IACpBP,EAAO,UAAA,IACP9gB,EAAO,UAAA,GACLwhB,IAAeH,IACjBP,EAAO,aAAA,IACPQ,IAAathB,EAAO,oBAAoBuhB;AAC5C,aAASzgC,IAAI,GAAGA,IAAIob,EAAS,QAAQpb,KAAK;AACxC,YAAM6b,IAASjT,IAAO5I,IAAI0gC,GACpBC,IAAiB9qB,EAAQ,CAAC,IAAI,KAAK,mBACnC+qB,IAAkB/qB,EAAQ,CAAC,IAAIkG,IAAa,KAAK,mBACjD8kB,IAAgBN,IAClB1kB,IAAS,KAAK,oBACdA,IAAS4kB,IAAkB,KAAK,mBAC9BK,IAAmBP,IACrB1kB,IAAS4kB,IAAkB,KAAK,oBAChC5kB,IAAS,KAAK,mBAGZklB,IAAU,SAAS,cAAc,KAAK;AAC5C,MAAAA,EAAQ,UAAU,IAAI,GAAGv5B,CAAa,eAAe,GACrDu5B,EAAQ,MAAM,MAAM,GAAGD,CAAgB,MACvCC,EAAQ,MAAM,OAAO,GAAGlrB,EAAQ,CAAC,CAAC,MAClCkrB,EAAQ,MAAM,QAAQ,GAAGhlB,CAAU,MACnCglB,EAAQ,MAAM,YAAY,SAASl5B,CAAK,KACxCk5B,EAAQ,MAAM,kBAAkB;AAGhC,YAAMC,IAAY,SAAS,cAAc,KAAK;AAC9C,MAAAA,EAAU,UAAU,IAAI,GAAGx5B,CAAa,qBAAqB;AAC7D,YAAMy5B,IAAW,KAAK,aAAaV,CAAc;AACjD,MAAAS,EAAU,YAAY,GAAGC,CAAQ,QAAQjhC,IAAI,CAAC,OAC9C+gC,EAAQ,OAAOC,CAAS;AAGxB,YAAME,IAAkB,SAAS,cAAc,KAAK;AACpD,MAAAA,EAAgB,UAAU,IAAI,GAAG15B,CAAa,mBAAmB,GACjE05B,EAAgB,YAAY,2cAC5BA,EAAgB,UAAU,CAACplC,MAAM;AAC/B,QAAAA,EAAE,gBAAA,GACF,KAAK,oBAAoBolC,CAAe;AAAA,MAC1C,GACAH,EAAQ,OAAOG,CAAe,GAE9B,KAAK,mBAAmB,OAAOH,CAAO;AAGtC,YAAMI,IAAU,SAAS,cAAc,MAAM;AAC7C,MAAAA,EAAQ,UAAU,IAAI,GAAG35B,CAAa,6BAA6B,GACnE25B,EAAQ,MAAM,MAAM,GAAGN,CAAa,MACpCM,EAAQ,MAAM,QAAQ,GAAGplB,CAAU,MACnColB,EAAQ,MAAM,aAAa,GAAGtrB,EAAQ,CAAC,CAAC,MACxC,KAAK,mBAAmB,OAAOsrB,CAAO;AAGtC,YAAMC,IAAW,SAAS,cAAc,MAAM;AAC9C,MAAAA,EAAS,UAAU,IAAI,GAAG55B,CAAa,8BAA8B,GACrE45B,EAAS,MAAM,MAAM,GAAGvlB,CAAM,MAC9BulB,EAAS,MAAM,SAAS,GAAGX,CAAe,MAC1CW,EAAS,MAAM,OAAO,GAAGT,CAAc,MACvC,KAAK,mBAAmB,OAAOS,CAAQ;AAGvC,YAAMC,IAAa,SAAS,cAAc,MAAM;AAChD,MAAAA,EAAW,UAAU,IAAI,GAAG75B,CAAa,gCAAgC,GACzE65B,EAAW,MAAM,MAAM,GAAGP,CAAgB,MAC1C,KAAK,mBAAmB,OAAOO,CAAU;AAGzC,YAAMC,IAAY,SAAS,cAAc,MAAM;AAC/C,MAAAA,EAAU,UAAU,IAAI,GAAG95B,CAAa,+BAA+B,GACvE85B,EAAU,MAAM,MAAM,GAAGzlB,CAAM,MAC/BylB,EAAU,MAAM,SAAS,GAAGb,CAAe,MAC3Ca,EAAU,MAAM,OAAO,GAAGV,CAAe,MACzC,KAAK,mBAAmB,OAAOU,CAAS;AAAA,IAC1C;AACA,SAAK,UAAU,OAAO,KAAK,kBAAkB;AAAA,EAC/C;AAAA,EAEQ,oBAAoBnmB,GAAqB;AAE/C,SAAK,oBAAA;AAEL,UAAMvR,IAAOuR,EAAO,sBAAA,GACdomB,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,UAAU,IAAI,GAAG/5B,CAAa,uBAAuB,GAC1D+5B,EAAK,MAAM,MAAM,GAAG33B,EAAK,SAAS,CAAC,MACnC23B,EAAK,MAAM,OAAO,GAAG33B,EAAK,IAAI,MAE9B43B,GAAmB,QAAQ,CAAA19B,MAAQ;AACjC,YAAM29B,IAAW,SAAS,cAAc,KAAK;AAC7C,MAAAA,EAAS,UAAU,IAAI,GAAGj6B,CAAa,4BAA4B,GACnEi6B,EAAS,YAAY39B,EAAK,OAC1B29B,EAAS,UAAU,CAAC3lC,MAAM;AACxB,QAAAA,EAAE,gBAAA,GACF,KAAK,kBAAkBgI,EAAK,OAAOA,EAAK,UAAU,GAClD,KAAK,oBAAA;AAAA,MACP,GACAy9B,EAAK,OAAOE,CAAQ;AAAA,IACtB,CAAC,GAED,SAAS,KAAK,OAAOF,CAAI,GACzB,KAAK,iBAAiBA;AAGtB,UAAMG,IAAgB,MAAM,KAAK,oBAAA;AACjC,WAAO,iBAAiB,UAAUA,GAAe,EAAI,GACnDH,EAAa,iBAAiBG;AAGhC,UAAMC,IAAe,CAAC7lC,MAAkB;AACtC,MAAKylC,EAAK,SAASzlC,EAAE,MAAc,KACjC,KAAK,oBAAA;AAAA,IAET;AACA,eAAW,MAAM;AACf,eAAS,iBAAiB,SAAS6lC,CAAY;AAAA,IACjD,GAAG,CAAC,GACFJ,EAAa,gBAAgBI;AAAA,EACjC;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,KAAK,gBAAgB;AAEvB,YAAMD,IAAiB,KAAK,eAAuB;AACnD,MAAIA,KACF,OAAO,oBAAoB,UAAUA,GAAe,EAAI;AAG1D,YAAMC,IAAgB,KAAK,eAAuB;AAClD,MAAIA,KACF,SAAS,oBAAoB,SAASA,CAAY,GAEpD,KAAK,eAAe,OAAA,GACpB,KAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,kBAAkBxZ,GAAgBN,GAAkB;AAC1D,UAAM5iB,IAAU,KAAK,KAAK,WAAA;AAE1B,IAAAA,EAAQ,aAAaA,EAAQ,cAAc,CAAA;AAC3C,UAAM28B,IAAoB38B,EAAQ;AAClC,IAAA28B,EAAkB,SAASzZ,GACvBN,MACF+Z,EAAkB,aAAa/Z,IAGjC,KAAK,KAAK,OAAO;AAAA,MACf,iBAAiB;AAAA,MACjB,aAAa;AAAA,IAAA,CACd;AAAA,EACH;AAAA,EAEQ,aAAaga,GAAmB;AACtC,UAAM7+B,IAAM,SAAS6+B,IAAW,WAAW,QAAQ,IAC7CZ,IAAW,KAAK,KAAK,EAAEj+B,CAAG;AAChC,WAAIi+B,KAAYA,MAAaj+B,IACpBi+B,IAEFY,IAAW,OAAO;AAAA,EAC3B;AAAA,EAEQ,sBAAsB;AlExR7B,QAAAl9B;AkEyRC,KAAAA,IAAA,KAAK,uBAAL,QAAAA,EAAyB,UACzB,KAAK,qBAAqB,MAC1B,KAAK,oBAAA;AAAA,EACP;AACF;ACnRO,MAAMm9B,GAAO;AAAA,EAUlB,YAAYv8B,GAAY/B,GAAmB;AATnC,IAAA8D,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,OAAOA,EAAK,QAAA,GACjB,KAAK,UAAUA,EAAK,WAAA,GAEpB,KAAK,cAAc/B,KAAQ,CAAA,GAC3B,KAAK,UAAU,CAAA,GACf,KAAK,eAAe,CAAA;AAAA,EACtB;AAAA,EAEO,aAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,eAAekB,GAAyB;AAC7C,SAAK,cAAcA;AAAA,EACrB;AAAA,EAEO,iBAA6B;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,kBAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAAU;AACf,SAAK,SAAA,GACL,KAAK,gBAAA,GACL,KAAK,qBAAA;AAAA,EACP;AAAA,EAEO,WAAW;AAChB,SAAK,UAAU,CAAA,GACf,KAAK,eAAe,CAAA;AAAA,EACtB;AAAA,EAEQ,kBAAkB;AACxB,UAAMqX,IAAa,KAAK,KAAK,cAAA;AAC7B,SAAK,UAAU,KAAK,KAAK,eAAe;AAAA,MACtC,YAAAA;AAAA,MACA,aAAa,KAAK;AAAA,IAAA,CACnB;AAAA,EACH;AAAA,EAEQ,uBAAuB;AAC7B,UAAMgmB,IAAe,KAAK,gBAAA,GACpBhmB,IAAa,KAAK,KAAK,cAAA,GAEvBH,IADU,KAAK,KAAK,WAAA,EACH,CAAC,GAElB4kB,IAAa,KAAK,KAAK,UAAA,GACvBwB,IAAe,KAAK,UAAA,GACpBnmB,IAAS2kB,IAAauB,IAAeC;AAC3C,SAAK,SAAS,uBAAuB;AAAA,MACnC,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,QAAApmB;AAAA,MACA,QAAAC;AAAA,MACA,YAAAE;AAAA,MACA,MAAMzF,GAAW;AAAA,IAAA,CAClB;AAAA,EACH;AAAA,EAEO,kBAA0B;AAC/B,UAAM;AAAA,MACJ,QAAQ,EAAE,QAAAtM,GAAQ,UAAAgpB,EAAA;AAAA,MAClB,OAAAnrB;AAAA,IAAA,IACE,KAAK;AACT,WAAImrB,IAAiB,IACd,KAAK,MAAMhpB,IAASnC,CAAK;AAAA,EAClC;AAAA,EAEO,eAAuB;AAC5B,UAAM;AAAA,MACJ,QAAQ,EAAE,gBAAAorB,EAAA;AAAA,IAAe,IACvB,KAAK,SACH5qB,IAAS,KAAK,KAAK,UAAA;AACzB,WAAO,KAAK,MAAMA,IAAS6qB,GAAsBD,CAAc,CAAC;AAAA,EAClE;AAAA,EAEO,YAAoB;AACzB,UAAME,IAAY,KAAK,aAAA,GACjB3C,IAAY,KAAK,aAAA;AACvB,WAAOA,IAAY2C,IAAYA,IAAY3C;AAAA,EAC7C;AAAA,EAEO,eAAuB;AAC5B,WAAO,KAAK,QAAQ,OAAO,CAAChT,GAAKC,MAAQD,IAAMC,EAAI,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEO,iBAAyB;AAE9B,UAAM5H,IAAU,KAAK,KAAK,WAAA,GACpBmsB,IAAe,KAAK,UAAA,GAEpBlkB,IADe,KAAK,gBAAA,IACSkkB,IAAensB,EAAQ,CAAC;AAC3D,WAAOiI,KAAe,IAAI,IAAIA;AAAA,EAChC;AAAA,EAEO,OAAO4C,GAA+B/X,GAAgB;AAC3D,IAAA+X,EAAI,KAAA,GACJA,EAAI,cAAc,KAAK,KAAK,mBACxB,IACA,KAAK,QAAQ,OAAO;AACxB,UAAM3E,IAAa,KAAK,KAAK,cAAA,GACvBoX,IAAY,KAAK,aAAA,GAEjBxX,IAAkB,CAAA;AACxB,QAAI0X,IAAe;AACnB,aAASr3B,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA,KAAK;AAC5C,YAAMqW,IAAM,KAAK,QAAQrW,CAAC;AAC1B,UAAIq3B,IAAehhB,EAAI,SAAS8gB;AAC9B;AAEF,MAAAxX,EAAQ,KAAKtJ,CAAG,GAChBghB,KAAgBhhB,EAAI;AAAA,IACtB;AACA,SAAK,KAAK,QAAQqO,GAAK;AAAA,MACrB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,SAAA/E;AAAA,MACA,QAAAhT;AAAA,MACA,YAAY;AAAA,MACZ,YAAAoT;AAAA,MACA,MAAMzF,GAAW;AAAA,MACjB,iBAAiB;AAAA,IAAA,CAClB,GACDoK,EAAI,QAAA;AAAA,EACN;AACF;ACxJO,MAAMuhB,GAAiB;AAAA,EACrB,WACLvhB,GACAkL,GACAvqB,GACAvB,GACA80B,GACA7sB,GACM;AACN,IAAA2Y,EAAI,KAAA,GACJA,EAAI,YAAY3Y,GAChB2Y,EAAI,cAAc3Y,GAClB2Y,EAAI,YAAY,KAAK,IAAI,KAAKkU,IAAW,IAAI;AAE7C,UAAM3M,IAAO2M,IAAW,KAClBZ,IAAUl0B;AAEhB,YAAQ8rB,GAAA;AAAA,MACN,KAAKsW,EAAQ;AACX,aAAK,SAASxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACnC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,WAAWxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACrC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,WAAWxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAI;AAC3C;AAAA,MACF,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,aAAK,YAAYxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAI;AAC5C;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,SAASxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACnC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,UAAUxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACpC;AAAA,MACF,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,aAAK,aAAaxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAI;AAC7C;AAAA,MACF,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,aAAK,SAASxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAI;AACzC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,UAAUxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACpC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,UAAUxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACpC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,WAAWxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACrC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,WAAWxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAK;AAC5C;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,UAAUxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAK;AAC3C;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,SAASxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACnC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,UAAUxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAI;AAC1C;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,WAAWxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACrC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,aAAaxhB,GAAKrf,GAAG2yB,GAAS/L,CAAI;AACvC;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,YAAYxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAK;AAC7C;AAAA,MACF,KAAKia,EAAQ;AACX,aAAK,aAAaxhB,GAAKrf,GAAG2yB,GAAS/L,GAAM,EAAK;AAC9C;AAAA,MACF;AACE,aAAK,SAASvH,GAAKrf,GAAG2yB,GAAS/L,CAAI;AAAA,IAAA;AAGvC,IAAAvH,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,SACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,IAAAvH,EAAI,UAAA,GACJA,EAAI,IAAIrf,GAAGvB,GAAGmoB,IAAO,KAAK,GAAG,KAAK,KAAK,CAAC,GACxCvH,EAAI,KAAA;AAAA,EACN;AAAA,EAEQ,WACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,IAAAvH,EAAI,UAAA,GACJA,EAAI,IAAIrf,GAAGvB,GAAGmoB,IAAO,KAAK,GAAG,KAAK,KAAK,CAAC,GACxCvH,EAAI,OAAA;AAAA,EACN;AAAA,EAEQ,WACNA,GACArf,GACAvB,GACAmoB,GACAka,GACM;AACN,UAAMC,IAAOna,IAAO;AACpB,IAAAvH,EAAI,UAAA,GACJA,EAAI,KAAKrf,IAAI+gC,GAAMtiC,IAAIsiC,GAAMna,GAAMA,CAAI,GACnCka,IACFzhB,EAAI,KAAA,IAEJA,EAAI,OAAA;AAAA,EAER;AAAA,EAEQ,YACNA,GACArf,GACAvB,GACAmoB,GACAka,GACM;AACN,UAAMC,IAAOna,IAAO;AACpB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,GAAGvB,IAAIsiC,CAAI,GACtB1hB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,CAAC,GACtB4gB,EAAI,OAAOrf,GAAGvB,IAAIsiC,CAAI,GACtB1hB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,CAAC,GACtB4gB,EAAI,UAAA,GACAyhB,IACFzhB,EAAI,KAAA,IAEJA,EAAI,OAAA;AAAA,EAER;AAAA,EAEQ,SACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAMma,IAAOna,IAAO;AACpB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,IAAI+gC,GAAMtiC,CAAC,GACtB4gB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,CAAC,GACtB4gB,EAAI,OAAA;AAAA,EACN;AAAA,EAEQ,UACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAMpgB,IAAQogB,IAAO;AACrB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,IAAI4mB,IAAO,KAAKnoB,CAAC,GAC5B4gB,EAAI,OAAOrf,IAAI4mB,IAAO,KAAKnoB,IAAImoB,IAAO,IAAI,GAC1CvH,EAAI,OAAOrf,IAAI4mB,IAAO,MAAMnoB,IAAImoB,IAAO,IAAI,GAC3CvH,EAAI,YAAY,KAAK,IAAI,KAAK7Y,IAAQ,CAAC,GACvC6Y,EAAI,OAAA;AAAA,EACN;AAAA,EAEQ,aACNA,GACArf,GACAvB,GACAmoB,GACAka,GACM;AACN,UAAMC,IAAOna,IAAO;AACpB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIsiC,IAAO,GAAG,GACnC1hB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,CAAC,GACtB4gB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIsiC,IAAO,GAAG,GACnC1hB,EAAI,UAAA,GACAyhB,IACFzhB,EAAI,KAAA,IAEJA,EAAI,OAAA;AAAA,EAER;AAAA,EAEQ,SACNA,GACArf,GACAvB,GACAmoB,GACAka,GACM;AACN,UAAME,IAAcpa,IAAO,MACrBqa,IAAcD,IAAc,KAC5BE,IAAS,GACTC,IAAO,KAAK,KAAKD;AAEvB,IAAA7hB,EAAI,UAAA;AACJ,aAAShkB,IAAI,GAAGA,IAAI,IAAI6lC,GAAQ7lC,KAAK;AACnC,YAAM+lC,IAAS/lC,IAAI,MAAM,IAAI2lC,IAAcC,GACrCI,IAAQhmC,IAAI8lC,IAAO,KAAK,KAAK,GAC7BG,IAAKthC,IAAIohC,IAAS,KAAK,IAAIC,CAAK,GAChCE,IAAK9iC,IAAI2iC,IAAS,KAAK,IAAIC,CAAK;AACtC,MAAIhmC,MAAM,IACRgkB,EAAI,OAAOiiB,GAAIC,CAAE,IAEjBliB,EAAI,OAAOiiB,GAAIC,CAAE;AAAA,IAErB;AACA,IAAAliB,EAAI,UAAA,GACAyhB,IACFzhB,EAAI,KAAA,IAEJA,EAAI,OAAA;AAAA,EAER;AAAA,EAEQ,UACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAMma,IAAOna,IAAO;AACpB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,IAAIsiC,CAAI,GACnC1hB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,CAAC,GACtB4gB,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,IAAIsiC,CAAI,GACnC1hB,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,CAAC,GAC5B4gB,EAAI,UAAA,GACJA,EAAI,KAAA;AAAA,EACN;AAAA,EAEQ,UACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAMma,IAAOna,IAAO;AACpB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIsiC,IAAO,GAAG,GACnC1hB,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,CAAC,GAC5B4gB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIsiC,IAAO,GAAG,GACnC1hB,EAAI,YAAY,KAAK,IAAI,KAAKuH,IAAO,IAAI,GACzCvH,EAAI,OAAA;AAAA,EACN;AAAA,EAEQ,UACNA,GACArf,GACAvB,GACAmoB,GACAka,GACM;AACN,UAAMt6B,IAAQogB,IAAO;AACrB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,GAAGvB,IAAI+H,IAAQ,CAAC,GAC3B6Y,EAAI;AAAA,MACFrf,IAAIwG,IAAQ;AAAA,MACZ/H,IAAI+H,IAAQ;AAAA,MACZxG,IAAIwG,IAAQ;AAAA,MACZ/H,IAAI+H,IAAQ;AAAA,MACZxG;AAAA,MACAvB,IAAI+H,IAAQ;AAAA,IAAA,GAEd6Y,EAAI;AAAA,MACFrf,IAAIwG,IAAQ;AAAA,MACZ/H,IAAI+H,IAAQ;AAAA,MACZxG,IAAIwG,IAAQ;AAAA,MACZ/H,IAAI+H,IAAQ;AAAA,MACZxG;AAAA,MACAvB,IAAI+H,IAAQ;AAAA,IAAA,GAEd6Y,EAAI,UAAA,GACAyhB,IACFzhB,EAAI,KAAA,IAEJA,EAAI,OAAA;AAAA,EAER;AAAA,EAEQ,SACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAMma,IAAOna,IAAO,KACdlP,IAASkP,IAAO;AACtB,IAAAvH,EAAI,UAAA,GACJA,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,IAAIsiC,CAAI,GACnC1hB,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,IAAIsiC,CAAI,GACnC1hB,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,IAAIsiC,CAAI,GACnC1hB,EAAI,OAAOrf,IAAI+gC,IAAO,KAAKtiC,IAAIsiC,CAAI,GACnC1hB,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIiZ,CAAM,GAC/B2H,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIiZ,CAAM,GAC/B2H,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIiZ,CAAM,GAC/B2H,EAAI,OAAOrf,IAAI+gC,GAAMtiC,IAAIiZ,CAAM,GAC/B2H,EAAI,YAAY,KAAK,IAAI,GAAGuH,IAAO,IAAI,GACvCvH,EAAI,OAAA;AAAA,EACN;AAAA,EAEQ,WACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAM4a,IAAc5a,IAAO,MACrB6a,IAAe7a,IAAO,KACtB8a,IAAS;AAEf,aAASrmC,IAAI,GAAGA,IAAIqmC,GAAQrmC,KAAK;AAC/B,YAAMgmC,IAAShmC,IAAI,IAAI,KAAK,KAAMqmC,IAAS,KAAK,KAAK,GAC/CJ,IAAKthC,IAAIyhC,IAAe,KAAK,IAAIJ,CAAK,GACtCE,IAAK9iC,IAAIgjC,IAAe,KAAK,IAAIJ,CAAK;AAC5C,MAAAhiB,EAAI,UAAA,GACJA,EAAI,IAAIiiB,GAAIC,GAAIC,GAAa,GAAG,KAAK,KAAK,CAAC,GAC3CniB,EAAI,KAAA;AAAA,IACN;AAEA,IAAAA,EAAI,UAAA,GACJA,EAAI,IAAIrf,GAAGvB,GAAG+iC,IAAc,KAAK,GAAG,KAAK,KAAK,CAAC,GAC/CniB,EAAI,KAAA;AAAA,EACN;AAAA,EAEQ,aACNA,GACArf,GACAvB,GACAmoB,GACM;AACN,UAAMma,IAAOna,IAAO,KACd+a,IAAQ;AACd,IAAAtiB,EAAI,UAAA;AACJ,aAAShkB,IAAI,GAAGA,IAAIsmC,GAAOtmC,KAAK;AAC9B,YAAMgmC,IAAShmC,IAAI,KAAK,KAAMsmC,GACxBrR,IAAKyQ,IAAO,KAAK,IAAIM,CAAK,GAC1B9Q,IAAKwQ,IAAO,KAAK,IAAIM,CAAK;AAChC,MAAAhiB,EAAI,OAAOrf,IAAIswB,GAAI7xB,IAAI8xB,CAAE,GACzBlR,EAAI,OAAOrf,IAAIswB,GAAI7xB,IAAI8xB,CAAE;AAAA,IAC3B;AACA,IAAAlR,EAAI,YAAY,KAAK,IAAI,KAAKuH,IAAO,IAAI,GACzCvH,EAAI,OAAA;AAAA,EACN;AAAA,EAEO,eAAekL,GAAgBgJ,GAA0B;AAC9D,UAAM3M,IAAO2M,IAAW;AACxB,YAAQhJ,GAAA;AAAA,MACN,KAAKsW,EAAQ;AAAA,MACb,KAAKA,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,eAAOja;AAAA,MACT,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,eAAOja;AAAA,MACT,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AAAA,MACb,KAAKA,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AACX,eAAOja;AAAA,MACT,KAAKia,EAAQ;AACX,eAAOja,IAAO;AAAA,MAChB,KAAKia,EAAQ;AACX,eAAOja;AAAA,MACT;AACE,eAAOA;AAAA,IAAA;AAAA,EAEb;AACF;ACjYO,MAAMgb,GAAa;AAAA,EASxB,YAAY19B,GAAY;AARhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAES,IAAAA,EAAA,2BAAoB;AACpB,IAAAA,EAAA,kBAAW;AAG1B,SAAK,OAAO/B,GACZ,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,eAAe,IAAI08B,GAAA;AAAA,EAC1B;AAAA,EAEO,QAAQiB,GAA2BC,GAAuB;AAE/D,QADmB,KAAK,KAAK,WAAA,EACb;AAChB,UAAM,EAAE,YAAA19B,GAAY,UAAAsF,EAAA,IAAa,KAAK,MAAM,SAAA;AAC5C,QAAI,CAAC,CAACtF,KAAc,CAAC,CAACsF,EAAU;AAEhC,UAAMq4B,IAAoB,KAAK,MAAM,6BAAA;AACrC,QAAI,CAACA,KAAqB,CAACA,EAAkB,OAAQ;AAKrD,QAHoBA,EAAkB;AAAA,MACpC,CAAAx1B,MAAMA,EAAG,aAAas1B,KAAYt1B,EAAG,cAAcu1B;AAAA,IAAA,KAElC,CAACD,GAAU;AAC5B,WAAK,UAAA;AACL;AAAA,IACF;AAEA,UAAMG,IAAS31B,GAAA;AACf,IAAA01B,EAAkB,QAAQ,CAAAx1B,MAAM;AAC9B,MAAAA,EAAG,SAASy1B,GACZz1B,EAAG,WAAWs1B,GACdt1B,EAAG,YAAYu1B;AAAA,IACjB,CAAC;AAED,UAAM3nB,IAAc/V,MAAesF,GAC7ByB,IAAWgP,IAAczQ,IAAWtF;AAC1C,SAAK,KAAK,OAAO,EAAE,UAAA+G,GAAU,aAAAgP,GAAa;AAAA,EAC5C;AAAA,EAEO,YAAY;ArE3DlB,QAAA7W;AqE6DC,QADmB,KAAK,KAAK,WAAA,EACb;AAChB,UAAM,EAAE,YAAAc,GAAY,UAAAsF,EAAA,IAAa,KAAK,MAAM,SAAA;AAC5C,QAAI,CAAC,CAACtF,KAAc,CAAC,CAACsF,EAAU;AAEhC,UAAMq4B,KAAoBz+B,IAAA,KAAK,MAC5B,6BAAA,MADuB,gBAAAA,EAEtB,OAAO,CAAAiJ,MAAMA,EAAG;AACpB,QAAI,CAACw1B,KAAqB,CAACA,EAAkB,OAAQ;AAErD,UAAM1+B,IAAc,KAAK,KAAK,eAAA,GACxBoN,IAAapN,EAAYqG,CAAQ;AACvC,QAAI+G,EAAW,QAAQ;AACrB,UAAIlM,IAAQmF,IAAW;AACvB,aAAOnF,IAAQlB,EAAY,UAAQ;AACjC,cAAMoB,IAAUpB,EAAYkB,CAAK;AACjC,YAAIkU,GAAqBhU,CAAO,EAAG;AACnC,YAAIA,EAAQ,WAAWgM,EAAW,QAAQ;AACxC,eAAK,KAAK,kBAAkBpN,GAAakB,GAAO,GAAG;AAAA,YACjD;AAAA,cACE,OAAOG;AAAAA,YAAA;AAAA,UACT,CACD;AACD;AAAA,QACF;AACA,QAAAH;AAAA,MACF;AAAA,IACF;AAEA,IAAAw9B,EAAkB,QAAQ,CAAAx1B,MAAM;AAC9B,aAAOA,EAAG,QACV,OAAOA,EAAG,UACV,OAAOA,EAAG,WACV,OAAOA,EAAG;AAAA,IACZ,CAAC;AAED,UAAM4N,IAAc/V,MAAesF,GAC7ByB,IAAWgP,IAAczQ,IAAWtF;AAC1C,SAAK,KAAK,OAAO,EAAE,UAAA+G,GAAU,aAAAgP,GAAa;AAAA,EAC5C;AAAA,EAEO,iBACLkF,GACAhc,GACqB;AACrB,UAAM4+B,wBAAmB,IAAA;AACzB,QAAI19B,IAAQ,GACR29B,IAAY7+B,EAAYkB,CAAK,EAAE,QAC/B49B,IAA6B,CAAA;AACjC,UAAMC,IAAgB/+B,EAAY;AAClC,WAAOkB,IAAQ69B,KAAe;AAC5B,YAAMh3B,IAAa/H,EAAYkB,CAAK;AACpC,UAAI29B,KAAaA,MAAc92B,EAAW;AACxC,QAAA+2B,EAAe,KAAK/2B,CAAU;AAAA,eAE1BA,EAAW,UAAUA,EAAW,WAAW82B,GAAW;AAExD,YAAIC,EAAe,QAAQ;AACzB,gBAAMx7B,IAAQ,KAAK,kBAAkB0Y,GAAK8iB,CAAc;AACxD,UAAAF,EAAa,IAAIC,GAAYv7B,CAAK;AAAA,QACpC;AACA,QAAAu7B,IAAY92B,EAAW,QACvB+2B,IAAiBD,IAAY,CAAC92B,CAAU,IAAI,CAAA;AAAA,MAC9C;AAEF,MAAA7G;AAAA,IACF;AACA,QAAI49B,EAAe,QAAQ;AACzB,YAAMx7B,IAAQ,KAAK,kBAAkB0Y,GAAK8iB,CAAc;AACxD,MAAAF,EAAa,IAAIC,GAAYv7B,CAAK;AAAA,IACpC;AACA,WAAOs7B;AAAA,EACT;AAAA,EAEO,kBACL5iB,GACAgjB,GACQ;AACR,UAAM,EAAE,OAAA77B,GAAO,UAAAiD,GAAU,aAAA64B,GAAa,aAAAC,EAAA,IAAgB,KAAK,SACrDt5B,IAAeo5B,EAAgB,CAAC;AAEtC,QAAIG,IAAmBv5B;AACvB,aAAS5N,IAAI,GAAGA,IAAIgnC,EAAgB,QAAQhnC,KAAK;AAC/C,YAAMkR,IAAK81B,EAAgBhnC,CAAC;AAC5B,UAAIkR,EAAG,UAAU7H,KAAQ6H,EAAG,UAAU,KAAM;AAC1C,QAAAi2B,IAAmBj2B;AACnB;AAAA,MACF;AAAA,IACF;AACA,UAAMk2B,IAAcD,EAAiB,cAAcA,EAAiB,QAAQF,GACtEI,IAAcF,EAAiB,QAAQD,GACvChP,IAAWkP,IAAcj8B;AAE/B,QACEyC,EAAa,aACbA,EAAa,cAAcgU,GAAU,SACrC;AACA,UAAIhU,EAAa,cAAcgU,GAAU;AACvC,gBAAQxT,EAAS,QAAQ,KAAK,YAAYjD;AAE5C,UAAIyC,EAAa,aAAa05B,GAAS,IAAI;AACzC,cAAMC,IAAc,KAAK,aAAa;AAAA,UACjB35B,EAAa;AAAA,UAChCsqB;AAAA,QAAA;AAEF,eAAO,KAAK,KAAKqP,IAAc,KAAK,WAAWp8B,CAAK;AAAA,MACtD;AAEA,MAAA6Y,EAAI,KAAA,GACJA,EAAI,OAAO,GAAGkU,CAAQ,MAAMmP,CAAW;AACvC,YAAMG,IAAa,KAAK,WAA8B55B,EAAa,WAAY,CAAC,GAC1E65B,IAAgBzjB,EAAI,YAAYwjB,CAAU;AAChD,aAAAxjB,EAAI,QAAA,GACG,KAAK,MAAMyjB,EAAc,QAAQ,KAAK,YAAYt8B,CAAK;AAAA,IAChE;AAEA,UAAMub,IAAQsgB,EAAgB,OAAO,CAAClmB,GAAKC,OACrCA,EAAI,UAAU1X,MAChByX,KAAO,IAEFA,IACN,CAAC;AACJ,QAAI,CAAC4F,EAAO,QAAO;AAEnB,UAAM3e,IAAO,GAAG,KAAK,kBAAkB,OAAO,OAAO2e,CAAK,EAAE,MAAM,CAAC,GACjEpY,GAAO,MACT;AACA,IAAA0V,EAAI,KAAA,GACJA,EAAI,OAAO,GAAGkU,CAAQ,MAAMmP,CAAW;AACvC,UAAM1c,IAAc3G,EAAI,YAAYjc,CAAI;AACxC,WAAAic,EAAI,QAAA,GACG,KAAK,MAAM2G,EAAY,QAAQ,KAAK,YAAYxf,CAAK;AAAA,EAC9D;AAAA,EAEO,cACL6Y,GACArO,GACAjH,GACA;ArEtMD,QAAAzG;AqEuMC,UAAM,EAAE,aAAAD,GAAa,SAAA05B,GAAS,WAAAgG,GAAW,QAAA17B,GAAQ,QAAAL,MAAWgK,GACtD/H,IAAe5F,EAAY,CAAC;AAClC,QAAI4F,EAAa,UAAUvE,KAAQuE,EAAa,SAAU;AAE1D,QAAI+5B,IAAW;AACf,UAAM,EAAE,iBAAAC,GAAiB,OAAAz8B,GAAO,aAAA+7B,GAAa,aAAAD,EAAA,IAAgB,KAAK;AAClE,aAASjnC,IAAI,GAAGA,IAAIgI,EAAY,QAAQhI,KAAK;AAC3C,YAAMoJ,IAAUpB,EAAYhI,CAAC;AAC7B,WAAIoJ,KAAA,gBAAAA,EAAS,UAASW,EAAY,IAAK;AACvC,MAAA49B,KAAYC,IAAkBz8B;AAAA,IAChC;AAEA,UAAM;AAAA,MACJ,YAAY;AAAA,QACV,SAAS,CAAC+T,GAAQC,CAAM;AAAA,MAAA;AAAA,IAC1B,IACEzQ,GACE/J,IACJua,IAASwiB,IAAWiG,KAAY/5B,EAAa,eAAe,KAAK,KAAK,QAAQ;AAEhF,QAAIA,EAAa,cAAcgU,GAAU,UAAU;AACjD,YAAM,EAAE,OAAAtW,GAAO,QAAQu8B,GAAgB,KAAA7V,MAAQ,KAAK,QAAQ,UACtD8V,IAAkC;AAAA,QACtC,GAAGl6B;AAAA,QACH,UAAU;AAAA,UACR,OAAO,CAAC,GAAC3F,IAAA2F,EAAa,aAAb,QAAA3F,EAAuB;AAAA,QAAA;AAAA,QAElC,SAAS;AAAA,UACP,GAAG2F,EAAa;AAAA,UAChB,QAAQtC,IAAQ0mB,IAAM,KAAK7mB;AAAA,UAC3B,QAAQ08B,IAAiB18B;AAAA,QAAA;AAAA,MAC3B;AAEF,WAAK,KAAK,oBAAA,EAAsB,OAAO;AAAA,QACrC,KAAA6Y;AAAA,QACA,GAAGrf,IAAIqtB,IAAM7mB;AAAA,QACb,GAAGgU,IAASnT;AAAA,QACZ,OAAO;AAAA,QACP,KAAK;AAAA,UACH,GAAG2J;AAAA,UACH,aAAa,CAACmyB,GAAoB,GAAGnyB,EAAI,WAAW;AAAA,QAAA;AAAA,MACtD,CACD;AACD;AAAA,IACF;AAEA,QAAIwxB,IAAmBv5B;AACvB,aAAS5N,IAAI,GAAGA,IAAIgI,EAAY,QAAQhI,KAAK;AAC3C,YAAMkR,IAAKlJ,EAAYhI,CAAC;AACxB,UAAIkR,EAAG,UAAU7H,KAAQ6H,EAAG,UAAU,KAAM;AAC1C,QAAAi2B,IAAmBj2B;AACnB;AAAA,MACF;AAAA,IACF;AAEA,UAAMgnB,KADciP,EAAiB,cAAcA,EAAiB,QAAQF,KAC7C97B,GACzBE,IAAQ87B,EAAiB,SAAS,KAAK,QAAQ,cAE/CY,IAAY5oB,IAASnT,GACrBg8B,IAAa7oB,IAASxT,IAAS;AAErC,QAAIiC,EAAa,aAAa05B,GAAS,IAAI;AACzC,YAAMpY,IAA2BthB,EAAa,aAAc43B,EAAQ,MAC9D+B,IAAc,KAAK,aAAa,eAAerY,GAAOgJ,CAAQ,GAC9D+P,IAAUtjC,IAAI4iC,IAAc;AAClC,WAAK,aAAa,WAAWvjB,GAAKkL,GAAO+Y,GAASD,GAAY9P,GAAU7sB,CAAK;AAAA,IAC/E,OAAO;AAEL,YAAMg8B,IAAcF,EAAiB,QAAQD,GACvCn/B,IAAO,KAAK;AAAA,QACG6F,EAAa;AAAA,QAChC85B,IAAa;AAAA,MAAA;AAEf,UAAI,CAAC3/B,EAAM;AACX,MAAAic,EAAI,KAAA,GACJA,EAAI,OAAO,GAAGmjB,EAAiB,SAAS,YAAY,EAAE,GAAGA,EAAiB,OAAO,UAAU,EAAE,GAAGjP,CAAQ,MAAMmP,CAAW,IACzHrjB,EAAI,YAAY3Y,GAChB2Y,EAAI,SAASjc,GAAMpD,GAAGojC,CAAS,GAC/B/jB,EAAI,QAAA;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,WAAWkL,GAAgB7vB,GAAmB;AACpD,YAAQ6vB,GAAA;AAAA,MACN,KAAKgZ,GAAQ;AACX,eAAO,GAAG,KAAK,kBAAkB7oC,CAAC,CAAC;AAAA,MACrC,KAAK6oC,GAAQ;AACX,eAAO,IAAI,KAAK,kBAAkB7oC,CAAC,CAAC;AAAA,MACtC,KAAK6oC,GAAQ;AAAA,MACb,KAAKA,GAAQ;AACX,eAAO,GAAG7oC,CAAC,GAAGiP,GAAO,MAAM;AAAA,MAC7B,KAAK45B,GAAQ;AACX,eAAO,IAAI7oC,CAAC;AAAA,MACd,KAAK6oC,GAAQ;AACX,eAAO,GAAG7oC,CAAC;AAAA,MACb,KAAK6oC,GAAQ;AACX,eAAO,KAAK,iBAAiB7oC,CAAC;AAAA,MAChC,KAAK6oC,GAAQ;AACX,eAAO,KAAK,gBAAgB7oC,GAAG,EAAI;AAAA,MACrC,KAAK6oC,GAAQ;AACX,eAAO,GAAG,KAAK,gBAAgB7oC,GAAG,EAAK,CAAC,GAAGiP,GAAO,MAAM;AAAA,MAC1D;AACE,eAAO,GAAGjP,CAAC,GAAGiP,GAAO,MAAM;AAAA,IAAA;AAAA,EAEjC;AAAA,EAEQ,kBAAkBjP,GAAmB;AAC3C,UAAM8oC,IAAiB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAClEC,IAAe,CAAC,IAAI,KAAK,KAAK,GAAG;AACvC,QAAI/oC,MAAM,EAAG,QAAO8oC,EAAe,CAAC;AACpC,QAAI9oC,IAAI,GAAI,QAAO8oC,EAAe9oC,CAAC;AACnC,QAAIA,MAAM,GAAI,QAAO;AACrB,QAAIA,IAAI,GAAI,QAAO,IAAI8oC,EAAe9oC,IAAI,EAAE,CAAC;AAE7C,QAAIq7B,IAAS,IACT2N,IAAY;AAChB,WAAOhpC,IAAI,KAAG;AACZ,YAAMipC,IAAQjpC,IAAI;AAClB,MAAIipC,MAAU,IACZ5N,IAASyN,EAAeG,CAAK,IAAIF,EAAaC,CAAS,IAAI3N,IAClDA,MAAW,MAAM,CAACA,EAAO,WAAWyN,EAAe,CAAC,CAAC,MAC9DzN,IAASyN,EAAe,CAAC,IAAIzN,IAE/Br7B,IAAI,KAAK,MAAMA,IAAI,EAAE,GACrBgpC;AAAA,IACF;AACA,WAAO3N,EAAO,QAAQ,OAAO,EAAE;AAAA,EACjC;AAAA,EAEQ,iBAAiBr7B,GAAmB;AAK1C,WAJgB;AAAA,MACd;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAC7C;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,IAAA,EAEhCA,IAAI,CAAC,KAAK,OAAOA,CAAC;AAAA,EACnC;AAAA,EAEQ,gBAAgBA,GAAWkpC,GAA0B;AAC3D,QAAI7N,IAAS;AACb,UAAM8N,IAAOD,IAAU,KAAK;AAC5B,WAAOlpC,IAAI;AACT,MAAAA,KACAq7B,IAAS,OAAO,aAAa8N,IAAQnpC,IAAI,EAAG,IAAIq7B,GAChDr7B,IAAI,KAAK,MAAMA,IAAI,EAAE;AAEvB,WAAOq7B;AAAA,EACT;AACF;ACrVO,MAAM+N,KAAN,MAAMA,GAAkB;AAAA;AAAA,EAM7B,YAAY5/B,GAAY;AALhB,IAAA+B,EAAA;AAMN,SAAK,UAAU/B,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,OACLmb,GACA5a,GACAzE,GACAvB,GACA;AACA,UAAM;AAAA,MACJ,OAAA+H;AAAA,MACA,WAAW,EAAE,OAAAE,GAAO,WAAA2Z,EAAA;AAAA,IAAU,IAC5B,KAAK;AACT,IAAAhB,EAAI,KAAA,GACJA,EAAI,UAAA;AAEJ,UAAM3W,IAAMjK,IAAKqlC,GAAkB,SAASt9B,IAAS,GAC/CgC,IAAOxI,IAAIyE,EAAQ,QAAQ;AAEjC,IAAA4a,EAAI,UAAU7W,GAAME,CAAG,GACvB2W,EAAI,MAAM7Y,GAAOA,CAAK,GAEtB6Y,EAAI,cAAc3Y,GAClB2Y,EAAI,YAAYgB,GAChBhB,EAAI,UAAU,SACdA,EAAI,WAAW,SACfA,EAAI,UAAA,GAEJA,EAAI,OAAO,GAAG,CAAC,GACfA,EAAI,OAAO,IAAI,CAAC,GAChBA,EAAI,OAAO,IAAI,CAAC,GAChBA,EAAI,OAAO,GAAG,CAAC,GAEfA,EAAI,OAAO,GAAG,CAAC,GACfA,EAAI,OAAO,GAAG,CAAC,GAEfA,EAAI,OAAO,GAAG,CAAC,GACfA,EAAI,OAAO,GAAG,CAAC,GACfA,EAAI,OAAA,GACJA,EAAI,UAAA,GACJA,EAAI,QAAA;AAAA,EACN;AACF;AA/CEpZ,EAFW69B,IAEY,SAAQ,KAC/B79B,EAHW69B,IAGY,UAAS,IAChC79B,EAJW69B,IAIY,OAAM;AAJxB,IAAMC,KAAND;ACUA,MAAME,GAAY;AAAA,EASvB,YAAY9/B,GAAY;AARhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,UAAuCA,EAAK,WAAA,GAEjD,KAAK,cAAc,CAAA,GACnB,KAAK,UAAU,CAAA,GACf,KAAK,eAAe,CAAA;AAAA,EACtB;AAAA,EAEQ,YAAY;AAClB,SAAK,cAAc,CAAA,GACnB,KAAK,UAAU,CAAA,GACf,KAAK,eAAe,CAAA;AAAA,EACtB;AAAA,EAEO,SAASN,GAAoC;AAClD,SAAK,gBAAA,GACL,KAAK,qBAAqBA,CAAO;AAAA,EACnC;AAAA,EAEQ,kBAAkB;AACxB,UAAM8W,IAAa,KAAK,KAAK,cAAA;AAC7B,SAAK,UAAU,KAAK,KAAK,eAAe;AAAA,MACtC,YAAAA;AAAA,MACA,aAAa,KAAK;AAAA,IAAA,CACnB;AAAA,EACH;AAAA,EAEQ,qBAAqB9W,GAAoC;AAC/D,UAAM,EAAE,WAAAqgC,GAAW,OAAAz9B,EAAA,IAAU,KAAK,SAC5B09B,IAAoB,KAAK,KAAK,UAAA,EAAY,eAAA,GAC1CxpB,IAAa,KAAK,KAAK,cAAA,GACvBlG,IAAU,KAAK,KAAK,WAAA;AAC1B,QAAI+F,IAAS/F,EAAQ,CAAC;AAEtB,IAAKyvB,EAAU,aACb1pB,MAAWwpB,GAAkB,QAAQA,GAAkB,OAAOv9B;AAEhE,UAAMgU,KAAS5W,KAAA,gBAAAA,EAAS,WAAU4Q,EAAQ,CAAC,IAAI0vB;AAC/C,SAAK,SAAS,uBAAuB;AAAA,MACnC,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,QAAA3pB;AAAA,MACA,QAAAC;AAAA,MACA,YAAAE;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEO,OACL2E,GACAzb,GACA;AACA,UAAM,EAAE,aAAAugC,IAAc,KAAK,QAAQ,YAAA,IAAgBvgC,KAAW,CAAA,GACxD,EAAE,MAAAzB,GAAM,MAAA4jB,GAAM,MAAAa,GAAM,OAAAlgB,GAAO,SAAAotB,MAAYqQ;AAC7C,SAAK,UAAA,GAEL,KAAK,cAAc;AAAA,MACjB;AAAA,QACE,OAAOhiC;AAAA,QACP,MAAA4jB;AAAA,QACA,MAAAa;AAAA,QACA,OAAAlgB;AAAA,MAAA;AAAA,IACF,GAEF+H,GAAkB,KAAK,aAAa;AAAA,MAClC,eAAe,KAAK;AAAA,MACpB,qBAAqB;AAAA,IAAA,CACtB,GAED,KAAK,SAAS7K,CAAO;AACrB,UAAM8W,IAAa,KAAK,KAAK,cAAA;AAE7B,IAAA2E,EAAI,KAAA,GACJA,EAAI,cAAcyU,GAClB,KAAK,KAAK,QAAQzU,GAAK;AAAA,MACrB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,YAAA3E;AAAA,MACA,iBAAiB;AAAA,IAAA,CAClB,GACD2E,EAAI,QAAA;AAAA,EACN;AACF;AC3FO,MAAM+kB,GAAM;AAAA;AAAA,EAOjB,YAAYlgC,GAAY;AANhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,kCAAkB,IAAA,GACvB,KAAK,oCAAoB,IAAA;AAAA,EAC3B;AAAA,EAEO,WAA0B;AAC/B,QACE,KAAK,KAAK,WAAA,KACV,KAAK,KAAK,UAAU,cAAc+Q,GAAW;AAE7C,aAAO;AAET,UAAMnS,IAAY,KAAK,MAAM,aAAA;AAC7B,QAAI,CAACA,EAAW,QAAO;AACvB,UAAMkf,IAAU3V,GAAA;AAChB,WAAAvJ,EAAU,QAAQ,CAAAyJ,MAAM;AACtB,MAAK,MAAM,QAAQA,EAAG,QAAQ,MAC5BA,EAAG,WAAW,CAAA,IAEhBA,EAAG,SAAS,KAAKyV,CAAO;AAAA,IAC1B,CAAC,GACD,KAAK,KAAK,OAAO;AAAA,MACf,aAAa;AAAA,MACb,WAAW;AAAA,IAAA,CACZ,GACMA;AAAA,EACT;AAAA,EAEO,wBACL3e,GACA2e,GACY;AxE/Db,QAAA1e,GAAAgH;AwEgEC,UAAM+5B,IAA+B,CAAA;AACrC,aAAS5pC,IAAI,GAAGA,IAAI4I,EAAY,QAAQ5I,KAAK;AAC3C,YAAMgK,IAAUpB,EAAY5I,CAAC;AAC7B,UAAIgK,EAAQ,SAASW,EAAY,OAAO;AACtC,cAAM6M,IAASxN,EAAQ;AACvB,iBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,gBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,mBAAS,IAAI,GAAG,IAAI4X,EAAG,OAAO,QAAQ,KAAK;AACzC,kBAAM4B,IAAK5B,EAAG,OAAO,CAAC,GAChB+xB,IAAqB,KAAK;AAAA,cAC9BnwB,EAAG;AAAA,cACH6N;AAAA,YAAA;AAEF,gBAAIsiB,EAAmB;AACrB,qBAAAD,EAAiB,KAAK,GAAGC,CAAkB,GACpCD;AAAA,UAEX;AAAA,QACF;AAAA,MACF;AACA,WAAI/gC,IAAAmB,KAAA,gBAAAA,EAAS,aAAT,QAAAnB,EAAmB,SAAS0e,IAAU;AACxC,QAAAqiB,EAAiB,KAAK5/B,CAAO;AAC7B,cAAM6E,IAAcjG,EAAY5I,IAAI,CAAC;AACrC,YAAI,GAAC6P,IAAAhB,KAAA,gBAAAA,EAAa,aAAb,QAAAgB,EAAuB,SAAS0X,IAAU;AAAA,MACjD;AAAA,IACF;AACA,WAAOqiB;AAAA,EACT;AAAA,EAEO,YAAYriB,GAAiB;AAClC,QAAI,KAAK,KAAK,aAAc;AAE5B,UAAM3e,IAAc,KAAK,KAAK,2BAAA,GACxBghC,IAAmB,KAAK,wBAAwBhhC,GAAa2e,CAAO;AAC1E,QAAKqiB,EAAiB,QACtB;AAAA,eAAS5pC,IAAI,GAAGA,IAAI4pC,EAAiB,QAAQ5pC,KAAK;AAChD,cAAMgK,IAAU4/B,EAAiB5pC,CAAC,GAC5B8pC,IAAW9/B,EAAQ,UACnB+/B,IAAaD,EAAS,UAAU,CAAApe,MAAMA,MAAOnE,CAAO;AAC1D,QAAAuiB,EAAS,OAAOC,GAAY,CAAC,GAExBD,EAAS,UACZ,OAAO9/B,EAAQ;AAAA,MAEnB;AACA,WAAK,KAAK,OAAO;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,MAAA,CACZ;AAAA;AAAA,EACH;AAAA,EAEO,oBACLpB,GACA2e,GACoC;AxEtHrC,QAAA1e;AwEuHC,QAAImhC,IAAkB,IAClBC,IAAgB;AACpB,aAASjqC,IAAI,GAAGA,IAAI4I,EAAY,QAAQ5I,KAAK;AAC3C,YAAMgK,IAAUpB,EAAY5I,CAAC;AAC7B,UAAIgK,EAAQ,SAASW,EAAY,OAAO;AACtC,cAAM6M,IAASxN,EAAQ;AACvB,iBAAS9J,IAAI,GAAGA,IAAIsX,EAAO,QAAQtX,KAAK;AACtC,gBAAM4X,IAAKN,EAAOtX,CAAC;AACnB,mBAAS,IAAI,GAAG,IAAI4X,EAAG,OAAO,QAAQ,KAAK;AACzC,kBAAM4B,IAAK5B,EAAG,OAAO,CAAC,GAChBvP,IAAQ,KAAK,oBAAoBmR,EAAG,OAAO6N,CAAO;AACxD,gBAAIhf;AACF,qBAAO;AAAA,gBACL,GAAGA;AAAA,gBACH,SAAS;AAAA,gBACT,OAAOvI;AAAA,gBACP,SAASE;AAAA,gBACT,SAAS;AAAA,gBACT,MAAMwZ,EAAG;AAAA,gBACT,MAAM5B,EAAG;AAAA,gBACT,SAAS9N,EAAQ;AAAA,cAAA;AAAA,UAGvB;AAAA,QACF;AAAA,MACF;AACA,OAAInB,IAAAmB,EAAQ,aAAR,QAAAnB,EAAkB,SAAS0e,OACzByiB,MAAoB,OAAIA,IAAkBhqC,IAC9CiqC,IAAgBjqC;AAAA,IAEpB;AACA,WAAIgqC,MAAoB,KACf;AAAA,MACL,SAAS;AAAA,MACT,YAAYA;AAAA,MACZ,UAAUC;AAAA,IAAA,IAGP;AAAA,EACT;AAAA,EAEO,gBAAgB;AACrB,SAAK,YAAY,MAAA,GACjB,KAAK,cAAc,MAAA;AAAA,EACrB;AAAA,EAEO,eACLjgC,GACAzE,GACAvB,GACAkI,GACAK,GACA;AACA,UAAMu9B,IAAW9/B,EAAQ;AACzB,QAAK8/B;AACL,iBAAWviB,KAAWuiB,GAAU;AAC9B,cAAMI,IAAW,KAAK,YAAY,IAAI3iB,CAAO;AAC7C,YAAI,CAAC2iB;AACH,eAAK,YAAY,IAAI3iB,GAAS;AAAA,YAC5B,YAAY,CAAC,EAAE,GAAAhiB,GAAG,GAAAvB,GAAG,OAAAkI,GAAO,QAAAK,GAAQ;AAAA,UAAA,CACrC,GACI,KAAK,cAAc,IAAIgb,CAAO,KACjC,KAAK,cAAc,IAAIA,GAAS,KAAK,cAAc,OAAO,CAAC;AAAA,aAExD;AACL,gBAAM4iB,IAAWD,EAAS,WAAWA,EAAS,WAAW,SAAS,CAAC;AACnE,UAAIC,KAAY,KAAK,IAAIA,EAAS,IAAInmC,CAAC,IAAI,IACzCmmC,EAAS,SAASj+B,IAElBg+B,EAAS,WAAW,KAAK,EAAE,GAAA3kC,GAAG,GAAAvB,GAAG,OAAAkI,GAAO,QAAAK,GAAQ;AAAA,QAEpD;AAAA,MACF;AAAA,EACF;AAAA,EAEO,OAAOqY,GAA+B;AxElM5C,QAAA/b;AwEmMC,QAAI,CAAC,KAAK,YAAY,KAAM;AAE5B,UAAMN,IAAQ,KAAK,MAAM,SAAA,GAEnB6hC,KAAiBvhC,IADH,KAAK,KAAK,eAAA,EACKN,EAAM,QAAQ,MAA1B,gBAAAM,EAA6B,UAC9C;AAAA,MACJ,OAAO,EAAE,iBAAAwhC,GAAiB,SAAAhR,GAAS,eAAAiR,GAAe,uBAAAnQ,EAAA;AAAA,IAAsB,IACtE,KAAK;AAET,IAAAvV,EAAI,KAAA,GAEJ,KAAK,YAAY,QAAQ,CAACslB,GAAU3iB,MAAY;AAC9C,YAAM,EAAE,YAAAgjB,MAAeL;AAGvB,OAFiBE,KAAA,gBAAAA,EAAgB,SAAS7iB,OAGxC3C,EAAI,cAAc0lB,GAClB1lB,EAAI,YAAYuV,MAEhBvV,EAAI,cAAcyU,GAClBzU,EAAI,YAAYylB;AAElB,iBAAWxa,KAAQ0a;AACjB,QAAA3lB,EAAI,SAASiL,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAOA,EAAK,MAAM;AAAA,IAGxD,CAAC,GAEDjL,EAAI,QAAA,GACJ,KAAK,cAAA;AAAA,EACP;AAAA;AAAA,EAGO,gBAAgB2C,GAAyB;AAC9C,WAAO,KAAK,cAAc,IAAIA,CAAO,KAAK;AAAA,EAC5C;AAAA;AAAA,EAGO,iBAA2B;AAChC,UAAM8K,IAAS,MAAM,KAAK,KAAK,cAAc,SAAS;AACtD,WAAAA,EAAO,KAAK,CAACvxB,GAAGpG,MAAMoG,EAAE,CAAC,IAAIpG,EAAE,CAAC,CAAC,GAC1B23B,EAAO,IAAI,CAAAxuB,MAAKA,EAAE,CAAC,CAAC;AAAA,EAC7B;AACF;AC1OO,MAAM2mC,GAAc;AAAA,EAUzB,YAAY/gC,GAAY;AAThB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEN,SAAK,OAAO/B,GACZ,KAAK,WAAW,KAAK,KAAK,YAAA,GAC1B,KAAK,gBAAgB,KAAK,KAAK,iBAAA,GAC/B,KAAK,oBAAoB,KAAK,WAAW,KAAK,IAAI,GAClD,KAAK,qBAAqB,KAAK,YAAY,KAAK,IAAI,GACpD,KAAK,qBAAqB,KAAK,YAAY,KAAK,IAAI,GACpD,KAAK,oBAAoB,KAAK,WAAW,KAAK,IAAI,GAClD,KAAK,kBAAkB,KAAK,SAAS,KAAK,IAAI,GAC9C,KAAK,gBAAgB,KAAK,OAAO,KAAK,IAAI,GAC1C,KAAK,cAAc,iBAAiB,aAAa,KAAK,iBAAiB,GACvE,KAAK,cAAc,iBAAiB,cAAc,KAAK,kBAAkB,GACzE,KAAK,cAAc,iBAAiB,cAAc,KAAK,kBAAkB,GACzE,KAAK,cAAc,iBAAiB,aAAa,KAAK,iBAAiB,GACvE,KAAK,cAAc,iBAAiB,WAAW,KAAK,eAAe,GACnE,KAAK,cAAc,iBAAiB,SAAS,KAAK,aAAa;AAAA,EACjE;AAAA,EAEO,cAAc;AACnB,SAAK,cAAc,oBAAoB,aAAa,KAAK,iBAAiB,GAC1E,KAAK,cAAc,oBAAoB,cAAc,KAAK,kBAAkB,GAC5E,KAAK,cAAc,oBAAoB,cAAc,KAAK,kBAAkB,GAC5E,KAAK,cAAc,oBAAoB,aAAa,KAAK,iBAAiB,GAC1E,KAAK,cAAc,oBAAoB,WAAW,KAAK,eAAe,GACtE,KAAK,cAAc,oBAAoB,SAAS,KAAK,aAAa;AAAA,EACpE;AAAA,EAEQ,WAAWoB,GAAiB;AAClC,IAAK,KAAK,SAAS,eAAe,WAAW,KAC7C,KAAK,SAAS,KAAK,aAAaA,CAAG;AAAA,EACrC;AAAA,EAEQ,YAAYA,GAAiB;AACnC,IAAK,KAAK,SAAS,eAAe,YAAY,KAC9C,KAAK,SAAS,KAAK,cAAcA,CAAG;AAAA,EACtC;AAAA,EAEQ,YAAYA,GAAiB;AACnC,IAAK,KAAK,SAAS,eAAe,YAAY,KAC9C,KAAK,SAAS,KAAK,cAAcA,CAAG;AAAA,EACtC;AAAA,EAEQ,WAAWA,GAAiB;AAClC,IAAK,KAAK,SAAS,eAAe,WAAW,KAC7C,KAAK,SAAS,KAAK,aAAaA,CAAG;AAAA,EACrC;AAAA,EAEQ,SAASA,GAAiB;AAChC,IAAK,KAAK,SAAS,eAAe,SAAS,KAC3C,KAAK,SAAS,KAAK,WAAWA,CAAG;AAAA,EACnC;AAAA,EAEQ,OAAOA,GAAiB;AAC9B,IAAK,KAAK,SAAS,eAAe,OAAO,KACzC,KAAK,SAAS,KAAK,SAASA,CAAG;AAAA,EACjC;AACF;ACjEO,MAAM4/B,GAAW;AAAA,EAItB,YAAYhhC,GAAY;AAHhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,OAAOmb,GAA+B/X,GAAgB;AAC3D,UAAM;AAAA,MACJ,OAAAd;AAAA,MACA,YAAY,EAAE,OAAAE,GAAO,MAAAkgB,GAAM,MAAAb,GAAM,OAAAtd,GAAO,MAAA5C,EAAA;AAAA,IAAK,IAC3C,KAAK,SACHs/B,IAAe,KAAK,KAAK,gBAAA,GACzB3wB,IAAU,KAAK,KAAK,WAAA,GACpBtJ,IAAe,KAAK,KAAK,YAAA,EAAc,4BAAA,GAEvCoP,IADc,KAAK,KAAK,eAAA,EACFhT,CAAM;AAClC,IAAA+X,EAAI,KAAA,GACJA,EAAI,YAAY3Y,GAChB2Y,EAAI,OAAO,GAAGuH,IAAOpgB,CAAK,MAAMuf,CAAI;AACpC,aAAS1qB,IAAI,GAAGA,IAAIif,EAAQ,QAAQjf,KAAK;AACvC,YAAM2V,IAAMsJ,EAAQjf,CAAC,GACf;AAAA,QACJ,YAAY,EAAE,YAAA4M,EAAA;AAAA,MAAW,IACvBiD,EAAa8F,EAAI,UAAU,GACzBo0B,IAAMv/B,MAASw/B,GAAe,OAAOhqC,IAAI,IAAI2V,EAAI,WAAW,GAC5DgV,IAAcmf,EAAa,YAAY9lB,GAAK;AAAA,QAChD,OAAO,GAAG+lB,CAAG;AAAA,MAAA,CACd,GACKplC,IAAIwU,EAAQ,CAAC,KAAKwR,EAAY,QAAQvd,KAASjC,GAC/C/H,IAAIwJ,EAAW,CAAC,IAAI+d,EAAY,0BAA0Bxf;AAChE,MAAA6Y,EAAI,SAAS,GAAG+lB,CAAG,IAAIplC,GAAGvB,CAAC;AAAA,IAC7B;AACA,IAAA4gB,EAAI,QAAA;AAAA,EACN;AACF;ACpCO,MAAMimB,GAAW;AAAA,EAMtB,YAAYphC,GAAY;AALhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,SAASA,EAAK,UAAA,GACnB,KAAK,SAASA,EAAK,UAAA,GACnB,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,OAAOmb,GAA+B;AAC3C,UAAM;AAAA,MACJ,OAAA7Y;AAAA,MACA,YAAY,EAAE,OAAAE,GAAO,WAAA2Z,GAAW,SAAAklB,EAAA;AAAA,IAAQ,IACtC,KAAK;AACT,IAAAlmB,EAAI,KAAA,GACJA,EAAI,UAAU,KAAK,GAAG,GACtBA,EAAI,cAAc3Y,GAClB2Y,EAAI,YAAYgB,IAAY7Z;AAC5B,UAAMgO,IAAU,KAAK,KAAK,WAAA,GAEpBxU,IAAIwU,EAAQ,CAAC,IAAI+wB,EAAQ,CAAC,IAAI/+B,GAE9B/H,IAAI+V,EAAQ,CAAC,IAAI,KAAK,OAAO,mBAAmB+wB,EAAQ,CAAC,IAAI/+B,GAE7DG,IAAQ,KAAK,KAAK,cAAA,KAAmB4+B,EAAQ,CAAC,IAAIA,EAAQ,CAAC,KAAK/+B,GAEhEQ,IACJ,KAAK,KAAK,UAAA,IACVvI,IACA,KAAK,OAAO,eAAA,IACZ+V,EAAQ,CAAC,IACT+wB,EAAQ,CAAC,IAAI/+B;AACf,IAAA6Y,EAAI,KAAKrf,GAAGvB,GAAGkI,GAAOK,CAAM,GAC5BqY,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,EACN;AACF;AC1BO,MAAMmmB,GAAa;AAAA,EAQxB,YAAYthC,GAAY;AAPhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,WAAWA,EAAK,YAAA,GACrB,KAAK,YAAYA,EAAK,aAAA,GACtB,KAAK,gBAAgBA,EAAK,iBAAA,GAC1B,KAAK,UAAUA,EAAK,WAAA;AAAA,EACtB;AAAA,EAEO,YAAY8M,GAAaC,GAAa;A5ErC5C,QAAA3N;A4EsCC,UAAM,EAAE,YAAAc,GAAY,UAAAsF,EAAA,IAAa,KAAK,MAAM,SAAA;AAC5C,QAAI,CAAC,CAACtF,KAAc,CAAC,CAACsF,EAAU;AAChC,UAAM,EAAE,iBAAA+7B,GAAiB,oBAAA9U,GAAoB,WAAA/V,GAAW,oBAAA2O,MACtD,KAAK,QAAQ,OACTlmB,IAAc,KAAK,KAAK,eAAA;AAC9B,QAAI05B,IAAU;AACd,SAAIz5B,IAAAD,EAAYe,CAAU,MAAtB,QAAAd,EAAyB,QAAQ;AACnC,YAAM4H,IAAe,KAAK,SAAS,gBAAA,GAC7B,EAAE,UAAAoJ,EAAA,IAAapJ,EAAa9G,CAAU,GAEtC4M,IADU,KAAK,KAAK,WAAA,EACNsD,CAAQ;AAC5B,MAAAyoB,KAAU/rB,KAAAA,gBAAAA,EAAK,YAAW;AAAA,IAC5B;AACA,UAAM0J,IAAa,KAAK,KAAK,qBAAA,IAAyBqiB,GAChDhhB,IAAkBnB,EAAU,CAAC,IAAIA,EAAU,CAAC,GAC5C8qB,IACJ,OAAO,SAAS,OAAOD,CAAe,CAAC,KAAK,OAAOA,CAAe,IAAI,IAClE,OAAOA,CAAe,IACtB,GACAE,IAAkB,KAAK;AAAA,MAC3BhV;AAAA,MACA+U;AAAA,MACA,KAAK,KAAK,KAAK,QAAQ,cAAc,MAAM3pB,CAAe;AAAA,IAAA,GAGtDmN,IAAwB,CAAA,GACxByG,IAAWjV,IAAazJ;AAC9B,aAASpW,IAAI,GAAGA,IAAIoW,GAAKpW;AACvB,MAAAquB,EAAS,KAAK;AAAA,QACZ,OAAOyG;AAAA,MAAA,CACR;AAGH,UAAM1d,IAAgB,CAAA;AACtB,aAAStX,IAAI,GAAGA,IAAIqW,GAAKrW,KAAK;AAC5B,YAAM6X,IAAgB,CAAA,GAChBD,IAAU;AAAA,QACd,QAAQozB;AAAA,QACR,QAAAnzB;AAAA,MAAA;AAEF,eAAS3X,IAAI,GAAGA,IAAIoW,GAAKpW;AACvB,QAAA2X,EAAO,KAAK;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO,CAAA;AAAA,QAAC,CACT;AAEH,MAAAP,EAAO,KAAKM,CAAE;AAAA,IAChB;AACA,UAAM9N,IAAoB;AAAA,MACxB,MAAMW,EAAY;AAAA,MAClB,OAAO;AAAA,MACP,UAAA8jB;AAAA,MACA,QAAAjX;AAAA,MACA,YAAY6X,GAAY;AAAA,MACxB,aAAaP;AAAA,MACb,aAAa;AAAA,IAAA;AAGf9a,IAAAA,GAAkB,CAAChK,CAAO,GAAG;AAAA,MAC3B,eAAe,KAAK;AAAA,IAAA,CACrB,GACDE,GAAqBtB,GAAa,CAACoB,CAAO,GAAGL,GAAY;AAAA,MACvD,eAAe,KAAK;AAAA,IAAA,CACrB;AACD,UAAM+G,IAAW/G,IAAa;AAC9B,SAAK,KAAK;AAAA,MACRf;AAAA,MACA8H;AAAA,MACA/G,MAAesF,IAAW,IAAIA,IAAWtF;AAAA,MACzC,CAACK,CAAO;AAAA,IAAA,GAEV,KAAK,MAAM,SAAS0G,GAAUA,CAAQ,GACtC,KAAK,KAAK,OAAO,EAAE,UAAAA,GAAU,aAAa,IAAO;AAAA,EACnD;AAAA,EAEO,oBAAoB;AACzB,UAAM6B,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA2E,GAAS,SAAAD,EAAA,IAAYrC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QACpB2pB,IAAQ3F,EAAUnZ,CAAQ;AAEhC,QAAI8e,EAAM,OAAO,SAAS3pB,EAAQ,SAAU,QAAQ;AAClD,YAAMmhC,IAAUxX,EAAM,OAAO,CAAC,EAAE;AAChC,eAAS9yB,IAAI,GAAGA,IAAIgU,GAAUhU,KAAK;AACjC,cAAMiX,IAAKkW,EAAUntB,CAAC;AACtB,iBAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,gBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,UAAIuV,EAAG,UAAU,KAAKA,EAAG,WAAYA,EAAG,WAAWyxB,IAAU,MAC3DzxB,EAAG,WAAW;AAAA,QAElB;AAAA,MACF;AAAA,IACF;AAEA,UAAM0xB,IAAUx5B,GAAA,GACVy5B,IAAa;AAAA,MACjB,QAAQ1X,EAAM;AAAA,MACd,IAAIyX;AAAA,MACJ,QAAQ,CAAA;AAAA,IAAC;AAEX,aAASvqC,IAAI,GAAGA,IAAI8yB,EAAM,OAAO,QAAQ9yB,KAAK;AAC5C,YAAMyqC,IAAQ3X,EAAM,OAAO9yB,CAAC,GACtB0qC,IAAU35B,GAAA;AAChB,MAAAy5B,EAAM,OAAO,KAAK;AAAA,QAChB,IAAIE;AAAA,QACJ,SAAS;AAAA,QACT,SAASD,EAAM;AAAA,QACf,OAAO;AAAA,UACL;AAAA,YACE,OAAOrhC;AAAAA,YACP,MAAM;AAAA,YACN,SAAA2K;AAAA,YACA,MAAMw2B;AAAA,YACN,MAAMG;AAAA,UAAA;AAAA,QACR;AAAA,MACF,CACD;AAAA,IACH;AACA,IAAAvd,EAAU,OAAOnZ,GAAU,GAAGw2B,CAAK,GAEnC,KAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,MACT,OAAAn7B;AAAA,MACA,SAAA2E;AAAA,MACA,SAAS;AAAA,MACT,MAAMw2B,EAAM,OAAO,CAAC,EAAE;AAAA,MACtB,MAAMA,EAAM;AAAA,MACZ,SAAAz2B;AAAA,IAAA,CACD,GACD,KAAK,MAAM,SAAS,GAAG,CAAC,GAExB,KAAK,KAAK,OAAO,EAAE,UAAU,GAAG,GAChC,KAAK,UAAU,OAAA;AAAA,EACjB;AAAA,EAEO,uBAAuB;AAC5B,UAAMrC,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA2E,GAAS,SAAAD,EAAA,IAAYrC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QACpB2pB,IAAQ3F,EAAUnZ,CAAQ,GAC1B22B,IACJxd,EAAU,SAAS,MAAMnZ,IAAU8e,IAAQ3F,EAAUnZ,IAAW,CAAC;AAEnE,QAAI22B,EAAS,OAAO,SAASxhC,EAAQ,SAAU,QAAQ;AACrD,YAAMmhC,IAAUK,EAAS,OAAO,CAAC,EAAE;AACnC,eAAS3qC,IAAI,GAAGA,IAAIgU,IAAW,GAAGhU,KAAK;AACrC,cAAMiX,IAAKkW,EAAUntB,CAAC;AACtB,iBAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,gBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,UAAIuV,EAAG,UAAU,KAAKA,EAAG,WAAYA,EAAG,WAAWyxB,IAAU,MAC3DzxB,EAAG,WAAW;AAAA,QAElB;AAAA,MACF;AAAA,IACF;AAEA,UAAM0xB,IAAUx5B,GAAA,GACVy5B,IAAa;AAAA,MACjB,QAAQG,EAAS;AAAA,MACjB,IAAIJ;AAAA,MACJ,QAAQ,CAAA;AAAA,IAAC;AAEX,aAASvqC,IAAI,GAAGA,IAAI2qC,EAAS,OAAO,QAAQ3qC,KAAK;AAC/C,YAAMyqC,IAAQE,EAAS,OAAO3qC,CAAC,GACzB0qC,IAAU35B,GAAA;AAChB,MAAAy5B,EAAM,OAAO,KAAK;AAAA,QAChB,IAAIE;AAAA,QACJ,SAAS;AAAA,QACT,SAASD,EAAM;AAAA,QACf,OAAO;AAAA,UACL;AAAA,YACE,OAAOrhC;AAAAA,YACP,MAAM;AAAA,YACN,SAAA2K;AAAA,YACA,MAAMw2B;AAAA,YACN,MAAMG;AAAA,UAAA;AAAA,QACR;AAAA,MACF,CACD;AAAA,IACH;AACA,IAAAvd,EAAU,OAAOnZ,IAAW,GAAG,GAAGw2B,CAAK,GAEvC,KAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,MACT,OAAAn7B;AAAA,MACA,SAAS2E,IAAW;AAAA,MACpB,SAAS;AAAA,MACT,MAAMw2B,EAAM,OAAO,CAAC,EAAE;AAAA,MACtB,MAAMA,EAAM;AAAA,MACZ,SAASrhC,EAAQ;AAAA,IAAA,CAClB,GACD,KAAK,MAAM,SAAS,GAAG,CAAC,GAExB,KAAK,KAAK,OAAO,EAAE,UAAU,GAAG;AAAA,EAClC;AAAA,EAEO,eAAeA,GAAmB;AACvC,QAAIA,EAAQ,SAASW,EAAY,MAAO;AACxC,UAAM,EAAE,oBAAA8gC,EAAA,IAAuB,KAAK,QAAQ,OACtChd,IAAWzkB,EAAQ,UACnB0hC,IAAgBjd,EAAS,OAAO,CAAC/M,GAAKC,MAAQD,IAAMC,EAAI,OAAO,CAAC,GAChEzV,IAAQ,KAAK,KAAK,sBAAA;AACxB,QAAIw/B,IAAgBx/B,GAAO;AAEzB,YAAMy/B,IAAqBld,EAAS;AAAA,QAClC,CAAAjY,MAAOA,EAAI,QAAQi1B;AAAA,MAAA,GAGfG,KAAeF,IAAgBx/B,KAASy/B,EAAmB;AACjE,eAAS9nC,IAAI,GAAGA,IAAI4qB,EAAS,QAAQ5qB,KAAK;AACxC,cAAMskB,IAAQsG,EAAS5qB,CAAC;AAExB,QAAIskB,EAAM,QAAQyjB,KAAeH,MAC/BtjB,EAAM,SAASyjB;AAAA,MAEnB;AAAA,IACF;AAAA,EACF;AAAA,EAEO,qBAAqB;AAC1B,UAAMr5B,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA4E,GAAS,SAAAF,EAAA,IAAYrC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QACpB6hC,IAAa/2B;AAEnB,aAASjU,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC,GAChB6U,IAAO9D,GAAA;AACb,MAAAkG,EAAG,OAAO,OAAO+zB,GAAY,GAAG;AAAA,QAC9B,IAAIn2B;AAAA,QACJ,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,YACE,OAAOzL;AAAAA,YACP,MAAM;AAAA,YACN,SAAA2K;AAAA,YACA,MAAMkD,EAAG;AAAA,YACT,MAAApC;AAAA,UAAA;AAAA,QACF;AAAA,MACF,CACD;AAAA,IACH;AAEA,UAAM,EAAE,oBAAA+1B,EAAA,IAAuB,KAAK,QAAQ;AAE5C,IADiBzhC,EAAQ,SAChB,OAAO6hC,GAAY,GAAG;AAAA,MAC7B,OAAOJ;AAAA,IAAA,CACR,GACD,KAAK,eAAezhC,CAAO,GAE3B,KAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,MACT,OAAAkG;AAAA,MACA,SAAS;AAAA,MACT,SAAS27B;AAAA,MACT,MAAM7d,EAAU,CAAC,EAAE,OAAO6d,CAAU,EAAE;AAAA,MACtC,MAAM7d,EAAU,CAAC,EAAE;AAAA,MACnB,SAAApZ;AAAA,IAAA,CACD,GACD,KAAK,MAAM,SAAS,GAAG,CAAC,GAExB,KAAK,KAAK,OAAO,EAAE,UAAU,GAAG,GAChC,KAAK,UAAU,OAAA;AAAA,EACjB;AAAA,EAEO,sBAAsB;AAC3B,UAAMrC,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA4E,GAAS,SAAAF,EAAA,IAAYrC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QACpB6hC,IAAa/2B,IAAW;AAE9B,aAASjU,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC,GAChB6U,IAAO9D,GAAA;AACb,MAAAkG,EAAG,OAAO,OAAO+zB,GAAY,GAAG;AAAA,QAC9B,IAAIn2B;AAAA,QACJ,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,YACE,OAAOzL;AAAAA,YACP,MAAM;AAAA,YACN,SAAA2K;AAAA,YACA,MAAMkD,EAAG;AAAA,YACT,MAAApC;AAAA,UAAA;AAAA,QACF;AAAA,MACF,CACD;AAAA,IACH;AAEA,UAAM,EAAE,oBAAA+1B,EAAA,IAAuB,KAAK,QAAQ;AAE5C,IADiBzhC,EAAQ,SAChB,OAAO6hC,GAAY,GAAG;AAAA,MAC7B,OAAOJ;AAAA,IAAA,CACR,GACD,KAAK,eAAezhC,CAAO,GAE3B,KAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,MACT,OAAAkG;AAAA,MACA,SAAS;AAAA,MACT,SAAS27B;AAAA,MACT,MAAM7d,EAAU,CAAC,EAAE,OAAO6d,CAAU,EAAE;AAAA,MACtC,MAAM7d,EAAU,CAAC,EAAE;AAAA,MACnB,SAAShkB,EAAQ;AAAA,IAAA,CAClB,GACD,KAAK,MAAM,SAAS,GAAG,CAAC,GAExB,KAAK,KAAK,OAAO,EAAE,UAAU,GAAG;AAAA,EAClC;AAAA,EAEO,iBAAiB;AACtB,UAAMuI,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA2E,GAAS,SAAAC,EAAA,IAAYvC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpCsH,IAASxN,EAAQ,QACjB2pB,IAAQnc,EAAO3C,CAAQ,GACvBi3B,IAAgBnY,EAAM,OAAO7e,CAAQ,EAAE;AAE7C,QAAI0C,EAAO,UAAU,KAAKxN,EAAQ,gBAAgB,GAAG;AACnD,WAAK,YAAA;AACL;AAAA,IACF;AAEA,aAAS9J,IAAI,GAAGA,IAAI4rC,GAAe5rC,KAAK;AAEtC,YAAM6X,IADKP,EAAOtX,CAAC,EACD;AAClB,eAASiE,IAAI,GAAGA,IAAI4T,EAAO,QAAQ5T,KAAK;AACtC,cAAMuV,IAAK3B,EAAO5T,CAAC;AACnB,QAAIuV,EAAG,WAAYA,EAAG,UAAUoyB,KAC9BpyB,EAAG;AAAA,MAEP;AAAA,IACF;AAEA,aAASvV,IAAI,GAAGA,IAAIwvB,EAAM,OAAO,QAAQxvB,KAAK;AAC5C,YAAMuV,IAAKia,EAAM,OAAOxvB,CAAC;AACzB,UAAIuV,EAAG,UAAU,GAAG;AAClB,cAAMhE,IAAO9D,GAAA,GACP2G,IAASf,EAAO3C,IAAW,CAAC;AAClC,QAAA0D,EAAO,OAAO,OAAOpU,GAAG,GAAG;AAAA,UACzB,IAAIuR;AAAA,UACJ,SAASgE,EAAG,UAAU;AAAA,UACtB,SAASA,EAAG;AAAA,UACZ,OAAO;AAAA,YACL;AAAA,cACE,OAAOzP;AAAAA,cACP,MAAM;AAAA,cACN,SAASD,EAAQ;AAAA,cACjB,MAAMuO,EAAO;AAAA,cACb,MAAA7C;AAAA,YAAA;AAAA,UACF;AAAA,QACF,CACD;AAAA,MACH;AAAA,IACF;AAEA,IAAA8B,EAAO,OAAO3C,GAAU,CAAC,GAEzB,KAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,IAAA,CACV,GACD,KAAK,MAAM,WAAA,GAEX,KAAK,KAAK,OAAO;AAAA,MACf,UAAUtC,EAAgB;AAAA,IAAA,CAC3B,GACD,KAAK,UAAU,QAAA;AAAA,EACjB;AAAA,EAEO,iBAAiB;A5ExavB,QAAA1J;A4EyaC,UAAM0J,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA4E,GAAS,SAAAD,EAAA,IAAYtC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QAEpB+hC,IADQ/d,EAAUnZ,CAAQ,EAAE,OAAOC,CAAQ,EACvB;AAG1B,QAAI,CADakZ,EAAU,KAAK,OAAMlW,EAAG,OAAO,SAAS,CAAC,GAC3C;AACb,WAAK,YAAA;AACL;AAAA,IACF;AAEA,aAASjX,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC;AACtB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,QACEuV,EAAG,YAAaqyB,KAChBryB,EAAG,WAAYA,EAAG,UAAUqyB,MAExBryB,EAAG,UAAU,IACfA,EAAG,YAEH5B,EAAG,OAAO,OAAO3T,GAAG,CAAC;AAAA,MAG3B;AAAA,IACF;AACA,KAAA0E,IAAAmB,EAAQ,aAAR,QAAAnB,EAAkB,OAAOkjC,GAAa,IAEtC,KAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,IAAA,CACV,GACD,KAAK,MAAM,SAAS,GAAG,CAAC,GAExB,KAAK,KAAK,OAAO;AAAA,MACf,UAAUx5B,EAAgB;AAAA,IAAA,CAC3B,GACD,KAAK,UAAU,QAAA;AAAA,EACjB;AAAA,EAEO,cAAc;AACnB,UAAMA,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM3I,IAAsB,KAAK,KAAK,uBAAA,GAChCoS,IAAepS,EAAoB2I,EAAgB,KAAM;AAE/D,QAAIy5B,IAAc,GACdC,IAAmB15B,EAAgB;AACvC,QAAIyJ,EAAa,UAAU;AAEzB,MAAAiwB,IAAmB15B,EAAgB,QAASyJ,EAAa;AAEzD,eAASpb,IAAIqrC,IAAmB,GAAGrrC,IAAIgJ,EAAoB,UACrDA,EAAoBhJ,CAAC,EAAE,aAAaob,EAAa,UADYpb;AAE/D,QAAAorC;AAAA,IAKN;AAEA,IAAApiC,EAAoB,OAAOqiC,GAAkBD,CAAW;AACxD,UAAMt7B,IAAWu7B,IAAmB;AACpC,SAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,MACT,OAAOv7B;AAAA,IAAA,CACR,GACD,KAAK,MAAM,SAASA,GAAUA,CAAQ,GACtC,KAAK,KAAK,OAAO,EAAE,UAAAA,EAAA,CAAU,GAC7B,KAAK,UAAU,QAAA;AAAA,EACjB;AAAA,EAEO,iBAAiB;A5ErfvB,QAAA7H;A4EsfC,UAAM0J,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM;AAAA,MACJ,eAAA6D;AAAA,MACA,cAAAR;AAAA,MACA,YAAAkY;AAAA,MACA,cAAAjY;AAAA,MACA,YAAAkY;AAAA,IAAA,IACE,KAAK,MAAM,SAAA;AACf,QAAI,CAAC3X,EAAe;AACpB,UAAM,EAAE,OAAAlG,MAAUqC,GAEZvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ;AAC1B,QAAIikB,IAAUD,EAAUnY,CAAa,EAAE,OAAOD,CAAa,GACvDsY,IAAQF,EAAUD,CAAW,EAAE,OAAOD,CAAW;AAErD,KAAIG,EAAQ,IAAKC,EAAM,KAAMD,EAAQ,IAAKC,EAAM,OAE9C,CAACD,GAASC,CAAK,IAAI,CAACA,GAAOD,CAAO;AAEpC,UAAME,IAAgBF,EAAQ,UACxBG,IAAcF,EAAM,YAAaA,EAAM,UAAU,IACjDlO,IAAgBiO,EAAQ,UACxBI,IAAcH,EAAM,YAAaA,EAAM,UAAU,IAEjD7X,IAAkB,CAAA;AACxB,aAASxV,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC,GAChBkX,IAAgB,CAAA;AACtB,eAAS5T,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,cAAMuV,IAAK5B,EAAG,OAAO3T,CAAC,GAChBmqB,IAAa5U,EAAG,UAChB6U,IAAa7U,EAAG;AACtB,QACE4U,KAAcH,KACdG,KAAcF,KACdG,KAAcvO,KACduO,KAAcF,KAEdtW,EAAO,KAAK2B,CAAE;AAAA,MAElB;AACA,MAAI3B,EAAO,UACT1B,EAAO,KAAK0B,CAAM;AAAA,IAEtB;AACA,QAAI,CAAC1B,EAAO,OAAQ;AAEpB,UAAM61B,IAAU71B,EAAOA,EAAO,SAAS,CAAC,GAClC3J,IAAU2J,EAAO,CAAC,EAAE,CAAC,GACrBb,IAAc02B,EAAQA,EAAQ,SAAS,CAAC,GACxCpsB,IAASpT,EAAQ,GACjBqT,IAASrT,EAAQ,GACjBmd,IAAOrU,EAAY,IAAKA,EAAY,OACpCuU,IAAOvU,EAAY,IAAKA,EAAY;AAC1C,aAAS3U,IAAI,GAAGA,IAAIwV,EAAO,QAAQxV,KAAK;AACtC,YAAMiX,IAAKzB,EAAOxV,CAAC;AACnB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,QAAQ3T,KAAK;AAClC,cAAMuV,IAAK5B,EAAG3T,CAAC,GACTgoC,IAAWzyB,EAAG,GACd0yB,IAAW1yB,EAAG,GACd2yB,IAASF,IAAWzyB,EAAG,OACvB4yB,IAASF,IAAW1yB,EAAG;AAE7B,YACEoG,IAASqsB,KACTpsB,IAASqsB,KACTviB,IAAOwiB,KACPtiB,IAAOuiB;AAEP;AAAA,MAEJ;AAAA,IACF;AAEA,UAAMC,IAA0B,CAAA,GAC1BC,IAAWn2B,EAAO,CAAC,EAAE,CAAC,GACtBo2B,IAAgB,CAAC36B,MACrB,CAAC,CAACA,KAAMA,EAAG,UAAU7H,KAAQ,CAAC6H,EAAG,MAC7B46B,IACJF,EAAS,MAAM,KAAK,CAAA16B,MAAM,CAAC26B,EAAc36B,CAAE,CAAC,KAC5C06B,EAAS,MAAM,CAAC,KACf;AAAA,MACC,OAAOviC;AAAAA,MACP,SAASD,EAAQ;AAAA,MACjB,OAAMnB,IAAAmlB,EAAUwe,EAAS,OAAQ,MAA3B,gBAAA3jC,EAA8B;AAAA,MACpC,MAAM2jC,EAAS;AAAA,IAAA;AAEnB,aAAS3rC,IAAI,GAAGA,IAAIwV,EAAO,QAAQxV,KAAK;AACtC,YAAMiX,IAAKzB,EAAOxV,CAAC;AACnB,eAASsD,IAAI,GAAGA,IAAI2T,EAAG,QAAQ3T,KAAK;AAClC,cAAMuV,IAAK5B,EAAG3T,CAAC;AAGf,YAAI,EAFetD,MAAM,KAAKsD,MAAM,IAEnB;AACf,UAAAooC,EAAc,KAAK7yB,EAAG,EAAG;AACzB,cAAIizB,IAAoB;AACxB,iBAAOF,EAAc/yB,EAAG,MAAMizB,CAAiB,CAAC;AAC9C,YAAAA;AAIF,UADEH,EAAS,MAAM,SAAS,KAAKA,EAAS,MAAM,MAAMC,CAAa,KACnCE,IAAoBjzB,EAAG,MAAM,WACzD8yB,EAAS,MAAM,SAAS;AAE1B,mBAASroC,IAAIwoC,GAAmBxoC,IAAIuV,EAAG,MAAM,QAAQvV,KAAK;AACxD,kBAAMo8B,IAAY7mB,EAAG,MAAMvV,CAAC;AAC5B,YAAIsoC,EAAclM,CAAS,MAC3BqM;AAAAA,cACEC;AAAAA,cACAH;AAAA,cACAnM;AAAA,YAAA,GAEFiM,EAAS,MAAM,KAAKjM,CAAS;AAAA,UAC/B;AAAA,QACF;AAEA,QAAI1/B,MAAM,KAAKsD,MAAM,MACnBqoC,EAAS,WAAW9yB,EAAG,UAGrB7Y,MAAM,KACJ2rC,EAAS,aAAa9yB,EAAG,aAC3B8yB,EAAS,WAAW9yB,EAAG;AAAA,MAG7B;AAAA,IACF;AACA,QAAI,CAAC8yB,EAAS,MAAM,UAAU,CAACC,EAAcD,EAAS,MAAM,CAAC,CAAC,GAAG;AAC/D,YAAM9C,IAAwB,EAAE,OAAOz/B,EAAA;AACvC2iC,MAAAA,GAAwBC,IAAoBH,GAAsBhD,CAAW,GAC7E8C,EAAS,MAAM,QAAQ9C,CAAW;AAAA,IACpC;AAEE,aAAO,IAAI8C,EAAS,MAAM,UAAQ;AAChC,YAAIC,EAAcD,EAAS,MAAM,CAAC,CAAC,GAAG;AACpC,UAAAA,EAAS,MAAM,OAAO,GAAG,CAAC;AAC1B;AAAA,QACF;AACA;AAAA,MACF;AAGF,aAAS3rC,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC;AACtB,UAAIsD,IAAI;AACR,aAAOA,IAAI2T,EAAG,OAAO,UAAQ;AAC3B,cAAM4B,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,QAAIooC,EAAc,SAAS7yB,EAAG,EAAG,MAC/B5B,EAAG,OAAO,OAAO3T,GAAG,CAAC,GACrBA,MAEFA;AAAA,MACF;AAAA,IACF;AAEA,SAAK,SAAS,mBAAmB;AAAA,MAC/B,GAAGoO;AAAA,MACH,SAASi6B,EAAS;AAAA,MAClB,SAASA,EAAS;AAAA,IAAA,CACnB;AACD,UAAM97B,IAAW87B,EAAS,MAAM,SAAS;AACzC,SAAK,MAAM,SAAS97B,GAAUA,CAAQ,GAEtC,KAAK,KAAK,OAAA,GACV,KAAK,UAAU,OAAA;AAAA,EACjB;AAAA,EAEO,uBAAuB;AAC5B,UAAM6B,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,GAAO,SAAA4E,GAAS,SAAAD,EAAA,IAAYtC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QACpB2pB,IAAQ3F,EAAUnZ,CAAQ,GAC1By2B,IAAQ3X,EAAM,OAAO7e,CAAQ;AACnC,QAAIw2B,EAAM,YAAY,KAAKA,EAAM,YAAY,EAAG;AAChD,UAAM/X,IAAU+X,EAAM;AAEtB,QAAIA,EAAM,UAAU,GAAG;AACrB,eAASlrC,IAAI,GAAGA,IAAIkrC,EAAM,SAASlrC,KAAK;AACtC,cAAMsV,IAAO9D,GAAA;AACb,QAAA+hB,EAAM,OAAO,OAAO7e,IAAW1U,GAAG,GAAG;AAAA,UACnC,IAAIsV;AAAA,UACJ,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,YACL;AAAA,cACE,OAAOzL;AAAAA,cACP,MAAM;AAAA,cACN,SAASD,EAAQ;AAAA,cACjB,MAAM2pB,EAAM;AAAA,cACZ,MAAAje;AAAA,YAAA;AAAA,UACF;AAAA,QACF,CACD;AAAA,MACH;AACA,MAAA41B,EAAM,UAAU;AAAA,IAClB;AAEA,QAAIA,EAAM,UAAU,GAAG;AACrB,eAASprC,IAAI,GAAGA,IAAIorC,EAAM,SAASprC,KAAK;AACtC,cAAM4X,IAAKkW,EAAUnZ,IAAW3U,CAAC;AACjC,iBAASE,IAAI,GAAGA,IAAImzB,GAASnzB,KAAK;AAChC,gBAAMsV,IAAO9D,GAAA;AACb,UAAAkG,EAAG,OAAO,OAAOwzB,EAAM,UAAW,GAAG;AAAA,YACnC,IAAI51B;AAAA,YACJ,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,cACL;AAAA,gBACE,OAAOzL;AAAAA,gBACP,MAAM;AAAA,gBACN,SAASD,EAAQ;AAAA,gBACjB,MAAM8N,EAAG;AAAA,gBACT,MAAApC;AAAA,cAAA;AAAA,YACF;AAAA,UACF,CACD;AAAA,QACH;AAAA,MACF;AACA,MAAA41B,EAAM,UAAU;AAAA,IAClB;AAEA,UAAM56B,IAAW46B,EAAM,MAAM,SAAS;AACtC,SAAK,MAAM,SAAS56B,GAAUA,CAAQ,GACtC,KAAK,KAAK,OAAA,GACV,KAAK,UAAU,OAAA;AAAA,EACjB;AAAA,EAEO,yBAAyB;AAC9B,UAAM6B,IAAkB,KAAK,SAAS,mBAAA;AAItC,QAHI,CAACA,EAAgB,WAEP,KAAK,MAAM,SAAA,EACf,cAAe;AACzB,UAAM,EAAE,OAAArC,GAAO,SAAA4E,GAAS,SAAAD,EAAA,IAAYtC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QACpB2pB,IAAQ3F,EAAUnZ,CAAQ,GAC1By2B,IAAQ3X,EAAM,OAAO7e,CAAQ;AAEnC,IAAA9K,EAAQ,SAAU,OAAO8K,IAAW,GAAG,GAAG;AAAA,MACxC,OAAO,KAAK,QAAQ,MAAM;AAAA,IAAA,CAC3B;AAED,aAASjU,IAAI,GAAGA,IAAImtB,EAAU,QAAQntB,KAAK;AACzC,YAAMiX,IAAKkW,EAAUntB,CAAC;AACtB,UAAIsD,IAAI;AACR,aAAOA,IAAI2T,EAAG,OAAO,UAAQ;AAC3B,cAAM4B,IAAK5B,EAAG,OAAO3T,CAAC;AAEtB,YAAIuV,EAAG,aAAa4xB,EAAM;AACxB,UACE5xB,EAAG,YAAa4xB,EAAM,YACtB5xB,EAAG,WAAYA,EAAG,UAAU4xB,EAAM,YAElC5xB,EAAG;AAAA,iBAIDA,EAAG,OAAO4xB,EAAM,IAAI;AACtB,gBAAM51B,IAAO9D,GAAA;AACb,UAAA+hB,EAAM,OAAO,OAAOxvB,IAAImnC,EAAM,SAAS,GAAG;AAAA,YACxC,IAAI51B;AAAA,YACJ,SAAS41B,EAAM;AAAA,YACf,SAAS;AAAA,YACT,OAAO;AAAA,cACL;AAAA,gBACE,OAAOrhC;AAAAA,gBACP,MAAM;AAAA,gBACN,SAASD,EAAQ;AAAA,gBACjB,MAAM8N,EAAG;AAAA,gBACT,MAAApC;AAAA,cAAA;AAAA,YACF;AAAA,UACF,CACD,GACDvR;AAAA,QACF;AAEF,QAAAA;AAAA,MACF;AAAA,IACF;AAEA,SAAK,KAAK,OAAA,GACV,KAAK,UAAU,OAAA;AAAA,EACjB;AAAA,EAEO,2BAA2B;AAChC,UAAMoO,IAAkB,KAAK,SAAS,mBAAA;AAItC,QAHI,CAACA,EAAgB,WAEP,KAAK,MAAM,SAAA,EACf,cAAe;AACzB,UAAM,EAAE,OAAArC,GAAO,SAAA4E,GAAS,SAAAD,EAAA,IAAYtC,GAE9BvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC8d,IAAYhkB,EAAQ,QAEpBshC,IADQtd,EAAUnZ,CAAQ,EACZ,OAAOC,CAAQ;AAEnC,QAAIg4B,IAAgB,IAEhBjsC,IAAI;AACR,WAAOA,IAAImtB,EAAU,UAAQ;AAC3B,UAAIntB,MAAMisC,GAAe;AACvB,QAAAjsC;AACA;AAAA,MACF;AACA,YAAMiX,IAAKkW,EAAUntB,CAAC;AACtB,UAAIsD,IAAI;AACR,aAAOA,IAAI2T,EAAG,OAAO,UAAQ;AAC3B,cAAM4B,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,YAAIuV,EAAG,OAAO4xB,EAAM,IAAI;AACtB,gBAAM71B,IAAO7D,GAAA,GACP8D,IAAO9D,GAAA;AACb,UAAAoc,EAAU,OAAOntB,IAAIyqC,EAAM,SAAS,GAAG;AAAA,YACrC,IAAI71B;AAAA,YACJ,QAAQ,KAAK,QAAQ,MAAM;AAAA,YAC3B,QAAQ;AAAA,cACN;AAAA,gBACE,IAAIC;AAAA,gBACJ,SAAS;AAAA,gBACT,SAAS41B,EAAM;AAAA,gBACf,OAAO;AAAA,kBACL;AAAA,oBACE,OAAOrhC;AAAAA,oBACP,MAAM;AAAA,oBACN,SAASD,EAAQ;AAAA,oBACjB,MAAAyL;AAAA,oBACA,MAAAC;AAAA,kBAAA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,CACD,GACDo3B,IAAgBjsC,IAAIyqC,EAAM;AAAA,QAC5B,OACE5xB,EAAG,YAAa4xB,EAAM,YACtB5xB,EAAG,WAAY4xB,EAAM,WAAYA,EAAM,WACvC5xB,EAAG,WAAYA,EAAG,WAAW4xB,EAAM,WAAYA,EAAM,WAIrD5xB,EAAG;AAEL,QAAAvV;AAAA,MACF;AACA,MAAAtD;AAAA,IACF;AAEA,SAAK,KAAK,OAAA,GACV,KAAK,UAAU,OAAA;AAAA,EACjB;AAAA,EAEO,qBAAqBgL,GAAwB;AAClD,UAAMwK,IAAS,KAAK,cAAc,eAAA;AAClC,QAAI,CAACA,EAAQ;AACb,aAASnW,IAAI,GAAGA,IAAImW,EAAO,QAAQnW,KAAK;AACtC,YAAMqW,IAAMF,EAAOnW,CAAC;AACpB,eAASE,IAAI,GAAGA,IAAImW,EAAI,QAAQnW,KAAK;AACnC,cAAMsZ,IAAKnD,EAAInW,CAAC;AAChB,QACE,CAACsZ,KACDA,EAAG,kBAAkB7N,KACpB,CAAC6N,EAAG,iBAAiB7N,MAAY2V,GAAc,QAKlD9H,EAAG,gBAAgB7N;AAAA,MACrB;AAAA,IACF;AACA,UAAM,EAAE,UAAAoD,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEO,gBAAgBpD,GAAsB;AAC3C,UAAM0G,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,MAAUqC,GAEZvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM;AAC1C,QACG,CAAClG,EAAQ,cAAc6B,MAAYwjB,GAAY,OAChDrlB,EAAQ,eAAe6B;AAEvB;AAGF,QADA7B,EAAQ,aAAa6B,GACjBA,MAAYwjB,GAAY,OAAO;AACjC,YAAM7X,IAASxN,EAAQ;AACvB,UAAIwN;AACF,iBAAS3W,IAAI,GAAGA,IAAI2W,EAAO,QAAQ3W,KAAK;AACtC,gBAAMiX,IAAKN,EAAO3W,CAAC;AACnB,mBAASsD,IAAI,GAAGA,IAAI2T,EAAG,OAAO,QAAQ3T,KAAK;AACzC,kBAAMuV,IAAK5B,EAAG,OAAO3T,CAAC;AACtB,YAAIuV,EAAG,eAAa,OAAOA,EAAG,aAC1BA,EAAG,eAAa,OAAOA,EAAG;AAAA,UAChC;AAAA,QACF;AAAA,IAEJ;AACA,UAAM,EAAE,UAAAzK,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEO,iBAAiBpD,GAAiB;AACvC,UAAM0G,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,MAAUqC,GAEZvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM;AAC1C,QACG,CAAClG,EAAQ,eACR6B,MAAY,KAAK,QAAQ,MAAM,sBACjC7B,EAAQ,gBAAgB6B;AAExB;AAEF,IAAA7B,EAAQ,cAAc6B;AACtB,UAAM,EAAE,UAAAoD,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,MACV,WAAW;AAAA,IAAA,CACZ;AAAA,EACH;AAAA,EAEO,iBAAiBpD,GAAiB;AACvC,UAAM0G,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,MAAUqC,GAEZvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC68B,IAAY,OAAOlhC,CAAO;AAChC,QAAI,CAAC,OAAO,SAASkhC,CAAS,EAAG;AACjC,QAAIA,KAAa,GAAG;AAClB,UAAI/iC,EAAQ,gBAAgB,OAAW;AACvC,aAAOA,EAAQ;AAAA,IACjB,OAAO;AACL,UAAIA,EAAQ,gBAAgB+iC,EAAW;AACvC,MAAA/iC,EAAQ,cAAc+iC,GAEpB/iC,EAAQ,wBAAwB,UAChCA,EAAQ,uBAAuB,KAE/B,OAAOA,EAAQ,qBAGfA,EAAQ,wBAAwB,UAChCA,EAAQ,wBAAwB+iC,KAEhC,OAAO/iC,EAAQ;AAAA,IAEnB;AACA,UAAM,EAAE,UAAAiF,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,MACV,WAAW;AAAA,IAAA,CACZ;AAAA,EACH;AAAA,EAEO,yBAAyBpD,GAAiB;AAC/C,UAAM0G,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,MAAUqC,GAEZvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpC68B,IAAY,OAAOlhC,CAAO;AAChC,QAAI,CAAC,OAAO,SAASkhC,CAAS,EAAG;AACjC,UAAM7d,IAAYllB,EAAQ,eAAe;AACzC,QAAI+iC,KAAa,KAAKA,MAAc7d,GAAW;AAC7C,UAAIllB,EAAQ,wBAAwB,OAAW;AAC/C,aAAOA,EAAQ;AAAA,IACjB,OAAO;AACL,UAAIA,EAAQ,wBAAwB+iC,EAAW;AAC/C,MAAA/iC,EAAQ,sBAAsB+iC;AAAA,IAChC;AACA,UAAM,EAAE,UAAA99B,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,MACV,WAAW;AAAA,IAAA,CACZ;AAAA,EACH;AAAA,EAEO,kBAAkBpD,GAAmB;AAC1C,UAAM0G,IAAkB,KAAK,SAAS,mBAAA;AACtC,QAAI,CAACA,EAAgB,QAAS;AAC9B,UAAM,EAAE,OAAArC,MAAUqC,GAEZvI,IADsB,KAAK,KAAK,uBAAA,EACFkG,CAAM,GACpCmG,IAAS,KAAK,cAAc,eAAA;AAClC,QAAI,CAACA,EAAQ;AACb,UAAM0B,IAAS1B,EAAO,KAAA,GAEhB22B,IAAkBj1B,EAAO;AAAA,MAC7B,CAAA2B,MAAA;A5E7+BH,YAAA7Q;A4E6+BS,kBAACA,IAAA6Q,EAAG,gBAAH,QAAA7Q,EAAgB,SAASgD;AAAA;AAAA,IAAO;AAEzC,IAAAkM,EAAO,QAAQ,CAAA2B,MAAM;AACnB,MAAKA,EAAG,gBACNA,EAAG,cAAc,CAAA;AAEnB,YAAMuzB,IAAkBvzB,EAAG,YAAY,UAAU,CAAAtO,MAAQA,MAASS,CAAO;AACzE,MAAImhC,KACG,CAACC,KACJvzB,EAAG,YAAY,KAAK7N,CAAO,GAExB6N,EAAG,gBACNA,EAAG,cAAc,CAAA,IAEnBA,EAAG,YAAY7N,CAAO,IAAI;AAAA,QACxB,OAAO7B,EAAQ,eAAe;AAAA,QAC9B,OAAOA,EAAQ,eAAe,KAAK,QAAQ,MAAM;AAAA,QACjD,OAAOA,EAAQ,eAAeqlB,GAAY,OAAO,WAAW;AAAA,MAAA,MAG1D,CAAC4d,KACHvzB,EAAG,YAAY,OAAOuzB,GAAiB,CAAC,GAEtCvzB,EAAG,eAAeA,EAAG,YAAY7N,CAAO,MAC1C,OAAO6N,EAAG,YAAY7N,CAAO,GACxB,OAAO,KAAK6N,EAAG,WAAW,EAAE,UAC/B,OAAOA,EAAG,eAKXA,EAAG,YAAY,UAClB,OAAOA,EAAG;AAAA,IAEd,CAAC;AACD,UAAM,EAAE,UAAAzK,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEO,iBAAiBpD,GAAkB;AACxC,UAAMwK,IAAS,KAAK,cAAc,eAAA;AAClC,QAAI,CAACA,EAAQ;AACb,UAAM0B,IAAS1B,EAAO,KAAA,GAEhB62B,IAAmBn1B,EAAO;AAAA,MAC9B,CAAA2B,MAAA;A5E5hCH,YAAA7Q;A4E4hCS,kBAACA,IAAA6Q,EAAG,eAAH,QAAA7Q,EAAe,SAASgD;AAAA;AAAA,IAAO;AAExC,IAAAkM,EAAO,QAAQ,CAAA2B,MAAM;AACnB,MAAKA,EAAG,eACNA,EAAG,aAAa,CAAA;AAElB,YAAMyzB,IAAiBzzB,EAAG,WAAW,UAAU,CAAAtO,MAAQA,MAASS,CAAO;AACvE,MAAIqhC,IACG,CAACC,KACJzzB,EAAG,WAAW,KAAK7N,CAAO,IAGxB,CAACshC,KACHzzB,EAAG,WAAW,OAAOyzB,GAAgB,CAAC,GAIrCzzB,EAAG,WAAW,UACjB,OAAOA,EAAG;AAAA,IAEd,CAAC;AACD,UAAM,EAAE,UAAAzK,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEO,uBAAuBpD,GAAiB;AAC7C,UAAMwK,IAAS,KAAK,cAAc,eAAA;AAClC,QAAI,CAACA,EAAQ;AACb,aAASnW,IAAI,GAAGA,IAAImW,EAAO,QAAQnW,KAAK;AACtC,YAAMqW,IAAMF,EAAOnW,CAAC;AACpB,eAASE,IAAI,GAAGA,IAAImW,EAAI,QAAQnW,KAAK;AACnC,cAAMoW,IAAMD,EAAInW,CAAC;AACjB,QAAAoW,EAAI,kBAAkB3K;AAAA,MACxB;AAAA,IACF;AACA,UAAM,EAAE,UAAAoD,EAAA,IAAa,KAAK,MAAM,SAAA;AAChC,SAAK,MAAM,SAASA,GAAUA,CAAQ,GACtC,KAAK,KAAK,OAAO;AAAA,MACf,WAAW;AAAA,IAAA,CACZ;AAAA,EACH;AAAA,EAEO,iBAAiB;AACtB,UAAMsD,IAAkB,KAAK,SAAS,mBAAA,GAChC,EAAE,OAAArC,GAAO,SAAA0E,GAAS,SAAArE,EAAA,IAAYgC;AACpC,QAAI,CAAChC,KAAW,CAACqE,EAAS;AAC1B,UAAM,EAAE,YAAAjL,GAAY,UAAAsF,EAAA,IAAa,KAAK,MAAM,SAAA,GAEtCuI,IADsB,KAAK,KAAK,uBAAA,EACHtH,CAAM,EAAE,QAErC6d,IAAavW,EAAO,SAAS,GAC7BsW,IAAatW,EAAOuW,CAAU,EAAE,OAAO,SAAS;AACtD,SAAK,MAAM,aAAa;AAAA,MACtB,YAAApkB;AAAA,MACA,UAAAsF;AAAA,MACA,SAAA2F;AAAA,MACA,cAAc;AAAA,MACd,YAAAkZ;AAAA,MACA,cAAc;AAAA,MACd,YAAAC;AAAA,IAAA,CACD,GACD,KAAK,KAAK,OAAO;AAAA,MACf,WAAW;AAAA,MACX,iBAAiB;AAAA,IAAA,CAClB;AAAA,EACH;AACF;ACxkCO,MAAMqf,GAAK;AAAA,EAOhB,YAAY3jC,GAAY;AANhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,yCAAkB,IAAA;AAGxB,SAAK,OAAO/B,GACZ,KAAK,OAAOA,EAAK,QAAA,GACjB,KAAK,QAAQA,EAAK,SAAA,GAClB,KAAK,WAAWA,EAAK,YAAA;AAAA,EACvB;AAAA,EAEO,cAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,kBAAiC;AACtC,QAAI,CAAC,KAAK,YAAY,KAAM,QAAO;AACnC,UAAM,EAAE,YAAAE,EAAA,IAAe,KAAK,MAAM,SAAA,GAE5BK,IADc,KAAK,KAAK,eAAA,EACFL,CAAU;AACtC,YAAOK,KAAA,gBAAAA,EAAS,WAAU;AAAA,EAC5B;AAAA,EAEO,oBAAsC;AAC3C,UAAMqjC,IAAe,KAAK,gBAAA;AAC1B,WAAKA,KACE,KAAK,YAAY,IAAIA,CAAY,KAAK;AAAA,EAC/C;AAAA,EAEO,aAAa;AAClB,UAAMC,IAAiB,KAAK,kBAAA;AAC5B,QAAI,EAACA,KAAA,QAAAA,EAAgB,MAAM,QAAO;AAClC,YAAQA,EAAe,KAAK,MAAA;AAAA,MAC1B,KAAKC,GAAS;AACZ,eAAO;AAAA,MACT,KAAKA,GAAS;AACZ,eAAO;AAAA,MACT,KAAKA,GAAS;AACZ,eAAO,CAAC,KAAK,KAAK,WAAA,EAAa,wBAAA;AAAA,MACjC;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA,EAEO,WAAW1hC,GAA2C;AAE3D,IAAI,KAAK,KAAK,QAAA,MAAc2O,GAAW,QACrC,KAAK,KAAK,QAAQA,GAAW,IAAI,GAGnC,KAAK,KAAK,YAAA,EAAc,mBAAmB;AAAA,MACzC,SAAS;AAAA,IAAA,CACV;AAED,UAAM,EAAE,IAAAkR,GAAI,OAAAjhB,GAAO,MAAA+iC,GAAM,UAAAl+B,MAAazD;AACtC,QAAIyD,MAAasJ,GAAiB;AAChC,WAAK,MAAM,SAAS,GAAG,CAAC;AAAA,SACnB;AAEL,YAAM60B,IADc,KAAK,KAAK,2BAAA,EACA,SAAS;AACvC,WAAK,MAAM,SAASA,GAAWA,CAAS;AAAA,IAC1C;AACA,UAAM3O,IAASpT,KAAM9Z,GAAA;AACrB,gBAAK,KAAK,kBAAkB;AAAA,MAC1B;AAAA,QACE,MAAMjH,EAAY;AAAA,QAClB,OAAO;AAAA,QACP,QAAAm0B;AAAA,QACA,WAAWr0B;AAAA,QACX,MAAM8E,GAAUi+B,CAAI;AAAA,MAAA;AAAA,IACtB,CACD,GACM1O;AAAA,EACT;AAAA,EAEO,OAAOla,GAA+B/X,GAAgB;AAC3D,QAAI,CAAC,KAAK,YAAY,KAAM;AAC5B,IAAA+X,EAAI,KAAA;AACJ,UAAM7K,IAAU,KAAK,KAAK,WAAA,GACpB7N,IAAQ,KAAK,KAAK,cAAA;AACxB,eAAWwhC,KAAgB,KAAK,aAAa;AAC3C,YAAM,EAAE,MAAAF,GAAM,cAAA/8B,MAAiBi9B,EAAa,CAAC;AAC7C,UACEF,KAAA,QAAAA,EAAM,QACL,EAACA,KAAA,QAAAA,EAAM,oBAAmB,EAACA,KAAA,QAAAA,EAAM,gBAAe,EAACA,KAAA,QAAAA,EAAM;AAExD;AAEF,YAAMG,IAAmBl9B,EAAa,OAAO,CAAA,MAAK,EAAE,WAAW5D,CAAM;AACrE,UAAI,CAAC8gC,EAAiB,OAAQ;AAC9B,MAAA/oB,EAAI,UAAU,KAAK,GAAG;AACtB,YAAMgpB,IAAgBD,EAAiB,CAAC,GAClCvzB,IAAeuzB,EAAiBA,EAAiB,SAAS,CAAC,GAE3DpoC,IAAIwU,EAAQ,CAAC,GACb/V,IAAI,KAAK,KAAK4pC,EAAc,WAAW,QAAQ,CAAC,CAAC,GACjDrhC,IAAS,KAAK,KAAK6N,EAAa,WAAW,YAAY,CAAC,IAAIpW,CAAC;AAEnE,MAAIwpC,EAAK,oBACP5oB,EAAI,YAAY4oB,EAAK,iBACrB5oB,EAAI,SAASrf,GAAGvB,GAAGkI,GAAOK,CAAM,IAG9BihC,EAAK,gBACP5oB,EAAI,cAAc4oB,EAAK,aACvB5oB,EAAI,WAAWrf,GAAGvB,GAAGkI,GAAOK,CAAM,IAGhCihC,EAAK,eAAe/8B,EAAa,UAAU,KACzB,IAAI84B,GAAY,KAAK,IAAI,EACjC,OAAO3kB,GAAK;AAAA,QACtB,aAAa;AAAA,UACX,GAAGipB;AAAAA,UACH,GAAGL,EAAK;AAAA,QAAA;AAAA,QAEV,QAAQI,EAAc,WAAW,QAAQ,CAAC;AAAA,MAAA,CAC3C,GAEHhpB,EAAI,UAAU,MAAM,IAAI;AAAA,IAC1B;AACA,IAAAA,EAAI,QAAA;AAAA,EACN;AAAA,EAEO,UAAU;AACf,SAAK,YAAY,MAAA;AACjB,UAAMhc,IAAc,KAAK,KAAK,2BAAA,GACxB6H,IAAe,KAAK,SAAS,4BAAA;AACnC,aAASzQ,IAAI,GAAGA,IAAI4I,EAAY,QAAQ5I,KAAK;AAC3C,YAAMgK,IAAUpB,EAAY5I,CAAC,GACvB8+B,IAAS90B,EAAQ;AACvB,UAAI80B,GAAQ;AACV,cAAMgP,IAAW,KAAK,YAAY,IAAIhP,CAAM;AAC5C,QAAKgP,KAQHA,EAAS,YAAY,KAAK9jC,CAAO,GACjC8jC,EAAS,aAAa,KAAKr9B,EAAazQ,CAAC,CAAC,KAR1C,KAAK,YAAY,IAAI8+B,GAAQ;AAAA,UAC3B,IAAIA;AAAA,UACJ,MAAM90B,EAAQ;AAAA,UACd,aAAa,CAACA,CAAO;AAAA,UACrB,cAAc,CAACyG,EAAazQ,CAAC,CAAC;AAAA,QAAA,CAC/B;AAAA,MAKL;AAAA,IACF;AAAA,EACF;AAAA,EAEO,aACLmJ,IAA+B,IACH;AAC5B,UAAM21B,IAAS31B,EAAQ,MAAM,KAAK,gBAAA;AAClC,QAAI,CAAC21B,EAAQ,QAAO;AACpB,UAAMgP,IAAW,KAAK,YAAY,IAAIhP,CAAM;AAC5C,WAAKgP,IACE;AAAA,MACL,MAAMA,EAAS;AAAA,MACf,IAAIA,EAAS;AAAA,MACb,aAAaA,EAAS,aAAa,CAAC,EAAE;AAAA,MACtC,WAAWA,EAAS,aAAaA,EAAS,aAAa,SAAS,CAAC,EAAE;AAAA,MACnE,OAAOxkC,GAAewkC,EAAS,WAAW;AAAA,IAAA,IANtB;AAAA,EAQxB;AAAA,EAEO,mBACLhP,GACA31B,GAC6D;A7EjM9D,QAAAN,GAAAgH,GAAAuC;A6EkMC,UAAMxJ,IAAc,KAAK,KAAK,2BAAA;AAC9B,aAAS5I,IAAI,GAAGA,IAAI4I,EAAY,QAAQ5I,KAAK;AAC3C,YAAMgK,IAAUpB,EAAY5I,CAAC;AAC7B,WAAImJ,KAAA,gBAAAA,EAAS,cAAayP,GAAiB;AAEzC,cAAI/P,IAAAD,EAAY5I,IAAI,CAAC,MAAjB,gBAAA6I,EAAoB,YAAWi2B,EAAQ;AAAA,kBAClC31B,KAAA,gBAAAA,EAAS,cAAayP,GAAiB;AAEhD,YACE,EAAE5O,EAAQ,WAAW80B,OAAUjvB,IAAAjH,EAAY5I,IAAI,CAAC,MAAjB,gBAAA6P,EAAoB,YAAWivB;AAE9D;AAAA,kBAEO31B,KAAA,gBAAAA,EAAS,cAAayP,GAAiB;AAEhD,YACE,EAAE5O,EAAQ,WAAW80B,OAAU1sB,IAAAxJ,EAAY5I,IAAI,CAAC,MAAjB,gBAAAoS,EAAoB,YAAW0sB;AAE9D;AAAA,iBAIE90B,EAAQ,WAAW80B,EAAQ;AAEjC,YAAMruB,IAAe,KAAK,SAAS,4BAAA;AACnC,aAAO;AAAA,QACL,OAAO;AAAA,UACL,YAAYzQ;AAAA,UACZ,UAAUA;AAAA,QAAA;AAAA,QAEZ,iBAAiByQ,EAAazQ,CAAC;AAAA,MAAA;AAAA,IAEnC;AACA,WAAO;AAAA,EACT;AAAA,EAEO,kBAAkB6L,GAAmC;AAC1D,UAAMizB,IAASjzB,EAAQ,MAAM,KAAK,gBAAA;AAClC,QAAI,CAACizB,EAAQ;AACb,UAAMgP,IAAW,KAAK,YAAY,IAAIhP,CAAM;AAC5C,QAAI,CAACgP,EAAU;AACf,IAAKA,EAAS,SACZA,EAAS,OAAO,CAAA;AAGlB,QAAI96B,IAAY;AAChB,UAAM+6B,IAAmC,CAAC,OAAO,MAAM;AAEvD,WAAO,QAAQliC,EAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC3E,GAAKuD,CAAK,MAAM;AAC3D,UAAIqxB,GAAWrxB,CAAK,EAAG;AACvB,YAAMujC,IAAU9mC;AAChB,MAAA4mC,EAAS,KAAKE,CAAO,IAAIvjC,GACrBsjC,EAAa,SAASC,CAAO,MAC/Bh7B,IAAY;AAAA,IAEhB,CAAC,GACD,KAAK,KAAK,OAAO;AAAA,MACf,WAAAA;AAAA,MACA,aAAa;AAAA,IAAA,CACd;AAAA,EACH;AACF;AC1PO,MAAMi7B,GAAM;AAAA,EAOjB,YAAYxkC,GAAY;AANhB,IAAA+B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAO/B,GACZ,KAAK,UAAUA,EAAK,WAAA,GACpB,KAAK,iCAAiB,IAAA,GACtB,KAAK,YAAY,MACjB,KAAK,mCAAmB,IAAA;AAAA,EAC1B;AAAA,EAEO,aAAaoC,GAAwB;AAC1C,SAAK,YAAYA;AAAA,EACnB;AAAA,EAEO,gBAAgBA,GAAuB;AAC5C,SAAK,aAAa,MAAA,GAClBA,EAAQ,QAAQ,CAAAqiC,MAAa;AAC3B,WAAK,aAAa,IAAIA,EAAU,QAAQA,EAAU,KAAK;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEQ,WACNtpB,GACArf,GACAvB,GACAkI,GACAK,GACA9B,GACA;AACA,QAAI,KAAK,WAAW,IAAIA,CAAK,GAAG;AAC9B,YAAM4a,IAAM,KAAK,WAAW,IAAI5a,CAAK;AACrC,MAAAma,EAAI,UAAUS,GAAK9f,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,IACxC,OAAO;AACL,YAAM8Y,IAAM,IAAI,MAAA;AAChB,MAAAA,EAAI,aAAa,eAAe,WAAW,GAC3CA,EAAI,MAAM5a,GACV4a,EAAI,SAAS,MAAM;AACjB,aAAK,WAAW,IAAI5a,GAAO4a,CAAG,GAC9BT,EAAI,UAAUS,GAAK9f,GAAGvB,GAAGkI,GAAOK,CAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEO,OAAOqY,GAA+B/X,GAAgB;AAE3D,QAAIA,MAAW,KAAK,KAAK,WAAW;AAClC,YAAM,EAAE,OAAAd,GAAO,OAAAoiC,EAAA,IAAU,KAAK,SACxB,EAAE,MAAApgC,GAAM,KAAAE,GAAK,OAAA/B,GAAO,QAAAK,GAAQ,OAAA9B,EAAA,IAAU,KAAK,WAE3CwsB,IACJ,KAAK,KAAK,WAAA,EAAa,CAAC,IAAI,KAAK,KAAK,UAAA,EAAY,eAAA,GAC9C1xB,KAAKwI,KAAQogC,EAAM,QAAQpiC,GAC3B/H,KAAKiK,KAAOkgC,EAAM,OAAOpiC,IAAQkrB;AACvC,WAAK,WAAWrS,GAAKrf,GAAGvB,GAAGkI,IAAQH,GAAOQ,IAASR,GAAOtB,CAAK;AAAA,IACjE;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,YAAMqjC,IAAW,KAAK,KAAK,QAAA,EAAU,YAAA;AACrC,UAAIA,EAAS,MAAM;AACjB,cAAM,EAAE,OAAA/hC,GAAO,OAAAoiC,EAAA,IAAU,KAAK;AAC9B,mBAAWC,KAAYN,GAAU;AAE/B,gBAAM,EAAE,cAAAr9B,EAAA,IAAiB29B,EAAS,CAAC,GAC7BR,IAAgBn9B,EAAa,CAAC;AACpC,cAAIm9B,EAAc,WAAW/gC,EAAQ;AAErC,gBAAMwhC,IAAY,KAAK,aAAa,IAAID,EAAS,CAAC,CAAC;AACnD,cAAI,CAACC,EAAW;AAChB,gBAAM,EAAE,MAAAtgC,GAAM,KAAAE,GAAK,OAAA/B,GAAO,QAAAK,GAAQ,OAAA9B,MAAU4jC,GACtC9oC,KAAKwI,KAAQogC,EAAM,QAAQpiC,GAC3B/H,KACHiK,KAAOkgC,EAAM,OAAOpiC,IAAQ6hC,EAAc,WAAW,QAAQ,CAAC;AACjE,eAAK,WAAWhpB,GAAKrf,GAAGvB,GAAGkI,IAAQH,GAAOQ,IAASR,GAAOtB,CAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;ACkCO,MAAM6jC,GAAK;AAAA,EAiFhB,YACEC,GACAplC,GACAzB,GACA88B,GACAnzB,GACAm9B,GACA;AAvFM,IAAAhjC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAC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"}
|