aboutsummaryrefslogblamecommitdiffstats
path: root/src/constant.rs
blob: 5cb78261dcfc87bad6e5be3525f58c29779d7410 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                                                              
















                                                                          

                                                     
   




                                                                        
 

                                                         
   

                                                                        
   

                                                                
 

                                               
   


                                                                              
   

                                                                







                                                                          

                                                                        
   

                                                                
 
                                                                             
   




                                                                           



                                                                


                                                                                













































































                                                                                                                                                           

                                                              
   



                                                                               
   










                                                                                             
 
                                                               
   





                                                                         




                                                                                   







                                                                                             

                                                           
                                                  
   



                                                                              

                                                                                 

                                                    
                                              
                              
 
                                                                                
   
                                                    
   



                                                                                      

















                                                                                                                                                     
                                                     
            
          

             


            






                    


             
             













                 





                           

















































































                                      
          

             



            













                           











                            


































                        
             



            















                     
















             







































































































































                              


             
             



             








                           
             

             























                         




            


















































































                           





















                     




               



             

























                       





























                        
















                     




             
            

            


            





              

































               




              
             







































































































                         

























               




              

              





































                       




























                  






















                      














                  



































                       











             








































                  
          























                    







             





















































               










































                     

             


            


            





























               










              

































               
























































































































                          
















                















                    



             





































                      

























































                      























































                     





























                       













             






























              

             


               































                





               






































                  













               





































                









































































                        












                    





















































































                      


           
          
























                 



















                  

            




































                        



             






             








               






















                     














































































                       



             





           



























                                                                                                                                                     



















































                                                                                                                                                           
                                                                                                                                  



























                                                                                                                                                        
                                                                                                                                              































                                                                                                                                                       
  













































                                                               
//! Constants needed to parse markdown.
//!
//! Most of these constants are magic numbers, such as the number of markers
//! needed to parse [code (fenced)][code_fenced]
//! ([`CODE_FENCED_SEQUENCE_SIZE_MIN`][]) or the max number of allowed markers
//! in a [heading (atx)][heading_atx]
//! ([`HEADING_ATX_OPENING_FENCE_SIZE_MAX`][]).
//!
//! Some constants are instead lists of things, such as the list of tag names
//! considered in the **raw** production of [HTML (flow)][html_flow]
//! ([`HTML_RAW_NAMES`][]), or the list of allowed named character references
//! ([`CHARACTER_REFERENCE_NAMES`][]).
//!
//! [code_fenced]: crate::construct::code_fenced
//! [heading_atx]: crate::construct::heading_atx
//! [html_flow]: crate::construct::html_flow

/// The number of characters allowed in a protocol of an [autolink][].
///
/// The protocol part is the `xxx` in `<xxx://example.com>`.
/// 32 characters is fine, 33 is too many.
///
/// [autolink]: crate::construct::autolink
pub const AUTOLINK_SCHEME_SIZE_MAX: usize = 32;

/// The number of characters allowed in a domain of an email [autolink][].
///
/// There can be multiple “domains”.
/// A domain part is each `xxx` in `<example@xxx.xxx.xxx>`.
/// 63 characters is fine, 64 is too many.
///
/// [autolink]: crate::construct::autolink
pub const AUTOLINK_DOMAIN_SIZE_MAX: usize = 63;

/// The max number of characters in a decimal numeric
/// [character reference][character_reference].
///
/// To illustrate, this allows `&#9999999;` and disallows `&#99999990;`.
/// This limit is imposed because all bigger numbers are invalid.
///
/// [character_reference]: crate::construct::character_reference
pub const CHARACTER_REFERENCE_DECIMAL_SIZE_MAX: usize = 7;

/// The max number of characters in a hexadecimal numeric
/// [character reference][character_reference].
///
/// To illustrate, this allows `&#xff9999;` and disallows `&#xff99990;`.
/// This limit is imposed because all bigger numbers are invalid.
///
/// [character_reference]: crate::construct::character_reference
pub const CHARACTER_REFERENCE_HEXADECIMAL_SIZE_MAX: usize = 6;

/// The max number of characters in a named
/// [character reference][character_reference].
///
/// This is the number of the longest name in [`CHARACTER_REFERENCE_NAMES`][].
/// It allows `&CounterClockwiseContourIntegral;` and prevents the parser from
/// continuing for eons.
///
/// [character_reference]: crate::construct::character_reference
pub const CHARACTER_REFERENCE_NAMED_SIZE_MAX: usize = 31;

/// The number of markers needed for [code (fenced)][code_fenced] to form.
///
/// Like many things in markdown, the number is `3`.
///
/// [code_fenced]: crate::construct::code_fenced
pub const CODE_FENCED_SEQUENCE_SIZE_MIN: usize = 3;

/// The number of spaces needed, before a line ending, for a [hard break
/// (trailing)][hard_break_trailing] to form.
///
/// [hard_break_trailing]: crate::construct::hard_break_trailing
pub const HARD_BREAK_PREFIX_SIZE_MIN: usize = 2;

/// The max number of markers allowed to form a [heading (atx)][heading_atx].
///
/// This limitation is imposed by HTML, which imposes a max heading rank of
/// `6`.
///
/// [heading_atx]: crate::construct::heading_atx
pub const HEADING_ATX_OPENING_FENCE_SIZE_MAX: usize = 6;

