{"version":3,"file":"whatwg-parser-B3k2JBJg.mjs","names":[],"sources":["../src/main/parser/entities.ts","../src/main/parser/tokenizer.ts","../src/main/parser/tree-builder.ts","../src/main/whatwg-parser/index.ts"],"sourcesContent":["// <generated> from scripts/entities-whatwg.json — DO NOT EDIT BY HAND.\n// WHATWG named character references for the tokenizer's named-character-reference\n// state. Main's own independent copy (shares no runtime code with ./legacy);\n// both generate from the same spec JSON. 2231 entries.\n// Keys keep the trailing ';' for semicolon forms; legacy no-';' forms included.\nexport const NAMED_REFS: Map<string, string> = new Map(JSON.parse(\n  '[[\"AElig\",\"Æ\"],[\"AElig;\",\"Æ\"],[\"AMP\",\"&\"],[\"AMP;\",\"&\"],[\"Aacute\",\"Á\"],[\"Aacute;\",\"Á\"],[\"Abreve;\",\"Ă\"],[\"Acirc\",\"Â\"],[\"Acirc;\",\"Â\"],[\"Acy;\",\"А\"],[\"Afr;\",\"𝔄\"],[\"Agrave\",\"À\"],[\"Agrave;\",\"À\"],[\"Alpha;\",\"Α\"],[\"Amacr;\",\"Ā\"],[\"And;\",\"⩓\"],[\"Aogon;\",\"Ą\"],[\"Aopf;\",\"𝔸\"],[\"ApplyFunction;\",\"⁡\"],[\"Aring\",\"Å\"],[\"Aring;\",\"Å\"],[\"Ascr;\",\"𝒜\"],[\"Assign;\",\"≔\"],[\"Atilde\",\"Ã\"],[\"Atilde;\",\"Ã\"],[\"Auml\",\"Ä\"],[\"Auml;\",\"Ä\"],[\"Backslash;\",\"∖\"],[\"Barv;\",\"⫧\"],[\"Barwed;\",\"⌆\"],[\"Bcy;\",\"Б\"],[\"Because;\",\"∵\"],[\"Bernoullis;\",\"ℬ\"],[\"Beta;\",\"Β\"],[\"Bfr;\",\"𝔅\"],[\"Bopf;\",\"𝔹\"],[\"Breve;\",\"˘\"],[\"Bscr;\",\"ℬ\"],[\"Bumpeq;\",\"≎\"],[\"CHcy;\",\"Ч\"],[\"COPY\",\"©\"],[\"COPY;\",\"©\"],[\"Cacute;\",\"Ć\"],[\"Cap;\",\"⋒\"],[\"CapitalDifferentialD;\",\"ⅅ\"],[\"Cayleys;\",\"ℭ\"],[\"Ccaron;\",\"Č\"],[\"Ccedil\",\"Ç\"],[\"Ccedil;\",\"Ç\"],[\"Ccirc;\",\"Ĉ\"],[\"Cconint;\",\"∰\"],[\"Cdot;\",\"Ċ\"],[\"Cedilla;\",\"¸\"],[\"CenterDot;\",\"·\"],[\"Cfr;\",\"ℭ\"],[\"Chi;\",\"Χ\"],[\"CircleDot;\",\"⊙\"],[\"CircleMinus;\",\"⊖\"],[\"CirclePlus;\",\"⊕\"],[\"CircleTimes;\",\"⊗\"],[\"ClockwiseContourIntegral;\",\"∲\"],[\"CloseCurlyDoubleQuote;\",\"”\"],[\"CloseCurlyQuote;\",\"’\"],[\"Colon;\",\"∷\"],[\"Colone;\",\"⩴\"],[\"Congruent;\",\"≡\"],[\"Conint;\",\"∯\"],[\"ContourIntegral;\",\"∮\"],[\"Copf;\",\"ℂ\"],[\"Coproduct;\",\"∐\"],[\"CounterClockwiseContourIntegral;\",\"∳\"],[\"Cross;\",\"⨯\"],[\"Cscr;\",\"𝒞\"],[\"Cup;\",\"⋓\"],[\"CupCap;\",\"≍\"],[\"DD;\",\"ⅅ\"],[\"DDotrahd;\",\"⤑\"],[\"DJcy;\",\"Ђ\"],[\"DScy;\",\"Ѕ\"],[\"DZcy;\",\"Џ\"],[\"Dagger;\",\"‡\"],[\"Darr;\",\"↡\"],[\"Dashv;\",\"⫤\"],[\"Dcaron;\",\"Ď\"],[\"Dcy;\",\"Д\"],[\"Del;\",\"∇\"],[\"Delta;\",\"Δ\"],[\"Dfr;\",\"𝔇\"],[\"DiacriticalAcute;\",\"´\"],[\"DiacriticalDot;\",\"˙\"],[\"DiacriticalDoubleAcute;\",\"˝\"],[\"DiacriticalGrave;\",\"`\"],[\"DiacriticalTilde;\",\"˜\"],[\"Diamond;\",\"⋄\"],[\"DifferentialD;\",\"ⅆ\"],[\"Dopf;\",\"𝔻\"],[\"Dot;\",\"¨\"],[\"DotDot;\",\"⃜\"],[\"DotEqual;\",\"≐\"],[\"DoubleContourIntegral;\",\"∯\"],[\"DoubleDot;\",\"¨\"],[\"DoubleDownArrow;\",\"⇓\"],[\"DoubleLeftArrow;\",\"⇐\"],[\"DoubleLeftRightArrow;\",\"⇔\"],[\"DoubleLeftTee;\",\"⫤\"],[\"DoubleLongLeftArrow;\",\"⟸\"],[\"DoubleLongLeftRightArrow;\",\"⟺\"],[\"DoubleLongRightArrow;\",\"⟹\"],[\"DoubleRightArrow;\",\"⇒\"],[\"DoubleRightTee;\",\"⊨\"],[\"DoubleUpArrow;\",\"⇑\"],[\"DoubleUpDownArrow;\",\"⇕\"],[\"DoubleVerticalBar;\",\"∥\"],[\"DownArrow;\",\"↓\"],[\"DownArrowBar;\",\"⤓\"],[\"DownArrowUpArrow;\",\"⇵\"],[\"DownBreve;\",\"̑\"],[\"DownLeftRightVector;\",\"⥐\"],[\"DownLeftTeeVector;\",\"⥞\"],[\"DownLeftVector;\",\"↽\"],[\"DownLeftVectorBar;\",\"⥖\"],[\"DownRightTeeVector;\",\"⥟\"],[\"DownRightVector;\",\"⇁\"],[\"DownRightVectorBar;\",\"⥗\"],[\"DownTee;\",\"⊤\"],[\"DownTeeArrow;\",\"↧\"],[\"Downarrow;\",\"⇓\"],[\"Dscr;\",\"𝒟\"],[\"Dstrok;\",\"Đ\"],[\"ENG;\",\"Ŋ\"],[\"ETH\",\"Ð\"],[\"ETH;\",\"Ð\"],[\"Eacute\",\"É\"],[\"Eacute;\",\"É\"],[\"Ecaron;\",\"Ě\"],[\"Ecirc\",\"Ê\"],[\"Ecirc;\",\"Ê\"],[\"Ecy;\",\"Э\"],[\"Edot;\",\"Ė\"],[\"Efr;\",\"𝔈\"],[\"Egrave\",\"È\"],[\"Egrave;\",\"È\"],[\"Element;\",\"∈\"],[\"Emacr;\",\"Ē\"],[\"EmptySmallSquare;\",\"◻\"],[\"EmptyVerySmallSquare;\",\"▫\"],[\"Eogon;\",\"Ę\"],[\"Eopf;\",\"𝔼\"],[\"Epsilon;\",\"Ε\"],[\"Equal;\",\"⩵\"],[\"EqualTilde;\",\"≂\"],[\"Equilibrium;\",\"⇌\"],[\"Escr;\",\"ℰ\"],[\"Esim;\",\"⩳\"],[\"Eta;\",\"Η\"],[\"Euml\",\"Ë\"],[\"Euml;\",\"Ë\"],[\"Exists;\",\"∃\"],[\"ExponentialE;\",\"ⅇ\"],[\"Fcy;\",\"Ф\"],[\"Ffr;\",\"𝔉\"],[\"FilledSmallSquare;\",\"◼\"],[\"FilledVerySmallSquare;\",\"▪\"],[\"Fopf;\",\"𝔽\"],[\"ForAll;\",\"∀\"],[\"Fouriertrf;\",\"ℱ\"],[\"Fscr;\",\"ℱ\"],[\"GJcy;\",\"Ѓ\"],[\"GT\",\">\"],[\"GT;\",\">\"],[\"Gamma;\",\"Γ\"],[\"Gammad;\",\"Ϝ\"],[\"Gbreve;\",\"Ğ\"],[\"Gcedil;\",\"Ģ\"],[\"Gcirc;\",\"Ĝ\"],[\"Gcy;\",\"Г\"],[\"Gdot;\",\"Ġ\"],[\"Gfr;\",\"𝔊\"],[\"Gg;\",\"⋙\"],[\"Gopf;\",\"𝔾\"],[\"GreaterEqual;\",\"≥\"],[\"GreaterEqualLess;\",\"⋛\"],[\"GreaterFullEqual;\",\"≧\"],[\"GreaterGreater;\",\"⪢\"],[\"GreaterLess;\",\"≷\"],[\"GreaterSlantEqual;\",\"⩾\"],[\"GreaterTilde;\",\"≳\"],[\"Gscr;\",\"𝒢\"],[\"Gt;\",\"≫\"],[\"HARDcy;\",\"Ъ\"],[\"Hacek;\",\"ˇ\"],[\"Hat;\",\"^\"],[\"Hcirc;\",\"Ĥ\"],[\"Hfr;\",\"ℌ\"],[\"HilbertSpace;\",\"ℋ\"],[\"Hopf;\",\"ℍ\"],[\"HorizontalLine;\",\"─\"],[\"Hscr;\",\"ℋ\"],[\"Hstrok;\",\"Ħ\"],[\"HumpDownHump;\",\"≎\"],[\"HumpEqual;\",\"≏\"],[\"IEcy;\",\"Е\"],[\"IJlig;\",\"Ĳ\"],[\"IOcy;\",\"Ё\"],[\"Iacute\",\"Í\"],[\"Iacute;\",\"Í\"],[\"Icirc\",\"Î\"],[\"Icirc;\",\"Î\"],[\"Icy;\",\"И\"],[\"Idot;\",\"İ\"],[\"Ifr;\",\"ℑ\"],[\"Igrave\",\"Ì\"],[\"Igrave;\",\"Ì\"],[\"Im;\",\"ℑ\"],[\"Imacr;\",\"Ī\"],[\"ImaginaryI;\",\"ⅈ\"],[\"Implies;\",\"⇒\"],[\"Int;\",\"∬\"],[\"Integral;\",\"∫\"],[\"Intersection;\",\"⋂\"],[\"InvisibleComma;\",\"⁣\"],[\"InvisibleTimes;\",\"⁢\"],[\"Iogon;\",\"Į\"],[\"Iopf;\",\"𝕀\"],[\"Iota;\",\"Ι\"],[\"Iscr;\",\"ℐ\"],[\"Itilde;\",\"Ĩ\"],[\"Iukcy;\",\"І\"],[\"Iuml\",\"Ï\"],[\"Iuml;\",\"Ï\"],[\"Jcirc;\",\"Ĵ\"],[\"Jcy;\",\"Й\"],[\"Jfr;\",\"𝔍\"],[\"Jopf;\",\"𝕁\"],[\"Jscr;\",\"𝒥\"],[\"Jsercy;\",\"Ј\"],[\"Jukcy;\",\"Є\"],[\"KHcy;\",\"Х\"],[\"KJcy;\",\"Ќ\"],[\"Kappa;\",\"Κ\"],[\"Kcedil;\",\"Ķ\"],[\"Kcy;\",\"К\"],[\"Kfr;\",\"𝔎\"],[\"Kopf;\",\"𝕂\"],[\"Kscr;\",\"𝒦\"],[\"LJcy;\",\"Љ\"],[\"LT\",\"<\"],[\"LT;\",\"<\"],[\"Lacute;\",\"Ĺ\"],[\"Lambda;\",\"Λ\"],[\"Lang;\",\"⟪\"],[\"Laplacetrf;\",\"ℒ\"],[\"Larr;\",\"↞\"],[\"Lcaron;\",\"Ľ\"],[\"Lcedil;\",\"Ļ\"],[\"Lcy;\",\"Л\"],[\"LeftAngleBracket;\",\"⟨\"],[\"LeftArrow;\",\"←\"],[\"LeftArrowBar;\",\"⇤\"],[\"LeftArrowRightArrow;\",\"⇆\"],[\"LeftCeiling;\",\"⌈\"],[\"LeftDoubleBracket;\",\"⟦\"],[\"LeftDownTeeVector;\",\"⥡\"],[\"LeftDownVector;\",\"⇃\"],[\"LeftDownVectorBar;\",\"⥙\"],[\"LeftFloor;\",\"⌊\"],[\"LeftRightArrow;\",\"↔\"],[\"LeftRightVector;\",\"⥎\"],[\"LeftTee;\",\"⊣\"],[\"LeftTeeArrow;\",\"↤\"],[\"LeftTeeVector;\",\"⥚\"],[\"LeftTriangle;\",\"⊲\"],[\"LeftTriangleBar;\",\"⧏\"],[\"LeftTriangleEqual;\",\"⊴\"],[\"LeftUpDownVector;\",\"⥑\"],[\"LeftUpTeeVector;\",\"⥠\"],[\"LeftUpVector;\",\"↿\"],[\"LeftUpVectorBar;\",\"⥘\"],[\"LeftVector;\",\"↼\"],[\"LeftVectorBar;\",\"⥒\"],[\"Leftarrow;\",\"⇐\"],[\"Leftrightarrow;\",\"⇔\"],[\"LessEqualGreater;\",\"⋚\"],[\"LessFullEqual;\",\"≦\"],[\"LessGreater;\",\"≶\"],[\"LessLess;\",\"⪡\"],[\"LessSlantEqual;\",\"⩽\"],[\"LessTilde;\",\"≲\"],[\"Lfr;\",\"𝔏\"],[\"Ll;\",\"⋘\"],[\"Lleftarrow;\",\"⇚\"],[\"Lmidot;\",\"Ŀ\"],[\"LongLeftArrow;\",\"⟵\"],[\"LongLeftRightArrow;\",\"⟷\"],[\"LongRightArrow;\",\"⟶\"],[\"Longleftarrow;\",\"⟸\"],[\"Longleftrightarrow;\",\"⟺\"],[\"Longrightarrow;\",\"⟹\"],[\"Lopf;\",\"𝕃\"],[\"LowerLeftArrow;\",\"↙\"],[\"LowerRightArrow;\",\"↘\"],[\"Lscr;\",\"ℒ\"],[\"Lsh;\",\"↰\"],[\"Lstrok;\",\"Ł\"],[\"Lt;\",\"≪\"],[\"Map;\",\"⤅\"],[\"Mcy;\",\"М\"],[\"MediumSpace;\",\" \"],[\"Mellintrf;\",\"ℳ\"],[\"Mfr;\",\"𝔐\"],[\"MinusPlus;\",\"∓\"],[\"Mopf;\",\"𝕄\"],[\"Mscr;\",\"ℳ\"],[\"Mu;\",\"Μ\"],[\"NJcy;\",\"Њ\"],[\"Nacute;\",\"Ń\"],[\"Ncaron;\",\"Ň\"],[\"Ncedil;\",\"Ņ\"],[\"Ncy;\",\"Н\"],[\"NegativeMediumSpace;\",\"​\"],[\"NegativeThickSpace;\",\"​\"],[\"NegativeThinSpace;\",\"​\"],[\"NegativeVeryThinSpace;\",\"​\"],[\"NestedGreaterGreater;\",\"≫\"],[\"NestedLessLess;\",\"≪\"],[\"NewLine;\",\"\\\\n\"],[\"Nfr;\",\"𝔑\"],[\"NoBreak;\",\"⁠\"],[\"NonBreakingSpace;\",\" \"],[\"Nopf;\",\"ℕ\"],[\"Not;\",\"⫬\"],[\"NotCongruent;\",\"≢\"],[\"NotCupCap;\",\"≭\"],[\"NotDoubleVerticalBar;\",\"∦\"],[\"NotElement;\",\"∉\"],[\"NotEqual;\",\"≠\"],[\"NotEqualTilde;\",\"≂̸\"],[\"NotExists;\",\"∄\"],[\"NotGreater;\",\"≯\"],[\"NotGreaterEqual;\",\"≱\"],[\"NotGreaterFullEqual;\",\"≧̸\"],[\"NotGreaterGreater;\",\"≫̸\"],[\"NotGreaterLess;\",\"≹\"],[\"NotGreaterSlantEqual;\",\"⩾̸\"],[\"NotGreaterTilde;\",\"≵\"],[\"NotHumpDownHump;\",\"≎̸\"],[\"NotHumpEqual;\",\"≏̸\"],[\"NotLeftTriangle;\",\"⋪\"],[\"NotLeftTriangleBar;\",\"⧏̸\"],[\"NotLeftTriangleEqual;\",\"⋬\"],[\"NotLess;\",\"≮\"],[\"NotLessEqual;\",\"≰\"],[\"NotLessGreater;\",\"≸\"],[\"NotLessLess;\",\"≪̸\"],[\"NotLessSlantEqual;\",\"⩽̸\"],[\"NotLessTilde;\",\"≴\"],[\"NotNestedGreaterGreater;\",\"⪢̸\"],[\"NotNestedLessLess;\",\"⪡̸\"],[\"NotPrecedes;\",\"⊀\"],[\"NotPrecedesEqual;\",\"⪯̸\"],[\"NotPrecedesSlantEqual;\",\"⋠\"],[\"NotReverseElement;\",\"∌\"],[\"NotRightTriangle;\",\"⋫\"],[\"NotRightTriangleBar;\",\"⧐̸\"],[\"NotRightTriangleEqual;\",\"⋭\"],[\"NotSquareSubset;\",\"⊏̸\"],[\"NotSquareSubsetEqual;\",\"⋢\"],[\"NotSquareSuperset;\",\"⊐̸\"],[\"NotSquareSupersetEqual;\",\"⋣\"],[\"NotSubset;\",\"⊂⃒\"],[\"NotSubsetEqual;\",\"⊈\"],[\"NotSucceeds;\",\"⊁\"],[\"NotSucceedsEqual;\",\"⪰̸\"],[\"NotSucceedsSlantEqual;\",\"⋡\"],[\"NotSucceedsTilde;\",\"≿̸\"],[\"NotSuperset;\",\"⊃⃒\"],[\"NotSupersetEqual;\",\"⊉\"],[\"NotTilde;\",\"≁\"],[\"NotTildeEqual;\",\"≄\"],[\"NotTildeFullEqual;\",\"≇\"],[\"NotTildeTilde;\",\"≉\"],[\"NotVerticalBar;\",\"∤\"],[\"Nscr;\",\"𝒩\"],[\"Ntilde\",\"Ñ\"],[\"Ntilde;\",\"Ñ\"],[\"Nu;\",\"Ν\"],[\"OElig;\",\"Œ\"],[\"Oacute\",\"Ó\"],[\"Oacute;\",\"Ó\"],[\"Ocirc\",\"Ô\"],[\"Ocirc;\",\"Ô\"],[\"Ocy;\",\"О\"],[\"Odblac;\",\"Ő\"],[\"Ofr;\",\"𝔒\"],[\"Ograve\",\"Ò\"],[\"Ograve;\",\"Ò\"],[\"Omacr;\",\"Ō\"],[\"Omega;\",\"Ω\"],[\"Omicron;\",\"Ο\"],[\"Oopf;\",\"𝕆\"],[\"OpenCurlyDoubleQuote;\",\"“\"],[\"OpenCurlyQuote;\",\"‘\"],[\"Or;\",\"⩔\"],[\"Oscr;\",\"𝒪\"],[\"Oslash\",\"Ø\"],[\"Oslash;\",\"Ø\"],[\"Otilde\",\"Õ\"],[\"Otilde;\",\"Õ\"],[\"Otimes;\",\"⨷\"],[\"Ouml\",\"Ö\"],[\"Ouml;\",\"Ö\"],[\"OverBar;\",\"‾\"],[\"OverBrace;\",\"⏞\"],[\"OverBracket;\",\"⎴\"],[\"OverParenthesis;\",\"⏜\"],[\"PartialD;\",\"∂\"],[\"Pcy;\",\"П\"],[\"Pfr;\",\"𝔓\"],[\"Phi;\",\"Φ\"],[\"Pi;\",\"Π\"],[\"PlusMinus;\",\"±\"],[\"Poincareplane;\",\"ℌ\"],[\"Popf;\",\"ℙ\"],[\"Pr;\",\"⪻\"],[\"Precedes;\",\"≺\"],[\"PrecedesEqual;\",\"⪯\"],[\"PrecedesSlantEqual;\",\"≼\"],[\"PrecedesTilde;\",\"≾\"],[\"Prime;\",\"″\"],[\"Product;\",\"∏\"],[\"Proportion;\",\"∷\"],[\"Proportional;\",\"∝\"],[\"Pscr;\",\"𝒫\"],[\"Psi;\",\"Ψ\"],[\"QUOT\",\"\\\\\"\"],[\"QUOT;\",\"\\\\\"\"],[\"Qfr;\",\"𝔔\"],[\"Qopf;\",\"ℚ\"],[\"Qscr;\",\"𝒬\"],[\"RBarr;\",\"⤐\"],[\"REG\",\"®\"],[\"REG;\",\"®\"],[\"Racute;\",\"Ŕ\"],[\"Rang;\",\"⟫\"],[\"Rarr;\",\"↠\"],[\"Rarrtl;\",\"⤖\"],[\"Rcaron;\",\"Ř\"],[\"Rcedil;\",\"Ŗ\"],[\"Rcy;\",\"Р\"],[\"Re;\",\"ℜ\"],[\"ReverseElement;\",\"∋\"],[\"ReverseEquilibrium;\",\"⇋\"],[\"ReverseUpEquilibrium;\",\"⥯\"],[\"Rfr;\",\"ℜ\"],[\"Rho;\",\"Ρ\"],[\"RightAngleBracket;\",\"⟩\"],[\"RightArrow;\",\"→\"],[\"RightArrowBar;\",\"⇥\"],[\"RightArrowLeftArrow;\",\"⇄\"],[\"RightCeiling;\",\"⌉\"],[\"RightDoubleBracket;\",\"⟧\"],[\"RightDownTeeVector;\",\"⥝\"],[\"RightDownVector;\",\"⇂\"],[\"RightDownVectorBar;\",\"⥕\"],[\"RightFloor;\",\"⌋\"],[\"RightTee;\",\"⊢\"],[\"RightTeeArrow;\",\"↦\"],[\"RightTeeVector;\",\"⥛\"],[\"RightTriangle;\",\"⊳\"],[\"RightTriangleBar;\",\"⧐\"],[\"RightTriangleEqual;\",\"⊵\"],[\"RightUpDownVector;\",\"⥏\"],[\"RightUpTeeVector;\",\"⥜\"],[\"RightUpVector;\",\"↾\"],[\"RightUpVectorBar;\",\"⥔\"],[\"RightVector;\",\"⇀\"],[\"RightVectorBar;\",\"⥓\"],[\"Rightarrow;\",\"⇒\"],[\"Ropf;\",\"ℝ\"],[\"RoundImplies;\",\"⥰\"],[\"Rrightarrow;\",\"⇛\"],[\"Rscr;\",\"ℛ\"],[\"Rsh;\",\"↱\"],[\"RuleDelayed;\",\"⧴\"],[\"SHCHcy;\",\"Щ\"],[\"SHcy;\",\"Ш\"],[\"SOFTcy;\",\"Ь\"],[\"Sacute;\",\"Ś\"],[\"Sc;\",\"⪼\"],[\"Scaron;\",\"Š\"],[\"Scedil;\",\"Ş\"],[\"Scirc;\",\"Ŝ\"],[\"Scy;\",\"С\"],[\"Sfr;\",\"𝔖\"],[\"ShortDownArrow;\",\"↓\"],[\"ShortLeftArrow;\",\"←\"],[\"ShortRightArrow;\",\"→\"],[\"ShortUpArrow;\",\"↑\"],[\"Sigma;\",\"Σ\"],[\"SmallCircle;\",\"∘\"],[\"Sopf;\",\"𝕊\"],[\"Sqrt;\",\"√\"],[\"Square;\",\"□\"],[\"SquareIntersection;\",\"⊓\"],[\"SquareSubset;\",\"⊏\"],[\"SquareSubsetEqual;\",\"⊑\"],[\"SquareSuperset;\",\"⊐\"],[\"SquareSupersetEqual;\",\"⊒\"],[\"SquareUnion;\",\"⊔\"],[\"Sscr;\",\"𝒮\"],[\"Star;\",\"⋆\"],[\"Sub;\",\"⋐\"],[\"Subset;\",\"⋐\"],[\"SubsetEqual;\",\"⊆\"],[\"Succeeds;\",\"≻\"],[\"SucceedsEqual;\",\"⪰\"],[\"SucceedsSlantEqual;\",\"≽\"],[\"SucceedsTilde;\",\"≿\"],[\"SuchThat;\",\"∋\"],[\"Sum;\",\"∑\"],[\"Sup;\",\"⋑\"],[\"Superset;\",\"⊃\"],[\"SupersetEqual;\",\"⊇\"],[\"Supset;\",\"⋑\"],[\"THORN\",\"Þ\"],[\"THORN;\",\"Þ\"],[\"TRADE;\",\"™\"],[\"TSHcy;\",\"Ћ\"],[\"TScy;\",\"Ц\"],[\"Tab;\",\"\\\\t\"],[\"Tau;\",\"Τ\"],[\"Tcaron;\",\"Ť\"],[\"Tcedil;\",\"Ţ\"],[\"Tcy;\",\"Т\"],[\"Tfr;\",\"𝔗\"],[\"Therefore;\",\"∴\"],[\"Theta;\",\"Θ\"],[\"ThickSpace;\",\"  \"],[\"ThinSpace;\",\" \"],[\"Tilde;\",\"∼\"],[\"TildeEqual;\",\"≃\"],[\"TildeFullEqual;\",\"≅\"],[\"TildeTilde;\",\"≈\"],[\"Topf;\",\"𝕋\"],[\"TripleDot;\",\"⃛\"],[\"Tscr;\",\"𝒯\"],[\"Tstrok;\",\"Ŧ\"],[\"Uacute\",\"Ú\"],[\"Uacute;\",\"Ú\"],[\"Uarr;\",\"↟\"],[\"Uarrocir;\",\"⥉\"],[\"Ubrcy;\",\"Ў\"],[\"Ubreve;\",\"Ŭ\"],[\"Ucirc\",\"Û\"],[\"Ucirc;\",\"Û\"],[\"Ucy;\",\"У\"],[\"Udblac;\",\"Ű\"],[\"Ufr;\",\"𝔘\"],[\"Ugrave\",\"Ù\"],[\"Ugrave;\",\"Ù\"],[\"Umacr;\",\"Ū\"],[\"UnderBar;\",\"_\"],[\"UnderBrace;\",\"⏟\"],[\"UnderBracket;\",\"⎵\"],[\"UnderParenthesis;\",\"⏝\"],[\"Union;\",\"⋃\"],[\"UnionPlus;\",\"⊎\"],[\"Uogon;\",\"Ų\"],[\"Uopf;\",\"𝕌\"],[\"UpArrow;\",\"↑\"],[\"UpArrowBar;\",\"⤒\"],[\"UpArrowDownArrow;\",\"⇅\"],[\"UpDownArrow;\",\"↕\"],[\"UpEquilibrium;\",\"⥮\"],[\"UpTee;\",\"⊥\"],[\"UpTeeArrow;\",\"↥\"],[\"Uparrow;\",\"⇑\"],[\"Updownarrow;\",\"⇕\"],[\"UpperLeftArrow;\",\"↖\"],[\"UpperRightArrow;\",\"↗\"],[\"Upsi;\",\"ϒ\"],[\"Upsilon;\",\"Υ\"],[\"Uring;\",\"Ů\"],[\"Uscr;\",\"𝒰\"],[\"Utilde;\",\"Ũ\"],[\"Uuml\",\"Ü\"],[\"Uuml;\",\"Ü\"],[\"VDash;\",\"⊫\"],[\"Vbar;\",\"⫫\"],[\"Vcy;\",\"В\"],[\"Vdash;\",\"⊩\"],[\"Vdashl;\",\"⫦\"],[\"Vee;\",\"⋁\"],[\"Verbar;\",\"‖\"],[\"Vert;\",\"‖\"],[\"VerticalBar;\",\"∣\"],[\"VerticalLine;\",\"|\"],[\"VerticalSeparator;\",\"❘\"],[\"VerticalTilde;\",\"≀\"],[\"VeryThinSpace;\",\" \"],[\"Vfr;\",\"𝔙\"],[\"Vopf;\",\"𝕍\"],[\"Vscr;\",\"𝒱\"],[\"Vvdash;\",\"⊪\"],[\"Wcirc;\",\"Ŵ\"],[\"Wedge;\",\"⋀\"],[\"Wfr;\",\"𝔚\"],[\"Wopf;\",\"𝕎\"],[\"Wscr;\",\"𝒲\"],[\"Xfr;\",\"𝔛\"],[\"Xi;\",\"Ξ\"],[\"Xopf;\",\"𝕏\"],[\"Xscr;\",\"𝒳\"],[\"YAcy;\",\"Я\"],[\"YIcy;\",\"Ї\"],[\"YUcy;\",\"Ю\"],[\"Yacute\",\"Ý\"],[\"Yacute;\",\"Ý\"],[\"Ycirc;\",\"Ŷ\"],[\"Ycy;\",\"Ы\"],[\"Yfr;\",\"𝔜\"],[\"Yopf;\",\"𝕐\"],[\"Yscr;\",\"𝒴\"],[\"Yuml;\",\"Ÿ\"],[\"ZHcy;\",\"Ж\"],[\"Zacute;\",\"Ź\"],[\"Zcaron;\",\"Ž\"],[\"Zcy;\",\"З\"],[\"Zdot;\",\"Ż\"],[\"ZeroWidthSpace;\",\"​\"],[\"Zeta;\",\"Ζ\"],[\"Zfr;\",\"ℨ\"],[\"Zopf;\",\"ℤ\"],[\"Zscr;\",\"𝒵\"],[\"aacute\",\"á\"],[\"aacute;\",\"á\"],[\"abreve;\",\"ă\"],[\"ac;\",\"∾\"],[\"acE;\",\"∾̳\"],[\"acd;\",\"∿\"],[\"acirc\",\"â\"],[\"acirc;\",\"â\"],[\"acute\",\"´\"],[\"acute;\",\"´\"],[\"acy;\",\"а\"],[\"aelig\",\"æ\"],[\"aelig;\",\"æ\"],[\"af;\",\"⁡\"],[\"afr;\",\"𝔞\"],[\"agrave\",\"à\"],[\"agrave;\",\"à\"],[\"alefsym;\",\"ℵ\"],[\"aleph;\",\"ℵ\"],[\"alpha;\",\"α\"],[\"amacr;\",\"ā\"],[\"amalg;\",\"⨿\"],[\"amp\",\"&\"],[\"amp;\",\"&\"],[\"and;\",\"∧\"],[\"andand;\",\"⩕\"],[\"andd;\",\"⩜\"],[\"andslope;\",\"⩘\"],[\"andv;\",\"⩚\"],[\"ang;\",\"∠\"],[\"ange;\",\"⦤\"],[\"angle;\",\"∠\"],[\"angmsd;\",\"∡\"],[\"angmsdaa;\",\"⦨\"],[\"angmsdab;\",\"⦩\"],[\"angmsdac;\",\"⦪\"],[\"angmsdad;\",\"⦫\"],[\"angmsdae;\",\"⦬\"],[\"angmsdaf;\",\"⦭\"],[\"angmsdag;\",\"⦮\"],[\"angmsdah;\",\"⦯\"],[\"angrt;\",\"∟\"],[\"angrtvb;\",\"⊾\"],[\"angrtvbd;\",\"⦝\"],[\"angsph;\",\"∢\"],[\"angst;\",\"Å\"],[\"angzarr;\",\"⍼\"],[\"aogon;\",\"ą\"],[\"aopf;\",\"𝕒\"],[\"ap;\",\"≈\"],[\"apE;\",\"⩰\"],[\"apacir;\",\"⩯\"],[\"ape;\",\"≊\"],[\"apid;\",\"≋\"],[\"apos;\",\"\\'\"],[\"approx;\",\"≈\"],[\"approxeq;\",\"≊\"],[\"aring\",\"å\"],[\"aring;\",\"å\"],[\"ascr;\",\"𝒶\"],[\"ast;\",\"*\"],[\"asymp;\",\"≈\"],[\"asympeq;\",\"≍\"],[\"atilde\",\"ã\"],[\"atilde;\",\"ã\"],[\"auml\",\"ä\"],[\"auml;\",\"ä\"],[\"awconint;\",\"∳\"],[\"awint;\",\"⨑\"],[\"bNot;\",\"⫭\"],[\"backcong;\",\"≌\"],[\"backepsilon;\",\"϶\"],[\"backprime;\",\"‵\"],[\"backsim;\",\"∽\"],[\"backsimeq;\",\"⋍\"],[\"barvee;\",\"⊽\"],[\"barwed;\",\"⌅\"],[\"barwedge;\",\"⌅\"],[\"bbrk;\",\"⎵\"],[\"bbrktbrk;\",\"⎶\"],[\"bcong;\",\"≌\"],[\"bcy;\",\"б\"],[\"bdquo;\",\"„\"],[\"becaus;\",\"∵\"],[\"because;\",\"∵\"],[\"bemptyv;\",\"⦰\"],[\"bepsi;\",\"϶\"],[\"bernou;\",\"ℬ\"],[\"beta;\",\"β\"],[\"beth;\",\"ℶ\"],[\"between;\",\"≬\"],[\"bfr;\",\"𝔟\"],[\"bigcap;\",\"⋂\"],[\"bigcirc;\",\"◯\"],[\"bigcup;\",\"⋃\"],[\"bigodot;\",\"⨀\"],[\"bigoplus;\",\"⨁\"],[\"bigotimes;\",\"⨂\"],[\"bigsqcup;\",\"⨆\"],[\"bigstar;\",\"★\"],[\"bigtriangledown;\",\"▽\"],[\"bigtriangleup;\",\"△\"],[\"biguplus;\",\"⨄\"],[\"bigvee;\",\"⋁\"],[\"bigwedge;\",\"⋀\"],[\"bkarow;\",\"⤍\"],[\"blacklozenge;\",\"⧫\"],[\"blacksquare;\",\"▪\"],[\"blacktriangle;\",\"▴\"],[\"blacktriangledown;\",\"▾\"],[\"blacktriangleleft;\",\"◂\"],[\"blacktriangleright;\",\"▸\"],[\"blank;\",\"␣\"],[\"blk12;\",\"▒\"],[\"blk14;\",\"░\"],[\"blk34;\",\"▓\"],[\"block;\",\"█\"],[\"bne;\",\"=⃥\"],[\"bnequiv;\",\"≡⃥\"],[\"bnot;\",\"⌐\"],[\"bopf;\",\"𝕓\"],[\"bot;\",\"⊥\"],[\"bottom;\",\"⊥\"],[\"bowtie;\",\"⋈\"],[\"boxDL;\",\"╗\"],[\"boxDR;\",\"╔\"],[\"boxDl;\",\"╖\"],[\"boxDr;\",\"╓\"],[\"boxH;\",\"═\"],[\"boxHD;\",\"╦\"],[\"boxHU;\",\"╩\"],[\"boxHd;\",\"╤\"],[\"boxHu;\",\"╧\"],[\"boxUL;\",\"╝\"],[\"boxUR;\",\"╚\"],[\"boxUl;\",\"╜\"],[\"boxUr;\",\"╙\"],[\"boxV;\",\"║\"],[\"boxVH;\",\"╬\"],[\"boxVL;\",\"╣\"],[\"boxVR;\",\"╠\"],[\"boxVh;\",\"╫\"],[\"boxVl;\",\"╢\"],[\"boxVr;\",\"╟\"],[\"boxbox;\",\"⧉\"],[\"boxdL;\",\"╕\"],[\"boxdR;\",\"╒\"],[\"boxdl;\",\"┐\"],[\"boxdr;\",\"┌\"],[\"boxh;\",\"─\"],[\"boxhD;\",\"╥\"],[\"boxhU;\",\"╨\"],[\"boxhd;\",\"┬\"],[\"boxhu;\",\"┴\"],[\"boxminus;\",\"⊟\"],[\"boxplus;\",\"⊞\"],[\"boxtimes;\",\"⊠\"],[\"boxuL;\",\"╛\"],[\"boxuR;\",\"╘\"],[\"boxul;\",\"┘\"],[\"boxur;\",\"└\"],[\"boxv;\",\"│\"],[\"boxvH;\",\"╪\"],[\"boxvL;\",\"╡\"],[\"boxvR;\",\"╞\"],[\"boxvh;\",\"┼\"],[\"boxvl;\",\"┤\"],[\"boxvr;\",\"├\"],[\"bprime;\",\"‵\"],[\"breve;\",\"˘\"],[\"brvbar\",\"¦\"],[\"brvbar;\",\"¦\"],[\"bscr;\",\"𝒷\"],[\"bsemi;\",\"⁏\"],[\"bsim;\",\"∽\"],[\"bsime;\",\"⋍\"],[\"bsol;\",\"\\\\\\\\\"],[\"bsolb;\",\"⧅\"],[\"bsolhsub;\",\"⟈\"],[\"bull;\",\"•\"],[\"bullet;\",\"•\"],[\"bump;\",\"≎\"],[\"bumpE;\",\"⪮\"],[\"bumpe;\",\"≏\"],[\"bumpeq;\",\"≏\"],[\"cacute;\",\"ć\"],[\"cap;\",\"∩\"],[\"capand;\",\"⩄\"],[\"capbrcup;\",\"⩉\"],[\"capcap;\",\"⩋\"],[\"capcup;\",\"⩇\"],[\"capdot;\",\"⩀\"],[\"caps;\",\"∩︀\"],[\"caret;\",\"⁁\"],[\"caron;\",\"ˇ\"],[\"ccaps;\",\"⩍\"],[\"ccaron;\",\"č\"],[\"ccedil\",\"ç\"],[\"ccedil;\",\"ç\"],[\"ccirc;\",\"ĉ\"],[\"ccups;\",\"⩌\"],[\"ccupssm;\",\"⩐\"],[\"cdot;\",\"ċ\"],[\"cedil\",\"¸\"],[\"cedil;\",\"¸\"],[\"cemptyv;\",\"⦲\"],[\"cent\",\"¢\"],[\"cent;\",\"¢\"],[\"centerdot;\",\"·\"],[\"cfr;\",\"𝔠\"],[\"chcy;\",\"ч\"],[\"check;\",\"✓\"],[\"checkmark;\",\"✓\"],[\"chi;\",\"χ\"],[\"cir;\",\"○\"],[\"cirE;\",\"⧃\"],[\"circ;\",\"ˆ\"],[\"circeq;\",\"≗\"],[\"circlearrowleft;\",\"↺\"],[\"circlearrowright;\",\"↻\"],[\"circledR;\",\"®\"],[\"circledS;\",\"Ⓢ\"],[\"circledast;\",\"⊛\"],[\"circledcirc;\",\"⊚\"],[\"circleddash;\",\"⊝\"],[\"cire;\",\"≗\"],[\"cirfnint;\",\"⨐\"],[\"cirmid;\",\"⫯\"],[\"cirscir;\",\"⧂\"],[\"clubs;\",\"♣\"],[\"clubsuit;\",\"♣\"],[\"colon;\",\":\"],[\"colone;\",\"≔\"],[\"coloneq;\",\"≔\"],[\"comma;\",\",\"],[\"commat;\",\"@\"],[\"comp;\",\"∁\"],[\"compfn;\",\"∘\"],[\"complement;\",\"∁\"],[\"complexes;\",\"ℂ\"],[\"cong;\",\"≅\"],[\"congdot;\",\"⩭\"],[\"conint;\",\"∮\"],[\"copf;\",\"𝕔\"],[\"coprod;\",\"∐\"],[\"copy\",\"©\"],[\"copy;\",\"©\"],[\"copysr;\",\"℗\"],[\"crarr;\",\"↵\"],[\"cross;\",\"✗\"],[\"cscr;\",\"𝒸\"],[\"csub;\",\"⫏\"],[\"csube;\",\"⫑\"],[\"csup;\",\"⫐\"],[\"csupe;\",\"⫒\"],[\"ctdot;\",\"⋯\"],[\"cudarrl;\",\"⤸\"],[\"cudarrr;\",\"⤵\"],[\"cuepr;\",\"⋞\"],[\"cuesc;\",\"⋟\"],[\"cularr;\",\"↶\"],[\"cularrp;\",\"⤽\"],[\"cup;\",\"∪\"],[\"cupbrcap;\",\"⩈\"],[\"cupcap;\",\"⩆\"],[\"cupcup;\",\"⩊\"],[\"cupdot;\",\"⊍\"],[\"cupor;\",\"⩅\"],[\"cups;\",\"∪︀\"],[\"curarr;\",\"↷\"],[\"curarrm;\",\"⤼\"],[\"curlyeqprec;\",\"⋞\"],[\"curlyeqsucc;\",\"⋟\"],[\"curlyvee;\",\"⋎\"],[\"curlywedge;\",\"⋏\"],[\"curren\",\"¤\"],[\"curren;\",\"¤\"],[\"curvearrowleft;\",\"↶\"],[\"curvearrowright;\",\"↷\"],[\"cuvee;\",\"⋎\"],[\"cuwed;\",\"⋏\"],[\"cwconint;\",\"∲\"],[\"cwint;\",\"∱\"],[\"cylcty;\",\"⌭\"],[\"dArr;\",\"⇓\"],[\"dHar;\",\"⥥\"],[\"dagger;\",\"†\"],[\"daleth;\",\"ℸ\"],[\"darr;\",\"↓\"],[\"dash;\",\"‐\"],[\"dashv;\",\"⊣\"],[\"dbkarow;\",\"⤏\"],[\"dblac;\",\"˝\"],[\"dcaron;\",\"ď\"],[\"dcy;\",\"д\"],[\"dd;\",\"ⅆ\"],[\"ddagger;\",\"‡\"],[\"ddarr;\",\"⇊\"],[\"ddotseq;\",\"⩷\"],[\"deg\",\"°\"],[\"deg;\",\"°\"],[\"delta;\",\"δ\"],[\"demptyv;\",\"⦱\"],[\"dfisht;\",\"⥿\"],[\"dfr;\",\"𝔡\"],[\"dharl;\",\"⇃\"],[\"dharr;\",\"⇂\"],[\"diam;\",\"⋄\"],[\"diamond;\",\"⋄\"],[\"diamondsuit;\",\"♦\"],[\"diams;\",\"♦\"],[\"die;\",\"¨\"],[\"digamma;\",\"ϝ\"],[\"disin;\",\"⋲\"],[\"div;\",\"÷\"],[\"divide\",\"÷\"],[\"divide;\",\"÷\"],[\"divideontimes;\",\"⋇\"],[\"divonx;\",\"⋇\"],[\"djcy;\",\"ђ\"],[\"dlcorn;\",\"⌞\"],[\"dlcrop;\",\"⌍\"],[\"dollar;\",\"$\"],[\"dopf;\",\"𝕕\"],[\"dot;\",\"˙\"],[\"doteq;\",\"≐\"],[\"doteqdot;\",\"≑\"],[\"dotminus;\",\"∸\"],[\"dotplus;\",\"∔\"],[\"dotsquare;\",\"⊡\"],[\"doublebarwedge;\",\"⌆\"],[\"downarrow;\",\"↓\"],[\"downdownarrows;\",\"⇊\"],[\"downharpoonleft;\",\"⇃\"],[\"downharpoonright;\",\"⇂\"],[\"drbkarow;\",\"⤐\"],[\"drcorn;\",\"⌟\"],[\"drcrop;\",\"⌌\"],[\"dscr;\",\"𝒹\"],[\"dscy;\",\"ѕ\"],[\"dsol;\",\"⧶\"],[\"dstrok;\",\"đ\"],[\"dtdot;\",\"⋱\"],[\"dtri;\",\"▿\"],[\"dtrif;\",\"▾\"],[\"duarr;\",\"⇵\"],[\"duhar;\",\"⥯\"],[\"dwangle;\",\"⦦\"],[\"dzcy;\",\"џ\"],[\"dzigrarr;\",\"⟿\"],[\"eDDot;\",\"⩷\"],[\"eDot;\",\"≑\"],[\"eacute\",\"é\"],[\"eacute;\",\"é\"],[\"easter;\",\"⩮\"],[\"ecaron;\",\"ě\"],[\"ecir;\",\"≖\"],[\"ecirc\",\"ê\"],[\"ecirc;\",\"ê\"],[\"ecolon;\",\"≕\"],[\"ecy;\",\"э\"],[\"edot;\",\"ė\"],[\"ee;\",\"ⅇ\"],[\"efDot;\",\"≒\"],[\"efr;\",\"𝔢\"],[\"eg;\",\"⪚\"],[\"egrave\",\"è\"],[\"egrave;\",\"è\"],[\"egs;\",\"⪖\"],[\"egsdot;\",\"⪘\"],[\"el;\",\"⪙\"],[\"elinters;\",\"⏧\"],[\"ell;\",\"ℓ\"],[\"els;\",\"⪕\"],[\"elsdot;\",\"⪗\"],[\"emacr;\",\"ē\"],[\"empty;\",\"∅\"],[\"emptyset;\",\"∅\"],[\"emptyv;\",\"∅\"],[\"emsp13;\",\" \"],[\"emsp14;\",\" \"],[\"emsp;\",\" \"],[\"eng;\",\"ŋ\"],[\"ensp;\",\" \"],[\"eogon;\",\"ę\"],[\"eopf;\",\"𝕖\"],[\"epar;\",\"⋕\"],[\"eparsl;\",\"⧣\"],[\"eplus;\",\"⩱\"],[\"epsi;\",\"ε\"],[\"epsilon;\",\"ε\"],[\"epsiv;\",\"ϵ\"],[\"eqcirc;\",\"≖\"],[\"eqcolon;\",\"≕\"],[\"eqsim;\",\"≂\"],[\"eqslantgtr;\",\"⪖\"],[\"eqslantless;\",\"⪕\"],[\"equals;\",\"=\"],[\"equest;\",\"≟\"],[\"equiv;\",\"≡\"],[\"equivDD;\",\"⩸\"],[\"eqvparsl;\",\"⧥\"],[\"erDot;\",\"≓\"],[\"erarr;\",\"⥱\"],[\"escr;\",\"ℯ\"],[\"esdot;\",\"≐\"],[\"esim;\",\"≂\"],[\"eta;\",\"η\"],[\"eth\",\"ð\"],[\"eth;\",\"ð\"],[\"euml\",\"ë\"],[\"euml;\",\"ë\"],[\"euro;\",\"€\"],[\"excl;\",\"!\"],[\"exist;\",\"∃\"],[\"expectation;\",\"ℰ\"],[\"exponentiale;\",\"ⅇ\"],[\"fallingdotseq;\",\"≒\"],[\"fcy;\",\"ф\"],[\"female;\",\"♀\"],[\"ffilig;\",\"ﬃ\"],[\"fflig;\",\"ﬀ\"],[\"ffllig;\",\"ﬄ\"],[\"ffr;\",\"𝔣\"],[\"filig;\",\"ﬁ\"],[\"fjlig;\",\"fj\"],[\"flat;\",\"♭\"],[\"fllig;\",\"ﬂ\"],[\"fltns;\",\"▱\"],[\"fnof;\",\"ƒ\"],[\"fopf;\",\"𝕗\"],[\"forall;\",\"∀\"],[\"fork;\",\"⋔\"],[\"forkv;\",\"⫙\"],[\"fpartint;\",\"⨍\"],[\"frac12\",\"½\"],[\"frac12;\",\"½\"],[\"frac13;\",\"⅓\"],[\"frac14\",\"¼\"],[\"frac14;\",\"¼\"],[\"frac15;\",\"⅕\"],[\"frac16;\",\"⅙\"],[\"frac18;\",\"⅛\"],[\"frac23;\",\"⅔\"],[\"frac25;\",\"⅖\"],[\"frac34\",\"¾\"],[\"frac34;\",\"¾\"],[\"frac35;\",\"⅗\"],[\"frac38;\",\"⅜\"],[\"frac45;\",\"⅘\"],[\"frac56;\",\"⅚\"],[\"frac58;\",\"⅝\"],[\"frac78;\",\"⅞\"],[\"frasl;\",\"⁄\"],[\"frown;\",\"⌢\"],[\"fscr;\",\"𝒻\"],[\"gE;\",\"≧\"],[\"gEl;\",\"⪌\"],[\"gacute;\",\"ǵ\"],[\"gamma;\",\"γ\"],[\"gammad;\",\"ϝ\"],[\"gap;\",\"⪆\"],[\"gbreve;\",\"ğ\"],[\"gcirc;\",\"ĝ\"],[\"gcy;\",\"г\"],[\"gdot;\",\"ġ\"],[\"ge;\",\"≥\"],[\"gel;\",\"⋛\"],[\"geq;\",\"≥\"],[\"geqq;\",\"≧\"],[\"geqslant;\",\"⩾\"],[\"ges;\",\"⩾\"],[\"gescc;\",\"⪩\"],[\"gesdot;\",\"⪀\"],[\"gesdoto;\",\"⪂\"],[\"gesdotol;\",\"⪄\"],[\"gesl;\",\"⋛︀\"],[\"gesles;\",\"⪔\"],[\"gfr;\",\"𝔤\"],[\"gg;\",\"≫\"],[\"ggg;\",\"⋙\"],[\"gimel;\",\"ℷ\"],[\"gjcy;\",\"ѓ\"],[\"gl;\",\"≷\"],[\"glE;\",\"⪒\"],[\"gla;\",\"⪥\"],[\"glj;\",\"⪤\"],[\"gnE;\",\"≩\"],[\"gnap;\",\"⪊\"],[\"gnapprox;\",\"⪊\"],[\"gne;\",\"⪈\"],[\"gneq;\",\"⪈\"],[\"gneqq;\",\"≩\"],[\"gnsim;\",\"⋧\"],[\"gopf;\",\"𝕘\"],[\"grave;\",\"`\"],[\"gscr;\",\"ℊ\"],[\"gsim;\",\"≳\"],[\"gsime;\",\"⪎\"],[\"gsiml;\",\"⪐\"],[\"gt\",\">\"],[\"gt;\",\">\"],[\"gtcc;\",\"⪧\"],[\"gtcir;\",\"⩺\"],[\"gtdot;\",\"⋗\"],[\"gtlPar;\",\"⦕\"],[\"gtquest;\",\"⩼\"],[\"gtrapprox;\",\"⪆\"],[\"gtrarr;\",\"⥸\"],[\"gtrdot;\",\"⋗\"],[\"gtreqless;\",\"⋛\"],[\"gtreqqless;\",\"⪌\"],[\"gtrless;\",\"≷\"],[\"gtrsim;\",\"≳\"],[\"gvertneqq;\",\"≩︀\"],[\"gvnE;\",\"≩︀\"],[\"hArr;\",\"⇔\"],[\"hairsp;\",\" \"],[\"half;\",\"½\"],[\"hamilt;\",\"ℋ\"],[\"hardcy;\",\"ъ\"],[\"harr;\",\"↔\"],[\"harrcir;\",\"⥈\"],[\"harrw;\",\"↭\"],[\"hbar;\",\"ℏ\"],[\"hcirc;\",\"ĥ\"],[\"hearts;\",\"♥\"],[\"heartsuit;\",\"♥\"],[\"hellip;\",\"…\"],[\"hercon;\",\"⊹\"],[\"hfr;\",\"𝔥\"],[\"hksearow;\",\"⤥\"],[\"hkswarow;\",\"⤦\"],[\"hoarr;\",\"⇿\"],[\"homtht;\",\"∻\"],[\"hookleftarrow;\",\"↩\"],[\"hookrightarrow;\",\"↪\"],[\"hopf;\",\"𝕙\"],[\"horbar;\",\"―\"],[\"hscr;\",\"𝒽\"],[\"hslash;\",\"ℏ\"],[\"hstrok;\",\"ħ\"],[\"hybull;\",\"⁃\"],[\"hyphen;\",\"‐\"],[\"iacute\",\"í\"],[\"iacute;\",\"í\"],[\"ic;\",\"⁣\"],[\"icirc\",\"î\"],[\"icirc;\",\"î\"],[\"icy;\",\"и\"],[\"iecy;\",\"е\"],[\"iexcl\",\"¡\"],[\"iexcl;\",\"¡\"],[\"iff;\",\"⇔\"],[\"ifr;\",\"𝔦\"],[\"igrave\",\"ì\"],[\"igrave;\",\"ì\"],[\"ii;\",\"ⅈ\"],[\"iiiint;\",\"⨌\"],[\"iiint;\",\"∭\"],[\"iinfin;\",\"⧜\"],[\"iiota;\",\"℩\"],[\"ijlig;\",\"ĳ\"],[\"imacr;\",\"ī\"],[\"image;\",\"ℑ\"],[\"imagline;\",\"ℐ\"],[\"imagpart;\",\"ℑ\"],[\"imath;\",\"ı\"],[\"imof;\",\"⊷\"],[\"imped;\",\"Ƶ\"],[\"in;\",\"∈\"],[\"incare;\",\"℅\"],[\"infin;\",\"∞\"],[\"infintie;\",\"⧝\"],[\"inodot;\",\"ı\"],[\"int;\",\"∫\"],[\"intcal;\",\"⊺\"],[\"integers;\",\"ℤ\"],[\"intercal;\",\"⊺\"],[\"intlarhk;\",\"⨗\"],[\"intprod;\",\"⨼\"],[\"iocy;\",\"ё\"],[\"iogon;\",\"į\"],[\"iopf;\",\"𝕚\"],[\"iota;\",\"ι\"],[\"iprod;\",\"⨼\"],[\"iquest\",\"¿\"],[\"iquest;\",\"¿\"],[\"iscr;\",\"𝒾\"],[\"isin;\",\"∈\"],[\"isinE;\",\"⋹\"],[\"isindot;\",\"⋵\"],[\"isins;\",\"⋴\"],[\"isinsv;\",\"⋳\"],[\"isinv;\",\"∈\"],[\"it;\",\"⁢\"],[\"itilde;\",\"ĩ\"],[\"iukcy;\",\"і\"],[\"iuml\",\"ï\"],[\"iuml;\",\"ï\"],[\"jcirc;\",\"ĵ\"],[\"jcy;\",\"й\"],[\"jfr;\",\"𝔧\"],[\"jmath;\",\"ȷ\"],[\"jopf;\",\"𝕛\"],[\"jscr;\",\"𝒿\"],[\"jsercy;\",\"ј\"],[\"jukcy;\",\"є\"],[\"kappa;\",\"κ\"],[\"kappav;\",\"ϰ\"],[\"kcedil;\",\"ķ\"],[\"kcy;\",\"к\"],[\"kfr;\",\"𝔨\"],[\"kgreen;\",\"ĸ\"],[\"khcy;\",\"х\"],[\"kjcy;\",\"ќ\"],[\"kopf;\",\"𝕜\"],[\"kscr;\",\"𝓀\"],[\"lAarr;\",\"⇚\"],[\"lArr;\",\"⇐\"],[\"lAtail;\",\"⤛\"],[\"lBarr;\",\"⤎\"],[\"lE;\",\"≦\"],[\"lEg;\",\"⪋\"],[\"lHar;\",\"⥢\"],[\"lacute;\",\"ĺ\"],[\"laemptyv;\",\"⦴\"],[\"lagran;\",\"ℒ\"],[\"lambda;\",\"λ\"],[\"lang;\",\"⟨\"],[\"langd;\",\"⦑\"],[\"langle;\",\"⟨\"],[\"lap;\",\"⪅\"],[\"laquo\",\"«\"],[\"laquo;\",\"«\"],[\"larr;\",\"←\"],[\"larrb;\",\"⇤\"],[\"larrbfs;\",\"⤟\"],[\"larrfs;\",\"⤝\"],[\"larrhk;\",\"↩\"],[\"larrlp;\",\"↫\"],[\"larrpl;\",\"⤹\"],[\"larrsim;\",\"⥳\"],[\"larrtl;\",\"↢\"],[\"lat;\",\"⪫\"],[\"latail;\",\"⤙\"],[\"late;\",\"⪭\"],[\"lates;\",\"⪭︀\"],[\"lbarr;\",\"⤌\"],[\"lbbrk;\",\"❲\"],[\"lbrace;\",\"{\"],[\"lbrack;\",\"[\"],[\"lbrke;\",\"⦋\"],[\"lbrksld;\",\"⦏\"],[\"lbrkslu;\",\"⦍\"],[\"lcaron;\",\"ľ\"],[\"lcedil;\",\"ļ\"],[\"lceil;\",\"⌈\"],[\"lcub;\",\"{\"],[\"lcy;\",\"л\"],[\"ldca;\",\"⤶\"],[\"ldquo;\",\"“\"],[\"ldquor;\",\"„\"],[\"ldrdhar;\",\"⥧\"],[\"ldrushar;\",\"⥋\"],[\"ldsh;\",\"↲\"],[\"le;\",\"≤\"],[\"leftarrow;\",\"←\"],[\"leftarrowtail;\",\"↢\"],[\"leftharpoondown;\",\"↽\"],[\"leftharpoonup;\",\"↼\"],[\"leftleftarrows;\",\"⇇\"],[\"leftrightarrow;\",\"↔\"],[\"leftrightarrows;\",\"⇆\"],[\"leftrightharpoons;\",\"⇋\"],[\"leftrightsquigarrow;\",\"↭\"],[\"leftthreetimes;\",\"⋋\"],[\"leg;\",\"⋚\"],[\"leq;\",\"≤\"],[\"leqq;\",\"≦\"],[\"leqslant;\",\"⩽\"],[\"les;\",\"⩽\"],[\"lescc;\",\"⪨\"],[\"lesdot;\",\"⩿\"],[\"lesdoto;\",\"⪁\"],[\"lesdotor;\",\"⪃\"],[\"lesg;\",\"⋚︀\"],[\"lesges;\",\"⪓\"],[\"lessapprox;\",\"⪅\"],[\"lessdot;\",\"⋖\"],[\"lesseqgtr;\",\"⋚\"],[\"lesseqqgtr;\",\"⪋\"],[\"lessgtr;\",\"≶\"],[\"lesssim;\",\"≲\"],[\"lfisht;\",\"⥼\"],[\"lfloor;\",\"⌊\"],[\"lfr;\",\"𝔩\"],[\"lg;\",\"≶\"],[\"lgE;\",\"⪑\"],[\"lhard;\",\"↽\"],[\"lharu;\",\"↼\"],[\"lharul;\",\"⥪\"],[\"lhblk;\",\"▄\"],[\"ljcy;\",\"љ\"],[\"ll;\",\"≪\"],[\"llarr;\",\"⇇\"],[\"llcorner;\",\"⌞\"],[\"llhard;\",\"⥫\"],[\"lltri;\",\"◺\"],[\"lmidot;\",\"ŀ\"],[\"lmoust;\",\"⎰\"],[\"lmoustache;\",\"⎰\"],[\"lnE;\",\"≨\"],[\"lnap;\",\"⪉\"],[\"lnapprox;\",\"⪉\"],[\"lne;\",\"⪇\"],[\"lneq;\",\"⪇\"],[\"lneqq;\",\"≨\"],[\"lnsim;\",\"⋦\"],[\"loang;\",\"⟬\"],[\"loarr;\",\"⇽\"],[\"lobrk;\",\"⟦\"],[\"longleftarrow;\",\"⟵\"],[\"longleftrightarrow;\",\"⟷\"],[\"longmapsto;\",\"⟼\"],[\"longrightarrow;\",\"⟶\"],[\"looparrowleft;\",\"↫\"],[\"looparrowright;\",\"↬\"],[\"lopar;\",\"⦅\"],[\"lopf;\",\"𝕝\"],[\"loplus;\",\"⨭\"],[\"lotimes;\",\"⨴\"],[\"lowast;\",\"∗\"],[\"lowbar;\",\"_\"],[\"loz;\",\"◊\"],[\"lozenge;\",\"◊\"],[\"lozf;\",\"⧫\"],[\"lpar;\",\"(\"],[\"lparlt;\",\"⦓\"],[\"lrarr;\",\"⇆\"],[\"lrcorner;\",\"⌟\"],[\"lrhar;\",\"⇋\"],[\"lrhard;\",\"⥭\"],[\"lrm;\",\"‎\"],[\"lrtri;\",\"⊿\"],[\"lsaquo;\",\"‹\"],[\"lscr;\",\"𝓁\"],[\"lsh;\",\"↰\"],[\"lsim;\",\"≲\"],[\"lsime;\",\"⪍\"],[\"lsimg;\",\"⪏\"],[\"lsqb;\",\"[\"],[\"lsquo;\",\"‘\"],[\"lsquor;\",\"‚\"],[\"lstrok;\",\"ł\"],[\"lt\",\"<\"],[\"lt;\",\"<\"],[\"ltcc;\",\"⪦\"],[\"ltcir;\",\"⩹\"],[\"ltdot;\",\"⋖\"],[\"lthree;\",\"⋋\"],[\"ltimes;\",\"⋉\"],[\"ltlarr;\",\"⥶\"],[\"ltquest;\",\"⩻\"],[\"ltrPar;\",\"⦖\"],[\"ltri;\",\"◃\"],[\"ltrie;\",\"⊴\"],[\"ltrif;\",\"◂\"],[\"lurdshar;\",\"⥊\"],[\"luruhar;\",\"⥦\"],[\"lvertneqq;\",\"≨︀\"],[\"lvnE;\",\"≨︀\"],[\"mDDot;\",\"∺\"],[\"macr\",\"¯\"],[\"macr;\",\"¯\"],[\"male;\",\"♂\"],[\"malt;\",\"✠\"],[\"maltese;\",\"✠\"],[\"map;\",\"↦\"],[\"mapsto;\",\"↦\"],[\"mapstodown;\",\"↧\"],[\"mapstoleft;\",\"↤\"],[\"mapstoup;\",\"↥\"],[\"marker;\",\"▮\"],[\"mcomma;\",\"⨩\"],[\"mcy;\",\"м\"],[\"mdash;\",\"—\"],[\"measuredangle;\",\"∡\"],[\"mfr;\",\"𝔪\"],[\"mho;\",\"℧\"],[\"micro\",\"µ\"],[\"micro;\",\"µ\"],[\"mid;\",\"∣\"],[\"midast;\",\"*\"],[\"midcir;\",\"⫰\"],[\"middot\",\"·\"],[\"middot;\",\"·\"],[\"minus;\",\"−\"],[\"minusb;\",\"⊟\"],[\"minusd;\",\"∸\"],[\"minusdu;\",\"⨪\"],[\"mlcp;\",\"⫛\"],[\"mldr;\",\"…\"],[\"mnplus;\",\"∓\"],[\"models;\",\"⊧\"],[\"mopf;\",\"𝕞\"],[\"mp;\",\"∓\"],[\"mscr;\",\"𝓂\"],[\"mstpos;\",\"∾\"],[\"mu;\",\"μ\"],[\"multimap;\",\"⊸\"],[\"mumap;\",\"⊸\"],[\"nGg;\",\"⋙̸\"],[\"nGt;\",\"≫⃒\"],[\"nGtv;\",\"≫̸\"],[\"nLeftarrow;\",\"⇍\"],[\"nLeftrightarrow;\",\"⇎\"],[\"nLl;\",\"⋘̸\"],[\"nLt;\",\"≪⃒\"],[\"nLtv;\",\"≪̸\"],[\"nRightarrow;\",\"⇏\"],[\"nVDash;\",\"⊯\"],[\"nVdash;\",\"⊮\"],[\"nabla;\",\"∇\"],[\"nacute;\",\"ń\"],[\"nang;\",\"∠⃒\"],[\"nap;\",\"≉\"],[\"napE;\",\"⩰̸\"],[\"napid;\",\"≋̸\"],[\"napos;\",\"ŉ\"],[\"napprox;\",\"≉\"],[\"natur;\",\"♮\"],[\"natural;\",\"♮\"],[\"naturals;\",\"ℕ\"],[\"nbsp\",\" \"],[\"nbsp;\",\" \"],[\"nbump;\",\"≎̸\"],[\"nbumpe;\",\"≏̸\"],[\"ncap;\",\"⩃\"],[\"ncaron;\",\"ň\"],[\"ncedil;\",\"ņ\"],[\"ncong;\",\"≇\"],[\"ncongdot;\",\"⩭̸\"],[\"ncup;\",\"⩂\"],[\"ncy;\",\"н\"],[\"ndash;\",\"–\"],[\"ne;\",\"≠\"],[\"neArr;\",\"⇗\"],[\"nearhk;\",\"⤤\"],[\"nearr;\",\"↗\"],[\"nearrow;\",\"↗\"],[\"nedot;\",\"≐̸\"],[\"nequiv;\",\"≢\"],[\"nesear;\",\"⤨\"],[\"nesim;\",\"≂̸\"],[\"nexist;\",\"∄\"],[\"nexists;\",\"∄\"],[\"nfr;\",\"𝔫\"],[\"ngE;\",\"≧̸\"],[\"nge;\",\"≱\"],[\"ngeq;\",\"≱\"],[\"ngeqq;\",\"≧̸\"],[\"ngeqslant;\",\"⩾̸\"],[\"nges;\",\"⩾̸\"],[\"ngsim;\",\"≵\"],[\"ngt;\",\"≯\"],[\"ngtr;\",\"≯\"],[\"nhArr;\",\"⇎\"],[\"nharr;\",\"↮\"],[\"nhpar;\",\"⫲\"],[\"ni;\",\"∋\"],[\"nis;\",\"⋼\"],[\"nisd;\",\"⋺\"],[\"niv;\",\"∋\"],[\"njcy;\",\"њ\"],[\"nlArr;\",\"⇍\"],[\"nlE;\",\"≦̸\"],[\"nlarr;\",\"↚\"],[\"nldr;\",\"‥\"],[\"nle;\",\"≰\"],[\"nleftarrow;\",\"↚\"],[\"nleftrightarrow;\",\"↮\"],[\"nleq;\",\"≰\"],[\"nleqq;\",\"≦̸\"],[\"nleqslant;\",\"⩽̸\"],[\"nles;\",\"⩽̸\"],[\"nless;\",\"≮\"],[\"nlsim;\",\"≴\"],[\"nlt;\",\"≮\"],[\"nltri;\",\"⋪\"],[\"nltrie;\",\"⋬\"],[\"nmid;\",\"∤\"],[\"nopf;\",\"𝕟\"],[\"not\",\"¬\"],[\"not;\",\"¬\"],[\"notin;\",\"∉\"],[\"notinE;\",\"⋹̸\"],[\"notindot;\",\"⋵̸\"],[\"notinva;\",\"∉\"],[\"notinvb;\",\"⋷\"],[\"notinvc;\",\"⋶\"],[\"notni;\",\"∌\"],[\"notniva;\",\"∌\"],[\"notnivb;\",\"⋾\"],[\"notnivc;\",\"⋽\"],[\"npar;\",\"∦\"],[\"nparallel;\",\"∦\"],[\"nparsl;\",\"⫽⃥\"],[\"npart;\",\"∂̸\"],[\"npolint;\",\"⨔\"],[\"npr;\",\"⊀\"],[\"nprcue;\",\"⋠\"],[\"npre;\",\"⪯̸\"],[\"nprec;\",\"⊀\"],[\"npreceq;\",\"⪯̸\"],[\"nrArr;\",\"⇏\"],[\"nrarr;\",\"↛\"],[\"nrarrc;\",\"⤳̸\"],[\"nrarrw;\",\"↝̸\"],[\"nrightarrow;\",\"↛\"],[\"nrtri;\",\"⋫\"],[\"nrtrie;\",\"⋭\"],[\"nsc;\",\"⊁\"],[\"nsccue;\",\"⋡\"],[\"nsce;\",\"⪰̸\"],[\"nscr;\",\"𝓃\"],[\"nshortmid;\",\"∤\"],[\"nshortparallel;\",\"∦\"],[\"nsim;\",\"≁\"],[\"nsime;\",\"≄\"],[\"nsimeq;\",\"≄\"],[\"nsmid;\",\"∤\"],[\"nspar;\",\"∦\"],[\"nsqsube;\",\"⋢\"],[\"nsqsupe;\",\"⋣\"],[\"nsub;\",\"⊄\"],[\"nsubE;\",\"⫅̸\"],[\"nsube;\",\"⊈\"],[\"nsubset;\",\"⊂⃒\"],[\"nsubseteq;\",\"⊈\"],[\"nsubseteqq;\",\"⫅̸\"],[\"nsucc;\",\"⊁\"],[\"nsucceq;\",\"⪰̸\"],[\"nsup;\",\"⊅\"],[\"nsupE;\",\"⫆̸\"],[\"nsupe;\",\"⊉\"],[\"nsupset;\",\"⊃⃒\"],[\"nsupseteq;\",\"⊉\"],[\"nsupseteqq;\",\"⫆̸\"],[\"ntgl;\",\"≹\"],[\"ntilde\",\"ñ\"],[\"ntilde;\",\"ñ\"],[\"ntlg;\",\"≸\"],[\"ntriangleleft;\",\"⋪\"],[\"ntrianglelefteq;\",\"⋬\"],[\"ntriangleright;\",\"⋫\"],[\"ntrianglerighteq;\",\"⋭\"],[\"nu;\",\"ν\"],[\"num;\",\"#\"],[\"numero;\",\"№\"],[\"numsp;\",\" \"],[\"nvDash;\",\"⊭\"],[\"nvHarr;\",\"⤄\"],[\"nvap;\",\"≍⃒\"],[\"nvdash;\",\"⊬\"],[\"nvge;\",\"≥⃒\"],[\"nvgt;\",\">⃒\"],[\"nvinfin;\",\"⧞\"],[\"nvlArr;\",\"⤂\"],[\"nvle;\",\"≤⃒\"],[\"nvlt;\",\"<⃒\"],[\"nvltrie;\",\"⊴⃒\"],[\"nvrArr;\",\"⤃\"],[\"nvrtrie;\",\"⊵⃒\"],[\"nvsim;\",\"∼⃒\"],[\"nwArr;\",\"⇖\"],[\"nwarhk;\",\"⤣\"],[\"nwarr;\",\"↖\"],[\"nwarrow;\",\"↖\"],[\"nwnear;\",\"⤧\"],[\"oS;\",\"Ⓢ\"],[\"oacute\",\"ó\"],[\"oacute;\",\"ó\"],[\"oast;\",\"⊛\"],[\"ocir;\",\"⊚\"],[\"ocirc\",\"ô\"],[\"ocirc;\",\"ô\"],[\"ocy;\",\"о\"],[\"odash;\",\"⊝\"],[\"odblac;\",\"ő\"],[\"odiv;\",\"⨸\"],[\"odot;\",\"⊙\"],[\"odsold;\",\"⦼\"],[\"oelig;\",\"œ\"],[\"ofcir;\",\"⦿\"],[\"ofr;\",\"𝔬\"],[\"ogon;\",\"˛\"],[\"ograve\",\"ò\"],[\"ograve;\",\"ò\"],[\"ogt;\",\"⧁\"],[\"ohbar;\",\"⦵\"],[\"ohm;\",\"Ω\"],[\"oint;\",\"∮\"],[\"olarr;\",\"↺\"],[\"olcir;\",\"⦾\"],[\"olcross;\",\"⦻\"],[\"oline;\",\"‾\"],[\"olt;\",\"⧀\"],[\"omacr;\",\"ō\"],[\"omega;\",\"ω\"],[\"omicron;\",\"ο\"],[\"omid;\",\"⦶\"],[\"ominus;\",\"⊖\"],[\"oopf;\",\"𝕠\"],[\"opar;\",\"⦷\"],[\"operp;\",\"⦹\"],[\"oplus;\",\"⊕\"],[\"or;\",\"∨\"],[\"orarr;\",\"↻\"],[\"ord;\",\"⩝\"],[\"order;\",\"ℴ\"],[\"orderof;\",\"ℴ\"],[\"ordf\",\"ª\"],[\"ordf;\",\"ª\"],[\"ordm\",\"º\"],[\"ordm;\",\"º\"],[\"origof;\",\"⊶\"],[\"oror;\",\"⩖\"],[\"orslope;\",\"⩗\"],[\"orv;\",\"⩛\"],[\"oscr;\",\"ℴ\"],[\"oslash\",\"ø\"],[\"oslash;\",\"ø\"],[\"osol;\",\"⊘\"],[\"otilde\",\"õ\"],[\"otilde;\",\"õ\"],[\"otimes;\",\"⊗\"],[\"otimesas;\",\"⨶\"],[\"ouml\",\"ö\"],[\"ouml;\",\"ö\"],[\"ovbar;\",\"⌽\"],[\"par;\",\"∥\"],[\"para\",\"¶\"],[\"para;\",\"¶\"],[\"parallel;\",\"∥\"],[\"parsim;\",\"⫳\"],[\"parsl;\",\"⫽\"],[\"part;\",\"∂\"],[\"pcy;\",\"п\"],[\"percnt;\",\"%\"],[\"period;\",\".\"],[\"permil;\",\"‰\"],[\"perp;\",\"⊥\"],[\"pertenk;\",\"‱\"],[\"pfr;\",\"𝔭\"],[\"phi;\",\"φ\"],[\"phiv;\",\"ϕ\"],[\"phmmat;\",\"ℳ\"],[\"phone;\",\"☎\"],[\"pi;\",\"π\"],[\"pitchfork;\",\"⋔\"],[\"piv;\",\"ϖ\"],[\"planck;\",\"ℏ\"],[\"planckh;\",\"ℎ\"],[\"plankv;\",\"ℏ\"],[\"plus;\",\"+\"],[\"plusacir;\",\"⨣\"],[\"plusb;\",\"⊞\"],[\"pluscir;\",\"⨢\"],[\"plusdo;\",\"∔\"],[\"plusdu;\",\"⨥\"],[\"pluse;\",\"⩲\"],[\"plusmn\",\"±\"],[\"plusmn;\",\"±\"],[\"plussim;\",\"⨦\"],[\"plustwo;\",\"⨧\"],[\"pm;\",\"±\"],[\"pointint;\",\"⨕\"],[\"popf;\",\"𝕡\"],[\"pound\",\"£\"],[\"pound;\",\"£\"],[\"pr;\",\"≺\"],[\"prE;\",\"⪳\"],[\"prap;\",\"⪷\"],[\"prcue;\",\"≼\"],[\"pre;\",\"⪯\"],[\"prec;\",\"≺\"],[\"precapprox;\",\"⪷\"],[\"preccurlyeq;\",\"≼\"],[\"preceq;\",\"⪯\"],[\"precnapprox;\",\"⪹\"],[\"precneqq;\",\"⪵\"],[\"precnsim;\",\"⋨\"],[\"precsim;\",\"≾\"],[\"prime;\",\"′\"],[\"primes;\",\"ℙ\"],[\"prnE;\",\"⪵\"],[\"prnap;\",\"⪹\"],[\"prnsim;\",\"⋨\"],[\"prod;\",\"∏\"],[\"profalar;\",\"⌮\"],[\"profline;\",\"⌒\"],[\"profsurf;\",\"⌓\"],[\"prop;\",\"∝\"],[\"propto;\",\"∝\"],[\"prsim;\",\"≾\"],[\"prurel;\",\"⊰\"],[\"pscr;\",\"𝓅\"],[\"psi;\",\"ψ\"],[\"puncsp;\",\" \"],[\"qfr;\",\"𝔮\"],[\"qint;\",\"⨌\"],[\"qopf;\",\"𝕢\"],[\"qprime;\",\"⁗\"],[\"qscr;\",\"𝓆\"],[\"quaternions;\",\"ℍ\"],[\"quatint;\",\"⨖\"],[\"quest;\",\"?\"],[\"questeq;\",\"≟\"],[\"quot\",\"\\\\\"\"],[\"quot;\",\"\\\\\"\"],[\"rAarr;\",\"⇛\"],[\"rArr;\",\"⇒\"],[\"rAtail;\",\"⤜\"],[\"rBarr;\",\"⤏\"],[\"rHar;\",\"⥤\"],[\"race;\",\"∽̱\"],[\"racute;\",\"ŕ\"],[\"radic;\",\"√\"],[\"raemptyv;\",\"⦳\"],[\"rang;\",\"⟩\"],[\"rangd;\",\"⦒\"],[\"range;\",\"⦥\"],[\"rangle;\",\"⟩\"],[\"raquo\",\"»\"],[\"raquo;\",\"»\"],[\"rarr;\",\"→\"],[\"rarrap;\",\"⥵\"],[\"rarrb;\",\"⇥\"],[\"rarrbfs;\",\"⤠\"],[\"rarrc;\",\"⤳\"],[\"rarrfs;\",\"⤞\"],[\"rarrhk;\",\"↪\"],[\"rarrlp;\",\"↬\"],[\"rarrpl;\",\"⥅\"],[\"rarrsim;\",\"⥴\"],[\"rarrtl;\",\"↣\"],[\"rarrw;\",\"↝\"],[\"ratail;\",\"⤚\"],[\"ratio;\",\"∶\"],[\"rationals;\",\"ℚ\"],[\"rbarr;\",\"⤍\"],[\"rbbrk;\",\"❳\"],[\"rbrace;\",\"}\"],[\"rbrack;\",\"]\"],[\"rbrke;\",\"⦌\"],[\"rbrksld;\",\"⦎\"],[\"rbrkslu;\",\"⦐\"],[\"rcaron;\",\"ř\"],[\"rcedil;\",\"ŗ\"],[\"rceil;\",\"⌉\"],[\"rcub;\",\"}\"],[\"rcy;\",\"р\"],[\"rdca;\",\"⤷\"],[\"rdldhar;\",\"⥩\"],[\"rdquo;\",\"”\"],[\"rdquor;\",\"”\"],[\"rdsh;\",\"↳\"],[\"real;\",\"ℜ\"],[\"realine;\",\"ℛ\"],[\"realpart;\",\"ℜ\"],[\"reals;\",\"ℝ\"],[\"rect;\",\"▭\"],[\"reg\",\"®\"],[\"reg;\",\"®\"],[\"rfisht;\",\"⥽\"],[\"rfloor;\",\"⌋\"],[\"rfr;\",\"𝔯\"],[\"rhard;\",\"⇁\"],[\"rharu;\",\"⇀\"],[\"rharul;\",\"⥬\"],[\"rho;\",\"ρ\"],[\"rhov;\",\"ϱ\"],[\"rightarrow;\",\"→\"],[\"rightarrowtail;\",\"↣\"],[\"rightharpoondown;\",\"⇁\"],[\"rightharpoonup;\",\"⇀\"],[\"rightleftarrows;\",\"⇄\"],[\"rightleftharpoons;\",\"⇌\"],[\"rightrightarrows;\",\"⇉\"],[\"rightsquigarrow;\",\"↝\"],[\"rightthreetimes;\",\"⋌\"],[\"ring;\",\"˚\"],[\"risingdotseq;\",\"≓\"],[\"rlarr;\",\"⇄\"],[\"rlhar;\",\"⇌\"],[\"rlm;\",\"‏\"],[\"rmoust;\",\"⎱\"],[\"rmoustache;\",\"⎱\"],[\"rnmid;\",\"⫮\"],[\"roang;\",\"⟭\"],[\"roarr;\",\"⇾\"],[\"robrk;\",\"⟧\"],[\"ropar;\",\"⦆\"],[\"ropf;\",\"𝕣\"],[\"roplus;\",\"⨮\"],[\"rotimes;\",\"⨵\"],[\"rpar;\",\")\"],[\"rpargt;\",\"⦔\"],[\"rppolint;\",\"⨒\"],[\"rrarr;\",\"⇉\"],[\"rsaquo;\",\"›\"],[\"rscr;\",\"𝓇\"],[\"rsh;\",\"↱\"],[\"rsqb;\",\"]\"],[\"rsquo;\",\"’\"],[\"rsquor;\",\"’\"],[\"rthree;\",\"⋌\"],[\"rtimes;\",\"⋊\"],[\"rtri;\",\"▹\"],[\"rtrie;\",\"⊵\"],[\"rtrif;\",\"▸\"],[\"rtriltri;\",\"⧎\"],[\"ruluhar;\",\"⥨\"],[\"rx;\",\"℞\"],[\"sacute;\",\"ś\"],[\"sbquo;\",\"‚\"],[\"sc;\",\"≻\"],[\"scE;\",\"⪴\"],[\"scap;\",\"⪸\"],[\"scaron;\",\"š\"],[\"sccue;\",\"≽\"],[\"sce;\",\"⪰\"],[\"scedil;\",\"ş\"],[\"scirc;\",\"ŝ\"],[\"scnE;\",\"⪶\"],[\"scnap;\",\"⪺\"],[\"scnsim;\",\"⋩\"],[\"scpolint;\",\"⨓\"],[\"scsim;\",\"≿\"],[\"scy;\",\"с\"],[\"sdot;\",\"⋅\"],[\"sdotb;\",\"⊡\"],[\"sdote;\",\"⩦\"],[\"seArr;\",\"⇘\"],[\"searhk;\",\"⤥\"],[\"searr;\",\"↘\"],[\"searrow;\",\"↘\"],[\"sect\",\"§\"],[\"sect;\",\"§\"],[\"semi;\",\";\"],[\"seswar;\",\"⤩\"],[\"setminus;\",\"∖\"],[\"setmn;\",\"∖\"],[\"sext;\",\"✶\"],[\"sfr;\",\"𝔰\"],[\"sfrown;\",\"⌢\"],[\"sharp;\",\"♯\"],[\"shchcy;\",\"щ\"],[\"shcy;\",\"ш\"],[\"shortmid;\",\"∣\"],[\"shortparallel;\",\"∥\"],[\"shy\",\"­\"],[\"shy;\",\"­\"],[\"sigma;\",\"σ\"],[\"sigmaf;\",\"ς\"],[\"sigmav;\",\"ς\"],[\"sim;\",\"∼\"],[\"simdot;\",\"⩪\"],[\"sime;\",\"≃\"],[\"simeq;\",\"≃\"],[\"simg;\",\"⪞\"],[\"simgE;\",\"⪠\"],[\"siml;\",\"⪝\"],[\"simlE;\",\"⪟\"],[\"simne;\",\"≆\"],[\"simplus;\",\"⨤\"],[\"simrarr;\",\"⥲\"],[\"slarr;\",\"←\"],[\"smallsetminus;\",\"∖\"],[\"smashp;\",\"⨳\"],[\"smeparsl;\",\"⧤\"],[\"smid;\",\"∣\"],[\"smile;\",\"⌣\"],[\"smt;\",\"⪪\"],[\"smte;\",\"⪬\"],[\"smtes;\",\"⪬︀\"],[\"softcy;\",\"ь\"],[\"sol;\",\"/\"],[\"solb;\",\"⧄\"],[\"solbar;\",\"⌿\"],[\"sopf;\",\"𝕤\"],[\"spades;\",\"♠\"],[\"spadesuit;\",\"♠\"],[\"spar;\",\"∥\"],[\"sqcap;\",\"⊓\"],[\"sqcaps;\",\"⊓︀\"],[\"sqcup;\",\"⊔\"],[\"sqcups;\",\"⊔︀\"],[\"sqsub;\",\"⊏\"],[\"sqsube;\",\"⊑\"],[\"sqsubset;\",\"⊏\"],[\"sqsubseteq;\",\"⊑\"],[\"sqsup;\",\"⊐\"],[\"sqsupe;\",\"⊒\"],[\"sqsupset;\",\"⊐\"],[\"sqsupseteq;\",\"⊒\"],[\"squ;\",\"□\"],[\"square;\",\"□\"],[\"squarf;\",\"▪\"],[\"squf;\",\"▪\"],[\"srarr;\",\"→\"],[\"sscr;\",\"𝓈\"],[\"ssetmn;\",\"∖\"],[\"ssmile;\",\"⌣\"],[\"sstarf;\",\"⋆\"],[\"star;\",\"☆\"],[\"starf;\",\"★\"],[\"straightepsilon;\",\"ϵ\"],[\"straightphi;\",\"ϕ\"],[\"strns;\",\"¯\"],[\"sub;\",\"⊂\"],[\"subE;\",\"⫅\"],[\"subdot;\",\"⪽\"],[\"sube;\",\"⊆\"],[\"subedot;\",\"⫃\"],[\"submult;\",\"⫁\"],[\"subnE;\",\"⫋\"],[\"subne;\",\"⊊\"],[\"subplus;\",\"⪿\"],[\"subrarr;\",\"⥹\"],[\"subset;\",\"⊂\"],[\"subseteq;\",\"⊆\"],[\"subseteqq;\",\"⫅\"],[\"subsetneq;\",\"⊊\"],[\"subsetneqq;\",\"⫋\"],[\"subsim;\",\"⫇\"],[\"subsub;\",\"⫕\"],[\"subsup;\",\"⫓\"],[\"succ;\",\"≻\"],[\"succapprox;\",\"⪸\"],[\"succcurlyeq;\",\"≽\"],[\"succeq;\",\"⪰\"],[\"succnapprox;\",\"⪺\"],[\"succneqq;\",\"⪶\"],[\"succnsim;\",\"⋩\"],[\"succsim;\",\"≿\"],[\"sum;\",\"∑\"],[\"sung;\",\"♪\"],[\"sup1\",\"¹\"],[\"sup1;\",\"¹\"],[\"sup2\",\"²\"],[\"sup2;\",\"²\"],[\"sup3\",\"³\"],[\"sup3;\",\"³\"],[\"sup;\",\"⊃\"],[\"supE;\",\"⫆\"],[\"supdot;\",\"⪾\"],[\"supdsub;\",\"⫘\"],[\"supe;\",\"⊇\"],[\"supedot;\",\"⫄\"],[\"suphsol;\",\"⟉\"],[\"suphsub;\",\"⫗\"],[\"suplarr;\",\"⥻\"],[\"supmult;\",\"⫂\"],[\"supnE;\",\"⫌\"],[\"supne;\",\"⊋\"],[\"supplus;\",\"⫀\"],[\"supset;\",\"⊃\"],[\"supseteq;\",\"⊇\"],[\"supseteqq;\",\"⫆\"],[\"supsetneq;\",\"⊋\"],[\"supsetneqq;\",\"⫌\"],[\"supsim;\",\"⫈\"],[\"supsub;\",\"⫔\"],[\"supsup;\",\"⫖\"],[\"swArr;\",\"⇙\"],[\"swarhk;\",\"⤦\"],[\"swarr;\",\"↙\"],[\"swarrow;\",\"↙\"],[\"swnwar;\",\"⤪\"],[\"szlig\",\"ß\"],[\"szlig;\",\"ß\"],[\"target;\",\"⌖\"],[\"tau;\",\"τ\"],[\"tbrk;\",\"⎴\"],[\"tcaron;\",\"ť\"],[\"tcedil;\",\"ţ\"],[\"tcy;\",\"т\"],[\"tdot;\",\"⃛\"],[\"telrec;\",\"⌕\"],[\"tfr;\",\"𝔱\"],[\"there4;\",\"∴\"],[\"therefore;\",\"∴\"],[\"theta;\",\"θ\"],[\"thetasym;\",\"ϑ\"],[\"thetav;\",\"ϑ\"],[\"thickapprox;\",\"≈\"],[\"thicksim;\",\"∼\"],[\"thinsp;\",\" \"],[\"thkap;\",\"≈\"],[\"thksim;\",\"∼\"],[\"thorn\",\"þ\"],[\"thorn;\",\"þ\"],[\"tilde;\",\"˜\"],[\"times\",\"×\"],[\"times;\",\"×\"],[\"timesb;\",\"⊠\"],[\"timesbar;\",\"⨱\"],[\"timesd;\",\"⨰\"],[\"tint;\",\"∭\"],[\"toea;\",\"⤨\"],[\"top;\",\"⊤\"],[\"topbot;\",\"⌶\"],[\"topcir;\",\"⫱\"],[\"topf;\",\"𝕥\"],[\"topfork;\",\"⫚\"],[\"tosa;\",\"⤩\"],[\"tprime;\",\"‴\"],[\"trade;\",\"™\"],[\"triangle;\",\"▵\"],[\"triangledown;\",\"▿\"],[\"triangleleft;\",\"◃\"],[\"trianglelefteq;\",\"⊴\"],[\"triangleq;\",\"≜\"],[\"triangleright;\",\"▹\"],[\"trianglerighteq;\",\"⊵\"],[\"tridot;\",\"◬\"],[\"trie;\",\"≜\"],[\"triminus;\",\"⨺\"],[\"triplus;\",\"⨹\"],[\"trisb;\",\"⧍\"],[\"tritime;\",\"⨻\"],[\"trpezium;\",\"⏢\"],[\"tscr;\",\"𝓉\"],[\"tscy;\",\"ц\"],[\"tshcy;\",\"ћ\"],[\"tstrok;\",\"ŧ\"],[\"twixt;\",\"≬\"],[\"twoheadleftarrow;\",\"↞\"],[\"twoheadrightarrow;\",\"↠\"],[\"uArr;\",\"⇑\"],[\"uHar;\",\"⥣\"],[\"uacute\",\"ú\"],[\"uacute;\",\"ú\"],[\"uarr;\",\"↑\"],[\"ubrcy;\",\"ў\"],[\"ubreve;\",\"ŭ\"],[\"ucirc\",\"û\"],[\"ucirc;\",\"û\"],[\"ucy;\",\"у\"],[\"udarr;\",\"⇅\"],[\"udblac;\",\"ű\"],[\"udhar;\",\"⥮\"],[\"ufisht;\",\"⥾\"],[\"ufr;\",\"𝔲\"],[\"ugrave\",\"ù\"],[\"ugrave;\",\"ù\"],[\"uharl;\",\"↿\"],[\"uharr;\",\"↾\"],[\"uhblk;\",\"▀\"],[\"ulcorn;\",\"⌜\"],[\"ulcorner;\",\"⌜\"],[\"ulcrop;\",\"⌏\"],[\"ultri;\",\"◸\"],[\"umacr;\",\"ū\"],[\"uml\",\"¨\"],[\"uml;\",\"¨\"],[\"uogon;\",\"ų\"],[\"uopf;\",\"𝕦\"],[\"uparrow;\",\"↑\"],[\"updownarrow;\",\"↕\"],[\"upharpoonleft;\",\"↿\"],[\"upharpoonright;\",\"↾\"],[\"uplus;\",\"⊎\"],[\"upsi;\",\"υ\"],[\"upsih;\",\"ϒ\"],[\"upsilon;\",\"υ\"],[\"upuparrows;\",\"⇈\"],[\"urcorn;\",\"⌝\"],[\"urcorner;\",\"⌝\"],[\"urcrop;\",\"⌎\"],[\"uring;\",\"ů\"],[\"urtri;\",\"◹\"],[\"uscr;\",\"𝓊\"],[\"utdot;\",\"⋰\"],[\"utilde;\",\"ũ\"],[\"utri;\",\"▵\"],[\"utrif;\",\"▴\"],[\"uuarr;\",\"⇈\"],[\"uuml\",\"ü\"],[\"uuml;\",\"ü\"],[\"uwangle;\",\"⦧\"],[\"vArr;\",\"⇕\"],[\"vBar;\",\"⫨\"],[\"vBarv;\",\"⫩\"],[\"vDash;\",\"⊨\"],[\"vangrt;\",\"⦜\"],[\"varepsilon;\",\"ϵ\"],[\"varkappa;\",\"ϰ\"],[\"varnothing;\",\"∅\"],[\"varphi;\",\"ϕ\"],[\"varpi;\",\"ϖ\"],[\"varpropto;\",\"∝\"],[\"varr;\",\"↕\"],[\"varrho;\",\"ϱ\"],[\"varsigma;\",\"ς\"],[\"varsubsetneq;\",\"⊊︀\"],[\"varsubsetneqq;\",\"⫋︀\"],[\"varsupsetneq;\",\"⊋︀\"],[\"varsupsetneqq;\",\"⫌︀\"],[\"vartheta;\",\"ϑ\"],[\"vartriangleleft;\",\"⊲\"],[\"vartriangleright;\",\"⊳\"],[\"vcy;\",\"в\"],[\"vdash;\",\"⊢\"],[\"vee;\",\"∨\"],[\"veebar;\",\"⊻\"],[\"veeeq;\",\"≚\"],[\"vellip;\",\"⋮\"],[\"verbar;\",\"|\"],[\"vert;\",\"|\"],[\"vfr;\",\"𝔳\"],[\"vltri;\",\"⊲\"],[\"vnsub;\",\"⊂⃒\"],[\"vnsup;\",\"⊃⃒\"],[\"vopf;\",\"𝕧\"],[\"vprop;\",\"∝\"],[\"vrtri;\",\"⊳\"],[\"vscr;\",\"𝓋\"],[\"vsubnE;\",\"⫋︀\"],[\"vsubne;\",\"⊊︀\"],[\"vsupnE;\",\"⫌︀\"],[\"vsupne;\",\"⊋︀\"],[\"vzigzag;\",\"⦚\"],[\"wcirc;\",\"ŵ\"],[\"wedbar;\",\"⩟\"],[\"wedge;\",\"∧\"],[\"wedgeq;\",\"≙\"],[\"weierp;\",\"℘\"],[\"wfr;\",\"𝔴\"],[\"wopf;\",\"𝕨\"],[\"wp;\",\"℘\"],[\"wr;\",\"≀\"],[\"wreath;\",\"≀\"],[\"wscr;\",\"𝓌\"],[\"xcap;\",\"⋂\"],[\"xcirc;\",\"◯\"],[\"xcup;\",\"⋃\"],[\"xdtri;\",\"▽\"],[\"xfr;\",\"𝔵\"],[\"xhArr;\",\"⟺\"],[\"xharr;\",\"⟷\"],[\"xi;\",\"ξ\"],[\"xlArr;\",\"⟸\"],[\"xlarr;\",\"⟵\"],[\"xmap;\",\"⟼\"],[\"xnis;\",\"⋻\"],[\"xodot;\",\"⨀\"],[\"xopf;\",\"𝕩\"],[\"xoplus;\",\"⨁\"],[\"xotime;\",\"⨂\"],[\"xrArr;\",\"⟹\"],[\"xrarr;\",\"⟶\"],[\"xscr;\",\"𝓍\"],[\"xsqcup;\",\"⨆\"],[\"xuplus;\",\"⨄\"],[\"xutri;\",\"△\"],[\"xvee;\",\"⋁\"],[\"xwedge;\",\"⋀\"],[\"yacute\",\"ý\"],[\"yacute;\",\"ý\"],[\"yacy;\",\"я\"],[\"ycirc;\",\"ŷ\"],[\"ycy;\",\"ы\"],[\"yen\",\"¥\"],[\"yen;\",\"¥\"],[\"yfr;\",\"𝔶\"],[\"yicy;\",\"ї\"],[\"yopf;\",\"𝕪\"],[\"yscr;\",\"𝓎\"],[\"yucy;\",\"ю\"],[\"yuml\",\"ÿ\"],[\"yuml;\",\"ÿ\"],[\"zacute;\",\"ź\"],[\"zcaron;\",\"ž\"],[\"zcy;\",\"з\"],[\"zdot;\",\"ż\"],[\"zeetrf;\",\"ℨ\"],[\"zeta;\",\"ζ\"],[\"zfr;\",\"𝔷\"],[\"zhcy;\",\"ж\"],[\"zigrarr;\",\"⇝\"],[\"zopf;\",\"𝕫\"],[\"zscr;\",\"𝓏\"],[\"zwj;\",\"‍\"],[\"zwnj;\",\"‌\"]]'\n));\n/** Longest named-reference key length (for bounding the match scan). */\nexport const MAX_NAMED_REF_LEN = 32;\n","/**\n * WHATWG HTML tokenizer (single pass) — `.` main engine.\n *\n * Implements the tokenization stage of https://html.spec.whatwg.org/#tokenization\n * Verified against the vendored html5lib-tests tokenizer suite\n * (test/main/tokenizer.test.ts). Tree construction (the other half of a\n * browser-faithful parser) drives the content-model state from outside via\n * `setState()` — exactly as the spec's tree-construction stage does.\n *\n * Parse errors are intentionally not surfaced as tokens: a sanitizer cares about\n * the token *stream* the browser would build, not error reporting. Character\n * tokens are emitted per run; the conformance harness coalesces before comparing.\n *\n * NOT YET IMPLEMENTED (rare; tracked by the harness ratchet): script-data\n * escaped / double-escaped states. Everything else (incl. RCDATA/RAWTEXT/\n * PLAINTEXT/CDATA, full comment + DOCTYPE machinery, named/numeric character\n * references) is here.\n */\nimport { NAMED_REFS, MAX_NAMED_REF_LEN } from './entities';\n\nexport interface Doctype {\n  type: 'doctype';\n  name: string | null;\n  publicId: string | null;\n  systemId: string | null;\n  forceQuirks: boolean;\n}\nexport interface TagToken {\n  type: 'startTag' | 'endTag';\n  name: string;\n  attrs: Array<[string, string]>;\n  selfClosing: boolean;\n}\nexport interface CommentToken {\n  type: 'comment';\n  data: string;\n}\nexport interface CharacterToken {\n  type: 'character';\n  data: string;\n}\nexport interface EofToken {\n  type: 'eof';\n}\nexport type Token = Doctype | TagToken | CommentToken | CharacterToken | EofToken;\n\n/** Content-model states the tree builder can switch the tokenizer into. */\nexport type ContentState = 'data' | 'rcdata' | 'rawtext' | 'scriptData' | 'plaintext' | 'cdata';\n\n// Internal state ids ---------------------------------------------------------\nconst S = {\n  Data: 0, RCDATA: 1, RAWTEXT: 2, ScriptData: 3, PLAINTEXT: 4,\n  TagOpen: 5, EndTagOpen: 6, TagName: 7,\n  RCDATALt: 8, RCDATAEndTagOpen: 9, RCDATAEndTagName: 10,\n  RAWTEXTLt: 11, RAWTEXTEndTagOpen: 12, RAWTEXTEndTagName: 13,\n  ScriptLt: 14, ScriptEndTagOpen: 15, ScriptEndTagName: 16,\n  BeforeAttrName: 17, AttrName: 18, AfterAttrName: 19, BeforeAttrValue: 20,\n  AttrValueDq: 21, AttrValueSq: 22, AttrValueUq: 23, AfterAttrValueQuoted: 24,\n  SelfClosing: 25, BogusComment: 26, MarkupDeclOpen: 27,\n  CommentStart: 28, CommentStartDash: 29, Comment: 30,\n  CommentEndDash: 31, CommentEnd: 32, CommentEndBang: 33,\n  Doctype: 34, BeforeDoctypeName: 35, DoctypeName: 36, AfterDoctypeName: 37,\n  AfterDoctypePublicKw: 38, BeforeDoctypePublicId: 39, DoctypePublicIdDq: 40,\n  DoctypePublicIdSq: 41, AfterDoctypePublicId: 42, BetweenDoctypePublicSystem: 43,\n  AfterDoctypeSystemKw: 44, BeforeDoctypeSystemId: 45, DoctypeSystemIdDq: 46,\n  DoctypeSystemIdSq: 47, AfterDoctypeSystemId: 48, BogusDoctype: 49,\n  CdataSection: 50, CdataSectionBracket: 51, CdataSectionEnd: 52,\n  CharRef: 53, NamedCharRef: 54, AmbiguousAmp: 55, NumericCharRef: 56,\n  HexStart: 57, DecStart: 58, HexRef: 59, DecRef: 60, NumericEnd: 61,\n  ScriptEscapeStart: 62, ScriptEscapeStartDash: 63, ScriptEscaped: 64,\n  ScriptEscapedDash: 65, ScriptEscapedDashDash: 66, ScriptEscapedLt: 67,\n  ScriptEscapedEndTagOpen: 68, ScriptEscapedEndTagName: 69, ScriptDoubleEscapeStart: 70,\n  ScriptDoubleEscaped: 71, ScriptDoubleEscapedDash: 72, ScriptDoubleEscapedDashDash: 73,\n  ScriptDoubleEscapedLt: 74, ScriptDoubleEscapeEnd: 75\n} as const;\n\nconst REPLACEMENT = '�';\nconst C1: Record<number, number> = {\n  0x80: 0x20ac, 0x82: 0x201a, 0x83: 0x0192, 0x84: 0x201e, 0x85: 0x2026,\n  0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02c6, 0x89: 0x2030, 0x8a: 0x0160,\n  0x8b: 0x2039, 0x8c: 0x0152, 0x8e: 0x017d, 0x91: 0x2018, 0x92: 0x2019,\n  0x93: 0x201c, 0x94: 0x201d, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014,\n  0x98: 0x02dc, 0x99: 0x2122, 0x9a: 0x0161, 0x9b: 0x203a, 0x9c: 0x0153,\n  0x9e: 0x017e, 0x9f: 0x0178\n};\n\nconst isWs = (c: number) => c === 0x09 || c === 0x0a || c === 0x0c || c === 0x20;\nconst isAsciiAlpha = (c: number) =>\n  (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a);\nconst isAsciiAlnum = (c: number) =>\n  isAsciiAlpha(c) || (c >= 0x30 && c <= 0x39);\nconst isHexDigit = (c: number) =>\n  (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);\nconst toLowerCh = (c: number) => (c >= 0x41 && c <= 0x5a ? c + 0x20 : c);\n// ASCII-lowercase a tag/attr-name run that the scanner already KNOWS contains an\n// uppercase letter (the scan tracks it, so we skip a redundant detection pass).\n// Spec lowercasing is ASCII-only — must NOT use String.prototype.toLowerCase.\nconst ASCII_UPPER_G = /[A-Z]/g;\nconst foldAsciiUpper = (s: string): string =>\n  s.replace(ASCII_UPPER_G, (m) => String.fromCharCode(m.charCodeAt(0) | 0x20));\n\n// Named-character-reference TRIE (built once from the table). Walking it by code\n// unit avoids the old greedy approach's growing-string rebuild + re-hash on every\n// character — the big win on entity-heavy input. (Built at load; ~13k inserts.)\ninterface EntityNode { v?: string; next: Map<number, EntityNode>; }\nconst ENTITY_TRIE: EntityNode = /*#__PURE__*/ (() => {\n  const root: EntityNode = { next: new Map() };\n  for (const [name, value] of NAMED_REFS) {\n    let node = root;\n    for (let i = 0; i < name.length; i++) {\n      const cc = name.charCodeAt(i);\n      let child = node.next.get(cc);\n      if (child === undefined) { child = { next: new Map() }; node.next.set(cc, child); }\n      node = child;\n    }\n    node.v = value;\n  }\n  return root;\n})();\n\nconst STATE_FROM_CONTENT: Record<ContentState, number> = {\n  data: S.Data, rcdata: S.RCDATA, rawtext: S.RAWTEXT,\n  scriptData: S.ScriptData, plaintext: S.PLAINTEXT, cdata: S.CdataSection\n};\n\nexport interface TokenizeOptions {\n  state?: ContentState;\n  /** Appropriate end-tag name, for RCDATA/RAWTEXT/script end-tag matching. */\n  lastStartTag?: string;\n}\n\nexport class Tokenizer {\n  private readonly input: string;\n  private readonly len: number;\n  private i = 0;\n  private state: number;\n  private returnState: number = S.Data;\n  // Emit queue. A single `step()` emits at most two tokens (a buffered text run\n  // flushed ahead of a tag/comment/doctype), so two slots replace an array+shift\n  // on the hot path. `e0` is the next token out; `e1` is the carry.\n  private e0: Token | null = null;\n  private e1: Token | null = null;\n  private done = false;\n  private foreignFlag = false;\n  private lastStartTag: string;\n\n  // current token scratch\n  private tagName = '';\n  private tagIsEnd = false;\n  private tagSelfClosing = false;\n  private attrs: Array<[string, string]> = [];\n  private attrName = '';\n  private attrValue = '';\n  private comment = '';\n  private dn: string | null = null; // doctype name\n  private dpub: string | null = null;\n  private dsys: string | null = null;\n  private dquirks = false;\n  private tempBuf = '';\n  private charBuf = '';\n  private charRefCode = 0;\n  // Reused token objects: the tree builder pulls one token at a time and consumes\n  // it (keeping only its strings/attrs array, never the wrapper) before pulling the\n  // next, so we mutate-and-reuse instead of allocating a wrapper per token. The\n  // batch `tokenize()` (test/conformance only) clones, since it retains every token.\n  private readonly rtag: TagToken = { type: 'startTag', name: '', attrs: [], selfClosing: false };\n  private readonly rchar: CharacterToken = { type: 'character', data: '' };\n\n  constructor(input: string, opts: TokenizeOptions) {\n    // WHATWG input-stream preprocessing: normalize CR and CRLF to LF.\n    const normalized = input.indexOf('\\r') === -1 ? input : input.replace(/\\r\\n?/g, '\\n');\n    this.input = normalized;\n    this.len = normalized.length;\n    this.state = STATE_FROM_CONTENT[opts.state ?? 'data'];\n    this.lastStartTag = opts.lastStartTag ?? '';\n  }\n\n  /**\n   * Pull one token. Returns null at end of input. The tree builder calls this in\n   * a loop, switching the content-model state (`setContentState`) between pulls —\n   * exactly the tokenizer↔tree-construction coupling the WHATWG spec requires.\n   */\n  nextToken(): Token | null {\n    while (this.e0 === null && !this.done) {\n      const eof = this.i >= this.len;\n      const c = eof ? -1 : this.input.charCodeAt(this.i);\n      if (!this.step(c, eof)) {\n        this.done = true;\n        this.flushChars();\n        this.push({ type: 'eof' }); // explicit EOF so the tree builder finalizes\n      }\n    }\n    const t = this.e0;\n    this.e0 = this.e1;\n    this.e1 = null;\n    return t;\n  }\n\n  /** Run to completion, returning the whole token stream (used by conformance).\n   * Clones each token because `rtag`/`rchar` are reused across `nextToken()` calls\n   * and this retains the full stream. (The tree builder consumes one at a time, so\n   * it doesn't need this.) */\n  tokenize(): Token[] {\n    const tokens: Token[] = [];\n    let t: Token | null;\n    while ((t = this.nextToken()) !== null) {\n      if (t.type === 'startTag' || t.type === 'endTag') tokens.push({ type: t.type, name: t.name, attrs: t.attrs, selfClosing: t.selfClosing });\n      else if (t.type === 'character') tokens.push({ type: 'character', data: t.data });\n      else tokens.push(t);\n    }\n    return tokens;\n  }\n\n  /** Tree builder hook: switch the content-model state (RAWTEXT/RCDATA/script…). */\n  setContentState(state: ContentState): void {\n    this.state = STATE_FROM_CONTENT[state];\n  }\n  /** Tree builder hook: set the appropriate end-tag name for raw-text matching. */\n  setLastStartTag(name: string): void {\n    this.lastStartTag = name;\n  }\n  /** Tree builder hook: in foreign content `<![CDATA[` is a real CDATA section,\n   * not a bogus comment. The tree builder keeps this in sync with the adjusted\n   * current node's namespace. */\n  setForeignContent(v: boolean): void {\n    this.foreignFlag = v;\n  }\n\n  // --- emit helpers ---------------------------------------------------------\n  private emitChar(s: string) {\n    this.charBuf += s;\n  }\n  /** Queue a token. At most two are ever live at once (text run + following tag). */\n  private push(t: Token) {\n    if (this.e0 === null) this.e0 = t;\n    else this.e1 = t;\n  }\n  private flushChars() {\n    if (this.charBuf) {\n      this.rchar.data = this.charBuf;\n      this.push(this.rchar);\n      this.charBuf = '';\n    }\n  }\n  private emit(t: Token) {\n    this.flushChars();\n    this.push(t);\n  }\n  private startTag() {\n    this.tagName = '';\n    this.tagIsEnd = false;\n    this.tagSelfClosing = false;\n    this.attrs = [];\n  }\n  private startEndTag() {\n    this.startTag();\n    this.tagIsEnd = true;\n  }\n  private addAttr() {\n    const name = this.attrName;\n    if (name) {\n      // first occurrence wins (per spec, duplicates are dropped). Plain loop,\n      // not `.some(closure)`, to avoid a closure allocation per attribute.\n      const attrs = this.attrs;\n      let dup = false;\n      for (let k = 0; k < attrs.length; k++) { if (attrs[k][0] === name) { dup = true; break; } }\n      if (!dup) attrs.push([name, this.attrValue]);\n    }\n    this.attrName = '';\n    this.attrValue = '';\n  }\n  private emitTag() {\n    this.addAttr();\n    if (!this.tagIsEnd) this.lastStartTag = this.tagName;\n    const k = this.rtag;\n    k.type = this.tagIsEnd ? 'endTag' : 'startTag';\n    k.name = this.tagName;\n    k.attrs = this.attrs;\n    k.selfClosing = this.tagSelfClosing;\n    this.emit(k);\n  }\n  private appropriateEndTag(): boolean {\n    return this.tagIsEnd && this.tagName === this.lastStartTag;\n  }\n\n  private reconsume(state: number, c: number, eof: boolean): boolean {\n    this.state = state;\n    return this.step(c, eof);\n  }\n\n  // --- the state machine ----------------------------------------------------\n  // Returns false to stop (EOF terminal); true to continue. `i` is advanced by\n  // each state unless it reconsumes.\n  private step(c: number, eof: boolean): boolean {\n    switch (this.state) {\n      // Text states bulk-scan each run to the next boundary char and append it as\n      // ONE slice (instead of step()+charBuf+= per character) — the dominant\n      // tokenizer cost on text-heavy input. Behavior-identical: same chars, NUL\n      // handling, and state transition on the boundary char.\n      case S.Data: {\n        if (eof) return false;\n        if (c !== 0x26 && c !== 0x3c && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x26 || cc === 0x3c || cc === 0) break; j++; }\n          this.charBuf += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x26) { this.returnState = S.Data; this.state = S.CharRef; }\n        else if (c === 0x3c) this.state = S.TagOpen;\n        else this.emitChar(this.input[this.i - 1]); // c === 0 -> emit U+0000\n        return true;\n      }\n\n      case S.RCDATA: {\n        if (eof) return false;\n        if (c !== 0x26 && c !== 0x3c && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x26 || cc === 0x3c || cc === 0) break; j++; }\n          this.charBuf += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x26) { this.returnState = S.RCDATA; this.state = S.CharRef; }\n        else if (c === 0x3c) this.state = S.RCDATALt;\n        else this.emitChar(REPLACEMENT); // c === 0\n        return true;\n      }\n\n      case S.RAWTEXT: {\n        if (eof) return false;\n        if (c !== 0x3c && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x3c || cc === 0) break; j++; }\n          this.charBuf += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x3c) this.state = S.RAWTEXTLt;\n        else this.emitChar(REPLACEMENT); // c === 0\n        return true;\n      }\n\n      case S.ScriptData: {\n        if (eof) return false;\n        if (c !== 0x3c && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x3c || cc === 0) break; j++; }\n          this.charBuf += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x3c) this.state = S.ScriptLt;\n        else this.emitChar(REPLACEMENT); // c === 0\n        return true;\n      }\n\n      case S.PLAINTEXT: {\n        if (eof) return false;\n        if (c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { if (input.charCodeAt(j) === 0) break; j++; }\n          this.charBuf += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        this.emitChar(REPLACEMENT); // c === 0\n        return true;\n      }\n\n      case S.TagOpen:\n        if (eof) { this.emitChar('<'); return false; }\n        if (c === 0x21) { this.i++; this.state = S.MarkupDeclOpen; }\n        else if (c === 0x2f) { this.i++; this.state = S.EndTagOpen; }\n        else if (isAsciiAlpha(c)) { this.startTag(); this.state = S.TagName; }\n        else if (c === 0x3f) { this.comment = ''; this.state = S.BogusComment; }\n        else { this.emitChar('<'); this.state = S.Data; }\n        return true;\n\n      case S.EndTagOpen:\n        if (eof) { this.emitChar('<'); this.emitChar('/'); return false; }\n        if (isAsciiAlpha(c)) { this.startEndTag(); this.state = S.TagName; }\n        else if (c === 0x3e) { this.i++; this.state = S.Data; }\n        else { this.comment = ''; this.state = S.BogusComment; }\n        return true;\n\n      case S.TagName: {\n        if (eof) return false;\n        if (!isWs(c) && c !== 0x2f && c !== 0x3e && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1, up = c >= 0x41 && c <= 0x5a;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x09 || cc === 0x0a || cc === 0x0c || cc === 0x20 || cc === 0x2f || cc === 0x3e || cc === 0) break; if (cc >= 0x41 && cc <= 0x5a) up = true; j++; }\n          const run = input.slice(this.i, j); this.tagName += up ? foldAsciiUpper(run) : run; this.i = j; return true;\n        }\n        this.i++;\n        if (isWs(c)) this.state = S.BeforeAttrName;\n        else if (c === 0x2f) this.state = S.SelfClosing;\n        else if (c === 0x3e) { this.state = S.Data; this.emitTag(); }\n        else this.tagName += REPLACEMENT; // c === 0\n        return true;\n      }\n\n      // RCDATA / RAWTEXT / Script less-than + end-tag (shared shape) ----------\n      case S.RCDATALt:\n        if (!eof && c === 0x2f) { this.i++; this.tempBuf = ''; this.state = S.RCDATAEndTagOpen; }\n        else { this.emitChar('<'); this.state = S.RCDATA; }\n        return true;\n      case S.RCDATAEndTagOpen:\n        if (!eof && isAsciiAlpha(c)) { this.startEndTag(); this.state = S.RCDATAEndTagName; }\n        else { this.emitChar('</'); this.state = S.RCDATA; }\n        return true;\n      case S.RCDATAEndTagName:\n        return this.endTagNameState(c, eof, S.RCDATA);\n\n      case S.RAWTEXTLt:\n        if (!eof && c === 0x2f) { this.i++; this.tempBuf = ''; this.state = S.RAWTEXTEndTagOpen; }\n        else { this.emitChar('<'); this.state = S.RAWTEXT; }\n        return true;\n      case S.RAWTEXTEndTagOpen:\n        if (!eof && isAsciiAlpha(c)) { this.startEndTag(); this.state = S.RAWTEXTEndTagName; }\n        else { this.emitChar('</'); this.state = S.RAWTEXT; }\n        return true;\n      case S.RAWTEXTEndTagName:\n        return this.endTagNameState(c, eof, S.RAWTEXT);\n\n      case S.ScriptLt:\n        if (!eof && c === 0x2f) { this.i++; this.tempBuf = ''; this.state = S.ScriptEndTagOpen; return true; }\n        if (!eof && c === 0x21) { this.i++; this.emitChar('<!'); this.state = S.ScriptEscapeStart; return true; }\n        this.emitChar('<'); this.state = S.ScriptData;\n        return true;\n      case S.ScriptEndTagOpen:\n        if (!eof && isAsciiAlpha(c)) { this.startEndTag(); this.state = S.ScriptEndTagName; }\n        else { this.emitChar('</'); this.state = S.ScriptData; }\n        return true;\n      case S.ScriptEndTagName:\n        return this.endTagNameState(c, eof, S.ScriptData);\n\n      // Script-data escaped / double-escaped (handles <script> with <!-- --> and\n      // nested <script>; correct </script> boundary detection is security-relevant).\n      case S.ScriptEscapeStart:\n        if (!eof && c === 0x2d) { this.i++; this.emitChar('-'); this.state = S.ScriptEscapeStartDash; return true; }\n        return this.reconsume(S.ScriptData, c, eof);\n      case S.ScriptEscapeStartDash:\n        if (!eof && c === 0x2d) { this.i++; this.emitChar('-'); this.state = S.ScriptEscapedDashDash; return true; }\n        return this.reconsume(S.ScriptData, c, eof);\n      case S.ScriptEscaped:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x2d) { this.emitChar('-'); this.state = S.ScriptEscapedDash; }\n        else if (c === 0x3c) this.state = S.ScriptEscapedLt;\n        else this.emitChar(c === 0 ? REPLACEMENT : this.input[this.i - 1]);\n        return true;\n      case S.ScriptEscapedDash:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x2d) { this.emitChar('-'); this.state = S.ScriptEscapedDashDash; }\n        else if (c === 0x3c) this.state = S.ScriptEscapedLt;\n        else { this.emitChar(c === 0 ? REPLACEMENT : this.input[this.i - 1]); this.state = S.ScriptEscaped; }\n        return true;\n      case S.ScriptEscapedDashDash:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x2d) this.emitChar('-');\n        else if (c === 0x3c) this.state = S.ScriptEscapedLt;\n        else if (c === 0x3e) { this.emitChar('>'); this.state = S.ScriptData; }\n        else { this.emitChar(c === 0 ? REPLACEMENT : this.input[this.i - 1]); this.state = S.ScriptEscaped; }\n        return true;\n      case S.ScriptEscapedLt:\n        if (!eof && c === 0x2f) { this.i++; this.tempBuf = ''; this.state = S.ScriptEscapedEndTagOpen; return true; }\n        if (!eof && isAsciiAlpha(c)) { this.tempBuf = ''; this.emitChar('<'); return this.reconsume(S.ScriptDoubleEscapeStart, c, eof); }\n        this.emitChar('<');\n        return this.reconsume(S.ScriptEscaped, c, eof);\n      case S.ScriptEscapedEndTagOpen:\n        if (!eof && isAsciiAlpha(c)) { this.startEndTag(); return this.reconsume(S.ScriptEscapedEndTagName, c, eof); }\n        this.emitChar('</');\n        return this.reconsume(S.ScriptEscaped, c, eof);\n      case S.ScriptEscapedEndTagName:\n        return this.endTagNameState(c, eof, S.ScriptEscaped);\n      case S.ScriptDoubleEscapeStart:\n        if (!eof && (isWs(c) || c === 0x2f || c === 0x3e)) { this.i++; this.emitChar(this.input[this.i - 1]); this.state = this.tempBuf === 'script' ? S.ScriptDoubleEscaped : S.ScriptEscaped; return true; }\n        if (!eof && isAsciiAlpha(c)) { this.i++; this.tempBuf += String.fromCharCode(toLowerCh(c)); this.emitChar(this.input[this.i - 1]); return true; }\n        return this.reconsume(S.ScriptEscaped, c, eof);\n      case S.ScriptDoubleEscaped:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x2d) { this.emitChar('-'); this.state = S.ScriptDoubleEscapedDash; }\n        else if (c === 0x3c) { this.emitChar('<'); this.state = S.ScriptDoubleEscapedLt; }\n        else this.emitChar(c === 0 ? REPLACEMENT : this.input[this.i - 1]);\n        return true;\n      case S.ScriptDoubleEscapedDash:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x2d) { this.emitChar('-'); this.state = S.ScriptDoubleEscapedDashDash; }\n        else if (c === 0x3c) { this.emitChar('<'); this.state = S.ScriptDoubleEscapedLt; }\n        else { this.emitChar(c === 0 ? REPLACEMENT : this.input[this.i - 1]); this.state = S.ScriptDoubleEscaped; }\n        return true;\n      case S.ScriptDoubleEscapedDashDash:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x2d) this.emitChar('-');\n        else if (c === 0x3c) { this.emitChar('<'); this.state = S.ScriptDoubleEscapedLt; }\n        else if (c === 0x3e) { this.emitChar('>'); this.state = S.ScriptData; }\n        else { this.emitChar(c === 0 ? REPLACEMENT : this.input[this.i - 1]); this.state = S.ScriptDoubleEscaped; }\n        return true;\n      case S.ScriptDoubleEscapedLt:\n        if (!eof && c === 0x2f) { this.i++; this.tempBuf = ''; this.emitChar('/'); this.state = S.ScriptDoubleEscapeEnd; return true; }\n        return this.reconsume(S.ScriptDoubleEscaped, c, eof);\n      case S.ScriptDoubleEscapeEnd:\n        if (!eof && (isWs(c) || c === 0x2f || c === 0x3e)) { this.i++; this.emitChar(this.input[this.i - 1]); this.state = this.tempBuf === 'script' ? S.ScriptEscaped : S.ScriptDoubleEscaped; return true; }\n        if (!eof && isAsciiAlpha(c)) { this.i++; this.tempBuf += String.fromCharCode(toLowerCh(c)); this.emitChar(this.input[this.i - 1]); return true; }\n        return this.reconsume(S.ScriptDoubleEscaped, c, eof);\n\n      // Attributes -----------------------------------------------------------\n      case S.BeforeAttrName:\n        if (eof || c === 0x2f || c === 0x3e) return this.reconsume(S.AfterAttrName, c, eof);\n        if (isWs(c)) { this.i++; return true; }\n        this.addAttr();\n        // `=` here starts an attribute whose name begins with '=' (parse error).\n        if (c === 0x3d) { this.i++; this.attrName = '='; this.state = S.AttrName; return true; }\n        return this.reconsume(S.AttrName, c, eof);\n      case S.AttrName: {\n        if (eof || isWs(c) || c === 0x2f || c === 0x3e) return this.reconsume(S.AfterAttrName, c, eof);\n        if (c !== 0x3d && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1, up = c >= 0x41 && c <= 0x5a;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x09 || cc === 0x0a || cc === 0x0c || cc === 0x20 || cc === 0x2f || cc === 0x3e || cc === 0x3d || cc === 0) break; if (cc >= 0x41 && cc <= 0x5a) up = true; j++; }\n          const run = input.slice(this.i, j); this.attrName += up ? foldAsciiUpper(run) : run; this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x3d) this.state = S.BeforeAttrValue;\n        else this.attrName += REPLACEMENT; // c === 0\n        return true;\n      }\n      case S.AfterAttrName:\n        if (eof) return false;\n        if (isWs(c)) { this.i++; return true; }\n        if (c === 0x2f) { this.i++; this.state = S.SelfClosing; return true; }\n        if (c === 0x3d) { this.i++; this.state = S.BeforeAttrValue; return true; }\n        if (c === 0x3e) { this.i++; this.state = S.Data; this.emitTag(); return true; }\n        this.addAttr();\n        this.state = S.AttrName; // reconsume c in AttrName (handles NUL→FFFD, lowercasing)\n        return true;\n      case S.BeforeAttrValue:\n        if (!eof && isWs(c)) { this.i++; return true; }\n        if (!eof && c === 0x22) { this.i++; this.state = S.AttrValueDq; }\n        else if (!eof && c === 0x27) { this.i++; this.state = S.AttrValueSq; }\n        else if (!eof && c === 0x3e) { this.i++; this.state = S.Data; this.emitTag(); }\n        else return this.reconsume(S.AttrValueUq, c, eof);\n        return true;\n      // Attribute values are copied verbatim (no case-folding), so each run\n      // bulk-slices to the next boundary char in one go — like the text states.\n      case S.AttrValueDq: {\n        if (eof) return false;\n        if (c !== 0x22 && c !== 0x26 && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x22 || cc === 0x26 || cc === 0) break; j++; }\n          this.attrValue += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x22) this.state = S.AfterAttrValueQuoted;\n        else if (c === 0x26) { this.returnState = S.AttrValueDq; this.state = S.CharRef; }\n        else this.attrValue += REPLACEMENT; // c === 0\n        return true;\n      }\n      case S.AttrValueSq: {\n        if (eof) return false;\n        if (c !== 0x27 && c !== 0x26 && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x27 || cc === 0x26 || cc === 0) break; j++; }\n          this.attrValue += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (c === 0x27) this.state = S.AfterAttrValueQuoted;\n        else if (c === 0x26) { this.returnState = S.AttrValueSq; this.state = S.CharRef; }\n        else this.attrValue += REPLACEMENT; // c === 0\n        return true;\n      }\n      case S.AttrValueUq: {\n        if (eof) return false;\n        if (!isWs(c) && c !== 0x26 && c !== 0x3e && c !== 0) {\n          const input = this.input, len = this.len; let j = this.i + 1;\n          while (j < len) { const cc = input.charCodeAt(j); if (cc === 0x09 || cc === 0x0a || cc === 0x0c || cc === 0x20 || cc === 0x26 || cc === 0x3e || cc === 0) break; j++; }\n          this.attrValue += input.slice(this.i, j); this.i = j; return true;\n        }\n        this.i++;\n        if (isWs(c)) this.state = S.BeforeAttrName;\n        else if (c === 0x26) { this.returnState = S.AttrValueUq; this.state = S.CharRef; }\n        else if (c === 0x3e) { this.state = S.Data; this.emitTag(); }\n        else this.attrValue += REPLACEMENT; // c === 0\n        return true;\n      }\n      case S.AfterAttrValueQuoted:\n        if (eof) return false;\n        if (isWs(c)) { this.i++; this.state = S.BeforeAttrName; }\n        else if (c === 0x2f) { this.i++; this.state = S.SelfClosing; }\n        else if (c === 0x3e) { this.i++; this.state = S.Data; this.emitTag(); }\n        else return this.reconsume(S.BeforeAttrName, c, eof);\n        return true;\n      case S.SelfClosing:\n        if (eof) return false;\n        if (c === 0x3e) { this.i++; this.tagSelfClosing = true; this.state = S.Data; this.emitTag(); return true; }\n        this.state = S.BeforeAttrName; // reconsume c\n        return true;\n\n      // Comments / markup declaration ----------------------------------------\n      case S.BogusComment:\n        if (eof) { this.emit({ type: 'comment', data: this.comment }); return false; }\n        this.i++;\n        if (c === 0x3e) { this.emit({ type: 'comment', data: this.comment }); this.state = S.Data; }\n        else this.comment += c === 0 ? REPLACEMENT : this.input[this.i - 1];\n        return true;\n      case S.MarkupDeclOpen:\n        if (this.input.startsWith('--', this.i)) { this.i += 2; this.comment = ''; this.state = S.CommentStart; }\n        else if (/^doctype/i.test(this.input.substr(this.i, 7))) { this.i += 7; this.state = S.Doctype; }\n        else if (this.input.startsWith('[CDATA[', this.i)) {\n          this.i += 7;\n          // Foreign content → real CDATA section; HTML content → bogus comment\n          // with data \"[CDATA[\" (per spec). The tree builder sets foreignFlag.\n          if (this.foreignFlag) { this.state = S.CdataSection; }\n          else { this.comment = '[CDATA['; this.state = S.BogusComment; }\n        }\n        else { this.comment = ''; this.state = S.BogusComment; }\n        return true;\n      case S.CommentStart:\n        if (!eof && c === 0x2d) { this.i++; this.state = S.CommentStartDash; }\n        else if (!eof && c === 0x3e) { this.i++; this.emit({ type: 'comment', data: this.comment }); this.state = S.Data; }\n        else return this.reconsume(S.Comment, c, eof);\n        return true;\n      case S.CommentStartDash:\n        if (eof) { this.emit({ type: 'comment', data: this.comment }); return false; }\n        if (c === 0x2d) { this.i++; this.state = S.CommentEnd; return true; }\n        if (c === 0x3e) { this.i++; this.emit({ type: 'comment', data: this.comment }); this.state = S.Data; return true; }\n        this.comment += '-';\n        this.state = S.Comment; // reconsume c (no advance)\n        return true;\n      case S.Comment:\n        if (eof) { this.emit({ type: 'comment', data: this.comment }); return false; }\n        this.i++;\n        if (c === 0x2d) this.state = S.CommentEndDash;\n        else if (c === 0) this.comment += REPLACEMENT;\n        else this.comment += this.input[this.i - 1];\n        return true;\n      case S.CommentEndDash:\n        if (eof) { this.emit({ type: 'comment', data: this.comment }); return false; }\n        if (c === 0x2d) { this.i++; this.state = S.CommentEnd; return true; }\n        this.comment += '-';\n        this.state = S.Comment; // reconsume c\n        return true;\n      case S.CommentEnd:\n        if (eof) { this.emit({ type: 'comment', data: this.comment }); return false; }\n        if (c === 0x3e) { this.i++; this.emit({ type: 'comment', data: this.comment }); this.state = S.Data; return true; }\n        if (c === 0x21) { this.i++; this.state = S.CommentEndBang; return true; }\n        if (c === 0x2d) { this.i++; this.comment += '-'; return true; }\n        this.comment += '--';\n        this.state = S.Comment; // reconsume c\n        return true;\n      case S.CommentEndBang:\n        if (eof) { this.emit({ type: 'comment', data: this.comment }); return false; }\n        if (c === 0x2d) { this.i++; this.comment += '--!'; this.state = S.CommentEndDash; return true; }\n        if (c === 0x3e) { this.i++; this.emit({ type: 'comment', data: this.comment }); this.state = S.Data; return true; }\n        this.comment += '--!';\n        this.state = S.Comment; // reconsume c\n        return true;\n\n      // DOCTYPE --------------------------------------------------------------\n      case S.Doctype:\n        if (eof) { this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; this.state = S.BeforeDoctypeName; }\n        else return this.reconsume(S.BeforeDoctypeName, c, eof);\n        return true;\n      case S.BeforeDoctypeName:\n        if (eof) { this.dn = null; this.dquirks = true; this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; return true; }\n        this.i++;\n        if (c === 0x3e) { this.dn = null; this.dquirks = true; this.emitDoctype(true); this.state = S.Data; return true; }\n        this.dn = c === 0 ? REPLACEMENT : String.fromCharCode(toLowerCh(c));\n        this.dpub = this.dsys = null; this.dquirks = false;\n        this.state = S.DoctypeName;\n        return true;\n      case S.DoctypeName:\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        this.i++;\n        if (isWs(c)) this.state = S.AfterDoctypeName;\n        else if (c === 0x3e) { this.state = S.Data; this.emitDoctype(false); }\n        else this.dn += c === 0 ? REPLACEMENT : String.fromCharCode(toLowerCh(c));\n        return true;\n      case S.AfterDoctypeName:\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; return true; }\n        if (c === 0x3e) { this.i++; this.state = S.Data; this.emitDoctype(false); return true; }\n        if (/^public/i.test(this.input.substr(this.i, 6))) { this.i += 6; this.state = S.AfterDoctypePublicKw; }\n        else if (/^system/i.test(this.input.substr(this.i, 6))) { this.i += 6; this.state = S.AfterDoctypeSystemKw; }\n        else { this.dquirks = true; this.state = S.BogusDoctype; }\n        return true;\n      case S.AfterDoctypePublicKw:\n      case S.BeforeDoctypePublicId:\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; if (this.state === S.AfterDoctypePublicKw) this.state = S.BeforeDoctypePublicId; return true; }\n        this.i++;\n        if (c === 0x22) { this.dpub = ''; this.state = S.DoctypePublicIdDq; }\n        else if (c === 0x27) { this.dpub = ''; this.state = S.DoctypePublicIdSq; }\n        else if (c === 0x3e) { this.dquirks = true; this.state = S.Data; this.emitDoctype(true); }\n        else { this.dquirks = true; this.state = S.BogusDoctype; }\n        return true;\n      case S.DoctypePublicIdDq:\n      case S.DoctypePublicIdSq: {\n        const q = this.state === S.DoctypePublicIdDq ? 0x22 : 0x27;\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        this.i++;\n        if (c === q) this.state = S.AfterDoctypePublicId;\n        else if (c === 0x3e) { this.dquirks = true; this.state = S.Data; this.emitDoctype(true); }\n        else this.dpub = this.dpub! + (c === 0 ? REPLACEMENT : this.input[this.i - 1]); // dpub set to '' on entry (648/649)\n        return true;\n      }\n      case S.AfterDoctypePublicId:\n      case S.BetweenDoctypePublicSystem:\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; if (this.state === S.AfterDoctypePublicId) this.state = S.BetweenDoctypePublicSystem; return true; }\n        this.i++;\n        if (c === 0x3e) { this.state = S.Data; this.emitDoctype(false); }\n        else if (c === 0x22) { this.dsys = ''; this.state = S.DoctypeSystemIdDq; }\n        else if (c === 0x27) { this.dsys = ''; this.state = S.DoctypeSystemIdSq; }\n        else { this.dquirks = true; this.state = S.BogusDoctype; }\n        return true;\n      case S.AfterDoctypeSystemKw:\n      case S.BeforeDoctypeSystemId:\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; if (this.state === S.AfterDoctypeSystemKw) this.state = S.BeforeDoctypeSystemId; return true; }\n        this.i++;\n        if (c === 0x22) { this.dsys = ''; this.state = S.DoctypeSystemIdDq; }\n        else if (c === 0x27) { this.dsys = ''; this.state = S.DoctypeSystemIdSq; }\n        else if (c === 0x3e) { this.dquirks = true; this.state = S.Data; this.emitDoctype(true); }\n        else { this.dquirks = true; this.state = S.BogusDoctype; }\n        return true;\n      case S.DoctypeSystemIdDq:\n      case S.DoctypeSystemIdSq: {\n        const q = this.state === S.DoctypeSystemIdDq ? 0x22 : 0x27;\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        this.i++;\n        if (c === q) this.state = S.AfterDoctypeSystemId;\n        else if (c === 0x3e) { this.dquirks = true; this.state = S.Data; this.emitDoctype(true); }\n        else this.dsys = this.dsys! + (c === 0 ? REPLACEMENT : this.input[this.i - 1]); // dsys set to '' on entry (669/670/678/679)\n        return true;\n      }\n      case S.AfterDoctypeSystemId:\n        if (eof) { this.dquirks = true; this.emitDoctype(true); return false; }\n        if (isWs(c)) { this.i++; return true; }\n        this.i++;\n        if (c === 0x3e) { this.state = S.Data; this.emitDoctype(false); }\n        else this.state = S.BogusDoctype;\n        return true;\n      case S.BogusDoctype:\n        if (eof) { this.emitDoctype(this.dquirks); return false; }\n        this.i++;\n        if (c === 0x3e) { this.state = S.Data; this.emitDoctype(this.dquirks); }\n        return true;\n\n      // CDATA ----------------------------------------------------------------\n      case S.CdataSection:\n        if (eof) return false;\n        this.i++;\n        if (c === 0x5d) this.state = S.CdataSectionBracket;\n        else this.emitChar(this.input[this.i - 1]);\n        return true;\n      case S.CdataSectionBracket:\n        if (!eof && c === 0x5d) { this.i++; this.state = S.CdataSectionEnd; }\n        else { this.emitChar(']'); return this.reconsume(S.CdataSection, c, eof); }\n        return true;\n      case S.CdataSectionEnd:\n        if (!eof && c === 0x5d) { this.i++; this.emitChar(']'); return true; }\n        if (!eof && c === 0x3e) { this.i++; this.state = S.Data; return true; }\n        this.emitChar(']]'); return this.reconsume(S.CdataSection, c, eof);\n\n      // Character references -------------------------------------------------\n      case S.CharRef:\n        this.tempBuf = '&';\n        if (!eof && isAsciiAlnum(c)) return this.reconsume(S.NamedCharRef, c, eof);\n        if (!eof && c === 0x23) { this.i++; this.tempBuf += '#'; this.state = S.NumericCharRef; return true; }\n        this.flushTempToCharRefTarget();\n        return this.reconsume(this.returnState, c, eof);\n      case S.NamedCharRef:\n        return this.namedCharRefState();\n      case S.AmbiguousAmp:\n        if (!eof && isAsciiAlnum(c)) { this.i++; this.appendCharRef(this.input[this.i - 1]); return true; }\n        return this.reconsume(this.returnState, c, eof);\n      case S.NumericCharRef:\n        this.charRefCode = 0;\n        if (!eof && (c === 0x78 || c === 0x58)) { this.i++; this.tempBuf += this.input[this.i - 1]; this.state = S.HexStart; }\n        else this.state = S.DecStart;\n        return true;\n      case S.HexStart:\n        if (!eof && isHexDigit(c)) return this.reconsume(S.HexRef, c, eof);\n        this.flushTempToCharRefTarget();\n        return this.reconsume(this.returnState, c, eof);\n      case S.DecStart:\n        if (!eof && c >= 0x30 && c <= 0x39) return this.reconsume(S.DecRef, c, eof);\n        this.flushTempToCharRefTarget();\n        return this.reconsume(this.returnState, c, eof);\n      case S.HexRef:\n        if (!eof && isHexDigit(c)) {\n          this.i++;\n          const d = c <= 0x39 ? c - 0x30 : (toLowerCh(c) - 0x61 + 10);\n          this.charRefCode = this.charRefCode * 16 + d;\n          return true;\n        }\n        if (!eof && c === 0x3b) this.i++;\n        this.state = S.NumericEnd;\n        return true;\n      case S.DecRef:\n        if (!eof && c >= 0x30 && c <= 0x39) { this.i++; this.charRefCode = this.charRefCode * 10 + (c - 0x30); return true; }\n        if (!eof && c === 0x3b) this.i++;\n        this.state = S.NumericEnd;\n        return true;\n      case S.NumericEnd: {\n        // Does NOT consume: process the accumulated code and switch to the return\n        // state; the next loop iteration reads the next char fresh.\n        let code = this.charRefCode;\n        if (code === 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) code = 0xfffd;\n        else if (C1[code] !== undefined) code = C1[code];\n        this.appendCharRef(String.fromCodePoint(code));\n        this.state = this.returnState;\n        return true;\n      }\n\n      /* v8 ignore next 2 -- unreachable: every state id 0..75 has a case above */\n      default:\n        return false;\n    }\n  }\n\n  private endTagNameState(c: number, eof: boolean, rawState: number): boolean {\n    if (!eof) {\n      if ((isWs(c)) && this.appropriateEndTag()) { this.i++; this.state = S.BeforeAttrName; return true; }\n      if (c === 0x2f && this.appropriateEndTag()) { this.i++; this.state = S.SelfClosing; return true; }\n      if (c === 0x3e && this.appropriateEndTag()) { this.i++; this.state = S.Data; this.emitTag(); return true; }\n      if (isAsciiAlpha(c)) {\n        this.i++;\n        this.tagName += String.fromCharCode(toLowerCh(c));\n        this.tempBuf += this.input[this.i - 1];\n        return true;\n      }\n    }\n    // not an appropriate end tag — emit \"</\" + buffer as characters\n    this.emitChar('</' + this.tempBuf);\n    return this.reconsume(rawState, c, eof);\n  }\n\n  private emitDoctype(forceQuirks: boolean) {\n    this.emit({ type: 'doctype', name: this.dn, publicId: this.dpub, systemId: this.dsys, forceQuirks });\n    this.dn = this.dpub = this.dsys = null;\n    this.dquirks = false;\n  }\n\n  // Character-reference output goes to the right sink (attr value vs text).\n  private appendCharRef(s: string) {\n    if (this.returnState === S.AttrValueDq || this.returnState === S.AttrValueSq || this.returnState === S.AttrValueUq) {\n      this.attrValue += s;\n    } else {\n      this.emitChar(s);\n    }\n  }\n  private flushTempToCharRefTarget() {\n    this.appendCharRef(this.tempBuf);\n  }\n  private inAttr(): boolean {\n    return this.returnState === S.AttrValueDq || this.returnState === S.AttrValueSq || this.returnState === S.AttrValueUq;\n  }\n\n  private namedCharRefState(): boolean {\n    // Greedy longest match via the trie, walking code unit by code unit (no\n    // growing-string rebuild/re-hash). matchLen/matchValue track the longest hit.\n    const input = this.input, len = this.len, start = this.i;\n    let matchLen = 0, matchValue = '';\n    let node = ENTITY_TRIE;\n    for (let k = 0; k < MAX_NAMED_REF_LEN && start + k < len; k++) {\n      const cc = input.charCodeAt(start + k);\n      if (!isAsciiAlnum(cc) && cc !== 0x3b) break;\n      const child = node.next.get(cc);\n      if (child === undefined) break;\n      node = child;\n      if (child.v !== undefined) { matchValue = child.v; matchLen = k + 1; }\n      if (cc === 0x3b) break;\n    }\n    if (matchLen > 0) {\n      const endsWithSemi = input.charCodeAt(start + matchLen - 1) === 0x3b;\n      const nextCh = start + matchLen < len ? input.charCodeAt(start + matchLen) : -1;\n      // Attribute special case: a name without ';' followed by '=' or alnum is\n      // NOT a reference — flush the consumed chars literally.\n      if (this.inAttr() && !endsWithSemi && (nextCh === 0x3d || isAsciiAlnum(nextCh))) {\n        this.appendCharRef('&' + input.slice(start, start + matchLen));\n        this.i += matchLen;\n        this.state = this.returnState;\n        return true;\n      }\n      this.appendCharRef(matchValue);\n      this.i += matchLen;\n      this.state = this.returnState;\n      return true;\n    }\n    // No match → flush '&' and reprocess from current position as ambiguous amp.\n    this.appendCharRef('&');\n    this.state = S.AmbiguousAmp;\n    return true;\n  }\n}\n","/**\n * WHATWG HTML tree construction — `.` main engine.\n *\n * Consumes the `Tokenizer` token stream (pull-based, driving its content-model\n * state) and builds a DOM-like tree per https://html.spec.whatwg.org/#tree-construction.\n * Verified against the vendored html5lib-tests tree-construction `.dat` suite\n * (test/main/tree-construction.test.ts), ratcheted.\n *\n * Coverage is built up incrementally (climbing the ratchet): the common document\n * modes (initial → in head → in body → text → after body), generic element\n * insertion, implied end tags, RAWTEXT/RCDATA/script text, and active-formatting\n * reconstruction are here. Table/select/template modes, full foreign content, and\n * the adoption agency algorithm are layered in over subsequent passes (tracked by\n * the ratchet baseline).\n */\nimport { Tokenizer, type Token, type TagToken } from './tokenizer';\n\nexport type NS = 'html' | 'svg' | 'mathml';\n\nexport interface ElementNode {\n  type: 'element';\n  name: string;\n  namespace: NS;\n  attrs: Array<[string, string]>;\n  children: TreeNode[];\n  parent: ParentNode | null;\n}\nexport interface TextNode {\n  type: 'text';\n  value: string;\n  parent: ParentNode | null;\n}\nexport interface CommentNode {\n  type: 'comment';\n  value: string;\n  parent: ParentNode | null;\n}\nexport interface DoctypeNode {\n  type: 'doctype';\n  name: string;\n  publicId: string;\n  systemId: string;\n  parent: ParentNode | null;\n}\nexport interface DocumentNode {\n  type: 'document';\n  children: TreeNode[];\n}\nexport type TreeNode = ElementNode | TextNode | CommentNode | DoctypeNode;\nexport type ParentNode = ElementNode | DocumentNode;\n\n// Tags handled specially in \"in body\" / head. Subsets used below.\nconst VOID = new Set(['area', 'base', 'basefont', 'bgsound', 'br', 'col', 'embed', 'frame', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']);\nconst RAWTEXT = new Set(['style', 'xmp', 'iframe', 'noembed', 'noframes']);\nconst HEAD_TAGS = new Set(['base', 'basefont', 'bgsound', 'link', 'meta', 'title', 'noframes', 'style', 'script', 'template', 'head', 'noscript', 'command']);\n// Implied-end-tag set + the special category (subset that matters for the common path).\nconst IMPLIED_END = new Set(['dd', 'dt', 'li', 'optgroup', 'option', 'p', 'rb', 'rp', 'rt', 'rtc']);\nconst HEADINGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\nconst FORMATTING = new Set(['a', 'b', 'big', 'code', 'em', 'font', 'i', 'nobr', 's', 'small', 'strike', 'strong', 'tt', 'u']);\n// Block/grouping end tags that close by: in scope? → generate implied end tags, pop until name.\nconst CLOSE_BLOCK = new Set(['address', 'article', 'aside', 'blockquote', 'button', 'center', 'details', 'dialog', 'dir', 'div', 'dl', 'fieldset', 'figcaption', 'figure', 'footer', 'header', 'hgroup', 'listing', 'main', 'menu', 'nav', 'ol', 'pre', 'section', 'summary', 'ul']);\n// \"in body\" start tags that close an open <p> then insert (O(1) lookup on the hot path).\nconst START_BLOCK = new Set(['p', 'div', 'section', 'article', 'aside', 'blockquote', 'center', 'details', 'dialog', 'dir', 'dl', 'fieldset', 'figcaption', 'figure', 'footer', 'header', 'hgroup', 'main', 'menu', 'nav', 'ol', 'ul', 'summary', 'address', 'pre', 'listing']);\n// \"Special\" elements (scope-breaking) — abbreviated but covers the common cases.\nconst SPECIAL = new Set(['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'ul', 'wbr', 'xmp']);\n\ntype Mode =\n  | 'initial' | 'beforeHtml' | 'beforeHead' | 'inHead' | 'afterHead'\n  | 'inBody' | 'text' | 'afterBody' | 'afterAfterBody'\n  | 'inTable' | 'inTableText' | 'inCaption' | 'inColumnGroup'\n  | 'inTableBody' | 'inRow' | 'inCell' | 'inSelect' | 'inSelectInTable' | 'inTemplate' | 'inHeadNoscript'\n  | 'inFrameset' | 'afterFrameset' | 'afterAfterFrameset';\n\nconst TABLE_CONTEXT = new Set(['table', 'tbody', 'tfoot', 'thead', 'tr']);\nconst TABLE_ROOT_CTX = new Set(['table', 'template', 'html']);\nconst TABLE_BODY_CTX = new Set(['tbody', 'tfoot', 'thead', 'template', 'html']);\nconst TABLE_ROW_CTX = new Set(['tr', 'template', 'html']);\nconst CELL_OR_CAPTION_START = new Set(['caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr']);\n\n// --- Foreign content (SVG/MathML) adjustment tables (WHATWG 13.2.6) ----------\n// HTML start tags that \"break out\" of foreign content back to HTML parsing.\nconst FOREIGN_BREAKOUT = new Set(['b', 'big', 'blockquote', 'body', 'br', 'center', 'code', 'dd', 'div', 'dl', 'dt', 'em', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'i', 'img', 'li', 'listing', 'menu', 'meta', 'nobr', 'ol', 'p', 'pre', 'ruby', 's', 'small', 'span', 'strong', 'strike', 'sub', 'sup', 'table', 'tt', 'u', 'ul', 'var']);\n// SVG element tag-name case fixups (lowercased input -> correct case).\nconst SVG_TAG_NAMES = new Map<string, string>(Object.entries({\n  altglyph: 'altGlyph', altglyphdef: 'altGlyphDef', altglyphitem: 'altGlyphItem', animatecolor: 'animateColor', animatemotion: 'animateMotion', animatetransform: 'animateTransform', clippath: 'clipPath', feblend: 'feBlend', fecolormatrix: 'feColorMatrix', fecomponenttransfer: 'feComponentTransfer', fecomposite: 'feComposite', feconvolvematrix: 'feConvolveMatrix', fediffuselighting: 'feDiffuseLighting', fedisplacementmap: 'feDisplacementMap', fedistantlight: 'feDistantLight', fedropshadow: 'feDropShadow', feflood: 'feFlood', fefunca: 'feFuncA', fefuncb: 'feFuncB', fefuncg: 'feFuncG', fefuncr: 'feFuncR', fegaussianblur: 'feGaussianBlur', feimage: 'feImage', femerge: 'feMerge', femergenode: 'feMergeNode', femorphology: 'feMorphology', feoffset: 'feOffset', fepointlight: 'fePointLight', fespecularlighting: 'feSpecularLighting', fespotlight: 'feSpotLight', fetile: 'feTile', feturbulence: 'feTurbulence', foreignobject: 'foreignObject', glyphref: 'glyphRef', lineargradient: 'linearGradient', radialgradient: 'radialGradient', textpath: 'textPath'\n}));\n// SVG attribute case fixups.\nconst SVG_ATTR = new Map<string, string>(Object.entries({\n  attributename: 'attributeName', attributetype: 'attributeType', basefrequency: 'baseFrequency', baseprofile: 'baseProfile', calcmode: 'calcMode', clippathunits: 'clipPathUnits', diffuseconstant: 'diffuseConstant', edgemode: 'edgeMode', filterunits: 'filterUnits', glyphref: 'glyphRef', gradienttransform: 'gradientTransform', gradientunits: 'gradientUnits', kernelmatrix: 'kernelMatrix', kernelunitlength: 'kernelUnitLength', keypoints: 'keyPoints', keysplines: 'keySplines', keytimes: 'keyTimes', lengthadjust: 'lengthAdjust', limitingconeangle: 'limitingConeAngle', markerheight: 'markerHeight', markerunits: 'markerUnits', markerwidth: 'markerWidth', maskcontentunits: 'maskContentUnits', maskunits: 'maskUnits', numoctaves: 'numOctaves', pathlength: 'pathLength', patterncontentunits: 'patternContentUnits', patterntransform: 'patternTransform', patternunits: 'patternUnits', pointsatx: 'pointsAtX', pointsaty: 'pointsAtY', pointsatz: 'pointsAtZ', preservealpha: 'preserveAlpha', preserveaspectratio: 'preserveAspectRatio', primitiveunits: 'primitiveUnits', refx: 'refX', refy: 'refY', repeatcount: 'repeatCount', repeatdur: 'repeatDur', requiredextensions: 'requiredExtensions', requiredfeatures: 'requiredFeatures', specularconstant: 'specularConstant', specularexponent: 'specularExponent', spreadmethod: 'spreadMethod', startoffset: 'startOffset', stddeviation: 'stdDeviation', stitchtiles: 'stitchTiles', surfacescale: 'surfaceScale', systemlanguage: 'systemLanguage', tablevalues: 'tableValues', targetx: 'targetX', targety: 'targetY', textlength: 'textLength', viewbox: 'viewBox', viewtarget: 'viewTarget', xchannelselector: 'xChannelSelector', ychannelselector: 'yChannelSelector', zoomandpan: 'zoomAndPan'\n}));\n// Namespaced (\"foreign\") attributes -> html5lib \"prefix localname\" serialized form.\nconst FOREIGN_ATTR = new Map<string, string>(Object.entries({\n  'xlink:actuate': 'xlink actuate', 'xlink:arcrole': 'xlink arcrole', 'xlink:href': 'xlink href', 'xlink:role': 'xlink role', 'xlink:show': 'xlink show', 'xlink:title': 'xlink title', 'xlink:type': 'xlink type', 'xml:lang': 'xml lang', 'xml:space': 'xml space', 'xmlns:xlink': 'xmlns xlink'\n}));\n\nconst WS = new Set([' ', '\\t', '\\n', '\\f']);\nfunction isAllWs(s: string): boolean {\n  for (const ch of s) if (!WS.has(ch)) return false;\n  return true;\n}\n\nexport class TreeBuilder {\n  private readonly tk: Tokenizer;\n  readonly document: DocumentNode = { type: 'document', children: [] };\n  private readonly open: ElementNode[] = [];\n  private readonly afe: Array<ElementNode | 'marker'> = []; // active formatting elements\n  private mode: Mode = 'initial';\n  private originalMode: Mode = 'initial';\n  private head: ElementNode | null = null;\n  private framesetOk = true;\n  private fosterParenting = false;\n  /** Set once an SVG/MathML element is inserted; gates the per-token foreign sync\n   * in parse() so all-HTML documents (the common case) skip it entirely. */\n  private sawForeign = false;\n  /** Stack of template insertion modes (top = current). Drives resetInsertionMode\n   * while inside one or more <template>s. */\n  private templateModes: Mode[] = [];\n  /** A single U+000A immediately after <pre>/<listing>/<textarea> is dropped\n   * (authoring convenience). Set on those start tags, consumed by the next token. */\n  private ignoreNextLF = false;\n  /** The \"form element pointer\" — at most one form per document (outside templates);\n   * a second <form> while this is set is ignored. */\n  private formElement: ElementNode | null = null;\n  private pendingTableText = '';\n  private pendingTableNonWs = false;\n\n  constructor(html: string) {\n    this.tk = new Tokenizer(html, { state: 'data' });\n  }\n\n  /** Parse to completion and return the document tree. */\n  parse(): DocumentNode {\n    let t: Token | null;\n    // The tokenizer's `<![CDATA[` decision only depends on the adjusted current\n    // node, which changes solely when the open-stack top does (start/end tags) —\n    // not on the runs of character tokens in between. Re-sync only on a change.\n    let lastTop: ElementNode | undefined;\n    while ((t = this.tk.nextToken()) !== null) {\n      this.process(t);\n      // No SVG/MathML seen yet ⇒ the adjusted current node is always HTML and the\n      // tokenizer's CDATA decision can't change, so skip the sync entirely. Once a\n      // foreign element appears, fall through to the per-change sync below.\n      if (this.sawForeign) {\n        const acn = this.open[this.open.length - 1];\n        if (acn !== lastTop) {\n          lastTop = acn;\n          this.tk.setForeignContent(acn !== undefined && acn.namespace !== 'html');\n        }\n      }\n    }\n    return this.document;\n  }\n\n  // --- tree helpers ---------------------------------------------------------\n  private current(): ParentNode {\n    return this.open.length ? this.open[this.open.length - 1] : this.document;\n  }\n  private append(parent: ParentNode, node: TreeNode) {\n    node.parent = parent;\n    parent.children.push(node);\n  }\n  /** The \"appropriate place for inserting a node\" — implements foster parenting:\n   * when enabled and the current node is a table context, content is inserted\n   * before the table rather than inside it (what the browser does). */\n  private appropriatePlace(): { parent: ParentNode; before: TreeNode | null } {\n    const cur = this.current();\n    if (this.fosterParenting && cur.type === 'element' && TABLE_CONTEXT.has(cur.name)) {\n      let lastTable: ElementNode | null = null, lastTableIdx = -1;\n      for (let i = this.open.length - 1; i >= 0; i--) {\n        if (this.open[i].name === 'table') { lastTable = this.open[i]; lastTableIdx = i; break; }\n      }\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!lastTable) return { parent: this.open[0] ?? this.document, before: null };\n      /* v8 ignore stop */\n      if (lastTable.parent) return { parent: lastTable.parent, before: lastTable };\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      return { parent: this.open[lastTableIdx - 1], before: null };\n      /* v8 ignore stop */\n    }\n    return { parent: cur, before: null };\n  }\n  private insertAt(place: { parent: ParentNode; before: TreeNode | null }, node: TreeNode) {\n    node.parent = place.parent;\n    if (place.before) {\n      const idx = place.parent.children.indexOf(place.before);\n      /* v8 ignore start -- defensive fallback for an impossible state (ref always found / current is an element / stack non-empty) */\n      place.parent.children.splice(idx < 0 ? place.parent.children.length : idx, 0, node);\n      /* v8 ignore stop */\n    } else {\n      place.parent.children.push(node);\n    }\n  }\n  private insertElement(token: TagToken, ns: NS = 'html'): ElementNode {\n    // token.attrs is already duplicate-free (the tokenizer's addAttr keeps first\n    // occurrence wins) and the token is transient, so we take its array directly\n    // instead of re-deduping into a fresh copy — one fewer allocation per element.\n    const el: ElementNode = { type: 'element', name: token.name, namespace: ns, attrs: token.attrs, children: [], parent: null };\n    // Fast path: outside table foster-parenting (the overwhelming majority of\n    // inserts) the insertion point is just the current node, appended at the end —\n    // no `appropriatePlace` place-object and no `insertAt` indirection.\n    if (this.fosterParenting) this.insertAt(this.appropriatePlace(), el);\n    else { const parent = this.current(); el.parent = parent; parent.children.push(el); }\n    this.open.push(el);\n    return el;\n  }\n  private insertText(data: string) {\n    if (!this.fosterParenting) {\n      const parent = this.current();\n      const siblings = parent.children;\n      const prev = siblings[siblings.length - 1];\n      if (prev !== undefined && prev.type === 'text') { prev.value += data; return; }\n      siblings.push({ type: 'text', value: data, parent });\n      return;\n    }\n    const place = this.appropriatePlace();\n    const siblings = place.parent.children;\n    const refIdx = place.before ? siblings.indexOf(place.before) : siblings.length;\n    const prev = siblings[refIdx - 1];\n    if (prev && prev.type === 'text') { prev.value += data; return; }\n    const node: TextNode = { type: 'text', value: data, parent: place.parent };\n    siblings.splice(refIdx, 0, node);\n  }\n  private insertComment(data: string, parent: ParentNode = this.current()) {\n    this.append(parent, { type: 'comment', value: data, parent: null });\n  }\n  private popUntil(name: string) {\n    while (this.open.length) {\n      const el = this.open.pop()!;\n      if (el.name === name) break;\n    }\n  }\n  private inScopeNames = new Set(['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template']);\n  /** A \"scope\" boundary element: the HTML markers PLUS the foreign integration\n   * points (MathML mi/mo/mn/ms/mtext/annotation-xml, SVG foreignObject/desc/title).\n   * Omitting the foreign ones made scope checks see through e.g. <mi> to an outer\n   * <p>, mis-closing it. Checked by namespace so an HTML <title> isn't a marker. */\n  private isScopeMarker(el: ElementNode): boolean {\n    if (el.namespace === 'html') return this.inScopeNames.has(el.name);\n    if (el.namespace === 'mathml') return el.name === 'mi' || el.name === 'mo' || el.name === 'mn' || el.name === 'ms' || el.name === 'mtext' || el.name === 'annotation-xml';\n    return el.name === 'foreignObject' || el.name === 'desc' || el.name === 'title';\n  }\n  private hasInScope(target: string): boolean {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const el = this.open[i];\n      if (el.name === target && el.namespace === 'html') return true;\n      if (this.isScopeMarker(el)) return false;\n    }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    return false;\n    /* v8 ignore stop */\n  }\n  private generateImpliedEndTags(except?: string) {\n    while (this.open.length) {\n      const c = this.open[this.open.length - 1];\n      if (c.name !== except && IMPLIED_END.has(c.name)) this.open.pop();\n      else break;\n    }\n  }\n  /** \"in button scope\" — like in-scope, but `button` is also a boundary. */\n  private hasInButtonScope(target: string): boolean {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const el = this.open[i];\n      if (el.name === target && el.namespace === 'html') return true;\n      if ((el.name === 'button' && el.namespace === 'html') || this.isScopeMarker(el)) return false;\n    }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    return false;\n    /* v8 ignore stop */\n  }\n  private closePElement() {\n    if (this.hasInButtonScope('p')) {\n      this.generateImpliedEndTags('p');\n      this.popUntil('p');\n    }\n  }\n  /** Add a formatting element to the active-formatting list, applying the spec's\n   * \"Noah's Ark\" clause: if three elements with the same tag name, namespace and\n   * attributes already follow the last marker, drop the EARLIEST such one first. */\n  private pushAfe(el: ElementNode) {\n    let count = 0, earliest = -1;\n    for (let i = this.afe.length - 1; i >= 0; i--) {\n      const e = this.afe[i];\n      if (e === 'marker') break;\n      if (e.name === el.name && e.namespace === el.namespace && sameAttrs(e.attrs, el.attrs)) { count++; earliest = i; }\n    }\n    if (count >= 3) this.afe.splice(earliest, 1);\n    this.afe.push(el);\n  }\n  private reconstructFormatting() {\n    if (this.afe.length === 0) return;\n    let last = this.afe[this.afe.length - 1];\n    if (last === 'marker' || this.open.includes(last as ElementNode)) return;\n    let i = this.afe.length - 1;\n    while (i > 0) {\n      const e = this.afe[i - 1];\n      if (e === 'marker' || this.open.includes(e as ElementNode)) break;\n      i--;\n    }\n    for (; i < this.afe.length; i++) {\n      const entry = this.afe[i] as ElementNode;\n      const el: ElementNode = { type: 'element', name: entry.name, namespace: 'html', attrs: entry.attrs.slice(), children: [], parent: null };\n      this.append(this.current(), el);\n      this.open.push(el);\n      this.afe[i] = el;\n    }\n    void last;\n  }\n\n  // --- the dispatcher (HTML vs foreign content) -----------------------------\n  private process(t: Token) {\n    if (this.ignoreNextLF) {\n      this.ignoreNextLF = false;\n      if (t.type === 'character' && t.data.charCodeAt(0) === 0x0a) {\n        if (t.data.length === 1) return; // the whole token was just the ignored LF\n        t = { type: 'character', data: t.data.slice(1) };\n      }\n    }\n    // Inline fast-reject: foreign rules only apply when an SVG/MathML element is\n    // the current node. Reading the stack top here (instead of inside\n    // useForeignRules) lets all-HTML documents skip that call entirely, and stays\n    // correct under re-entrant process() calls (always reads the live top).\n    const top = this.open.length !== 0 ? this.open[this.open.length - 1] : undefined;\n    if (top !== undefined && top.namespace !== 'html' && this.useForeignRules(t)) this.foreignContent(t);\n    else this.dispatchMode(t);\n  }\n  private dispatchMode(t: Token) {\n    switch (this.mode) {\n      case 'initial': return this.mInitial(t);\n      case 'beforeHtml': return this.mBeforeHtml(t);\n      case 'beforeHead': return this.mBeforeHead(t);\n      case 'inHead': return this.mInHead(t);\n      case 'afterHead': return this.mAfterHead(t);\n      case 'inBody': return this.mInBody(t);\n      case 'text': return this.mText(t);\n      case 'afterBody': return this.mAfterBody(t);\n      case 'afterAfterBody': return this.mAfterAfterBody(t);\n      case 'inTable': return this.mInTable(t);\n      case 'inTableText': return this.mInTableText(t);\n      case 'inCaption': return this.mInCaption(t);\n      case 'inColumnGroup': return this.mInColumnGroup(t);\n      case 'inTableBody': return this.mInTableBody(t);\n      case 'inRow': return this.mInRow(t);\n      case 'inCell': return this.mInCell(t);\n      case 'inSelect': return this.mInSelect(t);\n      case 'inSelectInTable': return this.mInSelectInTable(t);\n      case 'inTemplate': return this.mInTemplate(t);\n      case 'inHeadNoscript': return this.mInHeadNoscript(t);\n      case 'inFrameset': return this.mInFrameset(t);\n      case 'afterFrameset': return this.mAfterFrameset(t);\n      case 'afterAfterFrameset': return this.mAfterAfterFrameset(t);\n    }\n  }\n\n  // --- foreign content (SVG / MathML) ---------------------------------------\n  private isMathmlTextIP(el: ElementNode): boolean {\n    return el.namespace === 'mathml' && (el.name === 'mi' || el.name === 'mo' || el.name === 'mn' || el.name === 'ms' || el.name === 'mtext');\n  }\n  private isHtmlIP(el: ElementNode): boolean {\n    if (el.namespace === 'mathml' && el.name === 'annotation-xml') {\n      const enc = el.attrs.find((a) => a[0] === 'encoding');\n      const v = enc?.[1].toLowerCase();\n      return v === 'text/html' || v === 'application/xhtml+xml';\n    }\n    return el.namespace === 'svg' && (el.name === 'foreignObject' || el.name === 'desc' || el.name === 'title');\n  }\n  private useForeignRules(t: Token): boolean {\n    if (this.open.length === 0 || t.type === 'eof') return false;\n    const acn = this.open[this.open.length - 1]; // adjusted current node (non-fragment)\n    if (acn.namespace === 'html') return false;\n    if (this.isMathmlTextIP(acn)) {\n      if (t.type === 'character') return false;\n      if (t.type === 'startTag' && t.name !== 'mglyph' && t.name !== 'malignmark') return false;\n    }\n    if (acn.namespace === 'mathml' && acn.name === 'annotation-xml' && t.type === 'startTag' && t.name === 'svg') return false;\n    if (this.isHtmlIP(acn) && (t.type === 'startTag' || t.type === 'character')) return false;\n    return true;\n  }\n  private adjustForeignAttrs(attrs: Array<[string, string]>, ns: NS): Array<[string, string]> {\n    const seen = new Set<string>();\n    const out: Array<[string, string]> = [];\n    for (const [name, value] of attrs) {\n      let adj = name;\n      if (ns === 'mathml' && name === 'definitionurl') adj = 'definitionURL';\n      else if (ns === 'svg' && SVG_ATTR.has(name)) adj = SVG_ATTR.get(name)!;\n      if (FOREIGN_ATTR.has(adj)) adj = FOREIGN_ATTR.get(adj)!;\n      if (!seen.has(adj)) { seen.add(adj); out.push([adj, value]); }\n    }\n    return out;\n  }\n  private insertForeign(t: TagToken, ns: NS) {\n    this.sawForeign = true; // enables the per-token foreign-content sync in parse()\n    let name = t.name;\n    if (ns === 'svg' && SVG_TAG_NAMES.has(name)) name = SVG_TAG_NAMES.get(name)!;\n    const el: ElementNode = { type: 'element', name, namespace: ns, attrs: this.adjustForeignAttrs(t.attrs, ns), children: [], parent: null };\n    // Honour foster parenting (e.g. <table><svg> → svg goes BEFORE the table),\n    // matching insertElement, instead of always appending to the current node.\n    this.insertAt(this.appropriatePlace(), el);\n    this.open.push(el);\n    if (t.selfClosing) this.open.pop();\n  }\n  private foreignContent(t: Token) {\n    if (t.type === 'character') { this.insertText(t.data); if (!isAllWs(t.data)) this.framesetOk = false; return; }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'doctype') return;\n    /* v8 ignore stop */\n    if (t.type === 'startTag') {\n      const n = t.name;\n      if (FOREIGN_BREAKOUT.has(n) || (n === 'font' && t.attrs.some(([k]) => k === 'color' || k === 'face' || k === 'size'))) {\n        // breakout: pop foreign elements until HTML namespace / integration point, then reprocess\n        while (this.open.length) {\n          const cur = this.open[this.open.length - 1];\n          if (cur.namespace === 'html' || this.isMathmlTextIP(cur) || this.isHtmlIP(cur)) break;\n          this.open.pop();\n        }\n        this.dispatchMode(t);\n        return;\n      }\n      this.insertForeign(t, this.open[this.open.length - 1].namespace);\n      return;\n    }\n    if (t.type === 'endTag') {\n      for (let i = this.open.length - 1; i >= 0; i--) {\n        const node = this.open[i];\n        if (node.name.toLowerCase() === t.name) { while (this.open.length > i) this.open.pop(); return; }\n        if (node.namespace === 'html') { this.dispatchMode(t); return; }\n      }\n    }\n  }\n\n  private mInitial(t: Token) {\n    if (t.type === 'character' && isAllWs(t.data)) return;\n    if (t.type === 'comment') { this.insertComment(t.data, this.document); return; }\n    if (t.type === 'doctype') {\n      this.append(this.document, { type: 'doctype', name: t.name ?? '', publicId: t.publicId ?? '', systemId: t.systemId ?? '', parent: null });\n      this.mode = 'beforeHtml';\n      return;\n    }\n    this.mode = 'beforeHtml';\n    this.process(t);\n  }\n  private mBeforeHtml(t: Token) {\n    if (t.type === 'doctype') return;\n    if (t.type === 'comment') { this.insertComment(t.data, this.document); return; }\n    if (t.type === 'character' && isAllWs(t.data)) return;\n    if (t.type === 'startTag' && t.name === 'html') { this.insertElement(t); this.mode = 'beforeHead'; return; }\n    const html: TagToken = { type: 'startTag', name: 'html', attrs: [], selfClosing: false };\n    this.insertElement(html);\n    this.mode = 'beforeHead';\n    this.process(t);\n  }\n  private mBeforeHead(t: Token) {\n    if (t.type === 'character' && isAllWs(t.data)) return;\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'doctype') return;\n    /* v8 ignore stop */\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'startTag' && t.name === 'html') return this.mInBody(t);\n    /* v8 ignore stop */\n    if (t.type === 'startTag' && t.name === 'head') { this.head = this.insertElement(t); this.mode = 'inHead'; return; }\n    // Stray end tags (other than head/body/html/br) are ignored here — they must\n    // NOT trigger implicit <head> creation (else a comment after them misnests).\n    if (t.type === 'endTag' && t.name !== 'head' && t.name !== 'body' && t.name !== 'html' && t.name !== 'br') return;\n    this.head = this.insertElement({ type: 'startTag', name: 'head', attrs: [], selfClosing: false });\n    this.mode = 'inHead';\n    this.process(t);\n  }\n  private mInHead(t: Token) {\n    if (t.type === 'character') {\n      // Insert leading whitespace into <head>; the first non-whitespace char closes\n      // head and the remainder is reprocessed (so \" --> \" after </style> splits).\n      let i = 0; const d = t.data;\n      while (i < d.length) { const c = d.charCodeAt(i); if (c === 9 || c === 10 || c === 12 || c === 13 || c === 32) i++; else break; }\n      if (i > 0) this.insertText(d.slice(0, i));\n      if (i === d.length) return;\n      t = { type: 'character', data: d.slice(i) };\n    }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'doctype') return;\n    /* v8 ignore stop */\n    // <template> needs its own insertion mode; without this it would fall through\n    // \"anything else closes head\" → pop → reprocess → infinite loop (a parse DoS).\n    if (t.type === 'startTag' && t.name === 'template') {\n      this.insertElement(t);\n      this.afe.push('marker');\n      this.framesetOk = false;\n      this.templateModes.push('inTemplate');\n      this.mode = 'inTemplate';\n      return;\n    }\n    if (t.type === 'endTag' && t.name === 'template') {\n      if (!this.hasInScope('template')) return;\n      this.generateImpliedEndTags();\n      this.popUntil('template');\n      this.clearAfeToMarker();\n      this.templateModes.pop();\n      this.resetInsertionMode();\n      return;\n    }\n    if (t.type === 'startTag') {\n      if (t.name === 'html') return this.mInBody(t);\n      if (VOID.has(t.name) && HEAD_TAGS.has(t.name)) { this.insertElement(t); this.open.pop(); return; }\n      if (t.name === 'title') { this.insertElement(t); this.tk.setContentState('rcdata'); this.tk.setLastStartTag('title'); this.originalMode = this.mode; this.mode = 'text'; return; }\n      // scripting DISABLED (our default + the conformance suite's): <noscript> in\n      // head parses its content as normal HTML via the \"in head noscript\" mode,\n      // NOT as raw text.\n      if (t.name === 'noscript') { this.insertElement(t); this.mode = 'inHeadNoscript'; return; }\n      if (t.name === 'noframes' || t.name === 'style' || t.name === 'script') {\n        this.insertElement(t);\n        this.tk.setContentState(t.name === 'script' ? 'scriptData' : 'rawtext');\n        this.tk.setLastStartTag(t.name);\n        this.originalMode = this.mode; this.mode = 'text';\n        return;\n      }\n      if (t.name === 'head') return;\n      // fall through: anything else closes head\n    }\n    if (t.type === 'endTag' && t.name === 'head') { this.open.pop(); this.mode = 'afterHead'; return; }\n    if (t.type === 'endTag' && (t.name === 'body' || t.name === 'html' || t.name === 'br')) { /* fall through */ }\n    else if (t.type === 'endTag') return;\n    this.open.pop(); // pop head\n    this.mode = 'afterHead';\n    this.process(t);\n  }\n  /** \"in head noscript\" (scripting disabled): a small set of metadata tags +\n   * whitespace/comments are handled in-head; </noscript> closes; anything else\n   * pops the noscript and reprocesses in \"in head\". */\n  private mInHeadNoscript(t: Token) {\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag' && t.name === 'html') return this.mInBody(t);\n    if (t.type === 'endTag' && t.name === 'noscript') { this.open.pop(); this.mode = 'inHead'; return; }\n    if (t.type === 'character' && isAllWs(t.data)) return this.mInHead(t);\n    if (t.type === 'comment') return this.mInHead(t);\n    if (t.type === 'startTag' && (t.name === 'basefont' || t.name === 'bgsound' || t.name === 'link' || t.name === 'meta' || t.name === 'noframes' || t.name === 'style')) return this.mInHead(t);\n    if (t.type === 'startTag' && (t.name === 'head' || t.name === 'noscript')) return; // ignore\n    // anything else (incl </br>): parse error → pop noscript, back to in head, reprocess.\n    this.open.pop();\n    this.mode = 'inHead';\n    return this.process(t);\n  }\n  private mAfterHead(t: Token) {\n    if (t.type === 'character' && isAllWs(t.data)) { this.insertText(t.data); return; }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'doctype') return;\n    /* v8 ignore stop */\n    if (t.type === 'startTag' && t.name === 'html') return this.mInBody(t);\n    if (t.type === 'startTag' && t.name === 'body') { this.insertElement(t); this.framesetOk = false; this.mode = 'inBody'; return; }\n    if (t.type === 'startTag' && t.name === 'frameset') { this.insertElement(t); this.mode = 'inFrameset'; return; }\n    if (t.type === 'startTag' && HEAD_TAGS.has(t.name)) { if (this.head) this.open.push(this.head); this.mInHead(t); if (this.head) { const idx = this.open.lastIndexOf(this.head); if (idx >= 0) this.open.splice(idx, 1); } return; }\n    // Stray end tags (other than body/html/br) are ignored — must not force <body>.\n    if (t.type === 'endTag') { if (t.name === 'template') return this.mInHead(t); if (t.name !== 'body' && t.name !== 'html' && t.name !== 'br') return; }\n    this.insertElement({ type: 'startTag', name: 'body', attrs: [], selfClosing: false });\n    this.mode = 'inBody';\n    this.process(t);\n  }\n\n  private mInBody(t: Token) {\n    if (t.type === 'character') {\n      this.reconstructFormatting();\n      this.insertText(t.data);\n      if (!isAllWs(t.data)) this.framesetOk = false;\n      return;\n    }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag') return this.inBodyStart(t);\n    if (t.type === 'endTag') return this.inBodyEnd(t);\n  }\n\n  private inBodyStart(t: TagToken) {\n    const n = t.name;\n    if (n === 'html') {\n      // merge attributes onto the existing html element\n      const html = this.open[0];\n      if (html) for (const [k, v] of t.attrs) if (!html.attrs.some((a) => a[0] === k)) html.attrs.push([k, v]);\n      return;\n    }\n    // noscript in body (scripting disabled) is a normal flow element, not a head tag.\n    if (HEAD_TAGS.has(n) && n !== 'head' && n !== 'noscript') { this.mInHead(t); return; }\n    if (n === 'body') return; // (attribute-merge onto existing body omitted; irrelevant to sanitized output)\n    if (n === 'frameset') {\n      // Swap the body for a frameset (only while still frameset-ok and a body is open).\n      const body = this.open[1];\n      if (!this.framesetOk || !body || body.name !== 'body' || body.namespace !== 'html') return;\n      this.removeFromParent(body);\n      while (this.open.length > 1) this.open.pop();\n      this.insertElement(t);\n      this.mode = 'inFrameset';\n      return;\n    }\n    if (START_BLOCK.has(n)) {\n      this.closePElement();\n      this.insertElement(t);\n      if (n === 'pre' || n === 'listing') { this.ignoreNextLF = true; this.framesetOk = false; }\n      return;\n    }\n    if (HEADINGS.has(n)) {\n      this.closePElement();\n      /* v8 ignore start -- defensive fallback for an impossible state (ref always found / current is an element / stack non-empty) */\n      if (HEADINGS.has(this.current().type === 'element' ? (this.current() as ElementNode).name : '')) this.open.pop();\n      /* v8 ignore stop */\n      this.insertElement(t);\n      return;\n    }\n    if (n === 'li' || n === 'dd' || n === 'dt') {\n      this.framesetOk = false;\n      // close previous li/dd/dt in scope (simplified)\n      for (let i = this.open.length - 1; i >= 0; i--) {\n        const el = this.open[i];\n        if ((n === 'li' && el.name === 'li') || (n !== 'li' && (el.name === 'dd' || el.name === 'dt'))) {\n          this.generateImpliedEndTags(el.name);\n          this.popUntil(el.name);\n          break;\n        }\n        if (SPECIAL.has(el.name) && el.name !== 'address' && el.name !== 'div' && el.name !== 'p') break;\n      }\n      this.closePElement();\n      this.insertElement(t);\n      return;\n    }\n    if (FORMATTING.has(n)) {\n      if (n === 'a') {\n        // an existing <a> in the active formatting list is adopted out first\n        for (let i = this.afe.length - 1; i >= 0; i--) {\n          const e = this.afe[i];\n          if (e === 'marker') break;\n          if (e.name === 'a') { this.adoptionAgency('a'); break; }\n        }\n      } else if (n === 'nobr') {\n        this.reconstructFormatting();\n        if (this.hasInScope('nobr')) this.adoptionAgency('nobr');\n      }\n      this.reconstructFormatting();\n      const el = this.insertElement(t);\n      this.pushAfe(el);\n      return;\n    }\n    if (n === 'hr') {\n      this.closePElement();\n      this.insertElement(t);\n      this.open.pop();\n      this.framesetOk = false;\n      return;\n    }\n    if (n === 'param' || n === 'source' || n === 'track') {\n      // void, but (unlike img/br/embed/…) do NOT clear framesetOk or reconstruct.\n      this.insertElement(t);\n      this.open.pop();\n      return;\n    }\n    if (n === 'form') {\n      const hasTemplate = this.open.some((e) => e.name === 'template');\n      if (this.formElement && !hasTemplate) return; // one form per document\n      if (this.hasInButtonScope('p')) this.closePElement();\n      const f = this.insertElement(t);\n      if (!hasTemplate) this.formElement = f;\n      return;\n    }\n    if (n === 'br' || VOID.has(n)) {\n      this.reconstructFormatting();\n      this.insertElement(t);\n      this.open.pop();\n      // input keeps framesetOk only for type=hidden; every other void clears it.\n      if (n === 'input') { if (!t.attrs.some(([k, v]) => k === 'type' && v.toLowerCase() === 'hidden')) this.framesetOk = false; }\n      else this.framesetOk = false;\n      return;\n    }\n    if (RAWTEXT.has(n)) {\n      if (n === 'xmp') { this.closePElement(); this.reconstructFormatting(); }\n      if (n === 'xmp' || n === 'iframe') this.framesetOk = false;\n      this.insertElement(t);\n      this.tk.setContentState('rawtext'); this.tk.setLastStartTag(n);\n      this.originalMode = this.mode; this.mode = 'text';\n      return;\n    }\n    if (n === 'textarea') {\n      this.insertElement(t);\n      this.ignoreNextLF = true;\n      this.tk.setContentState('rcdata'); this.tk.setLastStartTag(n);\n      this.framesetOk = false;\n      this.originalMode = this.mode; this.mode = 'text';\n      return;\n    }\n    if (n === 'plaintext') { this.closePElement(); this.insertElement(t); this.tk.setContentState('plaintext'); return; }\n    if (n === 'button') {\n      if (this.hasInScope('button')) { this.generateImpliedEndTags(); this.popUntil('button'); }\n      this.reconstructFormatting();\n      this.insertElement(t);\n      this.framesetOk = false;\n      return;\n    }\n    if (n === 'table') {\n      // (quirks-mode p-closing nuance omitted)\n      this.closePElement();\n      this.insertElement(t);\n      this.framesetOk = false;\n      this.mode = 'inTable';\n      return;\n    }\n    if (n === 'select') {\n      this.reconstructFormatting();\n      this.insertElement(t);\n      this.framesetOk = false;\n      // \"in select in table\" when opened inside a table context (table tags then\n      // close the select), else plain \"in select\".\n      this.mode = (this.mode === 'inTable' || this.mode === 'inCaption' || this.mode === 'inTableBody' || this.mode === 'inRow' || this.mode === 'inCell')\n        ? 'inSelectInTable' : 'inSelect';\n      return;\n    }\n    if (n === 'optgroup' || n === 'option') {\n      if (this.current().type === 'element' && (this.current() as ElementNode).name === 'option') this.open.pop();\n      this.reconstructFormatting();\n      this.insertElement(t);\n      return;\n    }\n    if (n === 'caption' || n === 'col' || n === 'colgroup' || n === 'tbody' || n === 'td' || n === 'tfoot' || n === 'th' || n === 'thead' || n === 'tr' || n === 'frame' || n === 'head') {\n      return; // ignored as a start tag in body\n    }\n    if (n === 'image') { this.insertElement({ ...t, name: 'img' }); this.open.pop(); this.framesetOk = false; return; }\n    if (n === 'rb' || n === 'rtc') { if (this.hasInScope('ruby')) this.generateImpliedEndTags(); this.insertElement(t); return; }\n    if (n === 'rp' || n === 'rt') { if (this.hasInScope('ruby')) this.generateImpliedEndTags('rtc'); this.insertElement(t); return; }\n    if (n === 'svg') { this.reconstructFormatting(); this.insertForeign(t, 'svg'); return; }\n    if (n === 'math') { this.reconstructFormatting(); this.insertForeign(t, 'mathml'); return; }\n    if (n === 'applet' || n === 'marquee' || n === 'object') {\n      this.reconstructFormatting();\n      this.insertElement(t);\n      this.afe.push('marker');\n      this.framesetOk = false;\n      return;\n    }\n    // generic\n    this.reconstructFormatting();\n    this.insertElement(t);\n  }\n\n  private inBodyEnd(t: TagToken) {\n    const n = t.name;\n    if (n === 'body' || n === 'html') {\n      if (this.hasInScope('body')) { this.mode = 'afterBody'; if (n === 'html') this.process(t); }\n      return;\n    }\n    if (n === 'p') {\n      // Spec: no p in button scope → parse error; insert an empty <p>, then close\n      // it (a stray </p> therefore yields <p></p>).\n      if (!this.hasInButtonScope('p')) this.insertElement({ type: 'startTag', name: 'p', attrs: [], selfClosing: false });\n      this.closePElement();\n      return;\n    }\n    if (HEADINGS.has(n)) {\n      // ANY heading end tag closes ANY open heading (</h1> closes an <h3>, etc.).\n      let inScope = false;\n      for (let i = this.open.length - 1; i >= 0; i--) {\n        const nm = this.open[i].name;\n        if (HEADINGS.has(nm)) { inScope = true; break; }\n        if (this.inScopeNames.has(nm)) break;\n      }\n      if (!inScope) return; // parse error: no heading in scope → ignore\n      this.generateImpliedEndTags();\n      while (this.open.length) { const el = this.open.pop() as ElementNode; if (HEADINGS.has(el.name)) break; }\n      return;\n    }\n    if (n === 'form') {\n      if (this.open.some((e) => e.name === 'template')) {\n        if (!this.hasInScope('form')) return;\n        this.generateImpliedEndTags();\n        this.popUntil('form');\n        return;\n      }\n      const node = this.formElement;\n      this.formElement = null;\n      if (!node || !this.hasElementInScope(node)) return;\n      this.generateImpliedEndTags();\n      const i = this.open.indexOf(node);\n      if (i >= 0) this.open.splice(i, 1); // remove node (not necessarily the current node)\n      return;\n    }\n    if (CLOSE_BLOCK.has(n)) {\n      // in scope? → generate implied end tags, pop until the named element popped.\n      if (!this.hasInScope(n)) return; // parse error: ignore\n      this.generateImpliedEndTags();\n      this.popUntil(n);\n      return;\n    }\n    if (n === 'applet' || n === 'marquee' || n === 'object') {\n      if (!this.hasInScope(n)) return;\n      this.generateImpliedEndTags();\n      this.popUntil(n);\n      this.clearAfeToMarker();\n      return;\n    }\n    if (FORMATTING.has(n)) { this.adoptionAgency(n); return; }\n    this.inBodyEndGeneric(n);\n  }\n\n  private inBodyEndGeneric(n: string) {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const el = this.open[i];\n      if (el.name === n) {\n        this.generateImpliedEndTags(n);\n        while (this.open.length > i) this.open.pop();\n        return;\n      }\n      if (SPECIAL.has(el.name)) return;\n    }\n  }\n\n  private cloneElement(el: ElementNode): ElementNode {\n    return { type: 'element', name: el.name, namespace: el.namespace, attrs: el.attrs.map((a) => [a[0], a[1]] as [string, string]), children: [], parent: null };\n  }\n  private removeFromParent(node: TreeNode) {\n    const p = node.parent;\n    if (p) {\n      const i = p.children.indexOf(node);\n      if (i >= 0) p.children.splice(i, 1);\n      node.parent = null;\n    }\n  }\n  /** Insert `node` under `target`, foster-parenting (before the last table) when\n   * target is a table context — the adoption agency's \"appropriate place\". */\n  private fosterInsert(target: ElementNode, node: TreeNode) {\n    if (TABLE_CONTEXT.has(target.name)) {\n      let lt: ElementNode | null = null, lti = -1;\n      for (let k = this.open.length - 1; k >= 0; k--) {\n        if (this.open[k].name === 'table') { lt = this.open[k]; lti = k; break; }\n      }\n      if (lt && lt.parent) {\n        const j = lt.parent.children.indexOf(lt);\n        /* v8 ignore start -- defensive fallback for an impossible state (ref always found / current is an element / stack non-empty) */\n        lt.parent.children.splice(j < 0 ? lt.parent.children.length : j, 0, node);\n        /* v8 ignore stop */\n        node.parent = lt.parent;\n        return;\n      }\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (lt) { this.append(this.open[lti - 1], node); return; }\n      /* v8 ignore stop */\n    }\n    this.append(target, node);\n  }\n  private hasElementInScope(target: ElementNode): boolean {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const el = this.open[i];\n      if (el === target) return true;\n      if (this.isScopeMarker(el)) return false;\n    }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    return false;\n    /* v8 ignore stop */\n  }\n\n  /**\n   * The WHATWG adoption agency algorithm — reparents misnested formatting\n   * elements (e.g. `<a>1<p>2</p>3</a>`) exactly the way the browser does. This is\n   * the single most intricate part of tree construction and a real mXSS surface.\n   * (Foster parenting for the table case is a later refinement — marked below.)\n   */\n  private adoptionAgency(tag: string) {\n    const cur = this.open[this.open.length - 1];\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (cur && cur.name === tag && this.afe.indexOf(cur) === -1) { this.open.pop(); return; }\n    /* v8 ignore stop */\n\n    for (let outer = 0; outer < 8; outer++) {\n      // formatting element: last entry in AFE with `tag`, after the last marker\n      let fmtIdx = -1;\n      for (let i = this.afe.length - 1; i >= 0; i--) {\n        const e = this.afe[i];\n        if (e === 'marker') break;\n        if (e.name === tag) { fmtIdx = i; break; }\n      }\n      if (fmtIdx === -1) { this.inBodyEndGeneric(tag); return; } // \"any other end tag\"\n      const fmtEl = this.afe[fmtIdx] as ElementNode;\n      const openIdx = this.open.indexOf(fmtEl);\n      if (openIdx === -1) { this.afe.splice(fmtIdx, 1); return; }\n      if (!this.hasElementInScope(fmtEl)) return;\n\n      // furthest block: topmost \"special\" element below fmtEl in the open stack\n      let furthestBlock: ElementNode | null = null;\n      let furthestIdx = -1;\n      for (let i = openIdx + 1; i < this.open.length; i++) {\n        if (SPECIAL.has(this.open[i].name)) { furthestBlock = this.open[i]; furthestIdx = i; break; }\n      }\n      if (!furthestBlock) {\n        while (this.open.length > openIdx) this.open.pop();\n        this.afe.splice(fmtIdx, 1);\n        return;\n      }\n\n      const commonAncestor = this.open[openIdx - 1];\n      let bookmark = fmtIdx;\n      let lastNode = furthestBlock;\n      let nodeIdx = furthestIdx;\n      for (let inner = 0; ; ) {\n        inner++;\n        nodeIdx--;\n        /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n        if (nodeIdx < 0) break; // safety\n        /* v8 ignore stop */\n        let node = this.open[nodeIdx];\n        if (node === fmtEl) break;\n        let afeIdx = this.afe.indexOf(node);\n        if (inner > 3 && afeIdx !== -1) { this.afe.splice(afeIdx, 1); afeIdx = -1; }\n        if (afeIdx === -1) { this.open.splice(nodeIdx, 1); continue; }\n        const clone = this.cloneElement(node);\n        this.afe[afeIdx] = clone;\n        this.open[nodeIdx] = clone;\n        node = clone;\n        if (lastNode === furthestBlock) bookmark = afeIdx + 1;\n        this.removeFromParent(lastNode);\n        this.append(node, lastNode);\n        lastNode = node;\n      }\n\n      // place lastNode at the appropriate insertion point (foster-parent when\n      // commonAncestor is a table context — what the browser does).\n      this.removeFromParent(lastNode);\n      this.fosterInsert(commonAncestor, lastNode);\n\n      const fmtClone = this.cloneElement(fmtEl);\n      for (const child of furthestBlock.children) { child.parent = fmtClone; fmtClone.children.push(child); }\n      furthestBlock.children = [];\n      this.append(furthestBlock, fmtClone);\n\n      const fAfe = this.afe.indexOf(fmtEl);\n      if (fAfe !== -1) { this.afe.splice(fAfe, 1); if (fAfe < bookmark) bookmark--; }\n      bookmark = Math.max(0, Math.min(bookmark, this.afe.length));\n      this.afe.splice(bookmark, 0, fmtClone);\n\n      const fOpen = this.open.indexOf(fmtEl);\n      if (fOpen !== -1) this.open.splice(fOpen, 1);\n      const fbOpen = this.open.indexOf(furthestBlock);\n      this.open.splice(fbOpen + 1, 0, fmtClone);\n    }\n  }\n\n  private mText(t: Token) {\n    if (t.type === 'character') { this.insertText(t.data); return; }\n    if (t.type === 'endTag') { this.open.pop(); this.mode = this.originalMode; return; }\n    // EOF or other: pop and reprocess\n    this.open.pop();\n    this.mode = this.originalMode;\n    this.process(t);\n  }\n\n  private mAfterBody(t: Token) {\n    if (t.type === 'character' && isAllWs(t.data)) return this.mInBody(t);\n    /* v8 ignore start -- defensive fallback for an impossible state (ref always found / current is an element / stack non-empty) */\n    if (t.type === 'comment') { this.insertComment(t.data, this.open[0] ?? this.document); return; }\n    /* v8 ignore stop */\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag' && t.name === 'html') return this.mInBody(t);\n    if (t.type === 'endTag' && t.name === 'html') { this.mode = 'afterAfterBody'; return; }\n    this.mode = 'inBody';\n    this.process(t);\n  }\n  private mAfterAfterBody(t: Token) {\n    if (t.type === 'comment') { this.insertComment(t.data, this.document); return; }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'doctype') return;\n    /* v8 ignore stop */\n    if (t.type === 'character' && isAllWs(t.data)) return this.mInBody(t);\n    if (t.type === 'startTag' && t.name === 'html') return this.mInBody(t);\n    this.mode = 'inBody';\n    this.process(t);\n  }\n\n  // --- frameset modes (obsolete markup; a sanitizer drops these, but matching the\n  // browser's parse tree keeps reparse-stability + conformance honest) ----------\n  /** Whitespace-only subset of a character run (frameset modes ignore non-ws). */\n  private framesetWs(data: string): string {\n    let ws = '';\n    for (let i = 0; i < data.length; i++) {\n      const c = data.charCodeAt(i);\n      if (c === 9 || c === 10 || c === 12 || c === 13 || c === 32) ws += data[i];\n    }\n    return ws;\n  }\n  private mInFrameset(t: Token) {\n    if (t.type === 'character') { const ws = this.framesetWs(t.data); if (ws) this.insertText(ws); return; }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag') {\n      const n = t.name;\n      if (n === 'html') return this.mInBody(t);\n      if (n === 'frameset') { this.insertElement(t); return; }\n      if (n === 'frame') { this.insertElement(t); this.open.pop(); return; }\n      if (n === 'noframes') return this.mInHead(t);\n      return;\n    }\n    if (t.type === 'endTag' && t.name === 'frameset') {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (this.currentName() === 'html') return; // fragment case: ignore\n      /* v8 ignore stop */\n      this.open.pop();\n      if (this.currentName() !== 'frameset') this.mode = 'afterFrameset';\n      return;\n    }\n    // eof / other end tags: ignore\n  }\n  private mAfterFrameset(t: Token) {\n    if (t.type === 'character') { const ws = this.framesetWs(t.data); if (ws) this.insertText(ws); return; }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag') {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (t.name === 'html') return this.mInBody(t);\n      /* v8 ignore stop */\n      if (t.name === 'noframes') return this.mInHead(t);\n      return;\n    }\n    if (t.type === 'endTag' && t.name === 'html') { this.mode = 'afterAfterFrameset'; return; }\n    // eof / other: ignore\n  }\n  private mAfterAfterFrameset(t: Token) {\n    if (t.type === 'comment') { this.insertComment(t.data, this.document); return; }\n    if (t.type === 'character') { const ws = this.framesetWs(t.data); if (ws) this.insertText(ws); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag') {\n      if (t.name === 'html') return this.mInBody(t);\n      if (t.name === 'noframes') return this.mInHead(t);\n      return;\n    }\n    // eof / other: ignore\n  }\n\n  // --- table insertion modes ------------------------------------------------\n  private currentName(): string {\n    const c = this.current();\n    /* v8 ignore start -- defensive fallback for an impossible state (ref always found / current is an element / stack non-empty) */\n    return c.type === 'element' ? c.name : '';\n    /* v8 ignore stop */\n  }\n  private clearStackTo(ctx: Set<string>) {\n    while (this.open.length && !ctx.has(this.open[this.open.length - 1].name)) this.open.pop();\n  }\n  private clearAfeToMarker() {\n    while (this.afe.length) { if (this.afe.pop() === 'marker') break; }\n  }\n  private hasInTableScope(target: string): boolean {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const n = this.open[i].name;\n      if (n === target) return true;\n      if (n === 'html' || n === 'table' || n === 'template') return false;\n    }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    return false;\n    /* v8 ignore stop */\n  }\n  private hasInSelectScope(target: string): boolean {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const n = this.open[i].name;\n      if (n === target) return true;\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (n !== 'optgroup' && n !== 'option') return false;\n      /* v8 ignore stop */\n    }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    return false;\n    /* v8 ignore stop */\n  }\n  private anyTableBodyInScope(): boolean {\n    return this.hasInTableScope('tbody') || this.hasInTableScope('thead') || this.hasInTableScope('tfoot');\n  }\n  private resetInsertionMode() {\n    for (let i = this.open.length - 1; i >= 0; i--) {\n      const n = this.open[i].name;\n      const last = i === 0;\n      if (n === 'select') { this.mode = 'inSelect'; return; }\n      if ((n === 'td' || n === 'th') && !last) { this.mode = 'inCell'; return; }\n      if (n === 'tr') { this.mode = 'inRow'; return; }\n      if (n === 'tbody' || n === 'thead' || n === 'tfoot') { this.mode = 'inTableBody'; return; }\n      if (n === 'caption') { this.mode = 'inCaption'; return; }\n      if (n === 'colgroup') { this.mode = 'inColumnGroup'; return; }\n      if (n === 'table') { this.mode = 'inTable'; return; }\n      /* v8 ignore start -- defensive fallback for an impossible state (ref always found / current is an element / stack non-empty) */\n      if (n === 'template') { this.mode = this.templateModes[this.templateModes.length - 1] ?? 'inBody'; return; }\n      /* v8 ignore stop */\n      if (n === 'head' || n === 'body') { this.mode = 'inBody'; return; }\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (n === 'html') { this.mode = this.head ? 'afterHead' : 'beforeHead'; return; }\n      /* v8 ignore stop */\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (last) { this.mode = 'inBody'; return; }\n      /* v8 ignore stop */\n    }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    this.mode = 'inBody';\n    /* v8 ignore stop */\n  }\n  private fosterInBody(t: Token) {\n    this.fosterParenting = true;\n    this.mInBody(t);\n    this.fosterParenting = false;\n  }\n\n  private mInTable(t: Token) {\n    if (t.type === 'character') {\n      this.pendingTableText = ''; this.pendingTableNonWs = false;\n      this.originalMode = this.mode; this.mode = 'inTableText';\n      return this.process(t);\n    }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag') {\n      const n = t.name;\n      if (n === 'caption') { this.clearStackTo(TABLE_ROOT_CTX); this.afe.push('marker'); this.insertElement(t); this.mode = 'inCaption'; return; }\n      if (n === 'colgroup') { this.clearStackTo(TABLE_ROOT_CTX); this.insertElement(t); this.mode = 'inColumnGroup'; return; }\n      if (n === 'col') { this.clearStackTo(TABLE_ROOT_CTX); this.insertElement({ type: 'startTag', name: 'colgroup', attrs: [], selfClosing: false }); this.mode = 'inColumnGroup'; return this.process(t); }\n      if (n === 'tbody' || n === 'tfoot' || n === 'thead') { this.clearStackTo(TABLE_ROOT_CTX); this.insertElement(t); this.mode = 'inTableBody'; return; }\n      if (n === 'td' || n === 'th' || n === 'tr') { this.clearStackTo(TABLE_ROOT_CTX); this.insertElement({ type: 'startTag', name: 'tbody', attrs: [], selfClosing: false }); this.mode = 'inTableBody'; return this.process(t); }\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (n === 'table') { if (!this.hasInTableScope('table')) return; this.popUntil('table'); this.resetInsertionMode(); return this.process(t); }\n      /* v8 ignore stop */\n      if (n === 'style' || n === 'script' || n === 'template') return this.mInHead(t);\n      if (n === 'input' && t.attrs.some(([k, v]) => k === 'type' && v.toLowerCase() === 'hidden')) { this.insertElement(t); this.open.pop(); return; }\n      if (n === 'form') { this.insertElement(t); this.open.pop(); return; }\n      return this.fosterInBody(t);\n    }\n    if (t.type === 'endTag') {\n      const n = t.name;\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (n === 'table') { if (!this.hasInTableScope('table')) return; this.popUntil('table'); this.resetInsertionMode(); return; }\n      /* v8 ignore stop */\n      if (['body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr'].includes(n)) return;\n      return this.fosterInBody(t);\n    }\n    if (t.type === 'eof') return this.mInBody(t);\n  }\n  private mInTableText(t: Token) {\n    if (t.type === 'character') {\n      this.pendingTableText += t.data;\n      if (!isAllWs(t.data)) this.pendingTableNonWs = true;\n      return;\n    }\n    const text = this.pendingTableText, nonWs = this.pendingTableNonWs;\n    this.pendingTableText = ''; this.pendingTableNonWs = false;\n    this.mode = this.originalMode;\n    if (text) {\n      if (nonWs) { this.fosterParenting = true; this.insertText(text); this.fosterParenting = false; }\n      else this.insertText(text);\n    }\n    return this.process(t);\n  }\n  private mInCaption(t: Token) {\n    if (t.type === 'endTag' && t.name === 'caption') {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.hasInTableScope('caption')) return;\n      /* v8 ignore stop */\n      this.generateImpliedEndTags(); this.popUntil('caption'); this.clearAfeToMarker(); this.mode = 'inTable';\n      return;\n    }\n    if ((t.type === 'startTag' && CELL_OR_CAPTION_START.has(t.name)) || (t.type === 'endTag' && t.name === 'table')) {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.hasInTableScope('caption')) return;\n      /* v8 ignore stop */\n      this.generateImpliedEndTags(); this.popUntil('caption'); this.clearAfeToMarker(); this.mode = 'inTable';\n      return this.process(t);\n    }\n    if (t.type === 'endTag' && ['body', 'col', 'colgroup', 'html', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr'].includes(t.name)) return;\n    return this.mInBody(t);\n  }\n  private mInColumnGroup(t: Token) {\n    if (t.type === 'character' && isAllWs(t.data)) { this.insertText(t.data); return; }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag' && t.name === 'html') return this.mInBody(t);\n    if (t.type === 'startTag' && t.name === 'col') { this.insertElement(t); this.open.pop(); return; }\n    if ((t.type === 'startTag' || t.type === 'endTag') && t.name === 'template') return this.mInHead(t);\n    if (t.type === 'endTag' && t.name === 'colgroup') { if (this.currentName() === 'colgroup') { this.open.pop(); this.mode = 'inTable'; } return; }\n    if (t.type === 'endTag' && t.name === 'col') return;\n    if (t.type === 'eof') return this.mInBody(t);\n    if (this.currentName() === 'colgroup') { this.open.pop(); this.mode = 'inTable'; return this.process(t); }\n  }\n  private mInTableBody(t: Token) {\n    if (t.type === 'startTag' && t.name === 'tr') { this.clearStackTo(TABLE_BODY_CTX); this.insertElement(t); this.mode = 'inRow'; return; }\n    if (t.type === 'startTag' && (t.name === 'td' || t.name === 'th')) { this.clearStackTo(TABLE_BODY_CTX); this.insertElement({ type: 'startTag', name: 'tr', attrs: [], selfClosing: false }); this.mode = 'inRow'; return this.process(t); }\n    if (t.type === 'startTag' && ['caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead'].includes(t.name)) {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.anyTableBodyInScope()) return;\n      /* v8 ignore stop */\n      this.clearStackTo(TABLE_BODY_CTX); this.open.pop(); this.mode = 'inTable'; return this.process(t);\n    }\n    if (t.type === 'endTag' && (t.name === 'tbody' || t.name === 'tfoot' || t.name === 'thead')) {\n      if (!this.hasInTableScope(t.name)) return;\n      this.clearStackTo(TABLE_BODY_CTX); this.open.pop(); this.mode = 'inTable'; return;\n    }\n    if (t.type === 'endTag' && t.name === 'table') {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.anyTableBodyInScope()) return;\n      /* v8 ignore stop */\n      this.clearStackTo(TABLE_BODY_CTX); this.open.pop(); this.mode = 'inTable'; return this.process(t);\n    }\n    if (t.type === 'endTag' && ['body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'].includes(t.name)) return;\n    return this.mInTable(t);\n  }\n  private mInRow(t: Token) {\n    if (t.type === 'startTag' && (t.name === 'td' || t.name === 'th')) { this.clearStackTo(TABLE_ROW_CTX); this.insertElement(t); this.mode = 'inCell'; this.afe.push('marker'); return; }\n    /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n    if (t.type === 'endTag' && t.name === 'tr') { if (!this.hasInTableScope('tr')) return; this.clearStackTo(TABLE_ROW_CTX); this.open.pop(); this.mode = 'inTableBody'; return; }\n    /* v8 ignore stop */\n    if ((t.type === 'startTag' && ['caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'].includes(t.name)) || (t.type === 'endTag' && t.name === 'table')) {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.hasInTableScope('tr')) return;\n      /* v8 ignore stop */\n      this.clearStackTo(TABLE_ROW_CTX); this.open.pop(); this.mode = 'inTableBody'; return this.process(t);\n    }\n    if (t.type === 'endTag' && (t.name === 'tbody' || t.name === 'tfoot' || t.name === 'thead')) {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.hasInTableScope(t.name) || !this.hasInTableScope('tr')) return;\n      /* v8 ignore stop */\n      this.clearStackTo(TABLE_ROW_CTX); this.open.pop(); this.mode = 'inTableBody'; return this.process(t);\n    }\n    if (t.type === 'endTag' && ['body', 'caption', 'col', 'colgroup', 'html', 'td', 'th'].includes(t.name)) return;\n    return this.mInTable(t);\n  }\n  private mInCell(t: Token) {\n    if (t.type === 'endTag' && (t.name === 'td' || t.name === 'th')) {\n      if (!this.hasInTableScope(t.name)) return;\n      this.generateImpliedEndTags(); this.popUntil(t.name); this.clearAfeToMarker(); this.mode = 'inRow';\n      return;\n    }\n    if (t.type === 'startTag' && CELL_OR_CAPTION_START.has(t.name)) {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.hasInTableScope('td') && !this.hasInTableScope('th')) return;\n      /* v8 ignore stop */\n      this.closeCell(); return this.process(t);\n    }\n    if (t.type === 'endTag' && ['body', 'caption', 'col', 'colgroup', 'html'].includes(t.name)) return;\n    if (t.type === 'endTag' && ['table', 'tbody', 'tfoot', 'thead', 'tr'].includes(t.name)) {\n      if (!this.hasInTableScope(t.name)) return;\n      this.closeCell(); return this.process(t);\n    }\n    return this.mInBody(t);\n  }\n  private closeCell() {\n    const which = this.hasInTableScope('td') ? 'td' : 'th';\n    this.generateImpliedEndTags(); this.popUntil(which); this.clearAfeToMarker(); this.mode = 'inRow';\n  }\n  private mInSelect(t: Token) {\n    if (t.type === 'character') { this.insertText(t.data); return; }\n    if (t.type === 'comment') { this.insertComment(t.data); return; }\n    if (t.type === 'doctype') return;\n    if (t.type === 'startTag') {\n      const n = t.name;\n      if (n === 'html') return this.mInBody(t);\n      if (n === 'option') { if (this.currentName() === 'option') this.open.pop(); this.insertElement(t); return; }\n      if (n === 'optgroup') { if (this.currentName() === 'option') this.open.pop(); if (this.currentName() === 'optgroup') this.open.pop(); this.insertElement(t); return; }\n      if (n === 'hr') { if (this.currentName() === 'option') this.open.pop(); if (this.currentName() === 'optgroup') this.open.pop(); this.insertElement(t); this.open.pop(); return; }\n      if (n === 'select') { if (this.hasInSelectScope('select')) { this.popUntil('select'); this.resetInsertionMode(); } return; }\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (n === 'input' || n === 'keygen' || n === 'textarea') { if (!this.hasInSelectScope('select')) return; this.popUntil('select'); this.resetInsertionMode(); return this.process(t); }\n      /* v8 ignore stop */\n      if (n === 'script' || n === 'template') return this.mInHead(t);\n      // Recent spec: a <select> may now contain general flow content — any other\n      // start tag is processed with the in-body rules (insert/reconstruct), not ignored.\n      return this.mInBody(t);\n    }\n    if (t.type === 'endTag') {\n      const n = t.name;\n      if (n === 'optgroup') { if (this.currentName() === 'option' && this.open[this.open.length - 2]?.name === 'optgroup') this.open.pop(); if (this.currentName() === 'optgroup') this.open.pop(); return; }\n      if (n === 'option') { if (this.currentName() === 'option') this.open.pop(); return; }\n      if (n === 'select') { if (!this.hasInSelectScope('select')) return; this.popUntil('select'); this.resetInsertionMode(); return; }\n      if (n === 'template') return this.mInHead(t);\n      return this.mInBody(t);\n    }\n    if (t.type === 'eof') return this.mInBody(t);\n  }\n\n  /** \"in select in table\": a table-structure tag closes the whole select and is\n   * reprocessed; everything else falls through to the normal select rules. */\n  private mInSelectInTable(t: Token) {\n    if (t.type === 'startTag' || t.type === 'endTag') {\n      const n = t.name;\n      if (n === 'caption' || n === 'table' || n === 'tbody' || n === 'tfoot' || n === 'thead' || n === 'tr' || n === 'td' || n === 'th') {\n        // end tags only act when that element is actually in table scope.\n        if (t.type === 'endTag' && !this.hasInTableScope(n)) return;\n        this.popUntil('select');\n        this.resetInsertionMode();\n        return this.process(t);\n      }\n    }\n    return this.mInSelect(t);\n  }\n\n  /** \"in template\": route head-ish content to inHead, switch the current template\n   * insertion mode for table-context tags, close on </template>/EOF. Simplified\n   * vs. the spec but loop-free and safe (template content is dropped by the\n   * sanitizer regardless of the exact subtree). */\n  private mInTemplate(t: Token) {\n    if (t.type === 'character' || t.type === 'comment' || t.type === 'doctype') return this.mInBody(t);\n    if (t.type === 'eof') {\n      /* v8 ignore start -- unreachable in document-only parsing: defensive / fragment-context guard */\n      if (!this.hasInScope('template')) return; // stop\n      /* v8 ignore stop */\n      this.popUntil('template'); this.clearAfeToMarker(); this.templateModes.pop(); this.resetInsertionMode();\n      return this.process(t);\n    }\n    if (t.type === 'endTag') {\n      if (t.name === 'template') return this.mInHead(t); // close handled there\n      return; // other end tags are ignored in template content\n    }\n    const n = t.name;\n    if (HEAD_TAGS.has(n) || n === 'script') return this.mInHead(t); // base/link/meta/template/title/style/script…\n    // A table-context start tag sets the current template insertion mode, then is reprocessed there.\n    let m: Mode = 'inBody';\n    if (n === 'caption' || n === 'colgroup' || n === 'tbody' || n === 'tfoot' || n === 'thead') m = 'inTable';\n    else if (n === 'col') m = 'inColumnGroup';\n    else if (n === 'tr') m = 'inTableBody';\n    else if (n === 'td' || n === 'th') m = 'inRow';\n    this.templateModes[this.templateModes.length - 1] = m;\n    this.mode = m;\n    return this.process(t);\n  }\n}\n\n\n/** Order-independent attribute-set equality (for the adoption agency's Noah's Ark). */\nfunction sameAttrs(a: Array<[string, string]>, b: Array<[string, string]>): boolean {\n  if (a.length !== b.length) return false;\n  for (const [k, v] of a) {\n    let found = false;\n    for (const [k2, v2] of b) { if (k2 === k && v2 === v) { found = true; break; } }\n    if (!found) return false;\n  }\n  return true;\n}\n","/**\n * `neosanitize/whatwg-parser`: the browser-faithful WHATWG parse tree, exposed.\n *\n * Same tokenizer and tree construction the main sanitizer runs on (100% html5lib\n * tokenizer conformance), without any policy or filtering. Read, query, and\n * re-serialize HTML the way a browser would build it. Zero deps, no DOM.\n *\n *   import { parse, findAll, textContent, serialize } from 'neosanitize/whatwg-parser';\n *\n * `parse()` builds a full document (implied `<html>/<head>/<body>`), like\n * `new DOMParser().parseFromString(html, 'text/html')`.\n */\nimport { TreeBuilder } from '../parser/tree-builder';\nimport type { DocumentNode, ElementNode, ParentNode, TreeNode } from '../parser/tree-builder';\n\nexport type { DocumentNode, ElementNode, TextNode, CommentNode, DoctypeNode, TreeNode, ParentNode, NS } from '../parser/tree-builder';\n\n/** Parse HTML into the full WHATWG document tree a browser would build. */\nexport function parse(html: string): DocumentNode {\n\treturn new TreeBuilder(html).parse();\n}\n\n/**\n * The bundled WHATWG parser as a parse adapter. Import it from here (not from\n * `neosanitize`) when you need it in a browser bundle: the `.` browser export\n * resolves to the DOMParser build, which does not carry this adapter.\n *\n *   import { whatwgAdapter } from 'neosanitize/whatwg-parser';\n *   Sanitizer.builder(ugc).parser(whatwgAdapter).build();\n */\nexport const whatwgAdapter = parse;\n\n// --- serialization (policy-free; faithful HTML output) ----------------------\nconst VOID_ELEMENTS = new Set(['area', 'base', 'basefont', 'bgsound', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']);\nconst RAW_TEXT = new Set(['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'noscript', 'plaintext']);\n\nconst RE_AMP = /&/g;\nconst RE_LT = /</g;\nconst RE_GT = />/g;\nconst RE_QUOT = /\"/g;\nconst NBSP = String.fromCharCode(0xa0); // U+00A0 — escaped to &nbsp; like the browser\nconst escapeText = (s: string) => s.replace(RE_AMP, \"&amp;\").replace(RE_LT, \"&lt;\").replace(RE_GT, \"&gt;\").split(NBSP).join(\"&nbsp;\");\nconst escapeAttr = (s: string) => s.replace(RE_AMP, \"&amp;\").replace(RE_QUOT, \"&quot;\").split(NBSP).join(\"&nbsp;\");\n// Foreign attrs are stored as \"xlink href\" (space form) → re-emit as \"xlink:href\".\nconst attrName = (n: string) => (n.indexOf(' ') === -1 ? n : n.replace(' ', ':'));\n\nfunction emitNode(node: TreeNode, raw: boolean, out: string[]): void {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\tout.push(raw ? node.value : escapeText(node.value));\n\t\t\tbreak;\n\t\tcase 'element':\n\t\t\tout.push('<' + node.name);\n\t\t\tfor (const [k, v] of node.attrs) out.push(' ' + attrName(k) + '=\"' + escapeAttr(v) + '\"');\n\t\t\tout.push('>');\n\t\t\tif (VOID_ELEMENTS.has(node.name)) break;\n\t\t\tfor (const child of node.children) emitNode(child, RAW_TEXT.has(node.name), out);\n\t\t\tout.push('</' + node.name + '>');\n\t\t\tbreak;\n\t\tcase 'comment':\n\t\t\tout.push('<!--' + node.value + '-->');\n\t\t\tbreak;\n\t\tcase 'doctype':\n\t\t\tout.push('<!DOCTYPE ' + node.name + '>');\n\t\t\tbreak;\n\t}\n}\n\n/** Serialize a node (or a whole document) back to HTML, faithfully — no filtering. */\nexport function serialize(node: DocumentNode | TreeNode): string {\n\tconst out: string[] = [];\n\tif (node.type === 'document') for (const child of node.children) emitNode(child, false, out);\n\telse emitNode(node, false, out);\n\treturn out.join('');\n}\n\n// --- traversal --------------------------------------------------------------\n/**\n * Depth-first (pre-order) walk over every descendant of `root`. Return `false`\n * from the visitor to skip that node's subtree.\n */\nexport function walk(root: ParentNode, visit: (node: TreeNode, parent: ParentNode) => void | boolean): void {\n\tfor (const child of root.children) {\n\t\tif (visit(child, root) !== false && child.type === 'element') walk(child, visit);\n\t}\n}\n\n/** All descendant text concatenated — DOM `textContent` semantics. */\nexport function textContent(node: DocumentNode | TreeNode): string {\n\tif (node.type === 'text') return node.value;\n\tif (node.type === 'comment' || node.type === 'doctype') return '';\n\tlet s = '';\n\tfor (const child of node.children) s += textContent(child);\n\treturn s;\n}\n\n/** A tag name (e.g. `'a'`) or a predicate over elements. */\nexport type ElementMatch = string | ((el: ElementNode) => boolean);\nconst matches = (el: ElementNode, m: ElementMatch) => (typeof m === 'string' ? el.name === m : m(el));\n\n/** First descendant element matching a tag name or predicate, or `null`. */\nexport function find(root: ParentNode, match: ElementMatch): ElementNode | null {\n\tfor (const child of root.children) {\n\t\tif (child.type !== 'element') continue;\n\t\tif (matches(child, match)) return child;\n\t\tconst inner = find(child, match);\n\t\tif (inner) return inner;\n\t}\n\treturn null;\n}\n\n/** Every descendant element matching a tag name or predicate (document order). */\nexport function findAll(root: ParentNode, match: ElementMatch): ElementNode[] {\n\tconst acc: ElementNode[] = [];\n\t(function rec(parent: ParentNode) {\n\t\tfor (const child of parent.children) {\n\t\t\tif (child.type !== 'element') continue;\n\t\t\tif (matches(child, match)) acc.push(child);\n\t\t\trec(child);\n\t\t}\n\t})(root);\n\treturn acc;\n}\n"],"mappings":"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"}