/// List of HTML tag names that form the **basic** production of
/// [HTML (flow)][html_flow].
///
/// The **basic** production allows interleaving HTML and markdown with blank
/// lines and allows flow (block) elements to interrupt definitions, paragraphs,
/// and heading (setext).
/// Tag name matching must be performed insensitive to case, and thus this list
/// includes lowercase tag names.
///
/// Tag names not on this list result in the **complete** production.
///
/// > 👉 **Note**: `source` was removed on `main` of the `CommonMark` spec and
/// > is slated to be released in `CommonMark@0.31`.
///
/// ## References
///
/// *   [*§ 4.6 HTML blocks* in `CommonMark`](https://spec.commonmark.org/0.30/#html-blocks)
/// *   [*Remove source element as HTML block start condition* as `commonmark/commonmark-spec#710`](https://github.com/commonmark/commonmark-spec/pull/710)
///
/// [html_flow]: crate::construct::html_flow
pub const HTML_BLOCK_NAMES: [&str; 61] = [
    "address",
    "article",
    "aside",
    "base",
    "basefont",
    "blockquote",
    "body",
    "caption",
    "center",
    "col",
    "colgroup",
    "dd",
    "details",
    "dialog",
    "dir",
    "div",
    "dl",
    "dt",
    "fieldset",
    "figcaption",
    "figure",
    "footer",
    "form",
    "frame",
    "frameset",
    "h1",
    "h2",
    "h3",
    "h4",
    "h5",
    "h6",
    "head",
    "header",
    "hr",
    "html",
    "iframe",
    "legend",
    "li",
    "link",
    "main",
    "menu",
    "menuitem",
    "nav",
    "noframes",
    "ol",
    "optgroup",
    "option",
    "p",
    "param",
    "section",
    "summary",
    "table",
    "tbody",
    "td",
    "tfoot",
    "th",
    "thead",
    "title",
    "tr",
    "track",
    "ul",
];

/// List of HTML tag names that form the **raw** production of
/// [HTML (flow)][html_flow].
///
/// The **raw** production allows blank lines and thus no interleaving with
/// markdown.
/// Tag name matching must be performed insensitive to case, and thus this list
/// includes lowercase tag names.
///
/// The number of the longest tag name is also stored as a constant in
/// [`HTML_RAW_SIZE_MAX`][].
///
/// > 👉 **Note**: `textarea` was added in `CommonMark@0.30`.
///
/// ## References
///
/// *   [*§ 4.6 HTML blocks* in `CommonMark`](https://spec.commonmark.org/0.30/#html-blocks)
///
/// [html_flow]: crate::construct::html_flow
pub const HTML_RAW_NAMES: [&str; 4] = ["pre", "script", "style", "textarea"];

/// The number of the longest tag name in [`HTML_RAW_NAMES`][].
///
/// This is currently the size of `textarea`.
pub const HTML_RAW_SIZE_MAX: usize = 8;

/// To safeguard performance, labels are capped at a large number: `999`.
pub const LINK_REFERENCE_SIZE_MAX: usize = 999;

/// To do.
/// See: <https://spec.commonmark.org/0.30/#link-destination>,
/// <https://github.com/remarkjs/react-markdown/issues/658#issuecomment-984345577>.
pub const LINK_RESOURCE_DESTINATION_BALANCE_MAX: usize = 32;

/// List of protocols allowed, when operating safely, as `href` on `a`.
///
/// This list is based on what is allowed by GitHub.
pub const SAFE_PROTOCOL_HREF: [&str; 6] = ["http", "https", "irc", "ircs", "mailto", "xmpp"];

/// List of protocols allowed, when operating safely, as `src` on `img`.
///
/// This list is based on what is allowed by GitHub.
pub const SAFE_PROTOCOL_SRC: [&str; 2] = ["http", "https"];

/// The number of characters that form a tab stop.
///
/// This relates to the number of whitespace characters needed to form certain
/// constructs in markdown, most notable the whitespace required to form
/// [code (indented)][code_indented].
///
/// > 👉 **Note**: each [`Code::VirtualSpace`][vs] and `Code::Char('\t' | ' ')`
/// > counts.
///
/// [code_indented]: crate::construct::code_indented
/// [vs]: crate::tokenizer::Code::VirtualSpace
pub const TAB_SIZE: usize = 4;

/// The number of markers needed for a [thematic break][thematic_break] to form.
///
/// Like many things in markdown, the number is `3`.
///
/// [thematic_break]: crate::construct::thematic_break
pub const THEMATIC_BREAK_MARKER_COUNT_MIN: usize = 3;

// Important: please touch the below lists as few times as possible to keep Git small.

/// List of names that can form a named
/// [character reference][character_reference].
///
/// This list is sensitive to casing.
///
/// The number of the longest name (`CounterClockwiseContourIntegral`) is also
/// stored as a constant in [`CHARACTER_REFERENCE_NAMED_SIZE_MAX`][].
///
/// The corresponding values of this list are stored in
/// [`CHARACTER_REFERENCE_VALUES`][].
/// They correspond through their index.
///
/// ## References
///
/// *   [*§ 2.5 Entity and numeric character references* in `CommonMark`](https://spec.commonmark.org/0.30/#entity-and-numeric-character-references)
///
/// [character_reference]: crate::construct::character_reference
pub const CHARACTER_REFERENCE_NAMES: [&str; 2125] = [
    "AElig",
    "AMP",
    "Aacute",
    "Abreve",
    "Acirc",
    "Acy",
    "Afr",
    "Agrave",
    "Alpha",
    "Amacr",
    "And",
    "Aogon",
    "Aopf",
    "ApplyFunction",
    "Aring",
    "Ascr",
    "Assign",
    "Atilde",
    "Auml",
    "Backslash",
    "Barv",
    "Barwed",
    "Bcy",
    "Because",
    "Bernoullis",
    "Beta",
    "Bfr",
    "Bopf",
    "Breve",
    "Bscr",
    "Bumpeq",
    "CHcy",
    "COPY",
    "Cacute",
    "Cap",
    "CapitalDifferentialD",
    "Cayleys",
    "Ccaron",
    "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",
    "Eacute",
    "Ecaron",
    "Ecirc",
    "Ecy",
    "Edot",
    "Efr",
    "Egrave",
    "Element",
    "Emacr",
    "EmptySmallSquare",
    "EmptyVerySmallSquare",
    "Eogon",
    "Eopf",
    "Epsilon",
    "Equal",
    "EqualTilde",
    "Equilibrium",
    "Escr",
    "Esim",
    "Eta",
    "Euml",
    "Exists",
    "ExponentialE",
    "Fcy",
    "Ffr",
    "FilledSmallSquare",
    "FilledVerySmallSquare",
    "Fopf",
    "ForAll",
    "Fouriertrf",
    "Fscr",
    "GJcy",
    "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",
    "Icirc",
    "Icy",
    "Idot",
    "Ifr",
    "Igrave",
    "Im",
    "Imacr",
    "ImaginaryI",
    "Implies",
    "Int",
    "Integral",
    "Intersection",
    "InvisibleComma",
    "InvisibleTimes",
    "Iogon",
    "Iopf",
    "Iota",
    "Iscr",
    "Itilde",
    "Iukcy",
    "Iuml",
    "Jcirc",
    "Jcy",
    "Jfr",
    "Jopf",
    "Jscr",
    "Jsercy",
    "Jukcy",
    "KHcy",
    "KJcy",
    "Kappa",
    "Kcedil",
    "Kcy",
    "Kfr",
    "Kopf",
    "Kscr",
    "LJcy",
    "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",
    "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",
    "Nu",
    "OElig",
    "Oacute",
    "Ocirc",
    "Ocy",
    "Odblac",
    "Ofr",
    "Ograve",
    "Omacr",
    "Omega",
    "Omicron",
    "Oopf",
    "OpenCurlyDoubleQuote",
    "OpenCurlyQuote",
    "Or",
    "Oscr",
    "Oslash",
    "Otilde",
    "Otimes",
    "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",
    "Qfr",
    "Qopf",
    "Qscr",
    "RBarr",
    "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",
    "TRADE",
    "TSHcy",
    "TScy",
    "Tab",
    "Tau",
    "Tcaron",
    "Tcedil",
    "Tcy",
    "Tfr",
    "Therefore",
    "Theta",
    "ThickSpace",
    "ThinSpace",
    "Tilde",
    "TildeEqual",
    "TildeFullEqual",
    "TildeTilde",
    "Topf",
    "TripleDot",
    "Tscr",
    "Tstrok",
    "Uacute",
    "Uarr",
    "Uarrocir",
    "Ubrcy",
    "Ubreve",
    "Ucirc",
    "Ucy",
    "Udblac",
    "Ufr",
    "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",
    "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",
    "Ycirc",
    "Ycy",
    "Yfr",
    "Yopf",
    "Yscr",
    "Yuml",
    "ZHcy",
    "Zacute",
    "Zcaron",
    "Zcy",
    "Zdot",
    "ZeroWidthSpace",
    "Zeta",
    "Zfr",
    "Zopf",
    "Zscr",
    "aacute",
    "abreve",
    "ac",
    "acE",
    "acd",
    "acirc",
    "acute",
    "acy",
    "aelig",
    "af",
    "afr",
    "agrave",
    "alefsym",
    "aleph",
    "alpha",
    "amacr",
    "amalg",
    "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",
    "ascr",
    "ast",
    "asymp",
    "asympeq",
    "atilde",
    "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",
    "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",
    "ccirc",
    "ccups",
    "ccupssm",
    "cdot",
    "cedil",
    "cemptyv",
    "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",
    "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",
    "curvearrowleft",
    "curvearrowright",
    "cuvee",
    "cuwed",
    "cwconint",
    "cwint",
    "cylcty",
    "dArr",
    "dHar",
    "dagger",
    "daleth",
    "darr",
    "dash",
    "dashv",
    "dbkarow",
    "dblac",
    "dcaron",
    "dcy",
    "dd",
    "ddagger",
    "ddarr",
    "ddotseq",
    "deg",
    "delta",
    "demptyv",
    "dfisht",
    "dfr",
    "dharl",
    "dharr",
    "diam",
    "diamond",
    "diamondsuit",
    "diams",
    "die",
    "digamma",
    "disin",
    "div",
    "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",
    "easter",
    "ecaron",
    "ecir",
    "ecirc",
    "ecolon",
    "ecy",
    "edot",
    "ee",
    "efDot",
    "efr",
    "eg",
    "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",
    "euml",
    "euro",
    "excl",
    "exist",
    "expectation",
    "exponentiale",
    "fallingdotseq",
    "fcy",
    "female",
    "ffilig",
    "fflig",
    "ffllig",
    "ffr",
    "filig",
    "fjlig",
    "flat",
    "fllig",
    "fltns",
    "fnof",
    "fopf",
    "forall",
    "fork",
    "forkv",
    "fpartint",
    "frac12",
    "frac13",
    "frac14",
    "frac15",
    "frac16",
    "frac18",
    "frac23",
    "frac25",
    "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",
    "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",
    "ic",
    "icirc",
    "icy",
    "iecy",
    "iexcl",
    "iff",
    "ifr",
    "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",
    "iscr",
    "isin",
    "isinE",
    "isindot",
    "isins",
    "isinsv",
    "isinv",
    "it",
    "itilde",
    "iukcy",
    "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",
    "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",
    "ltcc",
    "ltcir",
    "ltdot",
    "lthree",
    "ltimes",
    "ltlarr",
    "ltquest",
    "ltrPar",
    "ltri",
    "ltrie",
    "ltrif",
    "lurdshar",
    "luruhar",
    "lvertneqq",
    "lvnE",
    "mDDot",
    "macr",
    "male",
    "malt",
    "maltese",
    "map",
    "mapsto",
    "mapstodown",
    "mapstoleft",
    "mapstoup",
    "marker",
    "mcomma",
    "mcy",
    "mdash",
    "measuredangle",
    "mfr",
    "mho",
    "micro",
    "mid",
    "midast",
    "midcir",
    "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",
    "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",
    "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",
    "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",
    "oast",
    "ocir",
    "ocirc",
    "ocy",
    "odash",
    "odblac",
    "odiv",
    "odot",
    "odsold",
    "oelig",
    "ofcir",
    "ofr",
    "ogon",
    "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",
    "ordm",
    "origof",
    "oror",
    "orslope",
    "orv",
    "oscr",
    "oslash",
    "osol",
    "otilde",
    "otimes",
    "otimesas",
    "ouml",
    "ovbar",
    "par",
    "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",
    "plussim",
    "plustwo",
    "pm",
    "pointint",
    "popf",
    "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",
    "rAarr",
    "rArr",
    "rAtail",
    "rBarr",
    "rHar",
    "race",
    "racute",
    "radic",
    "raemptyv",
    "rang",
    "rangd",
    "range",
    "rangle",
    "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",
    "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",
    "semi",
    "seswar",
    "setminus",
    "setmn",
    "sext",
    "sfr",
    "sfrown",
    "sharp",
    "shchcy",
    "shcy",
    "shortmid",
    "shortparallel",
    "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",
    "sup2",
    "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",
    "target",
    "tau",
    "tbrk",
    "tcaron",
    "tcedil",
    "tcy",
    "tdot",
    "telrec",
    "tfr",
    "there4",
    "therefore",
    "theta",
    "thetasym",
    "thetav",
    "thickapprox",
    "thicksim",
    "thinsp",
    "thkap",
    "thksim",
    "thorn",
    "tilde",
    "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",
    "uarr",
    "ubrcy",
    "ubreve",
    "ucirc",
    "ucy",
    "udarr",
    "udblac",
    "udhar",
    "ufisht",
    "ufr",
    "ugrave",
    "uharl",
    "uharr",
    "uhblk",
    "ulcorn",
    "ulcorner",
    "ulcrop",
    "ultri",
    "umacr",
    "uml",
    "uogon",
    "uopf",
    "uparrow",
    "updownarrow",
    "upharpoonleft",
    "upharpoonright",
    "uplus",
    "upsi",
    "upsih",
    "upsilon",
    "upuparrows",
    "urcorn",
    "urcorner",
    "urcrop",
    "uring",
    "urtri",
    "uscr",
    "utdot",
    "utilde",
    "utri",
    "utrif",
    "uuarr",
    "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",
    "yacy",
    "ycirc",
    "ycy",
    "yen",
    "yfr",
    "yicy",
    "yopf",
    "yscr",
    "yucy",
    "yuml",
    "zacute",
    "zcaron",
    "zcy",
    "zdot",
    "zeetrf",
    "zeta",
    "zfr",
    "zhcy",
    "zigrarr",
    "zopf",
    "zscr",
    "zwj",
    "zwnj",
];

/// List of values corresponding to names of named
/// [character references][character_reference].
///
/// The corresponding names of this list are stored in
/// [`CHARACTER_REFERENCE_NAMES`][].
/// They correspond through their index.
///
/// ## References
///
/// *   [*§ 2.5 Entity and numeric character references* in `CommonMark`](https://spec.commonmark.org/0.30/#entity-and-numeric-character-references)
///
/// [character_reference]: crate::construct::character_reference
pub const CHARACTER_REFERENCE_VALUES: [&str; 2125] = [
    "Æ", "&", "Á", "Ă", "Â", "А", "𝔄", "À", "Α", "Ā", "⩓", "Ą", "𝔸", "⁡", "Å", "𝒜", "≔", "Ã", "Ä",
    "∖", "⫧", "⌆", "Б", "∵", "ℬ", "Β", "𝔅", "𝔹", "˘", "ℬ", "≎", "Ч", "©", "Ć", "⋒", "ⅅ", "ℭ", "Č",
    "Ç", "Ĉ", "∰", "Ċ", "¸", "·", "ℭ", "Χ", "⊙", "⊖", "⊕", "⊗", "∲", "”", "’", "∷", "⩴", "≡", "∯",
    "∮", "ℂ", "∐", "∳", "⨯", "𝒞", "⋓", "≍", "ⅅ", "⤑", "Ђ", "Ѕ", "Џ", "‡", "↡", "⫤", "Ď", "Д", "∇",
    "Δ", "𝔇", "´", "˙", "˝", "`", "˜", "⋄", "ⅆ", "𝔻", "¨", "⃜", "≐", "∯", "¨", "⇓", "⇐", "⇔", "⫤",
    "⟸", "⟺", "⟹", "⇒", "⊨", "⇑", "⇕", "∥", "↓", "⤓", "⇵", "̑", "⥐", "⥞", "↽", "⥖", "⥟", "⇁", "⥗",
    "⊤", "↧", "⇓", "𝒟", "Đ", "Ŋ", "Ð", "É", "Ě", "Ê", "Э", "Ė", "𝔈", "È", "∈", "Ē", "◻", "▫", "Ę",
    "𝔼", "Ε", "⩵", "≂", "⇌", "ℰ", "⩳", "Η", "Ë", "∃", "ⅇ", "Ф", "𝔉", "◼", "▪", "𝔽", "∀", "ℱ", "ℱ",
    "Ѓ", ">", "Γ", "Ϝ", "Ğ", "Ģ", "Ĝ", "Г", "Ġ", "𝔊", "⋙", "𝔾", "≥", "⋛", "≧", "⪢", "≷", "⩾", "≳",
    "𝒢", "≫", "Ъ", "ˇ", "^", "Ĥ", "ℌ", "ℋ", "ℍ", "─", "ℋ", "Ħ", "≎", "≏", "Е", "IJ", "Ё", "Í", "Î",
    "И", "İ", "ℑ", "Ì", "ℑ", "Ī", "ⅈ", "⇒", "∬", "∫", "⋂", "⁣", "⁢", "Į", "𝕀", "Ι", "ℐ", "Ĩ", "І",
    "Ï", "Ĵ", "Й", "𝔍", "𝕁", "𝒥", "Ј", "Є", "Х", "Ќ", "Κ", "Ķ", "К", "𝔎", "𝕂", "𝒦", "Љ", "<", "Ĺ",
    "Λ", "⟪", "ℒ", "↞", "Ľ", "Ļ", "Л", "⟨", "←", "⇤", "⇆", "⌈", "⟦", "⥡", "⇃", "⥙", "⌊", "↔", "⥎",
    "⊣", "↤", "⥚", "⊲", "⧏", "⊴", "⥑", "⥠", "↿", "⥘", "↼", "⥒", "⇐", "⇔", "⋚", "≦", "≶", "⪡", "⩽",
    "≲", "𝔏", "⋘", "⇚", "Ŀ", "⟵", "⟷", "⟶", "⟸", "⟺", "⟹", "𝕃", "↙", "↘", "ℒ", "↰", "Ł", "≪", "⤅",
    "М", " ", "ℳ", "𝔐", "∓", "𝕄", "ℳ", "Μ", "Њ", "Ń", "Ň", "Ņ", "Н", "\u{200B}", "\u{200B}",
    "\u{200B}", "\u{200B}", "≫", "≪", "\n", "𝔑", "\u{2060}", " ", "ℕ", "⫬", "≢", "≭", "∦", "∉",
    "≠", "≂̸", "∄", "≯", "≱", "≧̸", "≫̸", "≹", "⩾̸", "≵", "≎̸", "≏̸", "⋪", "⧏̸", "⋬", "≮", "≰", "≸", "≪̸",
    "⩽̸", "≴", "⪢̸", "⪡̸", "⊀", "⪯̸", "⋠", "∌", "⋫", "⧐̸", "⋭", "⊏̸", "⋢", "⊐̸", "⋣", "⊂⃒", "⊈", "⊁", "⪰̸",
    "⋡", "≿̸", "⊃⃒", "⊉", "≁", "≄", "≇", "≉", "∤", "𝒩", "Ñ", "Ν", "Œ", "Ó", "Ô", "О", "Ő", "𝔒", "Ò",
    "Ō", "Ω", "Ο", "𝕆", "“", "‘", "⩔", "𝒪", "Ø", "Õ", "⨷", "Ö", "‾", "⏞", "⎴", "⏜", "∂", "П", "𝔓",
    "Φ", "Π", "±", "ℌ", "ℙ", "⪻", "≺", "⪯", "≼", "≾", "″", "∏", "∷", "∝", "𝒫", "Ψ", "\"", "𝔔", "ℚ",
    "𝒬", "⤐", "®", "Ŕ", "⟫", "↠", "⤖", "Ř", "Ŗ", "Р", "ℜ", "∋", "⇋", "⥯", "ℜ", "Ρ", "⟩", "→", "⇥",
    "⇄", "⌉", "⟧", "⥝", "⇂", "⥕", "⌋", "⊢", "↦", "⥛", "⊳", "⧐", "⊵", "⥏", "⥜", "↾", "⥔", "⇀", "⥓",
    "⇒", "ℝ", "⥰", "⇛", "ℛ", "↱", "⧴", "Щ", "Ш", "Ь", "Ś", "⪼", "Š", "Ş", "Ŝ", "С", "𝔖", "↓", "←",
    "→", "↑", "Σ", "∘", "𝕊", "√", "□", "⊓", "⊏", "⊑", "⊐", "⊒", "⊔", "𝒮", "⋆", "⋐", "⋐", "⊆", "≻",
    "⪰", "≽", "≿", "∋", "∑", "⋑", "⊃", "⊇", "⋑", "Þ", "™", "Ћ", "Ц", "\t", "Τ", "Ť", "Ţ", "Т", "𝔗",
    "∴", "Θ", "  ", " ", "∼", "≃", "≅", "≈", "𝕋", "⃛", "𝒯", "Ŧ", "Ú", "↟", "⥉", "Ў", "Ŭ", "Û", "У",
    "Ű", "𝔘", "Ù", "Ū", "_", "⏟", "⎵", "⏝", "⋃", "⊎", "Ų", "𝕌", "↑", "⤒", "⇅", "↕", "⥮", "⊥", "↥",
    "⇑", "⇕", "↖", "↗", "ϒ", "Υ", "Ů", "𝒰", "Ũ", "Ü", "⊫", "⫫", "В", "⊩", "⫦", "⋁", "‖", "‖", "∣",
    "|", "❘", "≀", " ", "𝔙", "𝕍", "𝒱", "⊪", "Ŵ", "⋀", "𝔚", "𝕎", "𝒲", "𝔛", "Ξ", "𝕏", "𝒳", "Я", "Ї",
    "Ю", "Ý", "Ŷ", "Ы", "𝔜", "𝕐", "𝒴", "Ÿ", "Ж", "Ź", "Ž", "З", "Ż", "\u{200B}", "Ζ", "ℨ", "ℤ",
    "𝒵", "á", "ă", "∾", "∾̳", "∿", "â", "´", "а", "æ", "⁡", "𝔞", "à", "ℵ", "ℵ", "α", "ā", "⨿", "&",
    "∧", "⩕", "⩜", "⩘", "⩚", "∠", "⦤", "∠", "∡", "⦨", "⦩", "⦪", "⦫", "⦬", "⦭", "⦮", "⦯", "∟", "⊾",
    "⦝", "∢", "Å", "⍼", "ą", "𝕒", "≈", "⩰", "⩯", "≊", "≋", "'", "≈", "≊", "å", "𝒶", "*", "≈", "≍",
    "ã", "ä", "∳", "⨑", "⫭", "≌", "϶", "‵", "∽", "⋍", "⊽", "⌅", "⌅", "⎵", "⎶", "≌", "б", "„", "∵",
    "∵", "⦰", "϶", "ℬ", "β", "ℶ", "≬", "𝔟", "⋂", "◯", "⋃", "⨀", "⨁", "⨂", "⨆", "★", "▽", "△", "⨄",
    "⋁", "⋀", "⤍", "⧫", "▪", "▴", "▾", "◂", "▸", "␣", "▒", "░", "▓", "█", "=⃥", "≡⃥", "⌐", "𝕓", "⊥",
    "⊥", "⋈", "╗", "╔", "╖", "╓", "═", "╦", "╩", "╤", "╧", "╝", "╚", "╜", "╙", "║", "╬", "╣", "╠",
    "╫", "╢", "╟", "⧉", "╕", "╒", "┐", "┌", "─", "╥", "╨", "┬", "┴", "⊟", "⊞", "⊠", "╛", "╘", "┘",
    "└", "│", "╪", "╡", "╞", "┼", "┤", "├", "‵", "˘", "¦", "𝒷", "⁏", "∽", "⋍", "\\", "⧅", "⟈", "•",
    "•", "≎", "⪮", "≏", "≏", "ć", "∩", "⩄", "⩉", "⩋", "⩇", "⩀", "∩︀", "⁁", "ˇ", "⩍", "č", "ç", "ĉ",
    "⩌", "⩐", "ċ", "¸", "⦲", "¢", "·", "𝔠", "ч", "✓", "✓", "χ", "○", "⧃", "ˆ", "≗", "↺", "↻", "®",
    "Ⓢ", "⊛", "⊚", "⊝", "≗", "⨐", "⫯", "⧂", "♣", "♣", ":", "≔", "≔", ",", "@", "∁", "∘", "∁", "ℂ",
    "≅", "⩭", "∮", "𝕔", "∐", "©", "℗", "↵", "✗", "𝒸", "⫏", "⫑", "⫐", "⫒", "⋯", "⤸", "⤵", "⋞", "⋟",
    "↶", "⤽", "∪", "⩈", "⩆", "⩊", "⊍", "⩅", "∪︀", "↷", "⤼", "⋞", "⋟", "⋎", "⋏", "¤", "↶", "↷", "⋎",
    "⋏", "∲", "∱", "⌭", "⇓", "⥥", "†", "ℸ", "↓", "‐", "⊣", "⤏", "˝", "ď", "д", "ⅆ", "‡", "⇊", "⩷",
    "°", "δ", "⦱", "⥿", "𝔡", "⇃", "⇂", "⋄", "⋄", "♦", "♦", "¨", "ϝ", "⋲", "÷", "÷", "⋇", "⋇", "ђ",
    "⌞", "⌍", "$", "𝕕", "˙", "≐", "≑", "∸", "∔", "⊡", "⌆", "↓", "⇊", "⇃", "⇂", "⤐", "⌟", "⌌", "𝒹",
    "ѕ", "⧶", "đ", "⋱", "▿", "▾", "⇵", "⥯", "⦦", "џ", "⟿", "⩷", "≑", "é", "⩮", "ě", "≖", "ê", "≕",
    "э", "ė", "ⅇ", "≒", "𝔢", "⪚", "è", "⪖", "⪘", "⪙", "⏧", "ℓ", "⪕", "⪗", "ē", "∅", "∅", "∅", " ",
    " ", " ", "ŋ", " ", "ę", "𝕖", "⋕", "⧣", "⩱", "ε", "ε", "ϵ", "≖", "≕", "≂", "⪖", "⪕", "=", "≟",
    "≡", "⩸", "⧥", "≓", "⥱", "ℯ", "≐", "≂", "η", "ð", "ë", "€", "!", "∃", "ℰ", "ⅇ", "≒", "ф", "♀",
    "ffi", "ff", "ffl", "𝔣", "fi", "fj", "♭", "fl", "▱", "ƒ", "𝕗", "∀", "⋔", "⫙", "⨍", "½", "⅓", "¼", "⅕",
    "⅙", "⅛", "⅔", "⅖", "¾", "⅗", "⅜", "⅘", "⅚", "⅝", "⅞", "⁄", "⌢", "𝒻", "≧", "⪌", "ǵ", "γ", "ϝ",
    "⪆", "ğ", "ĝ", "г", "ġ", "≥", "⋛", "≥", "≧", "⩾", "⩾", "⪩", "⪀", "⪂", "⪄", "⋛︀", "⪔", "𝔤", "≫",
    "⋙", "ℷ", "ѓ", "≷", "⪒", "⪥", "⪤", "≩", "⪊", "⪊", "⪈", "⪈", "≩", "⋧", "𝕘", "`", "ℊ", "≳", "⪎",
    "⪐", ">", "⪧", "⩺", "⋗", "⦕", "⩼", "⪆", "⥸", "⋗", "⋛", "⪌", "≷", "≳", "≩︀", "≩︀", "⇔", " ", "½",
    "ℋ", "ъ", "↔", "⥈", "↭", "ℏ", "ĥ", "♥", "♥", "…", "⊹", "𝔥", "⤥", "⤦", "⇿", "∻", "↩", "↪", "𝕙",
    "―", "𝒽", "ℏ", "ħ", "⁃", "‐", "í", "⁣", "î", "и", "е", "¡", "⇔", "𝔦", "ì", "ⅈ", "⨌", "∭", "⧜",
    "℩", "ij", "ī", "ℑ", "ℐ", "ℑ", "ı", "⊷", "Ƶ", "∈", "℅", "∞", "⧝", "ı", "∫", "⊺", "ℤ", "⊺", "⨗",
    "⨼", "ё", "į", "𝕚", "ι", "⨼", "¿", "𝒾", "∈", "⋹", "⋵", "⋴", "⋳", "∈", "⁢", "ĩ", "і", "ï", "ĵ",
    "й", "𝔧", "ȷ", "𝕛", "𝒿", "ј", "є", "κ", "ϰ", "ķ", "к", "𝔨", "ĸ", "х", "ќ", "𝕜", "𝓀", "⇚", "⇐",
    "⤛", "⤎", "≦", "⪋", "⥢", "ĺ", "⦴", "ℒ", "λ", "⟨", "⦑", "⟨", "⪅", "«", "←", "⇤", "⤟", "⤝", "↩",
    "↫", "⤹", "⥳", "↢", "⪫", "⤙", "⪭", "⪭︀", "⤌", "❲", "{", "[", "⦋", "⦏", "⦍", "ľ", "ļ", "⌈", "{",
    "л", "⤶", "“", "„", "⥧", "⥋", "↲", "≤", "←", "↢", "↽", "↼", "⇇", "↔", "⇆", "⇋", "↭", "⋋", "⋚",
    "≤", "≦", "⩽", "⩽", "⪨", "⩿", "⪁", "⪃", "⋚︀", "⪓", "⪅", "⋖", "⋚", "⪋", "≶", "≲", "⥼", "⌊", "𝔩",
    "≶", "⪑", "↽", "↼", "⥪", "▄", "љ", "≪", "⇇", "⌞", "⥫", "◺", "ŀ", "⎰", "⎰", "≨", "⪉", "⪉", "⪇",
    "⪇", "≨", "⋦", "⟬", "⇽", "⟦", "⟵", "⟷", "⟼", "⟶", "↫", "↬", "⦅", "𝕝", "⨭", "⨴", "∗", "_", "◊",
    "◊", "⧫", "(", "⦓", "⇆", "⌟", "⇋", "⥭", "‎", "⊿", "‹", "𝓁", "↰", "≲", "⪍", "⪏", "[", "‘", "‚",
    "ł", "<", "⪦", "⩹", "⋖", "⋋", "⋉", "⥶", "⩻", "⦖", "◃", "⊴", "◂", "⥊", "⥦", "≨︀", "≨︀", "∺", "¯",
    "♂", "✠", "✠", "↦", "↦", "↧", "↤", "↥", "▮", "⨩", "м", "—", "∡", "𝔪", "℧", "µ", "∣", "*", "⫰",
    "·", "−", "⊟", "∸", "⨪", "⫛", "…", "∓", "⊧", "𝕞", "∓", "𝓂", "∾", "μ", "⊸", "⊸", "⋙̸", "≫⃒", "≫̸",
    "⇍", "⇎", "⋘̸", "≪⃒", "≪̸", "⇏", "⊯", "⊮", "∇", "ń", "∠⃒", "≉", "⩰̸", "≋̸", "ʼn", "≉", "♮", "♮", "ℕ",
    " ", "≎̸", "≏̸", "⩃", "ň", "ņ", "≇", "⩭̸", "⩂", "н", "–", "≠", "⇗", "⤤", "↗", "↗", "≐̸", "≢", "⤨",
    "≂̸", "∄", "∄", "𝔫", "≧̸", "≱", "≱", "≧̸", "⩾̸", "⩾̸", "≵", "≯", "≯", "⇎", "↮", "⫲", "∋", "⋼", "⋺",
    "∋", "њ", "⇍", "≦̸", "↚", "‥", "≰", "↚", "↮", "≰", "≦̸", "⩽̸", "⩽̸", "≮", "≴", "≮", "⋪", "⋬", "∤",
    "𝕟", "¬", "∉", "⋹̸", "⋵̸", "∉", "⋷", "⋶", "∌", "∌", "⋾", "⋽", "∦", "∦", "⫽⃥", "∂̸", "⨔", "⊀", "⋠",
    "⪯̸", "⊀", "⪯̸", "⇏", "↛", "⤳̸", "↝̸", "↛", "⋫", "⋭", "⊁", "⋡", "⪰̸", "𝓃", "∤", "∦", "≁", "≄", "≄",
    "∤", "∦", "⋢", "⋣", "⊄", "⫅̸", "⊈", "⊂⃒", "⊈", "⫅̸", "⊁", "⪰̸", "⊅", "⫆̸", "⊉", "⊃⃒", "⊉", "⫆̸", "≹",
    "ñ", "≸", "⋪", "⋬", "⋫", "⋭", "ν", "#", "№", " ", "⊭", "⤄", "≍⃒", "⊬", "≥⃒", ">⃒", "⧞", "⤂", "≤⃒",
    "<⃒", "⊴⃒", "⤃", "⊵⃒", "∼⃒", "⇖", "⤣", "↖", "↖", "⤧", "Ⓢ", "ó", "⊛", "⊚", "ô", "о", "⊝", "ő", "⨸",
    "⊙", "⦼", "œ", "⦿", "𝔬", "˛", "ò", "⧁", "⦵", "Ω", "∮", "↺", "⦾", "⦻", "‾", "⧀", "ō", "ω", "ο",
    "⦶", "⊖", "𝕠", "⦷", "⦹", "⊕", "∨", "↻", "⩝", "ℴ", "ℴ", "ª", "º", "⊶", "⩖", "⩗", "⩛", "ℴ", "ø",
    "⊘", "õ", "⊗", "⨶", "ö", "⌽", "∥", "¶", "∥", "⫳", "⫽", "∂", "п", "%", ".", "‰", "⊥", "‱", "𝔭",
    "φ", "ϕ", "ℳ", "☎", "π", "⋔", "ϖ", "ℏ", "ℎ", "ℏ", "+", "⨣", "⊞", "⨢", "∔", "⨥", "⩲", "±", "⨦",
    "⨧", "±", "⨕", "𝕡", "£", "≺", "⪳", "⪷", "≼", "⪯", "≺", "⪷", "≼", "⪯", "⪹", "⪵", "⋨", "≾", "′",
    "ℙ", "⪵", "⪹", "⋨", "∏", "⌮", "⌒", "⌓", "∝", "∝", "≾", "⊰", "𝓅", "ψ", " ", "𝔮", "⨌", "𝕢", "⁗",
    "𝓆", "ℍ", "⨖", "?", "≟", "\"", "⇛", "⇒", "⤜", "⤏", "⥤", "∽̱", "ŕ", "√", "⦳", "⟩", "⦒", "⦥", "⟩",
    "»", "→", "⥵", "⇥", "⤠", "⤳", "⤞", "↪", "↬", "⥅", "⥴", "↣", "↝", "⤚", "∶", "ℚ", "⤍", "❳", "}",
    "]", "⦌", "⦎", "⦐", "ř", "ŗ", "⌉", "}", "р", "⤷", "⥩", "”", "”", "↳", "ℜ", "ℛ", "ℜ", "ℝ", "▭",
    "®", "⥽", "⌋", "𝔯", "⇁", "⇀", "⥬", "ρ", "ϱ", "→", "↣", "⇁", "⇀", "⇄", "⇌", "⇉", "↝", "⋌", "˚",
    "≓", "⇄", "⇌", "‏", "⎱", "⎱", "⫮", "⟭", "⇾", "⟧", "⦆", "𝕣", "⨮", "⨵", ")", "⦔", "⨒", "⇉", "›",
    "𝓇", "↱", "]", "’", "’", "⋌", "⋊", "▹", "⊵", "▸", "⧎", "⥨", "℞", "ś", "‚", "≻", "⪴", "⪸", "š",
    "≽", "⪰", "ş", "ŝ", "⪶", "⪺", "⋩", "⨓", "≿", "с", "⋅", "⊡", "⩦", "⇘", "⤥", "↘", "↘", "§", ";",
    "⤩", "∖", "∖", "✶", "𝔰", "⌢", "♯", "щ", "ш", "∣", "∥", "\u{AD}", "σ", "ς", "ς", "∼", "⩪", "≃",
    "≃", "⪞", "⪠", "⪝", "⪟", "≆", "⨤", "⥲", "←", "∖", "⨳", "⧤", "∣", "⌣", "⪪", "⪬", "⪬︀", "ь", "/",
    "⧄", "⌿", "𝕤", "♠", "♠", "∥", "⊓", "⊓︀", "⊔", "⊔︀", "⊏", "⊑", "⊏", "⊑", "⊐", "⊒", "⊐", "⊒", "□",
    "□", "▪", "▪", "→", "𝓈", "∖", "⌣", "⋆", "☆", "★", "ϵ", "ϕ", "¯", "⊂", "⫅", "⪽", "⊆", "⫃", "⫁",
    "⫋", "⊊", "⪿", "⥹", "⊂", "⊆", "⫅", "⊊", "⫋", "⫇", "⫕", "⫓", "≻", "⪸", "≽", "⪰", "⪺", "⪶", "⋩",
    "≿", "∑", "♪", "¹", "²", "³", "⊃", "⫆", "⪾", "⫘", "⊇", "⫄", "⟉", "⫗", "⥻", "⫂", "⫌", "⊋", "⫀",
    "⊃", "⊇", "⫆", "⊋", "⫌", "⫈", "⫔", "⫖", "⇙", "⤦", "↙", "↙", "⤪", "ß", "⌖", "τ", "⎴", "ť", "ţ",
    "т", "⃛", "⌕", "𝔱", "∴", "∴", "θ", "ϑ", "ϑ", "≈", "∼", " ", "≈", "∼", "þ", "˜", "×", "⊠", "⨱",
    "⨰", "∭", "⤨", "⊤", "⌶", "⫱", "𝕥", "⫚", "⤩", "‴", "™", "▵", "▿", "◃", "⊴", "≜", "▹", "⊵", "◬",
    "≜", "⨺", "⨹", "⧍", "⨻", "⏢", "𝓉", "ц", "ћ", "ŧ", "≬", "↞", "↠", "⇑", "⥣", "ú", "↑", "ў", "ŭ",
    "û", "у", "⇅", "ű", "⥮", "⥾", "𝔲", "ù", "↿", "↾", "▀", "⌜", "⌜", "⌏", "◸", "ū", "¨", "ų", "𝕦",
    "↑", "↕", "↿", "↾", "⊎", "υ", "ϒ", "υ", "⇈", "⌝", "⌝", "⌎", "ů", "◹", "𝓊", "⋰", "ũ", "▵", "▴",
    "⇈", "ü", "⦧", "⇕", "⫨", "⫩", "⊨", "⦜", "ϵ", "ϰ", "∅", "ϕ", "ϖ", "∝", "↕", "ϱ", "ς", "⊊︀", "⫋︀",
    "⊋︀", "⫌︀", "ϑ", "⊲", "⊳", "в", "⊢", "∨", "⊻", "≚", "⋮", "|", "|", "𝔳", "⊲", "⊂⃒", "⊃⃒", "𝕧", "∝",
    "⊳", "𝓋", "⫋︀", "⊊︀", "⫌︀", "⊋︀", "⦚", "ŵ", "⩟", "∧", "≙", "℘", "𝔴", "𝕨", "℘", "≀", "≀", "𝓌", "⋂",
    "◯", "⋃", "▽", "𝔵", "⟺", "⟷", "ξ", "⟸", "⟵", "⟼", "⋻", "⨀", "𝕩", "⨁", "⨂", "⟹", "⟶", "𝓍", "⨆",
    "⨄", "△", "⋁", "⋀", "ý", "я", "ŷ", "ы", "¥", "𝔶", "ї", "𝕪", "𝓎", "ю", "ÿ", "ź", "ž", "з", "ż",
    "ℨ", "ζ", "𝔷", "ж", "⇝", "𝕫", "𝓏", "‍", "‌",
];

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn constants() {
        assert_eq!(
            CHARACTER_REFERENCE_DECIMAL_SIZE_MAX,
            format!("{}", 0x10ffff).len(),
            "`CHARACTER_REFERENCE_DECIMAL_SIZE_MAX`"
        );

        assert_eq!(
            CHARACTER_REFERENCE_HEXADECIMAL_SIZE_MAX,
            format!("{:x}", 0x10ffff).len(),
            "`CHARACTER_REFERENCE_HEXADECIMAL_SIZE_MAX`"
        );

        assert_eq!(
            CHARACTER_REFERENCE_NAMED_SIZE_MAX,
            longest(&CHARACTER_REFERENCE_NAMES).unwrap().len(),
            "`CHARACTER_REFERENCE_NAMED_SIZE_MAX`"
        );

        assert_eq!(
            HTML_RAW_SIZE_MAX,
            longest(&HTML_RAW_NAMES).unwrap().len(),
            "`HTML_RAW_SIZE_MAX`"
        );
    }

    fn longest<'a>(list: &[&'a str]) -> Option<&'a str> {
        let mut max = 0;
        let mut result = None;
        for name in list.iter() {
            let len = name.len();
            if len > max {
                max = len;
                result = Some(*name);
            }
        }

        result
    }
}