diff --git a/Cargo.toml b/Cargo.toml index a0f650fa..ee557de2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ members = [ "rcdom", "xml5ever", "match_token" -] +, "html_named_entities"] [workspace.package] version = "0.35.0" @@ -24,6 +24,7 @@ match_token = { version = "0.35.0", path = "match_token" } markup5ever = { version = "0.35.0", path = "markup5ever" } xml5ever = { version = "0.35.0", path = "xml5ever" } html5ever = { version = "0.35.0", path = "html5ever" } +html_named_entities = { version = "0.1", path = "html_named_entities"} # External dependencies syn = { version = "2", features = ["full"] } @@ -40,9 +41,7 @@ phf_codegen = "0.11" # Dev dependencies criterion = "0.6" libtest-mimic = "0.8.1" +serde = { version = "1", features = ["derive"] } serde_json = "1.0" env_logger = "0.10" typed-arena = "2.0.2" - - - diff --git a/RELEASING.MD b/RELEASING.MD index 0de428a6..e9b3a437 100644 --- a/RELEASING.MD +++ b/RELEASING.MD @@ -21,6 +21,13 @@ The **web_atoms** crate is on a separate cycle as it needs frequent releases but - Publish the new version of **web_atoms** - Optionally: publish a new version of the other crates to match +## Making a release of **web_atoms**: + +- Bump the version in `html_named_entities/Cargo.toml` +- Update the version **html_named_entities** in the workspace `Cargo.toml`'s `[workspace.dependencies]` section to match +- Publish the new version of **html_named_entities** +- Optionally: publish a new version of the other crates to match + ## Making a release of all other crates In the workspace `Cargo.toml`: diff --git a/html5ever/Cargo.toml b/html5ever/Cargo.toml index b6452972..64f51a17 100644 --- a/html5ever/Cargo.toml +++ b/html5ever/Cargo.toml @@ -18,6 +18,7 @@ trace_tokenizer = [] [dependencies] markup5ever = { workspace = true } match_token = { workspace = true } +html_named_entities = { workspace = true } log = { workspace = true } [dev-dependencies] diff --git a/html5ever/benches/html5ever.rs b/html5ever/benches/html5ever.rs index f74b13a7..26f4bd49 100644 --- a/html5ever/benches/html5ever.rs +++ b/html5ever/benches/html5ever.rs @@ -80,6 +80,7 @@ fn html5ever_benchmark(c: &mut Criterion) { run_bench(c, "small-fragment.html"); run_bench(c, "tiny-fragment.html"); run_bench(c, "strong.html"); + run_bench(c, "entities.html"); } criterion_group!(benches, html5ever_benchmark); diff --git a/html5ever/data/bench/entities.html b/html5ever/data/bench/entities.html new file mode 100644 index 00000000..e1517193 --- /dev/null +++ b/html5ever/data/bench/entities.html @@ -0,0 +1 @@ +ÁÁááĂă∾∿∾̳ÂÂââ´´АаÆÆææ⁡𝔄𝔞ÀÀààℵℵΑαĀā⨿&&&&⩕⩓∧⩜⩘⩚∠⦤∠⦨⦩⦪⦫⦬⦭⦮⦯∡∟⊾⦝∢Å⍼Ąą𝔸𝕒⩯≈⩰≊≋'⁡≈≊ÅÅåå𝒜𝒶≔*≈≍ÃÃããÄÄää∳⨑≌϶‵∽⋍∖⫧⊽⌅⌆⌅⎵⎶≌Бб„∵∵∵⦰϶ℬℬΒβℶ≬𝔅𝔟⋂◯⋃⨀⨁⨂⨆★▽△⨄⋁⋀⤍⧫▪▴▾◂▸␣▒░▓█=⃥≡⃥⫭⌐𝔹𝕓⊥⊥⋈⧉┐╕╖╗┌╒╓╔─═┬╤╥╦┴╧╨╩⊟⊞⊠┘╛╜╝└╘╙╚│║┼╪╫╬┤╡╢╣├╞╟╠‵˘˘¦¦𝒷ℬ⁏∽⋍⧅\⟈••≎⪮≏≎≏Ćć⩄⩉⩋∩⋒⩇⩀ⅅ∩︀⁁ˇℭ⩍ČčÇÇççĈĉ∰⩌⩐Ċċ¸¸¸⦲¢¢··𝔠ℭЧч✓✓Χχˆ≗↺↻⊛⊚⊝⊙®Ⓢ⊖⊕⊗○⧃≗⨐⫯⧂∲”’♣♣:∷⩴≔≔,@∁∘∁ℂ≅⩭≡∮∯∮𝕔ℂ∐∐©©©©℗∳↵✗⨯𝒞𝒸⫏⫑⫐⫒⋯⤸⤵⋞⋟↶⤽⩈⩆≍∪⋓⩊⊍⩅∪︀↷⤼⋞⋟⋎⋏¤¤↶↷⋎⋏∲∱⌭†‡ℸ↓↡⇓‐⫤⊣⤏˝ĎďДд‡⇊ⅅⅆ⤑⩷°°∇Δδ⦱⥿𝔇𝔡⥥⇃⇂´˙˝`˜⋄⋄⋄♦♦¨ⅆϝ⋲÷÷÷⋇⋇Ђђ⌞⌍$𝔻𝕕¨˙⃜≐≑≐∸∔⊡⌆∯¨⇓⇐⇔⫤⟸⟺⟹⇒⊨⇑⇕∥⤓↓↓⇓⇵̑⇊⇃⇂⥐⥞⥖↽⥟⥗⇁↧⊤⤐⌟⌌𝒟𝒹Ѕѕ⧶Đđ⋱▿▾⇵⥯⦦Џџ⟿ÉÉéé⩮ĚěÊÊêê≖≕Ээ⩷Ėė≑ⅇ≒𝔈𝔢⪚ÈÈèè⪖⪘⪙∈⏧ℓ⪕⪗Ēē∅∅◻∅▫   Ŋŋ Ęę𝔼𝕖⋕⧣⩱εΕεϵ≖≕≂⪖⪕⩵=≂≟⇌≡⩸⧥⥱≓ℯℰ≐⩳≂ΗηÐÐððËËëë€!∃∃ℰⅇⅇ≒Фф♀ffiffffl𝔉𝔣fi◼▪fj♭fl▱ƒ𝔽𝕗∀∀⋔⫙ℱ⨍½½⅓¼¼⅕⅙⅛⅔⅖¾¾⅗⅜⅘⅚⅝⅞⁄⌢𝒻ℱǵΓγϜϝ⪆ĞğĢĜĝГгĠġ≥≧⪌⋛≥≧⩾⪩⩾⪀⪂⪄⋛︀⪔𝔊𝔤≫⋙⋙ℷЃѓ⪥≷⪒⪤⪊⪊⪈≩⪈≩⋧𝔾𝕘`≥⋛≧⪢≷⩾≳𝒢ℊ≳⪎⪐⪧⩺>>>>≫⋗⦕⩼⪆⥸⋗⋛⪌≷≳≩︀≩︀ˇ ½ℋЪъ⥈↔⇔↭^ℏĤĥ♥♥…⊹𝔥ℌℋ⤥⤦⇿∻↩↪𝕙ℍ―─𝒽ℋℏĦħ≎≏⁃‐ÍÍíí⁣ÎÎîîИиİЕе¡¡⇔𝔦ℑÌÌììⅈ⨌∭⧜℩IJijĪīℑⅈℐℑıℑ⊷Ƶ⇒℅∈∞⧝ı⊺∫∬ℤ∫⊺⋂⨗⨼⁣⁢ЁёĮį𝕀𝕚Ιι⨼¿¿𝒾ℐ∈⋵⋹⋴⋳∈⁢ĨĩІіÏÏïïĴĵЙй𝔍𝔧ȷ𝕁𝕛𝒥𝒿ЈјЄєΚκϰĶķКк𝔎𝔨ĸХхЌќ𝕂𝕜𝒦𝓀⇚Ĺĺ⦴ℒΛλ⟨⟪⦑⟨⪅ℒ««⇤⤟←↞⇐⤝↩↫⤹⥳↢⤙⤛⪫⪭⪭︀⤌⤎❲{[⦋⦏⦍ĽľĻļ⌈{Лл⤶“„⥧⥋↲≤≦⟨⇤←←⇐⇆↢⌈⟦⥡⥙⇃⌊↽↼⇇↔↔⇔⇆⇋↭⥎↤⊣⥚⋋⧏⊲⊴⥑⥠⥘↿⥒↼⪋⋚≤≦⩽⪨⩽⩿⪁⪃⋚︀⪓⪅⋖⋚⪋⋚≦≶≶⪡≲⩽≲⥼⌊𝔏𝔩≶⪑⥢↽↼⥪▄Љљ⇇≪⋘⌞⇚⥫◺Ŀŀ⎰⎰⪉⪉⪇≨⪇≨⋦⟬⇽⟦⟵⟵⟸⟷⟷⟺⟼⟶⟶⟹↫↬⦅𝕃𝕝⨭⨴∗_↙↘◊◊⧫(⦓⇆⌟⇋⥭‎⊿‹𝓁ℒ↰↰≲⪍⪏[‘‚Łł⪦⩹<<<<≪⋖⋋⋉⥶⩻◃⊴◂⦖⥊⥦≨︀≨︀¯¯♂✠✠⤅↦↦↧↤↥▮⨩Мм—∺∡ ℳ𝔐𝔪℧µµ*⫰∣··⊟−∸⨪∓⫛…∓⊧𝕄𝕞∓𝓂ℳ∾Μμ⊸⊸∇Ńń∠⃒≉⩰̸≋̸ʼn≉♮ℕ♮  ≎̸≏̸⩃ŇňŅņ≇⩭̸⩂Нн–⤤↗⇗↗≠≐̸​​​​≢⤨≂̸≫≪ ∄∄𝔑𝔫≧̸≱≱≧̸⩾̸⩾̸⋙̸≵≫⃒≯≯≫̸↮⇎⫲∋⋼⋺∋Њњ↚⇍‥≦̸≰↚⇍↮⇎≰≦̸⩽̸⩽̸≮⋘̸≴≪⃒≮⋪⋬≪̸∤⁠ 𝕟ℕ⫬¬¬≢≭∦∉≠≂̸∄≯≱≧̸≫̸≹⩾̸≵≎̸≏̸∉⋵̸⋹̸∉⋷⋶⧏̸⋪⋬≮≰≸≪̸⩽̸≴⪢̸⪡̸∌∌⋾⋽⊀⪯̸⋠∌⧐̸⋫⋭⊏̸⋢⊐̸⋣⊂⃒⊈⊁⪰̸⋡≿̸⊃⃒⊉≁≄≇≉∤∦∦⫽⃥∂̸⨔⊀⋠⊀⪯̸⪯̸⤳̸↛⇏↝̸↛⇏⋫⋭⊁⋡⪰̸𝒩𝓃∤∦≁≄≄∤∦⋢⋣⊄⫅̸⊈⊂⃒⊈⫅̸⊁⪰̸⊅⫆̸⊉⊃⃒⊉⫆̸≹ÑÑññ≸⋪⋬⋫⋭Νν#№ ≍⃒⊬⊭⊮⊯≥⃒>⃒⤄⧞⤂≤⃒<⃒⊴⃒⤃⊵⃒∼⃒⤣↖⇖↖⤧ÓÓóó⊛ÔÔôô⊚Оо⊝Őő⨸⊙⦼Œœ⦿𝔒𝔬˛ÒÒòò⧁⦵Ω∮↺⦾⦻‾⧀ŌōΩωΟο⦶⊖𝕆𝕠⦷“‘⦹⊕↻⩔∨⩝ℴℴªªºº⊶⩖⩗⩛Ⓢ𝒪ℴØØøø⊘ÕÕõõ⨶⨷⊗ÖÖöö⌽‾⏞⎴⏜¶¶∥∥⫳⫽∂∂Пп%.‰⊥‱𝔓𝔭Φφϕℳ☎Ππ⋔ϖℏℎℏ⨣⊞⨢+∔⨥⩲±±±⨦⨧±ℌ⨕𝕡ℙ££⪷⪻≺≼⪷≺≼≺⪯≼≾⪯⪹⪵⋨⪯⪳≾′″ℙ⪹⪵⋨∏∏⌮⌒⌓∝∝∷∝≾⊰𝒫𝓅Ψψ 𝔔𝔮⨌𝕢ℚ⁗𝒬𝓆ℍ⨖?≟""""⇛∽̱Ŕŕ√⦳⟩⟫⦒⦥⟩»»⥵⇥⤠⤳→↠⇒⤞↪↬⥅⥴⤖↣↝⤚⤜∶ℚ⤍⤏⤐❳}]⦌⦎⦐ŘřŖŗ⌉}Рр⤷⥩””↳ℜℛℜℝℜ▭®®®®∋⇋⥯⥽⌋𝔯ℜ⥤⇁⇀⥬Ρρϱ⟩⇥→→⇒⇄↣⌉⟧⥝⥕⇂⌋⇁⇀⇄⇌⇉↝↦⊢⥛⋌⧐⊳⊵⥏⥜⥔↾⥓⇀˚≓⇄⇌‏⎱⎱⫮⟭⇾⟧⦆𝕣ℝ⨮⨵⥰)⦔⨒⇉⇛›𝓇ℛ↱↱]’’⋌⋊▹⊵▸⧎⧴⥨℞Śś‚⪸Šš⪼≻≽⪰⪴ŞşŜŝ⪺⪶⋩⨓≿Сс⊡⋅⩦⤥↘⇘↘§§;⤩∖∖✶𝔖𝔰⌢♯ЩщШш↓←∣∥→↑­­Σσςς∼⩪≃≃⪞⪠⪝⪟≆⨤⥲←∘∖⨳⧤∣⌣⪪⪬⪬︀Ьь⌿⧄/𝕊𝕤♠♠∥⊓⊓︀⊔⊔︀√⊏⊑⊏⊑⊐⊒⊐⊒□□⊓⊏⊑⊐⊒⊔▪□▪→𝒮𝓈∖⌣⋆⋆☆★ϵϕ¯⊂⋐⪽⫅⊆⫃⫁⫋⊊⪿⥹⊂⋐⊆⫅⊆⊊⫋⫇⫕⫓⪸≻≽≻⪰≽≿⪰⪺⪶⋩≿∋∑∑♪¹¹²²³³⊃⋑⪾⫘⫆⊇⫄⊃⊇⟉⫗⥻⫂⫌⊋⫀⊃⋑⊇⫆⊋⫌⫈⫔⫖⤦↙⇙↙⤪ßß ⌖Ττ⎴ŤťŢţТт⃛⌕𝔗𝔱∴∴∴Θθϑϑ≈∼    ≈∼ÞÞþþ˜∼≃≅≈⨱⊠××⨰∭⤨⌶⫱⊤𝕋𝕥⫚⤩‴™™▵▿◃⊴≜▹⊵◬≜⨺⃛⨹⧍⨻⏢𝒯𝓉ЦцЋћŦŧ≬↞↠ÚÚúú↑↟⇑⥉ЎўŬŭÛÛûûУу⇅Űű⥮⥾𝔘𝔲ÙÙùù⥣↿↾▀⌜⌜⌏◸Ūū¨¨_⏟⎵⏝⋃⊎Ųų𝕌𝕦⤒↑↑⇑⇅↕↕⇕⥮↿↾⊎↖↗υϒϒΥυ↥⊥⇈⌝⌝⌎Ůů◹𝒰𝓊⋰Ũũ▵▴⇈ÜÜüü⦧⦜ϵϰ∅ϕϖ∝↕⇕ϱς⊊︀⫋︀⊋︀⫌︀ϑ⊲⊳⫨⫫⫩Вв⊢⊨⊩⊫⫦⊻∨⋁≚⋮|‖|‖∣|❘≀ 𝔙𝔳⊲⊂⃒⊃⃒𝕍𝕧∝⊳𝒱𝓋⫋︀⊊︀⫌︀⊋︀⊪⦚Ŵŵ⩟∧⋀≙℘𝔚𝔴𝕎𝕨℘≀≀𝒲𝓌⋂◯⋃▽𝔛𝔵⟷⟺Ξξ⟵⟸⟼⋻⨀𝕏𝕩⨁⨂⟶⟹𝒳𝓍⨆⨄△⋁⋀ÝÝýýЯяŶŷЫы¥¥𝔜𝔶Її𝕐𝕪𝒴𝓎ЮюÿÿŸŹźŽžЗзŻżℨ​Ζζ𝔷ℨЖж⇝𝕫ℤ𝒵𝓏‍‌ diff --git a/html5ever/src/tokenizer/char_ref/mod.rs b/html5ever/src/tokenizer/char_ref/mod.rs index e119477d..1ce24e6b 100644 --- a/html5ever/src/tokenizer/char_ref/mod.rs +++ b/html5ever/src/tokenizer/char_ref/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2014-2017 The html5ever Project Developers. See the +// Copyright 2014-2025 The html5ever Project Developers. See the // COPYRIGHT file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 , - - name_buf_opt: Option, - name_match: Option<(u32, u32)>, - name_len: usize, -} - -impl CharRef { - const EMPTY: CharRef = CharRef { - chars: ['\0', '\0'], - num_chars: 0, - }; } impl CharRefTokenizer { @@ -71,24 +56,9 @@ impl CharRefTokenizer { num_too_big: false, seen_digit: false, hex_marker: None, - name_buf_opt: None, - name_match: None, - name_len: 0, } } - fn name_buf(&self) -> &StrTendril { - self.name_buf_opt - .as_ref() - .expect("name_buf missing in named character reference") - } - - fn name_buf_mut(&mut self) -> &mut StrTendril { - self.name_buf_opt - .as_mut() - .expect("name_buf missing in named character reference") - } - fn finish_one(&mut self, c: char) -> Status { Status::Done(CharRef { chars: [c, '\0'], @@ -109,8 +79,40 @@ impl CharRefTokenizer { State::Octothorpe => self.do_octothorpe(tokenizer, input), State::Numeric(base) => self.do_numeric(tokenizer, input, base), State::NumericSemicolon => self.do_numeric_semicolon(tokenizer, input), - State::Named => self.do_named(tokenizer, input), - State::BogusName => self.do_bogus_name(tokenizer, input), + State::Named(ref mut named_tokenizer) => loop { + let Some(c) = tokenizer.peek(input) else { + return Status::Stuck; + }; + tokenizer.discard_char(input); + + match named_tokenizer.feed_character(c, input, |error| tokenizer.emit_error(error)) + { + NamedReferenceTokenizationResult::Success(reference) => { + return Status::Done(reference); + }, + NamedReferenceTokenizationResult::Failed(characters) => { + self.state = State::BogusName(characters.into()); + return Status::Progress; + }, + NamedReferenceTokenizationResult::Continue => {}, + } + }, + State::BogusName(ref mut invalid_name) => { + let Some(c) = tokenizer.peek(input) else { + return Status::Stuck; + }; + tokenizer.discard_char(input); + invalid_name.push_char(c); + match c { + _ if c.is_ascii_alphanumeric() => return Status::Progress, + ';' => { + tokenizer.emit_error(Cow::from(format_name_error(&invalid_name))); + }, + _ => (), + } + input.push_front(mem::take(invalid_name)); + Status::Done(CharRef::EMPTY) + }, } } @@ -121,8 +123,9 @@ impl CharRefTokenizer { ) -> Status { match tokenizer.peek(input) { Some('a'..='z' | 'A'..='Z' | '0'..='9') => { - self.state = State::Named; - self.name_buf_opt = Some(StrTendril::new()); + self.state = State::Named(NamedReferenceTokenizerState::new( + self.is_consumed_in_attribute, + )); Status::Progress }, Some('#') => { @@ -253,175 +256,36 @@ impl CharRefTokenizer { self.finish_one(c) } - fn do_named( - &mut self, - tokenizer: &Tokenizer, - input: &BufferQueue, - ) -> Status { - // peek + discard skips over newline normalization, therefore making it easier to - // un-consume - let Some(c) = tokenizer.peek(input) else { - return Status::Stuck; - }; - tokenizer.discard_char(input); - self.name_buf_mut().push_char(c); - match data::NAMED_ENTITIES.get(&self.name_buf()[..]) { - // We have either a full match or a prefix of one. - Some(&m) => { - if m.0 != 0 { - // We have a full match, but there might be a longer one to come. - self.name_match = Some(m); - self.name_len = self.name_buf().len(); - } - // Otherwise we just have a prefix match. - Status::Progress - }, - - // Can't continue the match. - None => self.finish_named(tokenizer, input, Some(c)), - } - } - - fn emit_name_error(&mut self, tokenizer: &Tokenizer) { - let msg = if tokenizer.opts.exact_errors { - Cow::from(format!("Invalid character reference &{}", self.name_buf())) - } else { - Cow::from("Invalid character reference") - }; - tokenizer.emit_error(msg); - } - - fn unconsume_name(&mut self, input: &BufferQueue) { - input.push_front(self.name_buf_opt.take().unwrap()); - } - - fn finish_named( - &mut self, - tokenizer: &Tokenizer, - input: &BufferQueue, - end_char: Option, - ) -> Status { - match self.name_match { - None => { - match end_char { - Some(c) if c.is_ascii_alphanumeric() => { - // Keep looking for a semicolon, to determine whether - // we emit a parse error. - self.state = State::BogusName; - return Status::Progress; - }, - - // Check length because &; is not a parse error. - Some(';') if self.name_buf().len() > 1 => self.emit_name_error(tokenizer), - - _ => (), - } - self.unconsume_name(input); - Status::Done(CharRef::EMPTY) - }, - - Some((c1, c2)) => { - // We have a complete match, but we may have consumed - // additional characters into self.name_buf. Usually - // at least one, but several in cases like - // - // ¬ => match for U+00AC - // ¬i => valid prefix for ¬in - // ¬it => can't continue match - - let name_len = self.name_len; - assert!(name_len > 0); - let last_matched = self.name_buf()[name_len - 1..].chars().next().unwrap(); - - // There might not be a next character after the match, if - // we had a full match and then hit EOF. - let next_after = if name_len == self.name_buf().len() { - None - } else { - Some(self.name_buf()[name_len..].chars().next().unwrap()) - }; - - // If the character reference was consumed as part of an attribute, and the last - // character matched is not a U+003B SEMICOLON character (;), and the next input - // character is either a U+003D EQUALS SIGN character (=) or an ASCII alphanumeric, - // then, for historical reasons, flush code points consumed as a character - // reference and switch to the return state. - - let unconsume_all = match (self.is_consumed_in_attribute, last_matched, next_after) - { - (_, ';', _) => false, - (true, _, Some('=')) => true, - (true, _, Some(c)) if c.is_ascii_alphanumeric() => true, - _ => { - // 1. If the last character matched is not a U+003B SEMICOLON character - // (;), then this is a missing-semicolon-after-character-reference parse - // error. - tokenizer.emit_error(Borrowed( - "Character reference does not end with semicolon", - )); - false - }, - }; - - if unconsume_all { - self.unconsume_name(input); - Status::Done(CharRef::EMPTY) - } else { - input.push_front(StrTendril::from_slice(&self.name_buf()[name_len..])); - tokenizer.ignore_lf.set(false); - Status::Done(CharRef { - chars: [from_u32(c1).unwrap(), from_u32(c2).unwrap()], - num_chars: if c2 == 0 { 1 } else { 2 }, - }) - } - }, - } - } - - fn do_bogus_name( - &mut self, - tokenizer: &Tokenizer, - input: &BufferQueue, - ) -> Status { - // peek + discard skips over newline normalization, therefore making it easier to - // un-consume - let Some(c) = tokenizer.peek(input) else { - return Status::Stuck; - }; - tokenizer.discard_char(input); - self.name_buf_mut().push_char(c); - match c { - _ if c.is_ascii_alphanumeric() => return Status::Progress, - ';' => self.emit_name_error(tokenizer), - _ => (), - } - self.unconsume_name(input); - Status::Done(CharRef::EMPTY) - } - pub(super) fn end_of_file( &mut self, tokenizer: &Tokenizer, input: &BufferQueue, ) -> CharRef { loop { - let status = match self.state { + let status = match &mut self.state { State::Begin => Status::Done(CharRef::EMPTY), State::Numeric(_) if !self.seen_digit => self.unconsume_numeric(tokenizer, input), State::Numeric(_) | State::NumericSemicolon => { tokenizer.emit_error(Borrowed("EOF in numeric character reference")); self.finish_numeric(tokenizer) }, - State::Named => self.finish_named(tokenizer, input, None), - State::BogusName => { - self.unconsume_name(input); - Status::Done(CharRef::EMPTY) + State::Named(state) => { + return state + .notify_end_of_file(input, |error| tokenizer.emit_error(error)) + .unwrap_or(CharRef::EMPTY) }, State::Octothorpe => { input.push_front(StrTendril::from_slice("#")); tokenizer.emit_error(Borrowed("EOF after '#' in character reference")); Status::Done(CharRef::EMPTY) }, + State::BogusName(bogus_name) => { + input.push_front(bogus_name.clone()); + if bogus_name.ends_with(';') { + tokenizer.emit_error(Cow::from(format_name_error(&bogus_name))); + } + Status::Done(CharRef::EMPTY) + }, }; match status { diff --git a/html5ever/src/tokenizer/mod.rs b/html5ever/src/tokenizer/mod.rs index eccc5690..712f7e1e 100644 --- a/html5ever/src/tokenizer/mod.rs +++ b/html5ever/src/tokenizer/mod.rs @@ -19,7 +19,8 @@ use self::states::{DoubleEscaped, Escaped}; use self::states::{DoubleQuoted, SingleQuoted, Unquoted}; use self::states::{Rawtext, Rcdata, ScriptData, ScriptDataEscaped}; -use self::char_ref::{CharRef, CharRefTokenizer}; +use self::char_ref::CharRefTokenizer; +use html_named_entities::CharRef; use crate::util::str::lower_ascii_letter; diff --git a/html_named_entities/Cargo.toml b/html_named_entities/Cargo.toml new file mode 100644 index 00000000..da917bb5 --- /dev/null +++ b/html_named_entities/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "html_named_entities" +description = "Parser for HTML named entities" +categories = [ "parser-implementations", "web-programming" ] +version = "0.1.0" +license.workspace = true +authors.workspace = true +repository.workspace = true +edition.workspace = true +rust-version.workspace = true +build = "build/main.rs" + +[dependencies] + +[build-dependencies] +serde = { workspace = true } +serde_json = { workspace = true } diff --git a/html_named_entities/build/entities.json b/html_named_entities/build/entities.json new file mode 100644 index 00000000..557170b4 --- /dev/null +++ b/html_named_entities/build/entities.json @@ -0,0 +1,2233 @@ +{ + "Æ": { "codepoints": [198], "characters": "\u00C6" }, + "Æ": { "codepoints": [198], "characters": "\u00C6" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "Á": { "codepoints": [193], "characters": "\u00C1" }, + "Á": { "codepoints": [193], "characters": "\u00C1" }, + "Ă": { "codepoints": [258], "characters": "\u0102" }, + "Â": { "codepoints": [194], "characters": "\u00C2" }, + "Â": { "codepoints": [194], "characters": "\u00C2" }, + "А": { "codepoints": [1040], "characters": "\u0410" }, + "𝔄": { "codepoints": [120068], "characters": "\uD835\uDD04" }, + "À": { "codepoints": [192], "characters": "\u00C0" }, + "À": { "codepoints": [192], "characters": "\u00C0" }, + "Α": { "codepoints": [913], "characters": "\u0391" }, + "Ā": { "codepoints": [256], "characters": "\u0100" }, + "⩓": { "codepoints": [10835], "characters": "\u2A53" }, + "Ą": { "codepoints": [260], "characters": "\u0104" }, + "𝔸": { "codepoints": [120120], "characters": "\uD835\uDD38" }, + "⁡": { "codepoints": [8289], "characters": "\u2061" }, + "Å": { "codepoints": [197], "characters": "\u00C5" }, + "Å": { "codepoints": [197], "characters": "\u00C5" }, + "𝒜": { "codepoints": [119964], "characters": "\uD835\uDC9C" }, + "≔": { "codepoints": [8788], "characters": "\u2254" }, + "Ã": { "codepoints": [195], "characters": "\u00C3" }, + "Ã": { "codepoints": [195], "characters": "\u00C3" }, + "Ä": { "codepoints": [196], "characters": "\u00C4" }, + "Ä": { "codepoints": [196], "characters": "\u00C4" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "⫧": { "codepoints": [10983], "characters": "\u2AE7" }, + "⌆": { "codepoints": [8966], "characters": "\u2306" }, + "Б": { "codepoints": [1041], "characters": "\u0411" }, + "∵": { "codepoints": [8757], "characters": "\u2235" }, + "ℬ": { "codepoints": [8492], "characters": "\u212C" }, + "Β": { "codepoints": [914], "characters": "\u0392" }, + "𝔅": { "codepoints": [120069], "characters": "\uD835\uDD05" }, + "𝔹": { "codepoints": [120121], "characters": "\uD835\uDD39" }, + "˘": { "codepoints": [728], "characters": "\u02D8" }, + "ℬ": { "codepoints": [8492], "characters": "\u212C" }, + "≎": { "codepoints": [8782], "characters": "\u224E" }, + "Ч": { "codepoints": [1063], "characters": "\u0427" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "Ć": { "codepoints": [262], "characters": "\u0106" }, + "⋒": { "codepoints": [8914], "characters": "\u22D2" }, + "ⅅ": { "codepoints": [8517], "characters": "\u2145" }, + "ℭ": { "codepoints": [8493], "characters": "\u212D" }, + "Č": { "codepoints": [268], "characters": "\u010C" }, + "Ç": { "codepoints": [199], "characters": "\u00C7" }, + "Ç": { "codepoints": [199], "characters": "\u00C7" }, + "Ĉ": { "codepoints": [264], "characters": "\u0108" }, + "∰": { "codepoints": [8752], "characters": "\u2230" }, + "Ċ": { "codepoints": [266], "characters": "\u010A" }, + "¸": { "codepoints": [184], "characters": "\u00B8" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "ℭ": { "codepoints": [8493], "characters": "\u212D" }, + "Χ": { "codepoints": [935], "characters": "\u03A7" }, + "⊙": { "codepoints": [8857], "characters": "\u2299" }, + "⊖": { "codepoints": [8854], "characters": "\u2296" }, + "⊕": { "codepoints": [8853], "characters": "\u2295" }, + "⊗": { "codepoints": [8855], "characters": "\u2297" }, + "∲": { "codepoints": [8754], "characters": "\u2232" }, + "”": { "codepoints": [8221], "characters": "\u201D" }, + "’": { "codepoints": [8217], "characters": "\u2019" }, + "∷": { "codepoints": [8759], "characters": "\u2237" }, + "⩴": { "codepoints": [10868], "characters": "\u2A74" }, + "≡": { "codepoints": [8801], "characters": "\u2261" }, + "∯": { "codepoints": [8751], "characters": "\u222F" }, + "∮": { "codepoints": [8750], "characters": "\u222E" }, + "ℂ": { "codepoints": [8450], "characters": "\u2102" }, + "∐": { "codepoints": [8720], "characters": "\u2210" }, + "∳": { "codepoints": [8755], "characters": "\u2233" }, + "⨯": { "codepoints": [10799], "characters": "\u2A2F" }, + "𝒞": { "codepoints": [119966], "characters": "\uD835\uDC9E" }, + "⋓": { "codepoints": [8915], "characters": "\u22D3" }, + "≍": { "codepoints": [8781], "characters": "\u224D" }, + "ⅅ": { "codepoints": [8517], "characters": "\u2145" }, + "⤑": { "codepoints": [10513], "characters": "\u2911" }, + "Ђ": { "codepoints": [1026], "characters": "\u0402" }, + "Ѕ": { "codepoints": [1029], "characters": "\u0405" }, + "Џ": { "codepoints": [1039], "characters": "\u040F" }, + "‡": { "codepoints": [8225], "characters": "\u2021" }, + "↡": { "codepoints": [8609], "characters": "\u21A1" }, + "⫤": { "codepoints": [10980], "characters": "\u2AE4" }, + "Ď": { "codepoints": [270], "characters": "\u010E" }, + "Д": { "codepoints": [1044], "characters": "\u0414" }, + "∇": { "codepoints": [8711], "characters": "\u2207" }, + "Δ": { "codepoints": [916], "characters": "\u0394" }, + "𝔇": { "codepoints": [120071], "characters": "\uD835\uDD07" }, + "´": { "codepoints": [180], "characters": "\u00B4" }, + "˙": { "codepoints": [729], "characters": "\u02D9" }, + "˝": { "codepoints": [733], "characters": "\u02DD" }, + "`": { "codepoints": [96], "characters": "\u0060" }, + "˜": { "codepoints": [732], "characters": "\u02DC" }, + "⋄": { "codepoints": [8900], "characters": "\u22C4" }, + "ⅆ": { "codepoints": [8518], "characters": "\u2146" }, + "𝔻": { "codepoints": [120123], "characters": "\uD835\uDD3B" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "⃜": { "codepoints": [8412], "characters": "\u20DC" }, + "≐": { "codepoints": [8784], "characters": "\u2250" }, + "∯": { "codepoints": [8751], "characters": "\u222F" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "⇓": { "codepoints": [8659], "characters": "\u21D3" }, + "⇐": { "codepoints": [8656], "characters": "\u21D0" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + "⫤": { "codepoints": [10980], "characters": "\u2AE4" }, + "⟸": { "codepoints": [10232], "characters": "\u27F8" }, + "⟺": { "codepoints": [10234], "characters": "\u27FA" }, + "⟹": { "codepoints": [10233], "characters": "\u27F9" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "⊨": { "codepoints": [8872], "characters": "\u22A8" }, + "⇑": { "codepoints": [8657], "characters": "\u21D1" }, + "⇕": { "codepoints": [8661], "characters": "\u21D5" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "⤓": { "codepoints": [10515], "characters": "\u2913" }, + "⇵": { "codepoints": [8693], "characters": "\u21F5" }, + "̑": { "codepoints": [785], "characters": "\u0311" }, + "⥐": { "codepoints": [10576], "characters": "\u2950" }, + "⥞": { "codepoints": [10590], "characters": "\u295E" }, + "↽": { "codepoints": [8637], "characters": "\u21BD" }, + "⥖": { "codepoints": [10582], "characters": "\u2956" }, + "⥟": { "codepoints": [10591], "characters": "\u295F" }, + "⇁": { "codepoints": [8641], "characters": "\u21C1" }, + "⥗": { "codepoints": [10583], "characters": "\u2957" }, + "⊤": { "codepoints": [8868], "characters": "\u22A4" }, + "↧": { "codepoints": [8615], "characters": "\u21A7" }, + "⇓": { "codepoints": [8659], "characters": "\u21D3" }, + "𝒟": { "codepoints": [119967], "characters": "\uD835\uDC9F" }, + "Đ": { "codepoints": [272], "characters": "\u0110" }, + "Ŋ": { "codepoints": [330], "characters": "\u014A" }, + "Ð": { "codepoints": [208], "characters": "\u00D0" }, + "Ð": { "codepoints": [208], "characters": "\u00D0" }, + "É": { "codepoints": [201], "characters": "\u00C9" }, + "É": { "codepoints": [201], "characters": "\u00C9" }, + "Ě": { "codepoints": [282], "characters": "\u011A" }, + "Ê": { "codepoints": [202], "characters": "\u00CA" }, + "Ê": { "codepoints": [202], "characters": "\u00CA" }, + "Э": { "codepoints": [1069], "characters": "\u042D" }, + "Ė": { "codepoints": [278], "characters": "\u0116" }, + "𝔈": { "codepoints": [120072], "characters": "\uD835\uDD08" }, + "È": { "codepoints": [200], "characters": "\u00C8" }, + "È": { "codepoints": [200], "characters": "\u00C8" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "Ē": { "codepoints": [274], "characters": "\u0112" }, + "◻": { "codepoints": [9723], "characters": "\u25FB" }, + "▫": { "codepoints": [9643], "characters": "\u25AB" }, + "Ę": { "codepoints": [280], "characters": "\u0118" }, + "𝔼": { "codepoints": [120124], "characters": "\uD835\uDD3C" }, + "Ε": { "codepoints": [917], "characters": "\u0395" }, + "⩵": { "codepoints": [10869], "characters": "\u2A75" }, + "≂": { "codepoints": [8770], "characters": "\u2242" }, + "⇌": { "codepoints": [8652], "characters": "\u21CC" }, + "ℰ": { "codepoints": [8496], "characters": "\u2130" }, + "⩳": { "codepoints": [10867], "characters": "\u2A73" }, + "Η": { "codepoints": [919], "characters": "\u0397" }, + "Ë": { "codepoints": [203], "characters": "\u00CB" }, + "Ë": { "codepoints": [203], "characters": "\u00CB" }, + "∃": { "codepoints": [8707], "characters": "\u2203" }, + "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, + "Ф": { "codepoints": [1060], "characters": "\u0424" }, + "𝔉": { "codepoints": [120073], "characters": "\uD835\uDD09" }, + "◼": { "codepoints": [9724], "characters": "\u25FC" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "𝔽": { "codepoints": [120125], "characters": "\uD835\uDD3D" }, + "∀": { "codepoints": [8704], "characters": "\u2200" }, + "ℱ": { "codepoints": [8497], "characters": "\u2131" }, + "ℱ": { "codepoints": [8497], "characters": "\u2131" }, + "Ѓ": { "codepoints": [1027], "characters": "\u0403" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + "Γ": { "codepoints": [915], "characters": "\u0393" }, + "Ϝ": { "codepoints": [988], "characters": "\u03DC" }, + "Ğ": { "codepoints": [286], "characters": "\u011E" }, + "Ģ": { "codepoints": [290], "characters": "\u0122" }, + "Ĝ": { "codepoints": [284], "characters": "\u011C" }, + "Г": { "codepoints": [1043], "characters": "\u0413" }, + "Ġ": { "codepoints": [288], "characters": "\u0120" }, + "𝔊": { "codepoints": [120074], "characters": "\uD835\uDD0A" }, + "⋙": { "codepoints": [8921], "characters": "\u22D9" }, + "𝔾": { "codepoints": [120126], "characters": "\uD835\uDD3E" }, + "≥": { "codepoints": [8805], "characters": "\u2265" }, + "⋛": { "codepoints": [8923], "characters": "\u22DB" }, + "≧": { "codepoints": [8807], "characters": "\u2267" }, + "⪢": { "codepoints": [10914], "characters": "\u2AA2" }, + "≷": { "codepoints": [8823], "characters": "\u2277" }, + "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, + "≳": { "codepoints": [8819], "characters": "\u2273" }, + "𝒢": { "codepoints": [119970], "characters": "\uD835\uDCA2" }, + "≫": { "codepoints": [8811], "characters": "\u226B" }, + "Ъ": { "codepoints": [1066], "characters": "\u042A" }, + "ˇ": { "codepoints": [711], "characters": "\u02C7" }, + "^": { "codepoints": [94], "characters": "\u005E" }, + "Ĥ": { "codepoints": [292], "characters": "\u0124" }, + "ℌ": { "codepoints": [8460], "characters": "\u210C" }, + "ℋ": { "codepoints": [8459], "characters": "\u210B" }, + "ℍ": { "codepoints": [8461], "characters": "\u210D" }, + "─": { "codepoints": [9472], "characters": "\u2500" }, + "ℋ": { "codepoints": [8459], "characters": "\u210B" }, + "Ħ": { "codepoints": [294], "characters": "\u0126" }, + "≎": { "codepoints": [8782], "characters": "\u224E" }, + "≏": { "codepoints": [8783], "characters": "\u224F" }, + "Е": { "codepoints": [1045], "characters": "\u0415" }, + "IJ": { "codepoints": [306], "characters": "\u0132" }, + "Ё": { "codepoints": [1025], "characters": "\u0401" }, + "Í": { "codepoints": [205], "characters": "\u00CD" }, + "Í": { "codepoints": [205], "characters": "\u00CD" }, + "Î": { "codepoints": [206], "characters": "\u00CE" }, + "Î": { "codepoints": [206], "characters": "\u00CE" }, + "И": { "codepoints": [1048], "characters": "\u0418" }, + "İ": { "codepoints": [304], "characters": "\u0130" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "Ì": { "codepoints": [204], "characters": "\u00CC" }, + "Ì": { "codepoints": [204], "characters": "\u00CC" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "Ī": { "codepoints": [298], "characters": "\u012A" }, + "ⅈ": { "codepoints": [8520], "characters": "\u2148" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "∬": { "codepoints": [8748], "characters": "\u222C" }, + "∫": { "codepoints": [8747], "characters": "\u222B" }, + "⋂": { "codepoints": [8898], "characters": "\u22C2" }, + "⁣": { "codepoints": [8291], "characters": "\u2063" }, + "⁢": { "codepoints": [8290], "characters": "\u2062" }, + "Į": { "codepoints": [302], "characters": "\u012E" }, + "𝕀": { "codepoints": [120128], "characters": "\uD835\uDD40" }, + "Ι": { "codepoints": [921], "characters": "\u0399" }, + "ℐ": { "codepoints": [8464], "characters": "\u2110" }, + "Ĩ": { "codepoints": [296], "characters": "\u0128" }, + "І": { "codepoints": [1030], "characters": "\u0406" }, + "Ï": { "codepoints": [207], "characters": "\u00CF" }, + "Ï": { "codepoints": [207], "characters": "\u00CF" }, + "Ĵ": { "codepoints": [308], "characters": "\u0134" }, + "Й": { "codepoints": [1049], "characters": "\u0419" }, + "𝔍": { "codepoints": [120077], "characters": "\uD835\uDD0D" }, + "𝕁": { "codepoints": [120129], "characters": "\uD835\uDD41" }, + "𝒥": { "codepoints": [119973], "characters": "\uD835\uDCA5" }, + "Ј": { "codepoints": [1032], "characters": "\u0408" }, + "Є": { "codepoints": [1028], "characters": "\u0404" }, + "Х": { "codepoints": [1061], "characters": "\u0425" }, + "Ќ": { "codepoints": [1036], "characters": "\u040C" }, + "Κ": { "codepoints": [922], "characters": "\u039A" }, + "Ķ": { "codepoints": [310], "characters": "\u0136" }, + "К": { "codepoints": [1050], "characters": "\u041A" }, + "𝔎": { "codepoints": [120078], "characters": "\uD835\uDD0E" }, + "𝕂": { "codepoints": [120130], "characters": "\uD835\uDD42" }, + "𝒦": { "codepoints": [119974], "characters": "\uD835\uDCA6" }, + "Љ": { "codepoints": [1033], "characters": "\u0409" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "Ĺ": { "codepoints": [313], "characters": "\u0139" }, + "Λ": { "codepoints": [923], "characters": "\u039B" }, + "⟪": { "codepoints": [10218], "characters": "\u27EA" }, + "ℒ": { "codepoints": [8466], "characters": "\u2112" }, + "↞": { "codepoints": [8606], "characters": "\u219E" }, + "Ľ": { "codepoints": [317], "characters": "\u013D" }, + "Ļ": { "codepoints": [315], "characters": "\u013B" }, + "Л": { "codepoints": [1051], "characters": "\u041B" }, + "⟨": { "codepoints": [10216], "characters": "\u27E8" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "⇤": { "codepoints": [8676], "characters": "\u21E4" }, + "⇆": { "codepoints": [8646], "characters": "\u21C6" }, + "⌈": { "codepoints": [8968], "characters": "\u2308" }, + "⟦": { "codepoints": [10214], "characters": "\u27E6" }, + "⥡": { "codepoints": [10593], "characters": "\u2961" }, + "⇃": { "codepoints": [8643], "characters": "\u21C3" }, + "⥙": { "codepoints": [10585], "characters": "\u2959" }, + "⌊": { "codepoints": [8970], "characters": "\u230A" }, + "↔": { "codepoints": [8596], "characters": "\u2194" }, + "⥎": { "codepoints": [10574], "characters": "\u294E" }, + "⊣": { "codepoints": [8867], "characters": "\u22A3" }, + "↤": { "codepoints": [8612], "characters": "\u21A4" }, + "⥚": { "codepoints": [10586], "characters": "\u295A" }, + "⊲": { "codepoints": [8882], "characters": "\u22B2" }, + "⧏": { "codepoints": [10703], "characters": "\u29CF" }, + "⊴": { "codepoints": [8884], "characters": "\u22B4" }, + "⥑": { "codepoints": [10577], "characters": "\u2951" }, + "⥠": { "codepoints": [10592], "characters": "\u2960" }, + "↿": { "codepoints": [8639], "characters": "\u21BF" }, + "⥘": { "codepoints": [10584], "characters": "\u2958" }, + "↼": { "codepoints": [8636], "characters": "\u21BC" }, + "⥒": { "codepoints": [10578], "characters": "\u2952" }, + "⇐": { "codepoints": [8656], "characters": "\u21D0" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + "⋚": { "codepoints": [8922], "characters": "\u22DA" }, + "≦": { "codepoints": [8806], "characters": "\u2266" }, + "≶": { "codepoints": [8822], "characters": "\u2276" }, + "⪡": { "codepoints": [10913], "characters": "\u2AA1" }, + "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, + "≲": { "codepoints": [8818], "characters": "\u2272" }, + "𝔏": { "codepoints": [120079], "characters": "\uD835\uDD0F" }, + "⋘": { "codepoints": [8920], "characters": "\u22D8" }, + "⇚": { "codepoints": [8666], "characters": "\u21DA" }, + "Ŀ": { "codepoints": [319], "characters": "\u013F" }, + "⟵": { "codepoints": [10229], "characters": "\u27F5" }, + "⟷": { "codepoints": [10231], "characters": "\u27F7" }, + "⟶": { "codepoints": [10230], "characters": "\u27F6" }, + "⟸": { "codepoints": [10232], "characters": "\u27F8" }, + "⟺": { "codepoints": [10234], "characters": "\u27FA" }, + "⟹": { "codepoints": [10233], "characters": "\u27F9" }, + "𝕃": { "codepoints": [120131], "characters": "\uD835\uDD43" }, + "↙": { "codepoints": [8601], "characters": "\u2199" }, + "↘": { "codepoints": [8600], "characters": "\u2198" }, + "ℒ": { "codepoints": [8466], "characters": "\u2112" }, + "↰": { "codepoints": [8624], "characters": "\u21B0" }, + "Ł": { "codepoints": [321], "characters": "\u0141" }, + "≪": { "codepoints": [8810], "characters": "\u226A" }, + "⤅": { "codepoints": [10501], "characters": "\u2905" }, + "М": { "codepoints": [1052], "characters": "\u041C" }, + " ": { "codepoints": [8287], "characters": "\u205F" }, + "ℳ": { "codepoints": [8499], "characters": "\u2133" }, + "𝔐": { "codepoints": [120080], "characters": "\uD835\uDD10" }, + "∓": { "codepoints": [8723], "characters": "\u2213" }, + "𝕄": { "codepoints": [120132], "characters": "\uD835\uDD44" }, + "ℳ": { "codepoints": [8499], "characters": "\u2133" }, + "Μ": { "codepoints": [924], "characters": "\u039C" }, + "Њ": { "codepoints": [1034], "characters": "\u040A" }, + "Ń": { "codepoints": [323], "characters": "\u0143" }, + "Ň": { "codepoints": [327], "characters": "\u0147" }, + "Ņ": { "codepoints": [325], "characters": "\u0145" }, + "Н": { "codepoints": [1053], "characters": "\u041D" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "≫": { "codepoints": [8811], "characters": "\u226B" }, + "≪": { "codepoints": [8810], "characters": "\u226A" }, + " ": { "codepoints": [10], "characters": "\u000A" }, + "𝔑": { "codepoints": [120081], "characters": "\uD835\uDD11" }, + "⁠": { "codepoints": [8288], "characters": "\u2060" }, + " ": { "codepoints": [160], "characters": "\u00A0" }, + "ℕ": { "codepoints": [8469], "characters": "\u2115" }, + "⫬": { "codepoints": [10988], "characters": "\u2AEC" }, + "≢": { "codepoints": [8802], "characters": "\u2262" }, + "≭": { "codepoints": [8813], "characters": "\u226D" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "∉": { "codepoints": [8713], "characters": "\u2209" }, + "≠": { "codepoints": [8800], "characters": "\u2260" }, + "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" }, + "∄": { "codepoints": [8708], "characters": "\u2204" }, + "≯": { "codepoints": [8815], "characters": "\u226F" }, + "≱": { "codepoints": [8817], "characters": "\u2271" }, + "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, + "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" }, + "≹": { "codepoints": [8825], "characters": "\u2279" }, + "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, + "≵": { "codepoints": [8821], "characters": "\u2275" }, + "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" }, + "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" }, + "⋪": { "codepoints": [8938], "characters": "\u22EA" }, + "⧏̸": { "codepoints": [10703, 824], "characters": "\u29CF\u0338" }, + "⋬": { "codepoints": [8940], "characters": "\u22EC" }, + "≮": { "codepoints": [8814], "characters": "\u226E" }, + "≰": { "codepoints": [8816], "characters": "\u2270" }, + "≸": { "codepoints": [8824], "characters": "\u2278" }, + "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" }, + "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, + "≴": { "codepoints": [8820], "characters": "\u2274" }, + "⪢̸": { "codepoints": [10914, 824], "characters": "\u2AA2\u0338" }, + "⪡̸": { "codepoints": [10913, 824], "characters": "\u2AA1\u0338" }, + "⊀": { "codepoints": [8832], "characters": "\u2280" }, + "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, + "⋠": { "codepoints": [8928], "characters": "\u22E0" }, + "∌": { "codepoints": [8716], "characters": "\u220C" }, + "⋫": { "codepoints": [8939], "characters": "\u22EB" }, + "⧐̸": { "codepoints": [10704, 824], "characters": "\u29D0\u0338" }, + "⋭": { "codepoints": [8941], "characters": "\u22ED" }, + "⊏̸": { "codepoints": [8847, 824], "characters": "\u228F\u0338" }, + "⋢": { "codepoints": [8930], "characters": "\u22E2" }, + "⊐̸": { "codepoints": [8848, 824], "characters": "\u2290\u0338" }, + "⋣": { "codepoints": [8931], "characters": "\u22E3" }, + "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, + "⊈": { "codepoints": [8840], "characters": "\u2288" }, + "⊁": { "codepoints": [8833], "characters": "\u2281" }, + "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, + "⋡": { "codepoints": [8929], "characters": "\u22E1" }, + "≿̸": { "codepoints": [8831, 824], "characters": "\u227F\u0338" }, + "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, + "⊉": { "codepoints": [8841], "characters": "\u2289" }, + "≁": { "codepoints": [8769], "characters": "\u2241" }, + "≄": { "codepoints": [8772], "characters": "\u2244" }, + "≇": { "codepoints": [8775], "characters": "\u2247" }, + "≉": { "codepoints": [8777], "characters": "\u2249" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "𝒩": { "codepoints": [119977], "characters": "\uD835\uDCA9" }, + "Ñ": { "codepoints": [209], "characters": "\u00D1" }, + "Ñ": { "codepoints": [209], "characters": "\u00D1" }, + "Ν": { "codepoints": [925], "characters": "\u039D" }, + "Œ": { "codepoints": [338], "characters": "\u0152" }, + "Ó": { "codepoints": [211], "characters": "\u00D3" }, + "Ó": { "codepoints": [211], "characters": "\u00D3" }, + "Ô": { "codepoints": [212], "characters": "\u00D4" }, + "Ô": { "codepoints": [212], "characters": "\u00D4" }, + "О": { "codepoints": [1054], "characters": "\u041E" }, + "Ő": { "codepoints": [336], "characters": "\u0150" }, + "𝔒": { "codepoints": [120082], "characters": "\uD835\uDD12" }, + "Ò": { "codepoints": [210], "characters": "\u00D2" }, + "Ò": { "codepoints": [210], "characters": "\u00D2" }, + "Ō": { "codepoints": [332], "characters": "\u014C" }, + "Ω": { "codepoints": [937], "characters": "\u03A9" }, + "Ο": { "codepoints": [927], "characters": "\u039F" }, + "𝕆": { "codepoints": [120134], "characters": "\uD835\uDD46" }, + "“": { "codepoints": [8220], "characters": "\u201C" }, + "‘": { "codepoints": [8216], "characters": "\u2018" }, + "⩔": { "codepoints": [10836], "characters": "\u2A54" }, + "𝒪": { "codepoints": [119978], "characters": "\uD835\uDCAA" }, + "Ø": { "codepoints": [216], "characters": "\u00D8" }, + "Ø": { "codepoints": [216], "characters": "\u00D8" }, + "Õ": { "codepoints": [213], "characters": "\u00D5" }, + "Õ": { "codepoints": [213], "characters": "\u00D5" }, + "⨷": { "codepoints": [10807], "characters": "\u2A37" }, + "Ö": { "codepoints": [214], "characters": "\u00D6" }, + "Ö": { "codepoints": [214], "characters": "\u00D6" }, + "‾": { "codepoints": [8254], "characters": "\u203E" }, + "⏞": { "codepoints": [9182], "characters": "\u23DE" }, + "⎴": { "codepoints": [9140], "characters": "\u23B4" }, + "⏜": { "codepoints": [9180], "characters": "\u23DC" }, + "∂": { "codepoints": [8706], "characters": "\u2202" }, + "П": { "codepoints": [1055], "characters": "\u041F" }, + "𝔓": { "codepoints": [120083], "characters": "\uD835\uDD13" }, + "Φ": { "codepoints": [934], "characters": "\u03A6" }, + "Π": { "codepoints": [928], "characters": "\u03A0" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "ℌ": { "codepoints": [8460], "characters": "\u210C" }, + "ℙ": { "codepoints": [8473], "characters": "\u2119" }, + "⪻": { "codepoints": [10939], "characters": "\u2ABB" }, + "≺": { "codepoints": [8826], "characters": "\u227A" }, + "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, + "≼": { "codepoints": [8828], "characters": "\u227C" }, + "≾": { "codepoints": [8830], "characters": "\u227E" }, + "″": { "codepoints": [8243], "characters": "\u2033" }, + "∏": { "codepoints": [8719], "characters": "\u220F" }, + "∷": { "codepoints": [8759], "characters": "\u2237" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "𝒫": { "codepoints": [119979], "characters": "\uD835\uDCAB" }, + "Ψ": { "codepoints": [936], "characters": "\u03A8" }, + """: { "codepoints": [34], "characters": "\u0022" }, + """: { "codepoints": [34], "characters": "\u0022" }, + "𝔔": { "codepoints": [120084], "characters": "\uD835\uDD14" }, + "ℚ": { "codepoints": [8474], "characters": "\u211A" }, + "𝒬": { "codepoints": [119980], "characters": "\uD835\uDCAC" }, + "⤐": { "codepoints": [10512], "characters": "\u2910" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "Ŕ": { "codepoints": [340], "characters": "\u0154" }, + "⟫": { "codepoints": [10219], "characters": "\u27EB" }, + "↠": { "codepoints": [8608], "characters": "\u21A0" }, + "⤖": { "codepoints": [10518], "characters": "\u2916" }, + "Ř": { "codepoints": [344], "characters": "\u0158" }, + "Ŗ": { "codepoints": [342], "characters": "\u0156" }, + "Р": { "codepoints": [1056], "characters": "\u0420" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "⇋": { "codepoints": [8651], "characters": "\u21CB" }, + "⥯": { "codepoints": [10607], "characters": "\u296F" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "Ρ": { "codepoints": [929], "characters": "\u03A1" }, + "⟩": { "codepoints": [10217], "characters": "\u27E9" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "⇥": { "codepoints": [8677], "characters": "\u21E5" }, + "⇄": { "codepoints": [8644], "characters": "\u21C4" }, + "⌉": { "codepoints": [8969], "characters": "\u2309" }, + "⟧": { "codepoints": [10215], "characters": "\u27E7" }, + "⥝": { "codepoints": [10589], "characters": "\u295D" }, + "⇂": { "codepoints": [8642], "characters": "\u21C2" }, + "⥕": { "codepoints": [10581], "characters": "\u2955" }, + "⌋": { "codepoints": [8971], "characters": "\u230B" }, + "⊢": { "codepoints": [8866], "characters": "\u22A2" }, + "↦": { "codepoints": [8614], "characters": "\u21A6" }, + "⥛": { "codepoints": [10587], "characters": "\u295B" }, + "⊳": { "codepoints": [8883], "characters": "\u22B3" }, + "⧐": { "codepoints": [10704], "characters": "\u29D0" }, + "⊵": { "codepoints": [8885], "characters": "\u22B5" }, + "⥏": { "codepoints": [10575], "characters": "\u294F" }, + "⥜": { "codepoints": [10588], "characters": "\u295C" }, + "↾": { "codepoints": [8638], "characters": "\u21BE" }, + "⥔": { "codepoints": [10580], "characters": "\u2954" }, + "⇀": { "codepoints": [8640], "characters": "\u21C0" }, + "⥓": { "codepoints": [10579], "characters": "\u2953" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "ℝ": { "codepoints": [8477], "characters": "\u211D" }, + "⥰": { "codepoints": [10608], "characters": "\u2970" }, + "⇛": { "codepoints": [8667], "characters": "\u21DB" }, + "ℛ": { "codepoints": [8475], "characters": "\u211B" }, + "↱": { "codepoints": [8625], "characters": "\u21B1" }, + "⧴": { "codepoints": [10740], "characters": "\u29F4" }, + "Щ": { "codepoints": [1065], "characters": "\u0429" }, + "Ш": { "codepoints": [1064], "characters": "\u0428" }, + "Ь": { "codepoints": [1068], "characters": "\u042C" }, + "Ś": { "codepoints": [346], "characters": "\u015A" }, + "⪼": { "codepoints": [10940], "characters": "\u2ABC" }, + "Š": { "codepoints": [352], "characters": "\u0160" }, + "Ş": { "codepoints": [350], "characters": "\u015E" }, + "Ŝ": { "codepoints": [348], "characters": "\u015C" }, + "С": { "codepoints": [1057], "characters": "\u0421" }, + "𝔖": { "codepoints": [120086], "characters": "\uD835\uDD16" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "Σ": { "codepoints": [931], "characters": "\u03A3" }, + "∘": { "codepoints": [8728], "characters": "\u2218" }, + "𝕊": { "codepoints": [120138], "characters": "\uD835\uDD4A" }, + "√": { "codepoints": [8730], "characters": "\u221A" }, + "□": { "codepoints": [9633], "characters": "\u25A1" }, + "⊓": { "codepoints": [8851], "characters": "\u2293" }, + "⊏": { "codepoints": [8847], "characters": "\u228F" }, + "⊑": { "codepoints": [8849], "characters": "\u2291" }, + "⊐": { "codepoints": [8848], "characters": "\u2290" }, + "⊒": { "codepoints": [8850], "characters": "\u2292" }, + "⊔": { "codepoints": [8852], "characters": "\u2294" }, + "𝒮": { "codepoints": [119982], "characters": "\uD835\uDCAE" }, + "⋆": { "codepoints": [8902], "characters": "\u22C6" }, + "⋐": { "codepoints": [8912], "characters": "\u22D0" }, + "⋐": { "codepoints": [8912], "characters": "\u22D0" }, + "⊆": { "codepoints": [8838], "characters": "\u2286" }, + "≻": { "codepoints": [8827], "characters": "\u227B" }, + "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, + "≽": { "codepoints": [8829], "characters": "\u227D" }, + "≿": { "codepoints": [8831], "characters": "\u227F" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "∑": { "codepoints": [8721], "characters": "\u2211" }, + "⋑": { "codepoints": [8913], "characters": "\u22D1" }, + "⊃": { "codepoints": [8835], "characters": "\u2283" }, + "⊇": { "codepoints": [8839], "characters": "\u2287" }, + "⋑": { "codepoints": [8913], "characters": "\u22D1" }, + "Þ": { "codepoints": [222], "characters": "\u00DE" }, + "Þ": { "codepoints": [222], "characters": "\u00DE" }, + "™": { "codepoints": [8482], "characters": "\u2122" }, + "Ћ": { "codepoints": [1035], "characters": "\u040B" }, + "Ц": { "codepoints": [1062], "characters": "\u0426" }, + " ": { "codepoints": [9], "characters": "\u0009" }, + "Τ": { "codepoints": [932], "characters": "\u03A4" }, + "Ť": { "codepoints": [356], "characters": "\u0164" }, + "Ţ": { "codepoints": [354], "characters": "\u0162" }, + "Т": { "codepoints": [1058], "characters": "\u0422" }, + "𝔗": { "codepoints": [120087], "characters": "\uD835\uDD17" }, + "∴": { "codepoints": [8756], "characters": "\u2234" }, + "Θ": { "codepoints": [920], "characters": "\u0398" }, + "  ": { "codepoints": [8287, 8202], "characters": "\u205F\u200A" }, + " ": { "codepoints": [8201], "characters": "\u2009" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + "≃": { "codepoints": [8771], "characters": "\u2243" }, + "≅": { "codepoints": [8773], "characters": "\u2245" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "𝕋": { "codepoints": [120139], "characters": "\uD835\uDD4B" }, + "⃛": { "codepoints": [8411], "characters": "\u20DB" }, + "𝒯": { "codepoints": [119983], "characters": "\uD835\uDCAF" }, + "Ŧ": { "codepoints": [358], "characters": "\u0166" }, + "Ú": { "codepoints": [218], "characters": "\u00DA" }, + "Ú": { "codepoints": [218], "characters": "\u00DA" }, + "↟": { "codepoints": [8607], "characters": "\u219F" }, + "⥉": { "codepoints": [10569], "characters": "\u2949" }, + "Ў": { "codepoints": [1038], "characters": "\u040E" }, + "Ŭ": { "codepoints": [364], "characters": "\u016C" }, + "Û": { "codepoints": [219], "characters": "\u00DB" }, + "Û": { "codepoints": [219], "characters": "\u00DB" }, + "У": { "codepoints": [1059], "characters": "\u0423" }, + "Ű": { "codepoints": [368], "characters": "\u0170" }, + "𝔘": { "codepoints": [120088], "characters": "\uD835\uDD18" }, + "Ù": { "codepoints": [217], "characters": "\u00D9" }, + "Ù": { "codepoints": [217], "characters": "\u00D9" }, + "Ū": { "codepoints": [362], "characters": "\u016A" }, + "_": { "codepoints": [95], "characters": "\u005F" }, + "⏟": { "codepoints": [9183], "characters": "\u23DF" }, + "⎵": { "codepoints": [9141], "characters": "\u23B5" }, + "⏝": { "codepoints": [9181], "characters": "\u23DD" }, + "⋃": { "codepoints": [8899], "characters": "\u22C3" }, + "⊎": { "codepoints": [8846], "characters": "\u228E" }, + "Ų": { "codepoints": [370], "characters": "\u0172" }, + "𝕌": { "codepoints": [120140], "characters": "\uD835\uDD4C" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "⤒": { "codepoints": [10514], "characters": "\u2912" }, + "⇅": { "codepoints": [8645], "characters": "\u21C5" }, + "↕": { "codepoints": [8597], "characters": "\u2195" }, + "⥮": { "codepoints": [10606], "characters": "\u296E" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "↥": { "codepoints": [8613], "characters": "\u21A5" }, + "⇑": { "codepoints": [8657], "characters": "\u21D1" }, + "⇕": { "codepoints": [8661], "characters": "\u21D5" }, + "↖": { "codepoints": [8598], "characters": "\u2196" }, + "↗": { "codepoints": [8599], "characters": "\u2197" }, + "ϒ": { "codepoints": [978], "characters": "\u03D2" }, + "Υ": { "codepoints": [933], "characters": "\u03A5" }, + "Ů": { "codepoints": [366], "characters": "\u016E" }, + "𝒰": { "codepoints": [119984], "characters": "\uD835\uDCB0" }, + "Ũ": { "codepoints": [360], "characters": "\u0168" }, + "Ü": { "codepoints": [220], "characters": "\u00DC" }, + "Ü": { "codepoints": [220], "characters": "\u00DC" }, + "⊫": { "codepoints": [8875], "characters": "\u22AB" }, + "⫫": { "codepoints": [10987], "characters": "\u2AEB" }, + "В": { "codepoints": [1042], "characters": "\u0412" }, + "⊩": { "codepoints": [8873], "characters": "\u22A9" }, + "⫦": { "codepoints": [10982], "characters": "\u2AE6" }, + "⋁": { "codepoints": [8897], "characters": "\u22C1" }, + "‖": { "codepoints": [8214], "characters": "\u2016" }, + "‖": { "codepoints": [8214], "characters": "\u2016" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "|": { "codepoints": [124], "characters": "\u007C" }, + "❘": { "codepoints": [10072], "characters": "\u2758" }, + "≀": { "codepoints": [8768], "characters": "\u2240" }, + " ": { "codepoints": [8202], "characters": "\u200A" }, + "𝔙": { "codepoints": [120089], "characters": "\uD835\uDD19" }, + "𝕍": { "codepoints": [120141], "characters": "\uD835\uDD4D" }, + "𝒱": { "codepoints": [119985], "characters": "\uD835\uDCB1" }, + "⊪": { "codepoints": [8874], "characters": "\u22AA" }, + "Ŵ": { "codepoints": [372], "characters": "\u0174" }, + "⋀": { "codepoints": [8896], "characters": "\u22C0" }, + "𝔚": { "codepoints": [120090], "characters": "\uD835\uDD1A" }, + "𝕎": { "codepoints": [120142], "characters": "\uD835\uDD4E" }, + "𝒲": { "codepoints": [119986], "characters": "\uD835\uDCB2" }, + "𝔛": { "codepoints": [120091], "characters": "\uD835\uDD1B" }, + "Ξ": { "codepoints": [926], "characters": "\u039E" }, + "𝕏": { "codepoints": [120143], "characters": "\uD835\uDD4F" }, + "𝒳": { "codepoints": [119987], "characters": "\uD835\uDCB3" }, + "Я": { "codepoints": [1071], "characters": "\u042F" }, + "Ї": { "codepoints": [1031], "characters": "\u0407" }, + "Ю": { "codepoints": [1070], "characters": "\u042E" }, + "Ý": { "codepoints": [221], "characters": "\u00DD" }, + "Ý": { "codepoints": [221], "characters": "\u00DD" }, + "Ŷ": { "codepoints": [374], "characters": "\u0176" }, + "Ы": { "codepoints": [1067], "characters": "\u042B" }, + "𝔜": { "codepoints": [120092], "characters": "\uD835\uDD1C" }, + "𝕐": { "codepoints": [120144], "characters": "\uD835\uDD50" }, + "𝒴": { "codepoints": [119988], "characters": "\uD835\uDCB4" }, + "Ÿ": { "codepoints": [376], "characters": "\u0178" }, + "Ж": { "codepoints": [1046], "characters": "\u0416" }, + "Ź": { "codepoints": [377], "characters": "\u0179" }, + "Ž": { "codepoints": [381], "characters": "\u017D" }, + "З": { "codepoints": [1047], "characters": "\u0417" }, + "Ż": { "codepoints": [379], "characters": "\u017B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "Ζ": { "codepoints": [918], "characters": "\u0396" }, + "ℨ": { "codepoints": [8488], "characters": "\u2128" }, + "ℤ": { "codepoints": [8484], "characters": "\u2124" }, + "𝒵": { "codepoints": [119989], "characters": "\uD835\uDCB5" }, + "á": { "codepoints": [225], "characters": "\u00E1" }, + "á": { "codepoints": [225], "characters": "\u00E1" }, + "ă": { "codepoints": [259], "characters": "\u0103" }, + "∾": { "codepoints": [8766], "characters": "\u223E" }, + "∾̳": { "codepoints": [8766, 819], "characters": "\u223E\u0333" }, + "∿": { "codepoints": [8767], "characters": "\u223F" }, + "â": { "codepoints": [226], "characters": "\u00E2" }, + "â": { "codepoints": [226], "characters": "\u00E2" }, + "´": { "codepoints": [180], "characters": "\u00B4" }, + "´": { "codepoints": [180], "characters": "\u00B4" }, + "а": { "codepoints": [1072], "characters": "\u0430" }, + "æ": { "codepoints": [230], "characters": "\u00E6" }, + "æ": { "codepoints": [230], "characters": "\u00E6" }, + "⁡": { "codepoints": [8289], "characters": "\u2061" }, + "𝔞": { "codepoints": [120094], "characters": "\uD835\uDD1E" }, + "à": { "codepoints": [224], "characters": "\u00E0" }, + "à": { "codepoints": [224], "characters": "\u00E0" }, + "ℵ": { "codepoints": [8501], "characters": "\u2135" }, + "ℵ": { "codepoints": [8501], "characters": "\u2135" }, + "α": { "codepoints": [945], "characters": "\u03B1" }, + "ā": { "codepoints": [257], "characters": "\u0101" }, + "⨿": { "codepoints": [10815], "characters": "\u2A3F" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "∧": { "codepoints": [8743], "characters": "\u2227" }, + "⩕": { "codepoints": [10837], "characters": "\u2A55" }, + "⩜": { "codepoints": [10844], "characters": "\u2A5C" }, + "⩘": { "codepoints": [10840], "characters": "\u2A58" }, + "⩚": { "codepoints": [10842], "characters": "\u2A5A" }, + "∠": { "codepoints": [8736], "characters": "\u2220" }, + "⦤": { "codepoints": [10660], "characters": "\u29A4" }, + "∠": { "codepoints": [8736], "characters": "\u2220" }, + "∡": { "codepoints": [8737], "characters": "\u2221" }, + "⦨": { "codepoints": [10664], "characters": "\u29A8" }, + "⦩": { "codepoints": [10665], "characters": "\u29A9" }, + "⦪": { "codepoints": [10666], "characters": "\u29AA" }, + "⦫": { "codepoints": [10667], "characters": "\u29AB" }, + "⦬": { "codepoints": [10668], "characters": "\u29AC" }, + "⦭": { "codepoints": [10669], "characters": "\u29AD" }, + "⦮": { "codepoints": [10670], "characters": "\u29AE" }, + "⦯": { "codepoints": [10671], "characters": "\u29AF" }, + "∟": { "codepoints": [8735], "characters": "\u221F" }, + "⊾": { "codepoints": [8894], "characters": "\u22BE" }, + "⦝": { "codepoints": [10653], "characters": "\u299D" }, + "∢": { "codepoints": [8738], "characters": "\u2222" }, + "Å": { "codepoints": [197], "characters": "\u00C5" }, + "⍼": { "codepoints": [9084], "characters": "\u237C" }, + "ą": { "codepoints": [261], "characters": "\u0105" }, + "𝕒": { "codepoints": [120146], "characters": "\uD835\uDD52" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "⩰": { "codepoints": [10864], "characters": "\u2A70" }, + "⩯": { "codepoints": [10863], "characters": "\u2A6F" }, + "≊": { "codepoints": [8778], "characters": "\u224A" }, + "≋": { "codepoints": [8779], "characters": "\u224B" }, + "'": { "codepoints": [39], "characters": "\u0027" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "≊": { "codepoints": [8778], "characters": "\u224A" }, + "å": { "codepoints": [229], "characters": "\u00E5" }, + "å": { "codepoints": [229], "characters": "\u00E5" }, + "𝒶": { "codepoints": [119990], "characters": "\uD835\uDCB6" }, + "*": { "codepoints": [42], "characters": "\u002A" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "≍": { "codepoints": [8781], "characters": "\u224D" }, + "ã": { "codepoints": [227], "characters": "\u00E3" }, + "ã": { "codepoints": [227], "characters": "\u00E3" }, + "ä": { "codepoints": [228], "characters": "\u00E4" }, + "ä": { "codepoints": [228], "characters": "\u00E4" }, + "∳": { "codepoints": [8755], "characters": "\u2233" }, + "⨑": { "codepoints": [10769], "characters": "\u2A11" }, + "⫭": { "codepoints": [10989], "characters": "\u2AED" }, + "≌": { "codepoints": [8780], "characters": "\u224C" }, + "϶": { "codepoints": [1014], "characters": "\u03F6" }, + "‵": { "codepoints": [8245], "characters": "\u2035" }, + "∽": { "codepoints": [8765], "characters": "\u223D" }, + "⋍": { "codepoints": [8909], "characters": "\u22CD" }, + "⊽": { "codepoints": [8893], "characters": "\u22BD" }, + "⌅": { "codepoints": [8965], "characters": "\u2305" }, + "⌅": { "codepoints": [8965], "characters": "\u2305" }, + "⎵": { "codepoints": [9141], "characters": "\u23B5" }, + "⎶": { "codepoints": [9142], "characters": "\u23B6" }, + "≌": { "codepoints": [8780], "characters": "\u224C" }, + "б": { "codepoints": [1073], "characters": "\u0431" }, + "„": { "codepoints": [8222], "characters": "\u201E" }, + "∵": { "codepoints": [8757], "characters": "\u2235" }, + "∵": { "codepoints": [8757], "characters": "\u2235" }, + "⦰": { "codepoints": [10672], "characters": "\u29B0" }, + "϶": { "codepoints": [1014], "characters": "\u03F6" }, + "ℬ": { "codepoints": [8492], "characters": "\u212C" }, + "β": { "codepoints": [946], "characters": "\u03B2" }, + "ℶ": { "codepoints": [8502], "characters": "\u2136" }, + "≬": { "codepoints": [8812], "characters": "\u226C" }, + "𝔟": { "codepoints": [120095], "characters": "\uD835\uDD1F" }, + "⋂": { "codepoints": [8898], "characters": "\u22C2" }, + "◯": { "codepoints": [9711], "characters": "\u25EF" }, + "⋃": { "codepoints": [8899], "characters": "\u22C3" }, + "⨀": { "codepoints": [10752], "characters": "\u2A00" }, + "⨁": { "codepoints": [10753], "characters": "\u2A01" }, + "⨂": { "codepoints": [10754], "characters": "\u2A02" }, + "⨆": { "codepoints": [10758], "characters": "\u2A06" }, + "★": { "codepoints": [9733], "characters": "\u2605" }, + "▽": { "codepoints": [9661], "characters": "\u25BD" }, + "△": { "codepoints": [9651], "characters": "\u25B3" }, + "⨄": { "codepoints": [10756], "characters": "\u2A04" }, + "⋁": { "codepoints": [8897], "characters": "\u22C1" }, + "⋀": { "codepoints": [8896], "characters": "\u22C0" }, + "⤍": { "codepoints": [10509], "characters": "\u290D" }, + "⧫": { "codepoints": [10731], "characters": "\u29EB" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "▴": { "codepoints": [9652], "characters": "\u25B4" }, + "▾": { "codepoints": [9662], "characters": "\u25BE" }, + "◂": { "codepoints": [9666], "characters": "\u25C2" }, + "▸": { "codepoints": [9656], "characters": "\u25B8" }, + "␣": { "codepoints": [9251], "characters": "\u2423" }, + "▒": { "codepoints": [9618], "characters": "\u2592" }, + "░": { "codepoints": [9617], "characters": "\u2591" }, + "▓": { "codepoints": [9619], "characters": "\u2593" }, + "█": { "codepoints": [9608], "characters": "\u2588" }, + "=⃥": { "codepoints": [61, 8421], "characters": "\u003D\u20E5" }, + "≡⃥": { "codepoints": [8801, 8421], "characters": "\u2261\u20E5" }, + "⌐": { "codepoints": [8976], "characters": "\u2310" }, + "𝕓": { "codepoints": [120147], "characters": "\uD835\uDD53" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "⋈": { "codepoints": [8904], "characters": "\u22C8" }, + "╗": { "codepoints": [9559], "characters": "\u2557" }, + "╔": { "codepoints": [9556], "characters": "\u2554" }, + "╖": { "codepoints": [9558], "characters": "\u2556" }, + "╓": { "codepoints": [9555], "characters": "\u2553" }, + "═": { "codepoints": [9552], "characters": "\u2550" }, + "╦": { "codepoints": [9574], "characters": "\u2566" }, + "╩": { "codepoints": [9577], "characters": "\u2569" }, + "╤": { "codepoints": [9572], "characters": "\u2564" }, + "╧": { "codepoints": [9575], "characters": "\u2567" }, + "╝": { "codepoints": [9565], "characters": "\u255D" }, + "╚": { "codepoints": [9562], "characters": "\u255A" }, + "╜": { "codepoints": [9564], "characters": "\u255C" }, + "╙": { "codepoints": [9561], "characters": "\u2559" }, + "║": { "codepoints": [9553], "characters": "\u2551" }, + "╬": { "codepoints": [9580], "characters": "\u256C" }, + "╣": { "codepoints": [9571], "characters": "\u2563" }, + "╠": { "codepoints": [9568], "characters": "\u2560" }, + "╫": { "codepoints": [9579], "characters": "\u256B" }, + "╢": { "codepoints": [9570], "characters": "\u2562" }, + "╟": { "codepoints": [9567], "characters": "\u255F" }, + "⧉": { "codepoints": [10697], "characters": "\u29C9" }, + "╕": { "codepoints": [9557], "characters": "\u2555" }, + "╒": { "codepoints": [9554], "characters": "\u2552" }, + "┐": { "codepoints": [9488], "characters": "\u2510" }, + "┌": { "codepoints": [9484], "characters": "\u250C" }, + "─": { "codepoints": [9472], "characters": "\u2500" }, + "╥": { "codepoints": [9573], "characters": "\u2565" }, + "╨": { "codepoints": [9576], "characters": "\u2568" }, + "┬": { "codepoints": [9516], "characters": "\u252C" }, + "┴": { "codepoints": [9524], "characters": "\u2534" }, + "⊟": { "codepoints": [8863], "characters": "\u229F" }, + "⊞": { "codepoints": [8862], "characters": "\u229E" }, + "⊠": { "codepoints": [8864], "characters": "\u22A0" }, + "╛": { "codepoints": [9563], "characters": "\u255B" }, + "╘": { "codepoints": [9560], "characters": "\u2558" }, + "┘": { "codepoints": [9496], "characters": "\u2518" }, + "└": { "codepoints": [9492], "characters": "\u2514" }, + "│": { "codepoints": [9474], "characters": "\u2502" }, + "╪": { "codepoints": [9578], "characters": "\u256A" }, + "╡": { "codepoints": [9569], "characters": "\u2561" }, + "╞": { "codepoints": [9566], "characters": "\u255E" }, + "┼": { "codepoints": [9532], "characters": "\u253C" }, + "┤": { "codepoints": [9508], "characters": "\u2524" }, + "├": { "codepoints": [9500], "characters": "\u251C" }, + "‵": { "codepoints": [8245], "characters": "\u2035" }, + "˘": { "codepoints": [728], "characters": "\u02D8" }, + "¦": { "codepoints": [166], "characters": "\u00A6" }, + "¦": { "codepoints": [166], "characters": "\u00A6" }, + "𝒷": { "codepoints": [119991], "characters": "\uD835\uDCB7" }, + "⁏": { "codepoints": [8271], "characters": "\u204F" }, + "∽": { "codepoints": [8765], "characters": "\u223D" }, + "⋍": { "codepoints": [8909], "characters": "\u22CD" }, + "\": { "codepoints": [92], "characters": "\u005C" }, + "⧅": { "codepoints": [10693], "characters": "\u29C5" }, + "⟈": { "codepoints": [10184], "characters": "\u27C8" }, + "•": { "codepoints": [8226], "characters": "\u2022" }, + "•": { "codepoints": [8226], "characters": "\u2022" }, + "≎": { "codepoints": [8782], "characters": "\u224E" }, + "⪮": { "codepoints": [10926], "characters": "\u2AAE" }, + "≏": { "codepoints": [8783], "characters": "\u224F" }, + "≏": { "codepoints": [8783], "characters": "\u224F" }, + "ć": { "codepoints": [263], "characters": "\u0107" }, + "∩": { "codepoints": [8745], "characters": "\u2229" }, + "⩄": { "codepoints": [10820], "characters": "\u2A44" }, + "⩉": { "codepoints": [10825], "characters": "\u2A49" }, + "⩋": { "codepoints": [10827], "characters": "\u2A4B" }, + "⩇": { "codepoints": [10823], "characters": "\u2A47" }, + "⩀": { "codepoints": [10816], "characters": "\u2A40" }, + "∩︀": { "codepoints": [8745, 65024], "characters": "\u2229\uFE00" }, + "⁁": { "codepoints": [8257], "characters": "\u2041" }, + "ˇ": { "codepoints": [711], "characters": "\u02C7" }, + "⩍": { "codepoints": [10829], "characters": "\u2A4D" }, + "č": { "codepoints": [269], "characters": "\u010D" }, + "ç": { "codepoints": [231], "characters": "\u00E7" }, + "ç": { "codepoints": [231], "characters": "\u00E7" }, + "ĉ": { "codepoints": [265], "characters": "\u0109" }, + "⩌": { "codepoints": [10828], "characters": "\u2A4C" }, + "⩐": { "codepoints": [10832], "characters": "\u2A50" }, + "ċ": { "codepoints": [267], "characters": "\u010B" }, + "¸": { "codepoints": [184], "characters": "\u00B8" }, + "¸": { "codepoints": [184], "characters": "\u00B8" }, + "⦲": { "codepoints": [10674], "characters": "\u29B2" }, + "¢": { "codepoints": [162], "characters": "\u00A2" }, + "¢": { "codepoints": [162], "characters": "\u00A2" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "𝔠": { "codepoints": [120096], "characters": "\uD835\uDD20" }, + "ч": { "codepoints": [1095], "characters": "\u0447" }, + "✓": { "codepoints": [10003], "characters": "\u2713" }, + "✓": { "codepoints": [10003], "characters": "\u2713" }, + "χ": { "codepoints": [967], "characters": "\u03C7" }, + "○": { "codepoints": [9675], "characters": "\u25CB" }, + "⧃": { "codepoints": [10691], "characters": "\u29C3" }, + "ˆ": { "codepoints": [710], "characters": "\u02C6" }, + "≗": { "codepoints": [8791], "characters": "\u2257" }, + "↺": { "codepoints": [8634], "characters": "\u21BA" }, + "↻": { "codepoints": [8635], "characters": "\u21BB" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" }, + "⊛": { "codepoints": [8859], "characters": "\u229B" }, + "⊚": { "codepoints": [8858], "characters": "\u229A" }, + "⊝": { "codepoints": [8861], "characters": "\u229D" }, + "≗": { "codepoints": [8791], "characters": "\u2257" }, + "⨐": { "codepoints": [10768], "characters": "\u2A10" }, + "⫯": { "codepoints": [10991], "characters": "\u2AEF" }, + "⧂": { "codepoints": [10690], "characters": "\u29C2" }, + "♣": { "codepoints": [9827], "characters": "\u2663" }, + "♣": { "codepoints": [9827], "characters": "\u2663" }, + ":": { "codepoints": [58], "characters": "\u003A" }, + "≔": { "codepoints": [8788], "characters": "\u2254" }, + "≔": { "codepoints": [8788], "characters": "\u2254" }, + ",": { "codepoints": [44], "characters": "\u002C" }, + "@": { "codepoints": [64], "characters": "\u0040" }, + "∁": { "codepoints": [8705], "characters": "\u2201" }, + "∘": { "codepoints": [8728], "characters": "\u2218" }, + "∁": { "codepoints": [8705], "characters": "\u2201" }, + "ℂ": { "codepoints": [8450], "characters": "\u2102" }, + "≅": { "codepoints": [8773], "characters": "\u2245" }, + "⩭": { "codepoints": [10861], "characters": "\u2A6D" }, + "∮": { "codepoints": [8750], "characters": "\u222E" }, + "𝕔": { "codepoints": [120148], "characters": "\uD835\uDD54" }, + "∐": { "codepoints": [8720], "characters": "\u2210" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "℗": { "codepoints": [8471], "characters": "\u2117" }, + "↵": { "codepoints": [8629], "characters": "\u21B5" }, + "✗": { "codepoints": [10007], "characters": "\u2717" }, + "𝒸": { "codepoints": [119992], "characters": "\uD835\uDCB8" }, + "⫏": { "codepoints": [10959], "characters": "\u2ACF" }, + "⫑": { "codepoints": [10961], "characters": "\u2AD1" }, + "⫐": { "codepoints": [10960], "characters": "\u2AD0" }, + "⫒": { "codepoints": [10962], "characters": "\u2AD2" }, + "⋯": { "codepoints": [8943], "characters": "\u22EF" }, + "⤸": { "codepoints": [10552], "characters": "\u2938" }, + "⤵": { "codepoints": [10549], "characters": "\u2935" }, + "⋞": { "codepoints": [8926], "characters": "\u22DE" }, + "⋟": { "codepoints": [8927], "characters": "\u22DF" }, + "↶": { "codepoints": [8630], "characters": "\u21B6" }, + "⤽": { "codepoints": [10557], "characters": "\u293D" }, + "∪": { "codepoints": [8746], "characters": "\u222A" }, + "⩈": { "codepoints": [10824], "characters": "\u2A48" }, + "⩆": { "codepoints": [10822], "characters": "\u2A46" }, + "⩊": { "codepoints": [10826], "characters": "\u2A4A" }, + "⊍": { "codepoints": [8845], "characters": "\u228D" }, + "⩅": { "codepoints": [10821], "characters": "\u2A45" }, + "∪︀": { "codepoints": [8746, 65024], "characters": "\u222A\uFE00" }, + "↷": { "codepoints": [8631], "characters": "\u21B7" }, + "⤼": { "codepoints": [10556], "characters": "\u293C" }, + "⋞": { "codepoints": [8926], "characters": "\u22DE" }, + "⋟": { "codepoints": [8927], "characters": "\u22DF" }, + "⋎": { "codepoints": [8910], "characters": "\u22CE" }, + "⋏": { "codepoints": [8911], "characters": "\u22CF" }, + "¤": { "codepoints": [164], "characters": "\u00A4" }, + "¤": { "codepoints": [164], "characters": "\u00A4" }, + "↶": { "codepoints": [8630], "characters": "\u21B6" }, + "↷": { "codepoints": [8631], "characters": "\u21B7" }, + "⋎": { "codepoints": [8910], "characters": "\u22CE" }, + "⋏": { "codepoints": [8911], "characters": "\u22CF" }, + "∲": { "codepoints": [8754], "characters": "\u2232" }, + "∱": { "codepoints": [8753], "characters": "\u2231" }, + "⌭": { "codepoints": [9005], "characters": "\u232D" }, + "⇓": { "codepoints": [8659], "characters": "\u21D3" }, + "⥥": { "codepoints": [10597], "characters": "\u2965" }, + "†": { "codepoints": [8224], "characters": "\u2020" }, + "ℸ": { "codepoints": [8504], "characters": "\u2138" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "‐": { "codepoints": [8208], "characters": "\u2010" }, + "⊣": { "codepoints": [8867], "characters": "\u22A3" }, + "⤏": { "codepoints": [10511], "characters": "\u290F" }, + "˝": { "codepoints": [733], "characters": "\u02DD" }, + "ď": { "codepoints": [271], "characters": "\u010F" }, + "д": { "codepoints": [1076], "characters": "\u0434" }, + "ⅆ": { "codepoints": [8518], "characters": "\u2146" }, + "‡": { "codepoints": [8225], "characters": "\u2021" }, + "⇊": { "codepoints": [8650], "characters": "\u21CA" }, + "⩷": { "codepoints": [10871], "characters": "\u2A77" }, + "°": { "codepoints": [176], "characters": "\u00B0" }, + "°": { "codepoints": [176], "characters": "\u00B0" }, + "δ": { "codepoints": [948], "characters": "\u03B4" }, + "⦱": { "codepoints": [10673], "characters": "\u29B1" }, + "⥿": { "codepoints": [10623], "characters": "\u297F" }, + "𝔡": { "codepoints": [120097], "characters": "\uD835\uDD21" }, + "⇃": { "codepoints": [8643], "characters": "\u21C3" }, + "⇂": { "codepoints": [8642], "characters": "\u21C2" }, + "⋄": { "codepoints": [8900], "characters": "\u22C4" }, + "⋄": { "codepoints": [8900], "characters": "\u22C4" }, + "♦": { "codepoints": [9830], "characters": "\u2666" }, + "♦": { "codepoints": [9830], "characters": "\u2666" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "ϝ": { "codepoints": [989], "characters": "\u03DD" }, + "⋲": { "codepoints": [8946], "characters": "\u22F2" }, + "÷": { "codepoints": [247], "characters": "\u00F7" }, + "÷": { "codepoints": [247], "characters": "\u00F7" }, + "÷": { "codepoints": [247], "characters": "\u00F7" }, + "⋇": { "codepoints": [8903], "characters": "\u22C7" }, + "⋇": { "codepoints": [8903], "characters": "\u22C7" }, + "ђ": { "codepoints": [1106], "characters": "\u0452" }, + "⌞": { "codepoints": [8990], "characters": "\u231E" }, + "⌍": { "codepoints": [8973], "characters": "\u230D" }, + "$": { "codepoints": [36], "characters": "\u0024" }, + "𝕕": { "codepoints": [120149], "characters": "\uD835\uDD55" }, + "˙": { "codepoints": [729], "characters": "\u02D9" }, + "≐": { "codepoints": [8784], "characters": "\u2250" }, + "≑": { "codepoints": [8785], "characters": "\u2251" }, + "∸": { "codepoints": [8760], "characters": "\u2238" }, + "∔": { "codepoints": [8724], "characters": "\u2214" }, + "⊡": { "codepoints": [8865], "characters": "\u22A1" }, + "⌆": { "codepoints": [8966], "characters": "\u2306" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "⇊": { "codepoints": [8650], "characters": "\u21CA" }, + "⇃": { "codepoints": [8643], "characters": "\u21C3" }, + "⇂": { "codepoints": [8642], "characters": "\u21C2" }, + "⤐": { "codepoints": [10512], "characters": "\u2910" }, + "⌟": { "codepoints": [8991], "characters": "\u231F" }, + "⌌": { "codepoints": [8972], "characters": "\u230C" }, + "𝒹": { "codepoints": [119993], "characters": "\uD835\uDCB9" }, + "ѕ": { "codepoints": [1109], "characters": "\u0455" }, + "⧶": { "codepoints": [10742], "characters": "\u29F6" }, + "đ": { "codepoints": [273], "characters": "\u0111" }, + "⋱": { "codepoints": [8945], "characters": "\u22F1" }, + "▿": { "codepoints": [9663], "characters": "\u25BF" }, + "▾": { "codepoints": [9662], "characters": "\u25BE" }, + "⇵": { "codepoints": [8693], "characters": "\u21F5" }, + "⥯": { "codepoints": [10607], "characters": "\u296F" }, + "⦦": { "codepoints": [10662], "characters": "\u29A6" }, + "џ": { "codepoints": [1119], "characters": "\u045F" }, + "⟿": { "codepoints": [10239], "characters": "\u27FF" }, + "⩷": { "codepoints": [10871], "characters": "\u2A77" }, + "≑": { "codepoints": [8785], "characters": "\u2251" }, + "é": { "codepoints": [233], "characters": "\u00E9" }, + "é": { "codepoints": [233], "characters": "\u00E9" }, + "⩮": { "codepoints": [10862], "characters": "\u2A6E" }, + "ě": { "codepoints": [283], "characters": "\u011B" }, + "≖": { "codepoints": [8790], "characters": "\u2256" }, + "ê": { "codepoints": [234], "characters": "\u00EA" }, + "ê": { "codepoints": [234], "characters": "\u00EA" }, + "≕": { "codepoints": [8789], "characters": "\u2255" }, + "э": { "codepoints": [1101], "characters": "\u044D" }, + "ė": { "codepoints": [279], "characters": "\u0117" }, + "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, + "≒": { "codepoints": [8786], "characters": "\u2252" }, + "𝔢": { "codepoints": [120098], "characters": "\uD835\uDD22" }, + "⪚": { "codepoints": [10906], "characters": "\u2A9A" }, + "è": { "codepoints": [232], "characters": "\u00E8" }, + "è": { "codepoints": [232], "characters": "\u00E8" }, + "⪖": { "codepoints": [10902], "characters": "\u2A96" }, + "⪘": { "codepoints": [10904], "characters": "\u2A98" }, + "⪙": { "codepoints": [10905], "characters": "\u2A99" }, + "⏧": { "codepoints": [9191], "characters": "\u23E7" }, + "ℓ": { "codepoints": [8467], "characters": "\u2113" }, + "⪕": { "codepoints": [10901], "characters": "\u2A95" }, + "⪗": { "codepoints": [10903], "characters": "\u2A97" }, + "ē": { "codepoints": [275], "characters": "\u0113" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + " ": { "codepoints": [8196], "characters": "\u2004" }, + " ": { "codepoints": [8197], "characters": "\u2005" }, + " ": { "codepoints": [8195], "characters": "\u2003" }, + "ŋ": { "codepoints": [331], "characters": "\u014B" }, + " ": { "codepoints": [8194], "characters": "\u2002" }, + "ę": { "codepoints": [281], "characters": "\u0119" }, + "𝕖": { "codepoints": [120150], "characters": "\uD835\uDD56" }, + "⋕": { "codepoints": [8917], "characters": "\u22D5" }, + "⧣": { "codepoints": [10723], "characters": "\u29E3" }, + "⩱": { "codepoints": [10865], "characters": "\u2A71" }, + "ε": { "codepoints": [949], "characters": "\u03B5" }, + "ε": { "codepoints": [949], "characters": "\u03B5" }, + "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, + "≖": { "codepoints": [8790], "characters": "\u2256" }, + "≕": { "codepoints": [8789], "characters": "\u2255" }, + "≂": { "codepoints": [8770], "characters": "\u2242" }, + "⪖": { "codepoints": [10902], "characters": "\u2A96" }, + "⪕": { "codepoints": [10901], "characters": "\u2A95" }, + "=": { "codepoints": [61], "characters": "\u003D" }, + "≟": { "codepoints": [8799], "characters": "\u225F" }, + "≡": { "codepoints": [8801], "characters": "\u2261" }, + "⩸": { "codepoints": [10872], "characters": "\u2A78" }, + "⧥": { "codepoints": [10725], "characters": "\u29E5" }, + "≓": { "codepoints": [8787], "characters": "\u2253" }, + "⥱": { "codepoints": [10609], "characters": "\u2971" }, + "ℯ": { "codepoints": [8495], "characters": "\u212F" }, + "≐": { "codepoints": [8784], "characters": "\u2250" }, + "≂": { "codepoints": [8770], "characters": "\u2242" }, + "η": { "codepoints": [951], "characters": "\u03B7" }, + "ð": { "codepoints": [240], "characters": "\u00F0" }, + "ð": { "codepoints": [240], "characters": "\u00F0" }, + "ë": { "codepoints": [235], "characters": "\u00EB" }, + "ë": { "codepoints": [235], "characters": "\u00EB" }, + "€": { "codepoints": [8364], "characters": "\u20AC" }, + "!": { "codepoints": [33], "characters": "\u0021" }, + "∃": { "codepoints": [8707], "characters": "\u2203" }, + "ℰ": { "codepoints": [8496], "characters": "\u2130" }, + "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, + "≒": { "codepoints": [8786], "characters": "\u2252" }, + "ф": { "codepoints": [1092], "characters": "\u0444" }, + "♀": { "codepoints": [9792], "characters": "\u2640" }, + "ffi": { "codepoints": [64259], "characters": "\uFB03" }, + "ff": { "codepoints": [64256], "characters": "\uFB00" }, + "ffl": { "codepoints": [64260], "characters": "\uFB04" }, + "𝔣": { "codepoints": [120099], "characters": "\uD835\uDD23" }, + "fi": { "codepoints": [64257], "characters": "\uFB01" }, + "fj": { "codepoints": [102, 106], "characters": "\u0066\u006A" }, + "♭": { "codepoints": [9837], "characters": "\u266D" }, + "fl": { "codepoints": [64258], "characters": "\uFB02" }, + "▱": { "codepoints": [9649], "characters": "\u25B1" }, + "ƒ": { "codepoints": [402], "characters": "\u0192" }, + "𝕗": { "codepoints": [120151], "characters": "\uD835\uDD57" }, + "∀": { "codepoints": [8704], "characters": "\u2200" }, + "⋔": { "codepoints": [8916], "characters": "\u22D4" }, + "⫙": { "codepoints": [10969], "characters": "\u2AD9" }, + "⨍": { "codepoints": [10765], "characters": "\u2A0D" }, + "½": { "codepoints": [189], "characters": "\u00BD" }, + "½": { "codepoints": [189], "characters": "\u00BD" }, + "⅓": { "codepoints": [8531], "characters": "\u2153" }, + "¼": { "codepoints": [188], "characters": "\u00BC" }, + "¼": { "codepoints": [188], "characters": "\u00BC" }, + "⅕": { "codepoints": [8533], "characters": "\u2155" }, + "⅙": { "codepoints": [8537], "characters": "\u2159" }, + "⅛": { "codepoints": [8539], "characters": "\u215B" }, + "⅔": { "codepoints": [8532], "characters": "\u2154" }, + "⅖": { "codepoints": [8534], "characters": "\u2156" }, + "¾": { "codepoints": [190], "characters": "\u00BE" }, + "¾": { "codepoints": [190], "characters": "\u00BE" }, + "⅗": { "codepoints": [8535], "characters": "\u2157" }, + "⅜": { "codepoints": [8540], "characters": "\u215C" }, + "⅘": { "codepoints": [8536], "characters": "\u2158" }, + "⅚": { "codepoints": [8538], "characters": "\u215A" }, + "⅝": { "codepoints": [8541], "characters": "\u215D" }, + "⅞": { "codepoints": [8542], "characters": "\u215E" }, + "⁄": { "codepoints": [8260], "characters": "\u2044" }, + "⌢": { "codepoints": [8994], "characters": "\u2322" }, + "𝒻": { "codepoints": [119995], "characters": "\uD835\uDCBB" }, + "≧": { "codepoints": [8807], "characters": "\u2267" }, + "⪌": { "codepoints": [10892], "characters": "\u2A8C" }, + "ǵ": { "codepoints": [501], "characters": "\u01F5" }, + "γ": { "codepoints": [947], "characters": "\u03B3" }, + "ϝ": { "codepoints": [989], "characters": "\u03DD" }, + "⪆": { "codepoints": [10886], "characters": "\u2A86" }, + "ğ": { "codepoints": [287], "characters": "\u011F" }, + "ĝ": { "codepoints": [285], "characters": "\u011D" }, + "г": { "codepoints": [1075], "characters": "\u0433" }, + "ġ": { "codepoints": [289], "characters": "\u0121" }, + "≥": { "codepoints": [8805], "characters": "\u2265" }, + "⋛": { "codepoints": [8923], "characters": "\u22DB" }, + "≥": { "codepoints": [8805], "characters": "\u2265" }, + "≧": { "codepoints": [8807], "characters": "\u2267" }, + "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, + "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, + "⪩": { "codepoints": [10921], "characters": "\u2AA9" }, + "⪀": { "codepoints": [10880], "characters": "\u2A80" }, + "⪂": { "codepoints": [10882], "characters": "\u2A82" }, + "⪄": { "codepoints": [10884], "characters": "\u2A84" }, + "⋛︀": { "codepoints": [8923, 65024], "characters": "\u22DB\uFE00" }, + "⪔": { "codepoints": [10900], "characters": "\u2A94" }, + "𝔤": { "codepoints": [120100], "characters": "\uD835\uDD24" }, + "≫": { "codepoints": [8811], "characters": "\u226B" }, + "⋙": { "codepoints": [8921], "characters": "\u22D9" }, + "ℷ": { "codepoints": [8503], "characters": "\u2137" }, + "ѓ": { "codepoints": [1107], "characters": "\u0453" }, + "≷": { "codepoints": [8823], "characters": "\u2277" }, + "⪒": { "codepoints": [10898], "characters": "\u2A92" }, + "⪥": { "codepoints": [10917], "characters": "\u2AA5" }, + "⪤": { "codepoints": [10916], "characters": "\u2AA4" }, + "≩": { "codepoints": [8809], "characters": "\u2269" }, + "⪊": { "codepoints": [10890], "characters": "\u2A8A" }, + "⪊": { "codepoints": [10890], "characters": "\u2A8A" }, + "⪈": { "codepoints": [10888], "characters": "\u2A88" }, + "⪈": { "codepoints": [10888], "characters": "\u2A88" }, + "≩": { "codepoints": [8809], "characters": "\u2269" }, + "⋧": { "codepoints": [8935], "characters": "\u22E7" }, + "𝕘": { "codepoints": [120152], "characters": "\uD835\uDD58" }, + "`": { "codepoints": [96], "characters": "\u0060" }, + "ℊ": { "codepoints": [8458], "characters": "\u210A" }, + "≳": { "codepoints": [8819], "characters": "\u2273" }, + "⪎": { "codepoints": [10894], "characters": "\u2A8E" }, + "⪐": { "codepoints": [10896], "characters": "\u2A90" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + "⪧": { "codepoints": [10919], "characters": "\u2AA7" }, + "⩺": { "codepoints": [10874], "characters": "\u2A7A" }, + "⋗": { "codepoints": [8919], "characters": "\u22D7" }, + "⦕": { "codepoints": [10645], "characters": "\u2995" }, + "⩼": { "codepoints": [10876], "characters": "\u2A7C" }, + "⪆": { "codepoints": [10886], "characters": "\u2A86" }, + "⥸": { "codepoints": [10616], "characters": "\u2978" }, + "⋗": { "codepoints": [8919], "characters": "\u22D7" }, + "⋛": { "codepoints": [8923], "characters": "\u22DB" }, + "⪌": { "codepoints": [10892], "characters": "\u2A8C" }, + "≷": { "codepoints": [8823], "characters": "\u2277" }, + "≳": { "codepoints": [8819], "characters": "\u2273" }, + "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" }, + "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + " ": { "codepoints": [8202], "characters": "\u200A" }, + "½": { "codepoints": [189], "characters": "\u00BD" }, + "ℋ": { "codepoints": [8459], "characters": "\u210B" }, + "ъ": { "codepoints": [1098], "characters": "\u044A" }, + "↔": { "codepoints": [8596], "characters": "\u2194" }, + "⥈": { "codepoints": [10568], "characters": "\u2948" }, + "↭": { "codepoints": [8621], "characters": "\u21AD" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "ĥ": { "codepoints": [293], "characters": "\u0125" }, + "♥": { "codepoints": [9829], "characters": "\u2665" }, + "♥": { "codepoints": [9829], "characters": "\u2665" }, + "…": { "codepoints": [8230], "characters": "\u2026" }, + "⊹": { "codepoints": [8889], "characters": "\u22B9" }, + "𝔥": { "codepoints": [120101], "characters": "\uD835\uDD25" }, + "⤥": { "codepoints": [10533], "characters": "\u2925" }, + "⤦": { "codepoints": [10534], "characters": "\u2926" }, + "⇿": { "codepoints": [8703], "characters": "\u21FF" }, + "∻": { "codepoints": [8763], "characters": "\u223B" }, + "↩": { "codepoints": [8617], "characters": "\u21A9" }, + "↪": { "codepoints": [8618], "characters": "\u21AA" }, + "𝕙": { "codepoints": [120153], "characters": "\uD835\uDD59" }, + "―": { "codepoints": [8213], "characters": "\u2015" }, + "𝒽": { "codepoints": [119997], "characters": "\uD835\uDCBD" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "ħ": { "codepoints": [295], "characters": "\u0127" }, + "⁃": { "codepoints": [8259], "characters": "\u2043" }, + "‐": { "codepoints": [8208], "characters": "\u2010" }, + "í": { "codepoints": [237], "characters": "\u00ED" }, + "í": { "codepoints": [237], "characters": "\u00ED" }, + "⁣": { "codepoints": [8291], "characters": "\u2063" }, + "î": { "codepoints": [238], "characters": "\u00EE" }, + "î": { "codepoints": [238], "characters": "\u00EE" }, + "и": { "codepoints": [1080], "characters": "\u0438" }, + "е": { "codepoints": [1077], "characters": "\u0435" }, + "¡": { "codepoints": [161], "characters": "\u00A1" }, + "¡": { "codepoints": [161], "characters": "\u00A1" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + "𝔦": { "codepoints": [120102], "characters": "\uD835\uDD26" }, + "ì": { "codepoints": [236], "characters": "\u00EC" }, + "ì": { "codepoints": [236], "characters": "\u00EC" }, + "ⅈ": { "codepoints": [8520], "characters": "\u2148" }, + "⨌": { "codepoints": [10764], "characters": "\u2A0C" }, + "∭": { "codepoints": [8749], "characters": "\u222D" }, + "⧜": { "codepoints": [10716], "characters": "\u29DC" }, + "℩": { "codepoints": [8489], "characters": "\u2129" }, + "ij": { "codepoints": [307], "characters": "\u0133" }, + "ī": { "codepoints": [299], "characters": "\u012B" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "ℐ": { "codepoints": [8464], "characters": "\u2110" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "ı": { "codepoints": [305], "characters": "\u0131" }, + "⊷": { "codepoints": [8887], "characters": "\u22B7" }, + "Ƶ": { "codepoints": [437], "characters": "\u01B5" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "℅": { "codepoints": [8453], "characters": "\u2105" }, + "∞": { "codepoints": [8734], "characters": "\u221E" }, + "⧝": { "codepoints": [10717], "characters": "\u29DD" }, + "ı": { "codepoints": [305], "characters": "\u0131" }, + "∫": { "codepoints": [8747], "characters": "\u222B" }, + "⊺": { "codepoints": [8890], "characters": "\u22BA" }, + "ℤ": { "codepoints": [8484], "characters": "\u2124" }, + "⊺": { "codepoints": [8890], "characters": "\u22BA" }, + "⨗": { "codepoints": [10775], "characters": "\u2A17" }, + "⨼": { "codepoints": [10812], "characters": "\u2A3C" }, + "ё": { "codepoints": [1105], "characters": "\u0451" }, + "į": { "codepoints": [303], "characters": "\u012F" }, + "𝕚": { "codepoints": [120154], "characters": "\uD835\uDD5A" }, + "ι": { "codepoints": [953], "characters": "\u03B9" }, + "⨼": { "codepoints": [10812], "characters": "\u2A3C" }, + "¿": { "codepoints": [191], "characters": "\u00BF" }, + "¿": { "codepoints": [191], "characters": "\u00BF" }, + "𝒾": { "codepoints": [119998], "characters": "\uD835\uDCBE" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "⋹": { "codepoints": [8953], "characters": "\u22F9" }, + "⋵": { "codepoints": [8949], "characters": "\u22F5" }, + "⋴": { "codepoints": [8948], "characters": "\u22F4" }, + "⋳": { "codepoints": [8947], "characters": "\u22F3" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "⁢": { "codepoints": [8290], "characters": "\u2062" }, + "ĩ": { "codepoints": [297], "characters": "\u0129" }, + "і": { "codepoints": [1110], "characters": "\u0456" }, + "ï": { "codepoints": [239], "characters": "\u00EF" }, + "ï": { "codepoints": [239], "characters": "\u00EF" }, + "ĵ": { "codepoints": [309], "characters": "\u0135" }, + "й": { "codepoints": [1081], "characters": "\u0439" }, + "𝔧": { "codepoints": [120103], "characters": "\uD835\uDD27" }, + "ȷ": { "codepoints": [567], "characters": "\u0237" }, + "𝕛": { "codepoints": [120155], "characters": "\uD835\uDD5B" }, + "𝒿": { "codepoints": [119999], "characters": "\uD835\uDCBF" }, + "ј": { "codepoints": [1112], "characters": "\u0458" }, + "є": { "codepoints": [1108], "characters": "\u0454" }, + "κ": { "codepoints": [954], "characters": "\u03BA" }, + "ϰ": { "codepoints": [1008], "characters": "\u03F0" }, + "ķ": { "codepoints": [311], "characters": "\u0137" }, + "к": { "codepoints": [1082], "characters": "\u043A" }, + "𝔨": { "codepoints": [120104], "characters": "\uD835\uDD28" }, + "ĸ": { "codepoints": [312], "characters": "\u0138" }, + "х": { "codepoints": [1093], "characters": "\u0445" }, + "ќ": { "codepoints": [1116], "characters": "\u045C" }, + "𝕜": { "codepoints": [120156], "characters": "\uD835\uDD5C" }, + "𝓀": { "codepoints": [120000], "characters": "\uD835\uDCC0" }, + "⇚": { "codepoints": [8666], "characters": "\u21DA" }, + "⇐": { "codepoints": [8656], "characters": "\u21D0" }, + "⤛": { "codepoints": [10523], "characters": "\u291B" }, + "⤎": { "codepoints": [10510], "characters": "\u290E" }, + "≦": { "codepoints": [8806], "characters": "\u2266" }, + "⪋": { "codepoints": [10891], "characters": "\u2A8B" }, + "⥢": { "codepoints": [10594], "characters": "\u2962" }, + "ĺ": { "codepoints": [314], "characters": "\u013A" }, + "⦴": { "codepoints": [10676], "characters": "\u29B4" }, + "ℒ": { "codepoints": [8466], "characters": "\u2112" }, + "λ": { "codepoints": [955], "characters": "\u03BB" }, + "⟨": { "codepoints": [10216], "characters": "\u27E8" }, + "⦑": { "codepoints": [10641], "characters": "\u2991" }, + "⟨": { "codepoints": [10216], "characters": "\u27E8" }, + "⪅": { "codepoints": [10885], "characters": "\u2A85" }, + "«": { "codepoints": [171], "characters": "\u00AB" }, + "«": { "codepoints": [171], "characters": "\u00AB" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "⇤": { "codepoints": [8676], "characters": "\u21E4" }, + "⤟": { "codepoints": [10527], "characters": "\u291F" }, + "⤝": { "codepoints": [10525], "characters": "\u291D" }, + "↩": { "codepoints": [8617], "characters": "\u21A9" }, + "↫": { "codepoints": [8619], "characters": "\u21AB" }, + "⤹": { "codepoints": [10553], "characters": "\u2939" }, + "⥳": { "codepoints": [10611], "characters": "\u2973" }, + "↢": { "codepoints": [8610], "characters": "\u21A2" }, + "⪫": { "codepoints": [10923], "characters": "\u2AAB" }, + "⤙": { "codepoints": [10521], "characters": "\u2919" }, + "⪭": { "codepoints": [10925], "characters": "\u2AAD" }, + "⪭︀": { "codepoints": [10925, 65024], "characters": "\u2AAD\uFE00" }, + "⤌": { "codepoints": [10508], "characters": "\u290C" }, + "❲": { "codepoints": [10098], "characters": "\u2772" }, + "{": { "codepoints": [123], "characters": "\u007B" }, + "[": { "codepoints": [91], "characters": "\u005B" }, + "⦋": { "codepoints": [10635], "characters": "\u298B" }, + "⦏": { "codepoints": [10639], "characters": "\u298F" }, + "⦍": { "codepoints": [10637], "characters": "\u298D" }, + "ľ": { "codepoints": [318], "characters": "\u013E" }, + "ļ": { "codepoints": [316], "characters": "\u013C" }, + "⌈": { "codepoints": [8968], "characters": "\u2308" }, + "{": { "codepoints": [123], "characters": "\u007B" }, + "л": { "codepoints": [1083], "characters": "\u043B" }, + "⤶": { "codepoints": [10550], "characters": "\u2936" }, + "“": { "codepoints": [8220], "characters": "\u201C" }, + "„": { "codepoints": [8222], "characters": "\u201E" }, + "⥧": { "codepoints": [10599], "characters": "\u2967" }, + "⥋": { "codepoints": [10571], "characters": "\u294B" }, + "↲": { "codepoints": [8626], "characters": "\u21B2" }, + "≤": { "codepoints": [8804], "characters": "\u2264" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "↢": { "codepoints": [8610], "characters": "\u21A2" }, + "↽": { "codepoints": [8637], "characters": "\u21BD" }, + "↼": { "codepoints": [8636], "characters": "\u21BC" }, + "⇇": { "codepoints": [8647], "characters": "\u21C7" }, + "↔": { "codepoints": [8596], "characters": "\u2194" }, + "⇆": { "codepoints": [8646], "characters": "\u21C6" }, + "⇋": { "codepoints": [8651], "characters": "\u21CB" }, + "↭": { "codepoints": [8621], "characters": "\u21AD" }, + "⋋": { "codepoints": [8907], "characters": "\u22CB" }, + "⋚": { "codepoints": [8922], "characters": "\u22DA" }, + "≤": { "codepoints": [8804], "characters": "\u2264" }, + "≦": { "codepoints": [8806], "characters": "\u2266" }, + "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, + "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, + "⪨": { "codepoints": [10920], "characters": "\u2AA8" }, + "⩿": { "codepoints": [10879], "characters": "\u2A7F" }, + "⪁": { "codepoints": [10881], "characters": "\u2A81" }, + "⪃": { "codepoints": [10883], "characters": "\u2A83" }, + "⋚︀": { "codepoints": [8922, 65024], "characters": "\u22DA\uFE00" }, + "⪓": { "codepoints": [10899], "characters": "\u2A93" }, + "⪅": { "codepoints": [10885], "characters": "\u2A85" }, + "⋖": { "codepoints": [8918], "characters": "\u22D6" }, + "⋚": { "codepoints": [8922], "characters": "\u22DA" }, + "⪋": { "codepoints": [10891], "characters": "\u2A8B" }, + "≶": { "codepoints": [8822], "characters": "\u2276" }, + "≲": { "codepoints": [8818], "characters": "\u2272" }, + "⥼": { "codepoints": [10620], "characters": "\u297C" }, + "⌊": { "codepoints": [8970], "characters": "\u230A" }, + "𝔩": { "codepoints": [120105], "characters": "\uD835\uDD29" }, + "≶": { "codepoints": [8822], "characters": "\u2276" }, + "⪑": { "codepoints": [10897], "characters": "\u2A91" }, + "↽": { "codepoints": [8637], "characters": "\u21BD" }, + "↼": { "codepoints": [8636], "characters": "\u21BC" }, + "⥪": { "codepoints": [10602], "characters": "\u296A" }, + "▄": { "codepoints": [9604], "characters": "\u2584" }, + "љ": { "codepoints": [1113], "characters": "\u0459" }, + "≪": { "codepoints": [8810], "characters": "\u226A" }, + "⇇": { "codepoints": [8647], "characters": "\u21C7" }, + "⌞": { "codepoints": [8990], "characters": "\u231E" }, + "⥫": { "codepoints": [10603], "characters": "\u296B" }, + "◺": { "codepoints": [9722], "characters": "\u25FA" }, + "ŀ": { "codepoints": [320], "characters": "\u0140" }, + "⎰": { "codepoints": [9136], "characters": "\u23B0" }, + "⎰": { "codepoints": [9136], "characters": "\u23B0" }, + "≨": { "codepoints": [8808], "characters": "\u2268" }, + "⪉": { "codepoints": [10889], "characters": "\u2A89" }, + "⪉": { "codepoints": [10889], "characters": "\u2A89" }, + "⪇": { "codepoints": [10887], "characters": "\u2A87" }, + "⪇": { "codepoints": [10887], "characters": "\u2A87" }, + "≨": { "codepoints": [8808], "characters": "\u2268" }, + "⋦": { "codepoints": [8934], "characters": "\u22E6" }, + "⟬": { "codepoints": [10220], "characters": "\u27EC" }, + "⇽": { "codepoints": [8701], "characters": "\u21FD" }, + "⟦": { "codepoints": [10214], "characters": "\u27E6" }, + "⟵": { "codepoints": [10229], "characters": "\u27F5" }, + "⟷": { "codepoints": [10231], "characters": "\u27F7" }, + "⟼": { "codepoints": [10236], "characters": "\u27FC" }, + "⟶": { "codepoints": [10230], "characters": "\u27F6" }, + "↫": { "codepoints": [8619], "characters": "\u21AB" }, + "↬": { "codepoints": [8620], "characters": "\u21AC" }, + "⦅": { "codepoints": [10629], "characters": "\u2985" }, + "𝕝": { "codepoints": [120157], "characters": "\uD835\uDD5D" }, + "⨭": { "codepoints": [10797], "characters": "\u2A2D" }, + "⨴": { "codepoints": [10804], "characters": "\u2A34" }, + "∗": { "codepoints": [8727], "characters": "\u2217" }, + "_": { "codepoints": [95], "characters": "\u005F" }, + "◊": { "codepoints": [9674], "characters": "\u25CA" }, + "◊": { "codepoints": [9674], "characters": "\u25CA" }, + "⧫": { "codepoints": [10731], "characters": "\u29EB" }, + "(": { "codepoints": [40], "characters": "\u0028" }, + "⦓": { "codepoints": [10643], "characters": "\u2993" }, + "⇆": { "codepoints": [8646], "characters": "\u21C6" }, + "⌟": { "codepoints": [8991], "characters": "\u231F" }, + "⇋": { "codepoints": [8651], "characters": "\u21CB" }, + "⥭": { "codepoints": [10605], "characters": "\u296D" }, + "‎": { "codepoints": [8206], "characters": "\u200E" }, + "⊿": { "codepoints": [8895], "characters": "\u22BF" }, + "‹": { "codepoints": [8249], "characters": "\u2039" }, + "𝓁": { "codepoints": [120001], "characters": "\uD835\uDCC1" }, + "↰": { "codepoints": [8624], "characters": "\u21B0" }, + "≲": { "codepoints": [8818], "characters": "\u2272" }, + "⪍": { "codepoints": [10893], "characters": "\u2A8D" }, + "⪏": { "codepoints": [10895], "characters": "\u2A8F" }, + "[": { "codepoints": [91], "characters": "\u005B" }, + "‘": { "codepoints": [8216], "characters": "\u2018" }, + "‚": { "codepoints": [8218], "characters": "\u201A" }, + "ł": { "codepoints": [322], "characters": "\u0142" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "⪦": { "codepoints": [10918], "characters": "\u2AA6" }, + "⩹": { "codepoints": [10873], "characters": "\u2A79" }, + "⋖": { "codepoints": [8918], "characters": "\u22D6" }, + "⋋": { "codepoints": [8907], "characters": "\u22CB" }, + "⋉": { "codepoints": [8905], "characters": "\u22C9" }, + "⥶": { "codepoints": [10614], "characters": "\u2976" }, + "⩻": { "codepoints": [10875], "characters": "\u2A7B" }, + "⦖": { "codepoints": [10646], "characters": "\u2996" }, + "◃": { "codepoints": [9667], "characters": "\u25C3" }, + "⊴": { "codepoints": [8884], "characters": "\u22B4" }, + "◂": { "codepoints": [9666], "characters": "\u25C2" }, + "⥊": { "codepoints": [10570], "characters": "\u294A" }, + "⥦": { "codepoints": [10598], "characters": "\u2966" }, + "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" }, + "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" }, + "∺": { "codepoints": [8762], "characters": "\u223A" }, + "¯": { "codepoints": [175], "characters": "\u00AF" }, + "¯": { "codepoints": [175], "characters": "\u00AF" }, + "♂": { "codepoints": [9794], "characters": "\u2642" }, + "✠": { "codepoints": [10016], "characters": "\u2720" }, + "✠": { "codepoints": [10016], "characters": "\u2720" }, + "↦": { "codepoints": [8614], "characters": "\u21A6" }, + "↦": { "codepoints": [8614], "characters": "\u21A6" }, + "↧": { "codepoints": [8615], "characters": "\u21A7" }, + "↤": { "codepoints": [8612], "characters": "\u21A4" }, + "↥": { "codepoints": [8613], "characters": "\u21A5" }, + "▮": { "codepoints": [9646], "characters": "\u25AE" }, + "⨩": { "codepoints": [10793], "characters": "\u2A29" }, + "м": { "codepoints": [1084], "characters": "\u043C" }, + "—": { "codepoints": [8212], "characters": "\u2014" }, + "∡": { "codepoints": [8737], "characters": "\u2221" }, + "𝔪": { "codepoints": [120106], "characters": "\uD835\uDD2A" }, + "℧": { "codepoints": [8487], "characters": "\u2127" }, + "µ": { "codepoints": [181], "characters": "\u00B5" }, + "µ": { "codepoints": [181], "characters": "\u00B5" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "*": { "codepoints": [42], "characters": "\u002A" }, + "⫰": { "codepoints": [10992], "characters": "\u2AF0" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "−": { "codepoints": [8722], "characters": "\u2212" }, + "⊟": { "codepoints": [8863], "characters": "\u229F" }, + "∸": { "codepoints": [8760], "characters": "\u2238" }, + "⨪": { "codepoints": [10794], "characters": "\u2A2A" }, + "⫛": { "codepoints": [10971], "characters": "\u2ADB" }, + "…": { "codepoints": [8230], "characters": "\u2026" }, + "∓": { "codepoints": [8723], "characters": "\u2213" }, + "⊧": { "codepoints": [8871], "characters": "\u22A7" }, + "𝕞": { "codepoints": [120158], "characters": "\uD835\uDD5E" }, + "∓": { "codepoints": [8723], "characters": "\u2213" }, + "𝓂": { "codepoints": [120002], "characters": "\uD835\uDCC2" }, + "∾": { "codepoints": [8766], "characters": "\u223E" }, + "μ": { "codepoints": [956], "characters": "\u03BC" }, + "⊸": { "codepoints": [8888], "characters": "\u22B8" }, + "⊸": { "codepoints": [8888], "characters": "\u22B8" }, + "⋙̸": { "codepoints": [8921, 824], "characters": "\u22D9\u0338" }, + "≫⃒": { "codepoints": [8811, 8402], "characters": "\u226B\u20D2" }, + "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" }, + "⇍": { "codepoints": [8653], "characters": "\u21CD" }, + "⇎": { "codepoints": [8654], "characters": "\u21CE" }, + "⋘̸": { "codepoints": [8920, 824], "characters": "\u22D8\u0338" }, + "≪⃒": { "codepoints": [8810, 8402], "characters": "\u226A\u20D2" }, + "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" }, + "⇏": { "codepoints": [8655], "characters": "\u21CF" }, + "⊯": { "codepoints": [8879], "characters": "\u22AF" }, + "⊮": { "codepoints": [8878], "characters": "\u22AE" }, + "∇": { "codepoints": [8711], "characters": "\u2207" }, + "ń": { "codepoints": [324], "characters": "\u0144" }, + "∠⃒": { "codepoints": [8736, 8402], "characters": "\u2220\u20D2" }, + "≉": { "codepoints": [8777], "characters": "\u2249" }, + "⩰̸": { "codepoints": [10864, 824], "characters": "\u2A70\u0338" }, + "≋̸": { "codepoints": [8779, 824], "characters": "\u224B\u0338" }, + "ʼn": { "codepoints": [329], "characters": "\u0149" }, + "≉": { "codepoints": [8777], "characters": "\u2249" }, + "♮": { "codepoints": [9838], "characters": "\u266E" }, + "♮": { "codepoints": [9838], "characters": "\u266E" }, + "ℕ": { "codepoints": [8469], "characters": "\u2115" }, + " ": { "codepoints": [160], "characters": "\u00A0" }, + " ": { "codepoints": [160], "characters": "\u00A0" }, + "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" }, + "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" }, + "⩃": { "codepoints": [10819], "characters": "\u2A43" }, + "ň": { "codepoints": [328], "characters": "\u0148" }, + "ņ": { "codepoints": [326], "characters": "\u0146" }, + "≇": { "codepoints": [8775], "characters": "\u2247" }, + "⩭̸": { "codepoints": [10861, 824], "characters": "\u2A6D\u0338" }, + "⩂": { "codepoints": [10818], "characters": "\u2A42" }, + "н": { "codepoints": [1085], "characters": "\u043D" }, + "–": { "codepoints": [8211], "characters": "\u2013" }, + "≠": { "codepoints": [8800], "characters": "\u2260" }, + "⇗": { "codepoints": [8663], "characters": "\u21D7" }, + "⤤": { "codepoints": [10532], "characters": "\u2924" }, + "↗": { "codepoints": [8599], "characters": "\u2197" }, + "↗": { "codepoints": [8599], "characters": "\u2197" }, + "≐̸": { "codepoints": [8784, 824], "characters": "\u2250\u0338" }, + "≢": { "codepoints": [8802], "characters": "\u2262" }, + "⤨": { "codepoints": [10536], "characters": "\u2928" }, + "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" }, + "∄": { "codepoints": [8708], "characters": "\u2204" }, + "∄": { "codepoints": [8708], "characters": "\u2204" }, + "𝔫": { "codepoints": [120107], "characters": "\uD835\uDD2B" }, + "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, + "≱": { "codepoints": [8817], "characters": "\u2271" }, + "≱": { "codepoints": [8817], "characters": "\u2271" }, + "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, + "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, + "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, + "≵": { "codepoints": [8821], "characters": "\u2275" }, + "≯": { "codepoints": [8815], "characters": "\u226F" }, + "≯": { "codepoints": [8815], "characters": "\u226F" }, + "⇎": { "codepoints": [8654], "characters": "\u21CE" }, + "↮": { "codepoints": [8622], "characters": "\u21AE" }, + "⫲": { "codepoints": [10994], "characters": "\u2AF2" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "⋼": { "codepoints": [8956], "characters": "\u22FC" }, + "⋺": { "codepoints": [8954], "characters": "\u22FA" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "њ": { "codepoints": [1114], "characters": "\u045A" }, + "⇍": { "codepoints": [8653], "characters": "\u21CD" }, + "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" }, + "↚": { "codepoints": [8602], "characters": "\u219A" }, + "‥": { "codepoints": [8229], "characters": "\u2025" }, + "≰": { "codepoints": [8816], "characters": "\u2270" }, + "↚": { "codepoints": [8602], "characters": "\u219A" }, + "↮": { "codepoints": [8622], "characters": "\u21AE" }, + "≰": { "codepoints": [8816], "characters": "\u2270" }, + "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" }, + "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, + "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, + "≮": { "codepoints": [8814], "characters": "\u226E" }, + "≴": { "codepoints": [8820], "characters": "\u2274" }, + "≮": { "codepoints": [8814], "characters": "\u226E" }, + "⋪": { "codepoints": [8938], "characters": "\u22EA" }, + "⋬": { "codepoints": [8940], "characters": "\u22EC" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "𝕟": { "codepoints": [120159], "characters": "\uD835\uDD5F" }, + "¬": { "codepoints": [172], "characters": "\u00AC" }, + "¬": { "codepoints": [172], "characters": "\u00AC" }, + "∉": { "codepoints": [8713], "characters": "\u2209" }, + "⋹̸": { "codepoints": [8953, 824], "characters": "\u22F9\u0338" }, + "⋵̸": { "codepoints": [8949, 824], "characters": "\u22F5\u0338" }, + "∉": { "codepoints": [8713], "characters": "\u2209" }, + "⋷": { "codepoints": [8951], "characters": "\u22F7" }, + "⋶": { "codepoints": [8950], "characters": "\u22F6" }, + "∌": { "codepoints": [8716], "characters": "\u220C" }, + "∌": { "codepoints": [8716], "characters": "\u220C" }, + "⋾": { "codepoints": [8958], "characters": "\u22FE" }, + "⋽": { "codepoints": [8957], "characters": "\u22FD" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "⫽⃥": { "codepoints": [11005, 8421], "characters": "\u2AFD\u20E5" }, + "∂̸": { "codepoints": [8706, 824], "characters": "\u2202\u0338" }, + "⨔": { "codepoints": [10772], "characters": "\u2A14" }, + "⊀": { "codepoints": [8832], "characters": "\u2280" }, + "⋠": { "codepoints": [8928], "characters": "\u22E0" }, + "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, + "⊀": { "codepoints": [8832], "characters": "\u2280" }, + "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, + "⇏": { "codepoints": [8655], "characters": "\u21CF" }, + "↛": { "codepoints": [8603], "characters": "\u219B" }, + "⤳̸": { "codepoints": [10547, 824], "characters": "\u2933\u0338" }, + "↝̸": { "codepoints": [8605, 824], "characters": "\u219D\u0338" }, + "↛": { "codepoints": [8603], "characters": "\u219B" }, + "⋫": { "codepoints": [8939], "characters": "\u22EB" }, + "⋭": { "codepoints": [8941], "characters": "\u22ED" }, + "⊁": { "codepoints": [8833], "characters": "\u2281" }, + "⋡": { "codepoints": [8929], "characters": "\u22E1" }, + "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, + "𝓃": { "codepoints": [120003], "characters": "\uD835\uDCC3" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "≁": { "codepoints": [8769], "characters": "\u2241" }, + "≄": { "codepoints": [8772], "characters": "\u2244" }, + "≄": { "codepoints": [8772], "characters": "\u2244" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "⋢": { "codepoints": [8930], "characters": "\u22E2" }, + "⋣": { "codepoints": [8931], "characters": "\u22E3" }, + "⊄": { "codepoints": [8836], "characters": "\u2284" }, + "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" }, + "⊈": { "codepoints": [8840], "characters": "\u2288" }, + "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, + "⊈": { "codepoints": [8840], "characters": "\u2288" }, + "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" }, + "⊁": { "codepoints": [8833], "characters": "\u2281" }, + "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, + "⊅": { "codepoints": [8837], "characters": "\u2285" }, + "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" }, + "⊉": { "codepoints": [8841], "characters": "\u2289" }, + "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, + "⊉": { "codepoints": [8841], "characters": "\u2289" }, + "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" }, + "≹": { "codepoints": [8825], "characters": "\u2279" }, + "ñ": { "codepoints": [241], "characters": "\u00F1" }, + "ñ": { "codepoints": [241], "characters": "\u00F1" }, + "≸": { "codepoints": [8824], "characters": "\u2278" }, + "⋪": { "codepoints": [8938], "characters": "\u22EA" }, + "⋬": { "codepoints": [8940], "characters": "\u22EC" }, + "⋫": { "codepoints": [8939], "characters": "\u22EB" }, + "⋭": { "codepoints": [8941], "characters": "\u22ED" }, + "ν": { "codepoints": [957], "characters": "\u03BD" }, + "#": { "codepoints": [35], "characters": "\u0023" }, + "№": { "codepoints": [8470], "characters": "\u2116" }, + " ": { "codepoints": [8199], "characters": "\u2007" }, + "⊭": { "codepoints": [8877], "characters": "\u22AD" }, + "⤄": { "codepoints": [10500], "characters": "\u2904" }, + "≍⃒": { "codepoints": [8781, 8402], "characters": "\u224D\u20D2" }, + "⊬": { "codepoints": [8876], "characters": "\u22AC" }, + "≥⃒": { "codepoints": [8805, 8402], "characters": "\u2265\u20D2" }, + ">⃒": { "codepoints": [62, 8402], "characters": "\u003E\u20D2" }, + "⧞": { "codepoints": [10718], "characters": "\u29DE" }, + "⤂": { "codepoints": [10498], "characters": "\u2902" }, + "≤⃒": { "codepoints": [8804, 8402], "characters": "\u2264\u20D2" }, + "<⃒": { "codepoints": [60, 8402], "characters": "\u003C\u20D2" }, + "⊴⃒": { "codepoints": [8884, 8402], "characters": "\u22B4\u20D2" }, + "⤃": { "codepoints": [10499], "characters": "\u2903" }, + "⊵⃒": { "codepoints": [8885, 8402], "characters": "\u22B5\u20D2" }, + "∼⃒": { "codepoints": [8764, 8402], "characters": "\u223C\u20D2" }, + "⇖": { "codepoints": [8662], "characters": "\u21D6" }, + "⤣": { "codepoints": [10531], "characters": "\u2923" }, + "↖": { "codepoints": [8598], "characters": "\u2196" }, + "↖": { "codepoints": [8598], "characters": "\u2196" }, + "⤧": { "codepoints": [10535], "characters": "\u2927" }, + "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" }, + "ó": { "codepoints": [243], "characters": "\u00F3" }, + "ó": { "codepoints": [243], "characters": "\u00F3" }, + "⊛": { "codepoints": [8859], "characters": "\u229B" }, + "⊚": { "codepoints": [8858], "characters": "\u229A" }, + "ô": { "codepoints": [244], "characters": "\u00F4" }, + "ô": { "codepoints": [244], "characters": "\u00F4" }, + "о": { "codepoints": [1086], "characters": "\u043E" }, + "⊝": { "codepoints": [8861], "characters": "\u229D" }, + "ő": { "codepoints": [337], "characters": "\u0151" }, + "⨸": { "codepoints": [10808], "characters": "\u2A38" }, + "⊙": { "codepoints": [8857], "characters": "\u2299" }, + "⦼": { "codepoints": [10684], "characters": "\u29BC" }, + "œ": { "codepoints": [339], "characters": "\u0153" }, + "⦿": { "codepoints": [10687], "characters": "\u29BF" }, + "𝔬": { "codepoints": [120108], "characters": "\uD835\uDD2C" }, + "˛": { "codepoints": [731], "characters": "\u02DB" }, + "ò": { "codepoints": [242], "characters": "\u00F2" }, + "ò": { "codepoints": [242], "characters": "\u00F2" }, + "⧁": { "codepoints": [10689], "characters": "\u29C1" }, + "⦵": { "codepoints": [10677], "characters": "\u29B5" }, + "Ω": { "codepoints": [937], "characters": "\u03A9" }, + "∮": { "codepoints": [8750], "characters": "\u222E" }, + "↺": { "codepoints": [8634], "characters": "\u21BA" }, + "⦾": { "codepoints": [10686], "characters": "\u29BE" }, + "⦻": { "codepoints": [10683], "characters": "\u29BB" }, + "‾": { "codepoints": [8254], "characters": "\u203E" }, + "⧀": { "codepoints": [10688], "characters": "\u29C0" }, + "ō": { "codepoints": [333], "characters": "\u014D" }, + "ω": { "codepoints": [969], "characters": "\u03C9" }, + "ο": { "codepoints": [959], "characters": "\u03BF" }, + "⦶": { "codepoints": [10678], "characters": "\u29B6" }, + "⊖": { "codepoints": [8854], "characters": "\u2296" }, + "𝕠": { "codepoints": [120160], "characters": "\uD835\uDD60" }, + "⦷": { "codepoints": [10679], "characters": "\u29B7" }, + "⦹": { "codepoints": [10681], "characters": "\u29B9" }, + "⊕": { "codepoints": [8853], "characters": "\u2295" }, + "∨": { "codepoints": [8744], "characters": "\u2228" }, + "↻": { "codepoints": [8635], "characters": "\u21BB" }, + "⩝": { "codepoints": [10845], "characters": "\u2A5D" }, + "ℴ": { "codepoints": [8500], "characters": "\u2134" }, + "ℴ": { "codepoints": [8500], "characters": "\u2134" }, + "ª": { "codepoints": [170], "characters": "\u00AA" }, + "ª": { "codepoints": [170], "characters": "\u00AA" }, + "º": { "codepoints": [186], "characters": "\u00BA" }, + "º": { "codepoints": [186], "characters": "\u00BA" }, + "⊶": { "codepoints": [8886], "characters": "\u22B6" }, + "⩖": { "codepoints": [10838], "characters": "\u2A56" }, + "⩗": { "codepoints": [10839], "characters": "\u2A57" }, + "⩛": { "codepoints": [10843], "characters": "\u2A5B" }, + "ℴ": { "codepoints": [8500], "characters": "\u2134" }, + "ø": { "codepoints": [248], "characters": "\u00F8" }, + "ø": { "codepoints": [248], "characters": "\u00F8" }, + "⊘": { "codepoints": [8856], "characters": "\u2298" }, + "õ": { "codepoints": [245], "characters": "\u00F5" }, + "õ": { "codepoints": [245], "characters": "\u00F5" }, + "⊗": { "codepoints": [8855], "characters": "\u2297" }, + "⨶": { "codepoints": [10806], "characters": "\u2A36" }, + "ö": { "codepoints": [246], "characters": "\u00F6" }, + "ö": { "codepoints": [246], "characters": "\u00F6" }, + "⌽": { "codepoints": [9021], "characters": "\u233D" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "¶": { "codepoints": [182], "characters": "\u00B6" }, + "¶": { "codepoints": [182], "characters": "\u00B6" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "⫳": { "codepoints": [10995], "characters": "\u2AF3" }, + "⫽": { "codepoints": [11005], "characters": "\u2AFD" }, + "∂": { "codepoints": [8706], "characters": "\u2202" }, + "п": { "codepoints": [1087], "characters": "\u043F" }, + "%": { "codepoints": [37], "characters": "\u0025" }, + ".": { "codepoints": [46], "characters": "\u002E" }, + "‰": { "codepoints": [8240], "characters": "\u2030" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "‱": { "codepoints": [8241], "characters": "\u2031" }, + "𝔭": { "codepoints": [120109], "characters": "\uD835\uDD2D" }, + "φ": { "codepoints": [966], "characters": "\u03C6" }, + "ϕ": { "codepoints": [981], "characters": "\u03D5" }, + "ℳ": { "codepoints": [8499], "characters": "\u2133" }, + "☎": { "codepoints": [9742], "characters": "\u260E" }, + "π": { "codepoints": [960], "characters": "\u03C0" }, + "⋔": { "codepoints": [8916], "characters": "\u22D4" }, + "ϖ": { "codepoints": [982], "characters": "\u03D6" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "ℎ": { "codepoints": [8462], "characters": "\u210E" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "+": { "codepoints": [43], "characters": "\u002B" }, + "⨣": { "codepoints": [10787], "characters": "\u2A23" }, + "⊞": { "codepoints": [8862], "characters": "\u229E" }, + "⨢": { "codepoints": [10786], "characters": "\u2A22" }, + "∔": { "codepoints": [8724], "characters": "\u2214" }, + "⨥": { "codepoints": [10789], "characters": "\u2A25" }, + "⩲": { "codepoints": [10866], "characters": "\u2A72" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "⨦": { "codepoints": [10790], "characters": "\u2A26" }, + "⨧": { "codepoints": [10791], "characters": "\u2A27" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "⨕": { "codepoints": [10773], "characters": "\u2A15" }, + "𝕡": { "codepoints": [120161], "characters": "\uD835\uDD61" }, + "£": { "codepoints": [163], "characters": "\u00A3" }, + "£": { "codepoints": [163], "characters": "\u00A3" }, + "≺": { "codepoints": [8826], "characters": "\u227A" }, + "⪳": { "codepoints": [10931], "characters": "\u2AB3" }, + "⪷": { "codepoints": [10935], "characters": "\u2AB7" }, + "≼": { "codepoints": [8828], "characters": "\u227C" }, + "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, + "≺": { "codepoints": [8826], "characters": "\u227A" }, + "⪷": { "codepoints": [10935], "characters": "\u2AB7" }, + "≼": { "codepoints": [8828], "characters": "\u227C" }, + "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, + "⪹": { "codepoints": [10937], "characters": "\u2AB9" }, + "⪵": { "codepoints": [10933], "characters": "\u2AB5" }, + "⋨": { "codepoints": [8936], "characters": "\u22E8" }, + "≾": { "codepoints": [8830], "characters": "\u227E" }, + "′": { "codepoints": [8242], "characters": "\u2032" }, + "ℙ": { "codepoints": [8473], "characters": "\u2119" }, + "⪵": { "codepoints": [10933], "characters": "\u2AB5" }, + "⪹": { "codepoints": [10937], "characters": "\u2AB9" }, + "⋨": { "codepoints": [8936], "characters": "\u22E8" }, + "∏": { "codepoints": [8719], "characters": "\u220F" }, + "⌮": { "codepoints": [9006], "characters": "\u232E" }, + "⌒": { "codepoints": [8978], "characters": "\u2312" }, + "⌓": { "codepoints": [8979], "characters": "\u2313" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "≾": { "codepoints": [8830], "characters": "\u227E" }, + "⊰": { "codepoints": [8880], "characters": "\u22B0" }, + "𝓅": { "codepoints": [120005], "characters": "\uD835\uDCC5" }, + "ψ": { "codepoints": [968], "characters": "\u03C8" }, + " ": { "codepoints": [8200], "characters": "\u2008" }, + "𝔮": { "codepoints": [120110], "characters": "\uD835\uDD2E" }, + "⨌": { "codepoints": [10764], "characters": "\u2A0C" }, + "𝕢": { "codepoints": [120162], "characters": "\uD835\uDD62" }, + "⁗": { "codepoints": [8279], "characters": "\u2057" }, + "𝓆": { "codepoints": [120006], "characters": "\uD835\uDCC6" }, + "ℍ": { "codepoints": [8461], "characters": "\u210D" }, + "⨖": { "codepoints": [10774], "characters": "\u2A16" }, + "?": { "codepoints": [63], "characters": "\u003F" }, + "≟": { "codepoints": [8799], "characters": "\u225F" }, + """: { "codepoints": [34], "characters": "\u0022" }, + """: { "codepoints": [34], "characters": "\u0022" }, + "⇛": { "codepoints": [8667], "characters": "\u21DB" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "⤜": { "codepoints": [10524], "characters": "\u291C" }, + "⤏": { "codepoints": [10511], "characters": "\u290F" }, + "⥤": { "codepoints": [10596], "characters": "\u2964" }, + "∽̱": { "codepoints": [8765, 817], "characters": "\u223D\u0331" }, + "ŕ": { "codepoints": [341], "characters": "\u0155" }, + "√": { "codepoints": [8730], "characters": "\u221A" }, + "⦳": { "codepoints": [10675], "characters": "\u29B3" }, + "⟩": { "codepoints": [10217], "characters": "\u27E9" }, + "⦒": { "codepoints": [10642], "characters": "\u2992" }, + "⦥": { "codepoints": [10661], "characters": "\u29A5" }, + "⟩": { "codepoints": [10217], "characters": "\u27E9" }, + "»": { "codepoints": [187], "characters": "\u00BB" }, + "»": { "codepoints": [187], "characters": "\u00BB" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "⥵": { "codepoints": [10613], "characters": "\u2975" }, + "⇥": { "codepoints": [8677], "characters": "\u21E5" }, + "⤠": { "codepoints": [10528], "characters": "\u2920" }, + "⤳": { "codepoints": [10547], "characters": "\u2933" }, + "⤞": { "codepoints": [10526], "characters": "\u291E" }, + "↪": { "codepoints": [8618], "characters": "\u21AA" }, + "↬": { "codepoints": [8620], "characters": "\u21AC" }, + "⥅": { "codepoints": [10565], "characters": "\u2945" }, + "⥴": { "codepoints": [10612], "characters": "\u2974" }, + "↣": { "codepoints": [8611], "characters": "\u21A3" }, + "↝": { "codepoints": [8605], "characters": "\u219D" }, + "⤚": { "codepoints": [10522], "characters": "\u291A" }, + "∶": { "codepoints": [8758], "characters": "\u2236" }, + "ℚ": { "codepoints": [8474], "characters": "\u211A" }, + "⤍": { "codepoints": [10509], "characters": "\u290D" }, + "❳": { "codepoints": [10099], "characters": "\u2773" }, + "}": { "codepoints": [125], "characters": "\u007D" }, + "]": { "codepoints": [93], "characters": "\u005D" }, + "⦌": { "codepoints": [10636], "characters": "\u298C" }, + "⦎": { "codepoints": [10638], "characters": "\u298E" }, + "⦐": { "codepoints": [10640], "characters": "\u2990" }, + "ř": { "codepoints": [345], "characters": "\u0159" }, + "ŗ": { "codepoints": [343], "characters": "\u0157" }, + "⌉": { "codepoints": [8969], "characters": "\u2309" }, + "}": { "codepoints": [125], "characters": "\u007D" }, + "р": { "codepoints": [1088], "characters": "\u0440" }, + "⤷": { "codepoints": [10551], "characters": "\u2937" }, + "⥩": { "codepoints": [10601], "characters": "\u2969" }, + "”": { "codepoints": [8221], "characters": "\u201D" }, + "”": { "codepoints": [8221], "characters": "\u201D" }, + "↳": { "codepoints": [8627], "characters": "\u21B3" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "ℛ": { "codepoints": [8475], "characters": "\u211B" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "ℝ": { "codepoints": [8477], "characters": "\u211D" }, + "▭": { "codepoints": [9645], "characters": "\u25AD" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "⥽": { "codepoints": [10621], "characters": "\u297D" }, + "⌋": { "codepoints": [8971], "characters": "\u230B" }, + "𝔯": { "codepoints": [120111], "characters": "\uD835\uDD2F" }, + "⇁": { "codepoints": [8641], "characters": "\u21C1" }, + "⇀": { "codepoints": [8640], "characters": "\u21C0" }, + "⥬": { "codepoints": [10604], "characters": "\u296C" }, + "ρ": { "codepoints": [961], "characters": "\u03C1" }, + "ϱ": { "codepoints": [1009], "characters": "\u03F1" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "↣": { "codepoints": [8611], "characters": "\u21A3" }, + "⇁": { "codepoints": [8641], "characters": "\u21C1" }, + "⇀": { "codepoints": [8640], "characters": "\u21C0" }, + "⇄": { "codepoints": [8644], "characters": "\u21C4" }, + "⇌": { "codepoints": [8652], "characters": "\u21CC" }, + "⇉": { "codepoints": [8649], "characters": "\u21C9" }, + "↝": { "codepoints": [8605], "characters": "\u219D" }, + "⋌": { "codepoints": [8908], "characters": "\u22CC" }, + "˚": { "codepoints": [730], "characters": "\u02DA" }, + "≓": { "codepoints": [8787], "characters": "\u2253" }, + "⇄": { "codepoints": [8644], "characters": "\u21C4" }, + "⇌": { "codepoints": [8652], "characters": "\u21CC" }, + "‏": { "codepoints": [8207], "characters": "\u200F" }, + "⎱": { "codepoints": [9137], "characters": "\u23B1" }, + "⎱": { "codepoints": [9137], "characters": "\u23B1" }, + "⫮": { "codepoints": [10990], "characters": "\u2AEE" }, + "⟭": { "codepoints": [10221], "characters": "\u27ED" }, + "⇾": { "codepoints": [8702], "characters": "\u21FE" }, + "⟧": { "codepoints": [10215], "characters": "\u27E7" }, + "⦆": { "codepoints": [10630], "characters": "\u2986" }, + "𝕣": { "codepoints": [120163], "characters": "\uD835\uDD63" }, + "⨮": { "codepoints": [10798], "characters": "\u2A2E" }, + "⨵": { "codepoints": [10805], "characters": "\u2A35" }, + ")": { "codepoints": [41], "characters": "\u0029" }, + "⦔": { "codepoints": [10644], "characters": "\u2994" }, + "⨒": { "codepoints": [10770], "characters": "\u2A12" }, + "⇉": { "codepoints": [8649], "characters": "\u21C9" }, + "›": { "codepoints": [8250], "characters": "\u203A" }, + "𝓇": { "codepoints": [120007], "characters": "\uD835\uDCC7" }, + "↱": { "codepoints": [8625], "characters": "\u21B1" }, + "]": { "codepoints": [93], "characters": "\u005D" }, + "’": { "codepoints": [8217], "characters": "\u2019" }, + "’": { "codepoints": [8217], "characters": "\u2019" }, + "⋌": { "codepoints": [8908], "characters": "\u22CC" }, + "⋊": { "codepoints": [8906], "characters": "\u22CA" }, + "▹": { "codepoints": [9657], "characters": "\u25B9" }, + "⊵": { "codepoints": [8885], "characters": "\u22B5" }, + "▸": { "codepoints": [9656], "characters": "\u25B8" }, + "⧎": { "codepoints": [10702], "characters": "\u29CE" }, + "⥨": { "codepoints": [10600], "characters": "\u2968" }, + "℞": { "codepoints": [8478], "characters": "\u211E" }, + "ś": { "codepoints": [347], "characters": "\u015B" }, + "‚": { "codepoints": [8218], "characters": "\u201A" }, + "≻": { "codepoints": [8827], "characters": "\u227B" }, + "⪴": { "codepoints": [10932], "characters": "\u2AB4" }, + "⪸": { "codepoints": [10936], "characters": "\u2AB8" }, + "š": { "codepoints": [353], "characters": "\u0161" }, + "≽": { "codepoints": [8829], "characters": "\u227D" }, + "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, + "ş": { "codepoints": [351], "characters": "\u015F" }, + "ŝ": { "codepoints": [349], "characters": "\u015D" }, + "⪶": { "codepoints": [10934], "characters": "\u2AB6" }, + "⪺": { "codepoints": [10938], "characters": "\u2ABA" }, + "⋩": { "codepoints": [8937], "characters": "\u22E9" }, + "⨓": { "codepoints": [10771], "characters": "\u2A13" }, + "≿": { "codepoints": [8831], "characters": "\u227F" }, + "с": { "codepoints": [1089], "characters": "\u0441" }, + "⋅": { "codepoints": [8901], "characters": "\u22C5" }, + "⊡": { "codepoints": [8865], "characters": "\u22A1" }, + "⩦": { "codepoints": [10854], "characters": "\u2A66" }, + "⇘": { "codepoints": [8664], "characters": "\u21D8" }, + "⤥": { "codepoints": [10533], "characters": "\u2925" }, + "↘": { "codepoints": [8600], "characters": "\u2198" }, + "↘": { "codepoints": [8600], "characters": "\u2198" }, + "§": { "codepoints": [167], "characters": "\u00A7" }, + "§": { "codepoints": [167], "characters": "\u00A7" }, + ";": { "codepoints": [59], "characters": "\u003B" }, + "⤩": { "codepoints": [10537], "characters": "\u2929" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "✶": { "codepoints": [10038], "characters": "\u2736" }, + "𝔰": { "codepoints": [120112], "characters": "\uD835\uDD30" }, + "⌢": { "codepoints": [8994], "characters": "\u2322" }, + "♯": { "codepoints": [9839], "characters": "\u266F" }, + "щ": { "codepoints": [1097], "characters": "\u0449" }, + "ш": { "codepoints": [1096], "characters": "\u0448" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "­": { "codepoints": [173], "characters": "\u00AD" }, + "­": { "codepoints": [173], "characters": "\u00AD" }, + "σ": { "codepoints": [963], "characters": "\u03C3" }, + "ς": { "codepoints": [962], "characters": "\u03C2" }, + "ς": { "codepoints": [962], "characters": "\u03C2" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + "⩪": { "codepoints": [10858], "characters": "\u2A6A" }, + "≃": { "codepoints": [8771], "characters": "\u2243" }, + "≃": { "codepoints": [8771], "characters": "\u2243" }, + "⪞": { "codepoints": [10910], "characters": "\u2A9E" }, + "⪠": { "codepoints": [10912], "characters": "\u2AA0" }, + "⪝": { "codepoints": [10909], "characters": "\u2A9D" }, + "⪟": { "codepoints": [10911], "characters": "\u2A9F" }, + "≆": { "codepoints": [8774], "characters": "\u2246" }, + "⨤": { "codepoints": [10788], "characters": "\u2A24" }, + "⥲": { "codepoints": [10610], "characters": "\u2972" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "⨳": { "codepoints": [10803], "characters": "\u2A33" }, + "⧤": { "codepoints": [10724], "characters": "\u29E4" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "⌣": { "codepoints": [8995], "characters": "\u2323" }, + "⪪": { "codepoints": [10922], "characters": "\u2AAA" }, + "⪬": { "codepoints": [10924], "characters": "\u2AAC" }, + "⪬︀": { "codepoints": [10924, 65024], "characters": "\u2AAC\uFE00" }, + "ь": { "codepoints": [1100], "characters": "\u044C" }, + "/": { "codepoints": [47], "characters": "\u002F" }, + "⧄": { "codepoints": [10692], "characters": "\u29C4" }, + "⌿": { "codepoints": [9023], "characters": "\u233F" }, + "𝕤": { "codepoints": [120164], "characters": "\uD835\uDD64" }, + "♠": { "codepoints": [9824], "characters": "\u2660" }, + "♠": { "codepoints": [9824], "characters": "\u2660" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "⊓": { "codepoints": [8851], "characters": "\u2293" }, + "⊓︀": { "codepoints": [8851, 65024], "characters": "\u2293\uFE00" }, + "⊔": { "codepoints": [8852], "characters": "\u2294" }, + "⊔︀": { "codepoints": [8852, 65024], "characters": "\u2294\uFE00" }, + "⊏": { "codepoints": [8847], "characters": "\u228F" }, + "⊑": { "codepoints": [8849], "characters": "\u2291" }, + "⊏": { "codepoints": [8847], "characters": "\u228F" }, + "⊑": { "codepoints": [8849], "characters": "\u2291" }, + "⊐": { "codepoints": [8848], "characters": "\u2290" }, + "⊒": { "codepoints": [8850], "characters": "\u2292" }, + "⊐": { "codepoints": [8848], "characters": "\u2290" }, + "⊒": { "codepoints": [8850], "characters": "\u2292" }, + "□": { "codepoints": [9633], "characters": "\u25A1" }, + "□": { "codepoints": [9633], "characters": "\u25A1" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "𝓈": { "codepoints": [120008], "characters": "\uD835\uDCC8" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "⌣": { "codepoints": [8995], "characters": "\u2323" }, + "⋆": { "codepoints": [8902], "characters": "\u22C6" }, + "☆": { "codepoints": [9734], "characters": "\u2606" }, + "★": { "codepoints": [9733], "characters": "\u2605" }, + "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, + "ϕ": { "codepoints": [981], "characters": "\u03D5" }, + "¯": { "codepoints": [175], "characters": "\u00AF" }, + "⊂": { "codepoints": [8834], "characters": "\u2282" }, + "⫅": { "codepoints": [10949], "characters": "\u2AC5" }, + "⪽": { "codepoints": [10941], "characters": "\u2ABD" }, + "⊆": { "codepoints": [8838], "characters": "\u2286" }, + "⫃": { "codepoints": [10947], "characters": "\u2AC3" }, + "⫁": { "codepoints": [10945], "characters": "\u2AC1" }, + "⫋": { "codepoints": [10955], "characters": "\u2ACB" }, + "⊊": { "codepoints": [8842], "characters": "\u228A" }, + "⪿": { "codepoints": [10943], "characters": "\u2ABF" }, + "⥹": { "codepoints": [10617], "characters": "\u2979" }, + "⊂": { "codepoints": [8834], "characters": "\u2282" }, + "⊆": { "codepoints": [8838], "characters": "\u2286" }, + "⫅": { "codepoints": [10949], "characters": "\u2AC5" }, + "⊊": { "codepoints": [8842], "characters": "\u228A" }, + "⫋": { "codepoints": [10955], "characters": "\u2ACB" }, + "⫇": { "codepoints": [10951], "characters": "\u2AC7" }, + "⫕": { "codepoints": [10965], "characters": "\u2AD5" }, + "⫓": { "codepoints": [10963], "characters": "\u2AD3" }, + "≻": { "codepoints": [8827], "characters": "\u227B" }, + "⪸": { "codepoints": [10936], "characters": "\u2AB8" }, + "≽": { "codepoints": [8829], "characters": "\u227D" }, + "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, + "⪺": { "codepoints": [10938], "characters": "\u2ABA" }, + "⪶": { "codepoints": [10934], "characters": "\u2AB6" }, + "⋩": { "codepoints": [8937], "characters": "\u22E9" }, + "≿": { "codepoints": [8831], "characters": "\u227F" }, + "∑": { "codepoints": [8721], "characters": "\u2211" }, + "♪": { "codepoints": [9834], "characters": "\u266A" }, + "¹": { "codepoints": [185], "characters": "\u00B9" }, + "¹": { "codepoints": [185], "characters": "\u00B9" }, + "²": { "codepoints": [178], "characters": "\u00B2" }, + "²": { "codepoints": [178], "characters": "\u00B2" }, + "³": { "codepoints": [179], "characters": "\u00B3" }, + "³": { "codepoints": [179], "characters": "\u00B3" }, + "⊃": { "codepoints": [8835], "characters": "\u2283" }, + "⫆": { "codepoints": [10950], "characters": "\u2AC6" }, + "⪾": { "codepoints": [10942], "characters": "\u2ABE" }, + "⫘": { "codepoints": [10968], "characters": "\u2AD8" }, + "⊇": { "codepoints": [8839], "characters": "\u2287" }, + "⫄": { "codepoints": [10948], "characters": "\u2AC4" }, + "⟉": { "codepoints": [10185], "characters": "\u27C9" }, + "⫗": { "codepoints": [10967], "characters": "\u2AD7" }, + "⥻": { "codepoints": [10619], "characters": "\u297B" }, + "⫂": { "codepoints": [10946], "characters": "\u2AC2" }, + "⫌": { "codepoints": [10956], "characters": "\u2ACC" }, + "⊋": { "codepoints": [8843], "characters": "\u228B" }, + "⫀": { "codepoints": [10944], "characters": "\u2AC0" }, + "⊃": { "codepoints": [8835], "characters": "\u2283" }, + "⊇": { "codepoints": [8839], "characters": "\u2287" }, + "⫆": { "codepoints": [10950], "characters": "\u2AC6" }, + "⊋": { "codepoints": [8843], "characters": "\u228B" }, + "⫌": { "codepoints": [10956], "characters": "\u2ACC" }, + "⫈": { "codepoints": [10952], "characters": "\u2AC8" }, + "⫔": { "codepoints": [10964], "characters": "\u2AD4" }, + "⫖": { "codepoints": [10966], "characters": "\u2AD6" }, + "⇙": { "codepoints": [8665], "characters": "\u21D9" }, + "⤦": { "codepoints": [10534], "characters": "\u2926" }, + "↙": { "codepoints": [8601], "characters": "\u2199" }, + "↙": { "codepoints": [8601], "characters": "\u2199" }, + "⤪": { "codepoints": [10538], "characters": "\u292A" }, + "ß": { "codepoints": [223], "characters": "\u00DF" }, + "ß": { "codepoints": [223], "characters": "\u00DF" }, + "⌖": { "codepoints": [8982], "characters": "\u2316" }, + "τ": { "codepoints": [964], "characters": "\u03C4" }, + "⎴": { "codepoints": [9140], "characters": "\u23B4" }, + "ť": { "codepoints": [357], "characters": "\u0165" }, + "ţ": { "codepoints": [355], "characters": "\u0163" }, + "т": { "codepoints": [1090], "characters": "\u0442" }, + "⃛": { "codepoints": [8411], "characters": "\u20DB" }, + "⌕": { "codepoints": [8981], "characters": "\u2315" }, + "𝔱": { "codepoints": [120113], "characters": "\uD835\uDD31" }, + "∴": { "codepoints": [8756], "characters": "\u2234" }, + "∴": { "codepoints": [8756], "characters": "\u2234" }, + "θ": { "codepoints": [952], "characters": "\u03B8" }, + "ϑ": { "codepoints": [977], "characters": "\u03D1" }, + "ϑ": { "codepoints": [977], "characters": "\u03D1" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + " ": { "codepoints": [8201], "characters": "\u2009" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + "þ": { "codepoints": [254], "characters": "\u00FE" }, + "þ": { "codepoints": [254], "characters": "\u00FE" }, + "˜": { "codepoints": [732], "characters": "\u02DC" }, + "×": { "codepoints": [215], "characters": "\u00D7" }, + "×": { "codepoints": [215], "characters": "\u00D7" }, + "⊠": { "codepoints": [8864], "characters": "\u22A0" }, + "⨱": { "codepoints": [10801], "characters": "\u2A31" }, + "⨰": { "codepoints": [10800], "characters": "\u2A30" }, + "∭": { "codepoints": [8749], "characters": "\u222D" }, + "⤨": { "codepoints": [10536], "characters": "\u2928" }, + "⊤": { "codepoints": [8868], "characters": "\u22A4" }, + "⌶": { "codepoints": [9014], "characters": "\u2336" }, + "⫱": { "codepoints": [10993], "characters": "\u2AF1" }, + "𝕥": { "codepoints": [120165], "characters": "\uD835\uDD65" }, + "⫚": { "codepoints": [10970], "characters": "\u2ADA" }, + "⤩": { "codepoints": [10537], "characters": "\u2929" }, + "‴": { "codepoints": [8244], "characters": "\u2034" }, + "™": { "codepoints": [8482], "characters": "\u2122" }, + "▵": { "codepoints": [9653], "characters": "\u25B5" }, + "▿": { "codepoints": [9663], "characters": "\u25BF" }, + "◃": { "codepoints": [9667], "characters": "\u25C3" }, + "⊴": { "codepoints": [8884], "characters": "\u22B4" }, + "≜": { "codepoints": [8796], "characters": "\u225C" }, + "▹": { "codepoints": [9657], "characters": "\u25B9" }, + "⊵": { "codepoints": [8885], "characters": "\u22B5" }, + "◬": { "codepoints": [9708], "characters": "\u25EC" }, + "≜": { "codepoints": [8796], "characters": "\u225C" }, + "⨺": { "codepoints": [10810], "characters": "\u2A3A" }, + "⨹": { "codepoints": [10809], "characters": "\u2A39" }, + "⧍": { "codepoints": [10701], "characters": "\u29CD" }, + "⨻": { "codepoints": [10811], "characters": "\u2A3B" }, + "⏢": { "codepoints": [9186], "characters": "\u23E2" }, + "𝓉": { "codepoints": [120009], "characters": "\uD835\uDCC9" }, + "ц": { "codepoints": [1094], "characters": "\u0446" }, + "ћ": { "codepoints": [1115], "characters": "\u045B" }, + "ŧ": { "codepoints": [359], "characters": "\u0167" }, + "≬": { "codepoints": [8812], "characters": "\u226C" }, + "↞": { "codepoints": [8606], "characters": "\u219E" }, + "↠": { "codepoints": [8608], "characters": "\u21A0" }, + "⇑": { "codepoints": [8657], "characters": "\u21D1" }, + "⥣": { "codepoints": [10595], "characters": "\u2963" }, + "ú": { "codepoints": [250], "characters": "\u00FA" }, + "ú": { "codepoints": [250], "characters": "\u00FA" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "ў": { "codepoints": [1118], "characters": "\u045E" }, + "ŭ": { "codepoints": [365], "characters": "\u016D" }, + "û": { "codepoints": [251], "characters": "\u00FB" }, + "û": { "codepoints": [251], "characters": "\u00FB" }, + "у": { "codepoints": [1091], "characters": "\u0443" }, + "⇅": { "codepoints": [8645], "characters": "\u21C5" }, + "ű": { "codepoints": [369], "characters": "\u0171" }, + "⥮": { "codepoints": [10606], "characters": "\u296E" }, + "⥾": { "codepoints": [10622], "characters": "\u297E" }, + "𝔲": { "codepoints": [120114], "characters": "\uD835\uDD32" }, + "ù": { "codepoints": [249], "characters": "\u00F9" }, + "ù": { "codepoints": [249], "characters": "\u00F9" }, + "↿": { "codepoints": [8639], "characters": "\u21BF" }, + "↾": { "codepoints": [8638], "characters": "\u21BE" }, + "▀": { "codepoints": [9600], "characters": "\u2580" }, + "⌜": { "codepoints": [8988], "characters": "\u231C" }, + "⌜": { "codepoints": [8988], "characters": "\u231C" }, + "⌏": { "codepoints": [8975], "characters": "\u230F" }, + "◸": { "codepoints": [9720], "characters": "\u25F8" }, + "ū": { "codepoints": [363], "characters": "\u016B" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "ų": { "codepoints": [371], "characters": "\u0173" }, + "𝕦": { "codepoints": [120166], "characters": "\uD835\uDD66" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "↕": { "codepoints": [8597], "characters": "\u2195" }, + "↿": { "codepoints": [8639], "characters": "\u21BF" }, + "↾": { "codepoints": [8638], "characters": "\u21BE" }, + "⊎": { "codepoints": [8846], "characters": "\u228E" }, + "υ": { "codepoints": [965], "characters": "\u03C5" }, + "ϒ": { "codepoints": [978], "characters": "\u03D2" }, + "υ": { "codepoints": [965], "characters": "\u03C5" }, + "⇈": { "codepoints": [8648], "characters": "\u21C8" }, + "⌝": { "codepoints": [8989], "characters": "\u231D" }, + "⌝": { "codepoints": [8989], "characters": "\u231D" }, + "⌎": { "codepoints": [8974], "characters": "\u230E" }, + "ů": { "codepoints": [367], "characters": "\u016F" }, + "◹": { "codepoints": [9721], "characters": "\u25F9" }, + "𝓊": { "codepoints": [120010], "characters": "\uD835\uDCCA" }, + "⋰": { "codepoints": [8944], "characters": "\u22F0" }, + "ũ": { "codepoints": [361], "characters": "\u0169" }, + "▵": { "codepoints": [9653], "characters": "\u25B5" }, + "▴": { "codepoints": [9652], "characters": "\u25B4" }, + "⇈": { "codepoints": [8648], "characters": "\u21C8" }, + "ü": { "codepoints": [252], "characters": "\u00FC" }, + "ü": { "codepoints": [252], "characters": "\u00FC" }, + "⦧": { "codepoints": [10663], "characters": "\u29A7" }, + "⇕": { "codepoints": [8661], "characters": "\u21D5" }, + "⫨": { "codepoints": [10984], "characters": "\u2AE8" }, + "⫩": { "codepoints": [10985], "characters": "\u2AE9" }, + "⊨": { "codepoints": [8872], "characters": "\u22A8" }, + "⦜": { "codepoints": [10652], "characters": "\u299C" }, + "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, + "ϰ": { "codepoints": [1008], "characters": "\u03F0" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + "ϕ": { "codepoints": [981], "characters": "\u03D5" }, + "ϖ": { "codepoints": [982], "characters": "\u03D6" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "↕": { "codepoints": [8597], "characters": "\u2195" }, + "ϱ": { "codepoints": [1009], "characters": "\u03F1" }, + "ς": { "codepoints": [962], "characters": "\u03C2" }, + "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" }, + "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" }, + "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" }, + "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" }, + "ϑ": { "codepoints": [977], "characters": "\u03D1" }, + "⊲": { "codepoints": [8882], "characters": "\u22B2" }, + "⊳": { "codepoints": [8883], "characters": "\u22B3" }, + "в": { "codepoints": [1074], "characters": "\u0432" }, + "⊢": { "codepoints": [8866], "characters": "\u22A2" }, + "∨": { "codepoints": [8744], "characters": "\u2228" }, + "⊻": { "codepoints": [8891], "characters": "\u22BB" }, + "≚": { "codepoints": [8794], "characters": "\u225A" }, + "⋮": { "codepoints": [8942], "characters": "\u22EE" }, + "|": { "codepoints": [124], "characters": "\u007C" }, + "|": { "codepoints": [124], "characters": "\u007C" }, + "𝔳": { "codepoints": [120115], "characters": "\uD835\uDD33" }, + "⊲": { "codepoints": [8882], "characters": "\u22B2" }, + "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, + "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, + "𝕧": { "codepoints": [120167], "characters": "\uD835\uDD67" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "⊳": { "codepoints": [8883], "characters": "\u22B3" }, + "𝓋": { "codepoints": [120011], "characters": "\uD835\uDCCB" }, + "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" }, + "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" }, + "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" }, + "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" }, + "⦚": { "codepoints": [10650], "characters": "\u299A" }, + "ŵ": { "codepoints": [373], "characters": "\u0175" }, + "⩟": { "codepoints": [10847], "characters": "\u2A5F" }, + "∧": { "codepoints": [8743], "characters": "\u2227" }, + "≙": { "codepoints": [8793], "characters": "\u2259" }, + "℘": { "codepoints": [8472], "characters": "\u2118" }, + "𝔴": { "codepoints": [120116], "characters": "\uD835\uDD34" }, + "𝕨": { "codepoints": [120168], "characters": "\uD835\uDD68" }, + "℘": { "codepoints": [8472], "characters": "\u2118" }, + "≀": { "codepoints": [8768], "characters": "\u2240" }, + "≀": { "codepoints": [8768], "characters": "\u2240" }, + "𝓌": { "codepoints": [120012], "characters": "\uD835\uDCCC" }, + "⋂": { "codepoints": [8898], "characters": "\u22C2" }, + "◯": { "codepoints": [9711], "characters": "\u25EF" }, + "⋃": { "codepoints": [8899], "characters": "\u22C3" }, + "▽": { "codepoints": [9661], "characters": "\u25BD" }, + "𝔵": { "codepoints": [120117], "characters": "\uD835\uDD35" }, + "⟺": { "codepoints": [10234], "characters": "\u27FA" }, + "⟷": { "codepoints": [10231], "characters": "\u27F7" }, + "ξ": { "codepoints": [958], "characters": "\u03BE" }, + "⟸": { "codepoints": [10232], "characters": "\u27F8" }, + "⟵": { "codepoints": [10229], "characters": "\u27F5" }, + "⟼": { "codepoints": [10236], "characters": "\u27FC" }, + "⋻": { "codepoints": [8955], "characters": "\u22FB" }, + "⨀": { "codepoints": [10752], "characters": "\u2A00" }, + "𝕩": { "codepoints": [120169], "characters": "\uD835\uDD69" }, + "⨁": { "codepoints": [10753], "characters": "\u2A01" }, + "⨂": { "codepoints": [10754], "characters": "\u2A02" }, + "⟹": { "codepoints": [10233], "characters": "\u27F9" }, + "⟶": { "codepoints": [10230], "characters": "\u27F6" }, + "𝓍": { "codepoints": [120013], "characters": "\uD835\uDCCD" }, + "⨆": { "codepoints": [10758], "characters": "\u2A06" }, + "⨄": { "codepoints": [10756], "characters": "\u2A04" }, + "△": { "codepoints": [9651], "characters": "\u25B3" }, + "⋁": { "codepoints": [8897], "characters": "\u22C1" }, + "⋀": { "codepoints": [8896], "characters": "\u22C0" }, + "ý": { "codepoints": [253], "characters": "\u00FD" }, + "ý": { "codepoints": [253], "characters": "\u00FD" }, + "я": { "codepoints": [1103], "characters": "\u044F" }, + "ŷ": { "codepoints": [375], "characters": "\u0177" }, + "ы": { "codepoints": [1099], "characters": "\u044B" }, + "¥": { "codepoints": [165], "characters": "\u00A5" }, + "¥": { "codepoints": [165], "characters": "\u00A5" }, + "𝔶": { "codepoints": [120118], "characters": "\uD835\uDD36" }, + "ї": { "codepoints": [1111], "characters": "\u0457" }, + "𝕪": { "codepoints": [120170], "characters": "\uD835\uDD6A" }, + "𝓎": { "codepoints": [120014], "characters": "\uD835\uDCCE" }, + "ю": { "codepoints": [1102], "characters": "\u044E" }, + "ÿ": { "codepoints": [255], "characters": "\u00FF" }, + "ÿ": { "codepoints": [255], "characters": "\u00FF" }, + "ź": { "codepoints": [378], "characters": "\u017A" }, + "ž": { "codepoints": [382], "characters": "\u017E" }, + "з": { "codepoints": [1079], "characters": "\u0437" }, + "ż": { "codepoints": [380], "characters": "\u017C" }, + "ℨ": { "codepoints": [8488], "characters": "\u2128" }, + "ζ": { "codepoints": [950], "characters": "\u03B6" }, + "𝔷": { "codepoints": [120119], "characters": "\uD835\uDD37" }, + "ж": { "codepoints": [1078], "characters": "\u0436" }, + "⇝": { "codepoints": [8669], "characters": "\u21DD" }, + "𝕫": { "codepoints": [120171], "characters": "\uD835\uDD6B" }, + "𝓏": { "codepoints": [120015], "characters": "\uD835\uDCCF" }, + "‍": { "codepoints": [8205], "characters": "\u200D" }, + "‌": { "codepoints": [8204], "characters": "\u200C" } +} diff --git a/html_named_entities/build/main.rs b/html_named_entities/build/main.rs new file mode 100644 index 00000000..ede2488e --- /dev/null +++ b/html_named_entities/build/main.rs @@ -0,0 +1,373 @@ +// Copyright 2014-2025 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Generates a DAFSA at compile time for resolving named character references + +use std::{ + collections::{hash_map::Entry, BTreeMap, HashMap, VecDeque}, + env, fmt, + fs::File, + io::{BufReader, BufWriter, Write}, + path::Path, +}; + +use serde::Deserialize; + +struct Node { + /// One edge per ASCII character + edges: [Option; 128], + is_terminal: bool, + /// Represents the number of terminal nodes within this node's subtree. + /// + /// This is needed for minimal perfect hashing within the DAFSA. + num_nodes: usize, +} + +impl fmt::Debug for Node { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Node") + .field("is_terminal", &self.is_terminal) + .field("num_nodes", &self.num_nodes) + .finish() + } +} + +struct Transition { + from: usize, + /// ASCII character + character: u8, + to: usize, +} + +struct DafsaBuilder { + previous_word: String, + unchecked_transitions: Vec, + minimized_nodes: Vec, + /// First node is always the root node. + nodes: Vec, +} + +impl Default for Node { + fn default() -> Self { + Self { + is_terminal: false, + edges: [const { None }; 128], + num_nodes: 0, + } + } +} + +impl Default for DafsaBuilder { + fn default() -> Self { + Self { + previous_word: String::default(), + unchecked_transitions: Vec::default(), + minimized_nodes: Vec::default(), + nodes: vec![Default::default()], + } + } +} + +impl DafsaBuilder { + fn allocate_node(&mut self) -> usize { + let index = self.nodes.len(); + self.nodes.push(Node::default()); + index + } + + /// Insert a new word into the DAFSA, while maintaining invariants. + /// + /// This implements the algorithm described in . + fn insert(&mut self, new_word: String) { + assert!( + new_word > self.previous_word, + "Words must be inserted in order" + ); + + // We can operate on bytes here, because all named character references are + // restriced to ASCII code points. + let common_prefix_length = new_word + .bytes() + .zip(self.previous_word.bytes()) + .position(|(a, b)| a != b) + .unwrap_or(new_word.len().min(self.previous_word.len())); + + self.minimize(common_prefix_length); + + // add the suffix, starting from the correct node mid-way through the graph + let mut node_handle = self + .unchecked_transitions + .last() + .map(|transition| transition.to) + .unwrap_or_default(); + + let remaining_code_points = &new_word.as_bytes()[common_prefix_length..]; + for code_point in remaining_code_points { + assert!( + self.nodes[node_handle].edges[*code_point as usize].is_none(), + "Should have found a longer common prefix" + ); + + let new_child_handle = self.allocate_node(); + self.nodes[node_handle].edges[*code_point as usize] = Some(new_child_handle); + self.unchecked_transitions.push(Transition { + from: node_handle, + character: *code_point, + to: new_child_handle, + }); + node_handle = new_child_handle; + } + + self.nodes[node_handle].is_terminal = true; + self.previous_word = new_word; + } + + /// Check the uncheckedNodes for redundant nodes, proceeding from last + /// one down to the common prefix size. Then truncate the list at that + /// point. + fn minimize(&mut self, down_to: usize) { + while self.unchecked_transitions.len() > down_to { + let transition = self.unchecked_transitions.pop().unwrap(); + + if let Some(equal_minimized_node) = self + .minimized_nodes + .iter() + .find(|minimized_node| self.are_subtrees_equal(**minimized_node, transition.to)) + { + self.nodes[transition.from].edges[transition.character as usize] = + Some(*equal_minimized_node); + } else { + self.minimized_nodes.push(transition.to); + } + } + } + + fn finish(&mut self) { + self.minimize(0); + } + + fn are_subtrees_equal(&self, first: usize, second: usize) -> bool { + if first == second { + return true; + } + + let first = &self.nodes[first]; + let second = &self.nodes[second]; + + if first.is_terminal != second.is_terminal { + return false; + } + + // First check if exactly the same edges are present + if first + .edges + .iter() + .zip(second.edges.iter()) + .any(|(a, b)| a.is_some() != b.is_some()) + { + return false; + } + + // The check whether the subtrees at each edge are equal. + first + .edges + .iter() + .zip(second.edges.iter()) + .filter_map(|(first_edge, second_edge)| first_edge.zip(*second_edge)) + .all(|(first_edge, second_edge)| self.are_subtrees_equal(first_edge, second_edge)) + } + + fn compute_numbers_for(&mut self, index: usize) { + if self.nodes[index].num_nodes != 0 { + // We already computed the unique value for this node + return; + } + + self.nodes[index].num_nodes += self.nodes[index].is_terminal as usize; + for edge in self.nodes[index].edges { + let Some(edge) = edge else { + continue; + }; + + self.compute_numbers_for(edge); + self.nodes[index].num_nodes += self.nodes[edge].num_nodes; + } + } + + /// Computes all numbers needed for minimal perfect hashing + fn compute_numbers(&mut self) { + self.compute_numbers_for(0); + } + + /// Returns the perfect hash value for the input, or `None` if + /// the input was not in the input set. + /// + /// Hashing is done by computing a prefix sum over `Node::num_nodes` at + /// every step of the traversal. + fn get_unique_index(&self, input: &str) -> Option { + assert!(input.is_ascii()); + + let mut index = 0; + let mut current = &self.nodes[0]; + for code_point in input.as_bytes() { + let next_node = current.edges[*code_point as usize]?; + + for edge in ¤t.edges[..*code_point as usize] { + let Some(edge) = edge else { + continue; + }; + index += self.nodes[*edge].num_nodes; + } + + current = &self.nodes[next_node]; + if current.is_terminal { + index += 1; + } + } + + debug_assert!( + current.is_terminal, + "Traversing {input:?} did not end at a terminal node" + ); + Some(index) + } +} + +impl Node { + fn edges(&self) -> impl Iterator + use<'_> { + self.edges.iter().filter_map(|edge| *edge) + } +} + +#[derive(Deserialize)] +struct NamedEntity { + codepoints: Vec, + #[allow(dead_code)] + characters: String, +} + +fn main() { + println!("cargo:rerun-if-changed=build/"); + + // Parse the list of named entities from https://html.spec.whatwg.org/entities.json + let input_file = BufReader::new(File::open("build/entities.json").unwrap()); + let named_entities: BTreeMap = + serde_json::from_reader(input_file).unwrap(); + + // Build the DAFSA of all named references + let mut dafsa_builder = DafsaBuilder::default(); + for name in named_entities.keys() { + let name = name.strip_prefix('&').unwrap(); + dafsa_builder.insert(name.to_string()); + } + dafsa_builder.finish(); + dafsa_builder.compute_numbers(); + + // Assert that there are no collisions in the perfect hash map, as a sanity check. + let mut seen_indices = HashMap::new(); + for name in named_entities.keys() { + let name = name.strip_prefix('&').unwrap(); + + let previous_value = seen_indices.insert( + dafsa_builder.get_unique_index(name).unwrap(), + name.to_owned(), + ); + assert!( + previous_value.is_none(), + "Collision on {name} with {previous_value:?}" + ); + } + + // Generate implementation + let mut stack = VecDeque::new(); + stack.push_back(0); // Initially we only know about the root node + + let mut next_available_index = dafsa_builder.nodes[0].edges().count() + 1; + + // Maps from a node to the index of its first child + let mut first_child_index = HashMap::new(); + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let destination_path = Path::new(&out_dir).join("named_entities_graph.rs"); + let mut result = BufWriter::new(File::create(destination_path).unwrap()); + writeln!( + &mut result, + "pub(crate) static DAFSA_NODES: [Node; 3872] = [" + ) + .unwrap(); + + // Define all nodes by traversing the DAFSA graph + write!(&mut result, "Node::new(0, 0, false, true, 1),").unwrap(); + while let Some(handle) = stack.pop_front() { + let node = &dafsa_builder.nodes[handle]; + let num_children = node.edges().count(); + + let mut child_index = 0; + for (code_point, child_handle) in node.edges.iter().enumerate() { + let Some(child_handle) = *child_handle else { + continue; + }; + + let child = &dafsa_builder.nodes[child_handle]; + let is_last_child = child_index == num_children - 1; + + let first_child_index = match first_child_index.entry(child_handle) { + Entry::Occupied(entry) => *entry.get(), + Entry::Vacant(entry) => { + let descendants = child.edges().count(); + + stack.push_back(child_handle); + if descendants > 0 { + let first_child = next_available_index; + entry.insert(first_child); + next_available_index += descendants; + first_child + } else { + // If the node has no descendants then we set the first child index to + // zero, as the root node cannot be a descendant of anybody (due to the graph being acyclic). + 0 + } + }, + }; + + write!( + &mut result, + "Node::new({code_point}, {hash_value}, {is_terminal}, {is_last_child}, {first_child_index}),", + is_terminal = child.is_terminal, + hash_value = child.num_nodes + ) + .unwrap(); + child_index += 1; + } + } + writeln!(&mut result, "];").unwrap(); + + // Define the lookup table for the PHF values + let num_entities = named_entities.len(); + let mut references: Vec<(u32, u32)> = vec![Default::default(); named_entities.len() + 1]; + for (name, entity) in &named_entities { + let name = name.strip_prefix('&').unwrap(); + let unique_index = dafsa_builder.get_unique_index(name).unwrap(); + + // For safety, ensure that there are no collisions + assert_eq!(references[unique_index].0, 0); + + references[unique_index] = ( + entity.codepoints[0], + entity.codepoints.get(1).copied().unwrap_or_default(), + ); + } + + writeln!( + &mut result, + "pub(crate) static REFERENCES: [(u32, u32); {}] = {references:?};", + num_entities + 1 + ) + .unwrap(); +} diff --git a/html_named_entities/src/codegen.rs b/html_named_entities/src/codegen.rs new file mode 100644 index 00000000..9c476e3a --- /dev/null +++ b/html_named_entities/src/codegen.rs @@ -0,0 +1,116 @@ +// Copyright 2014-2025 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use super::CharRef; + +include!(concat!(env!("OUT_DIR"), "/named_entities_graph.rs")); + +/// A single node in the DAFSA. +/// +/// For memory efficiency reasons, this is packed in 32 bits. The memory representation is as follows: +/// * 8 bits: code point +/// * 8 bits: hash value +#[derive(Clone, Copy, Debug)] +pub(crate) struct Node(u32); + +impl Node { + const IS_TERMINAL: u32 = 1 << 15; + const IS_LAST_CHILD: u32 = 1 << 14; + + pub(crate) const fn new( + code_point: u8, + hash_value: u8, + is_terminal: bool, + is_last_child: bool, + first_child_index: u16, + ) -> Self { + let mut value = 0; + value |= (code_point as u32) << 24; + value |= (hash_value as u32) << 16; + + if is_terminal { + value |= Self::IS_TERMINAL; + } + + if is_last_child { + value |= Self::IS_LAST_CHILD; + } + + assert!(first_child_index <= 0xFFF); + + value |= first_child_index as u32; + + Self(value) + } + + pub(crate) const fn code_point(&self) -> u8 { + (self.0 >> 24) as u8 + } + + pub(crate) const fn hash_value(&self) -> usize { + ((self.0 >> 16) & 0xFF) as usize + } + + pub(crate) const fn is_terminal(&self) -> bool { + (self.0 & Self::IS_TERMINAL) != 0 + } + + const fn is_last_child(&self) -> bool { + (self.0 & Self::IS_LAST_CHILD) != 0 + } + + const fn first_child_index(&self) -> u16 { + (self.0 & 0xFFF) as u16 + } + + pub(crate) fn children(&self) -> impl Iterator { + struct ChildIterator { + index: usize, + done: bool, + } + + impl Iterator for ChildIterator { + type Item = &'static Node; + + fn next(&mut self) -> Option { + if self.done { + return None; + } + let node = &DAFSA_NODES[self.index]; + self.index += 1; + + if node.is_last_child() { + self.done = true; + } + + Some(node) + } + } + + let first_child_index = self.first_child_index(); + ChildIterator { + index: first_child_index as usize, + done: first_child_index == 0, + } + } +} + +pub(crate) fn resolve_unique_hash_value(value: usize) -> CharRef { + let (first, second) = REFERENCES[value]; + + let num_chars = if second == 0 { 1 } else { 2 }; + + CharRef { + chars: [ + char::from_u32(first).unwrap(), + char::from_u32(second).unwrap(), + ], + num_chars, + } +} diff --git a/html_named_entities/src/interface.rs b/html_named_entities/src/interface.rs new file mode 100644 index 00000000..87fd1acb --- /dev/null +++ b/html_named_entities/src/interface.rs @@ -0,0 +1,24 @@ +/// A source of characters for the tokenizer. +pub trait InputSource { + /// Inserts the given value at the beginning of the input stream, such that + /// it will be consumed next. + fn push_front(&self, value: String); +} + +/// A parsed character reference +#[derive(Clone, Copy, Debug)] +pub struct CharRef { + /// The resulting character(s) + pub chars: [char; 2], + + /// How many slots in `chars` are valid? + pub num_chars: u8, +} + +impl CharRef { + /// A character reference that contains no characters. + pub const EMPTY: CharRef = CharRef { + chars: ['\0', '\0'], + num_chars: 0, + }; +} diff --git a/html_named_entities/src/lib.rs b/html_named_entities/src/lib.rs new file mode 100644 index 00000000..860c9e7e --- /dev/null +++ b/html_named_entities/src/lib.rs @@ -0,0 +1,24 @@ +// Copyright 2014-2025 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Implements a tokenizer for named character references in HTML. +//! +//! A full list of all entities can be found on +//! [w3c.org](https://dev.w3.org/html5/spec-LC/named-character-references.html). + +#![deny(missing_docs)] + +mod codegen; +mod interface; +mod tokenizer; + +pub use interface::{CharRef, InputSource}; +pub use tokenizer::{ + format_name_error, NamedReferenceTokenizationResult, NamedReferenceTokenizerState, +}; diff --git a/html_named_entities/src/tokenizer.rs b/html_named_entities/src/tokenizer.rs new file mode 100644 index 00000000..14b31b53 --- /dev/null +++ b/html_named_entities/src/tokenizer.rs @@ -0,0 +1,186 @@ +use crate::codegen::{resolve_unique_hash_value, Node, DAFSA_NODES}; +use crate::{CharRef, InputSource}; + +use std::borrow::Cow; +use std::mem; + +#[derive(Clone, Debug)] +pub(crate) struct Match { + hash_value: usize, + matched_text: String, +} + +/// Tokenizer for named character references. +#[derive(Clone, Debug)] +pub struct NamedReferenceTokenizerState { + current_node: &'static Node, + /// Contains all characters that the tokenizer has consumed since the last match. + /// + /// We can't always know whether these characters will be part of a named reference until + /// we consume more. For example, `¬` is a valid named character reference, but it might continue + /// to form `¬in`. When we have consumed `¬i` then only the `i` will be in the name buffer + /// since it is the only character that needs to be flushed when no further reference is found. + name_buffer: String, + hash_value: usize, + + /// The last match (last terminal node) that we found during the traversal. + last_match: Option, + + is_in_attribute: bool, +} + +/// The result of attempting to tokenize a named character reference. +pub enum NamedReferenceTokenizationResult { + /// Tokenization is complete. + Success(CharRef), + /// The provided characters do not form a valid named reference and there is no + /// valid continuation that would change that. + /// + /// Contains all the characters that have been tokenized so far. + Failed(String), + /// The tokenizer needs more input. + Continue, +} + +impl NamedReferenceTokenizerState { + /// Construct a new tokenizer. + /// + /// `is_in_attribute` indicates whether the named reference that should be parsed + /// is part of an attribute of a HTML tag. + pub fn new(is_in_attribute: bool) -> Self { + Self { + current_node: &DAFSA_NODES[0], + name_buffer: Default::default(), + hash_value: Default::default(), + last_match: None, + is_in_attribute, + } + } + + /// Provide a single character to the tokenizer. + pub fn feed_character( + &mut self, + c: char, + input: &I, + error_callback: E, + ) -> NamedReferenceTokenizationResult + where + I: InputSource, + E: FnOnce(Cow<'static, str>), + { + self.name_buffer.push(c); + if !c.is_ascii_alphanumeric() && c != ';' { + return self.did_find_invalid_character(input, error_callback); + } + + let code_point = c as u32 as u8; + let mut next_node = None; + for child in self.current_node.children() { + if child.code_point() == code_point { + next_node = Some(child); + break; + } else { + self.hash_value += child.hash_value(); + } + } + + let Some(next_node) = next_node else { + return self.did_find_invalid_character(input, error_callback); + }; + + self.current_node = next_node; + + if self.current_node.is_terminal() { + self.hash_value += 1; + self.last_match = Some(Match { + hash_value: self.hash_value, + matched_text: mem::take(&mut self.name_buffer), + }); + } + + NamedReferenceTokenizationResult::Continue + } + + fn did_find_invalid_character( + &mut self, + input: &I, + error_callback: E, + ) -> NamedReferenceTokenizationResult + where + I: InputSource, + E: FnOnce(Cow<'static, str>), + { + if let Some(last_match) = self.last_match.take() { + input.push_front(self.name_buffer.clone()); + let reference = self.finish_matching_reference(last_match, input, error_callback); + return NamedReferenceTokenizationResult::Success(reference); + } + + NamedReferenceTokenizationResult::Failed(mem::take(&mut self.name_buffer)) + } + + /// Indicate to the tokenizer that all input has been consumed. + pub fn notify_end_of_file(&mut self, input: &I, error_callback: E) -> Option + where + I: InputSource, + E: FnOnce(Cow<'static, str>), + { + input.push_front(self.name_buffer.clone()); + if let Some(last_match) = self.last_match.take() { + Some(self.finish_matching_reference(last_match, input, error_callback)) + } else { + if self.name_buffer.ends_with(';') { + error_callback(Cow::from(format_name_error(&self.name_buffer))); + } + None + } + } + + /// Called whenever the tokenizer has finished matching a named reference. + /// + /// This method takes care of emitting appropriate errors and implement some legacy quirks. + pub(crate) fn finish_matching_reference( + &self, + matched: Match, + input: &I, + error_callback: E, + ) -> CharRef + where + I: InputSource, + E: FnOnce(Cow<'static, str>), + { + let char_ref = resolve_unique_hash_value(matched.hash_value); + let last_matched_codepoint = matched + .matched_text + .chars() + .next_back() + .expect("named character references cannot be empty"); + let first_codepoint_after_match = self.name_buffer.chars().next(); + + // If the character reference was consumed as part of an attribute, and the last + // character matched is not a U+003B SEMICOLON character (;), and the next input + // character is either a U+003D EQUALS SIGN character (=) or an ASCII alphanumeric, + // then, for historical reasons, flush code points consumed as a character + // reference and switch to the return state. + if self.is_in_attribute + && last_matched_codepoint != ';' + && first_codepoint_after_match.is_some_and(|c| c.is_ascii_alphanumeric() || c == '=') + { + input.push_front(matched.matched_text); + return CharRef::EMPTY; + } + + // If the last character matched is not a U+003B SEMICOLON character + // (;), then this is a missing-semicolon-after-character-reference parse + // error. + if last_matched_codepoint != ';' { + error_callback(Cow::from("Character reference does not end with semicolon")); + } + char_ref + } +} + +/// Format a error message for an invalid character reference. +pub fn format_name_error(matched_string: &str) -> String { + format!("Invalid character reference: &{matched_string}") +} diff --git a/markup5ever/Cargo.toml b/markup5ever/Cargo.toml index e46294a3..68bfbd03 100644 --- a/markup5ever/Cargo.toml +++ b/markup5ever/Cargo.toml @@ -17,3 +17,4 @@ path = "lib.rs" web_atoms = { workspace = true } tendril = { workspace = true } log = { workspace = true } +html_named_entities = { workspace = true } diff --git a/markup5ever/lib.rs b/markup5ever/lib.rs index a591fec4..f7827df8 100644 --- a/markup5ever/lib.rs +++ b/markup5ever/lib.rs @@ -40,7 +40,6 @@ pub use web_atoms::{ pub mod data { pub use web_atoms::C1_REPLACEMENTS; - pub use web_atoms::NAMED_ENTITIES; } #[macro_use] pub mod interface; diff --git a/markup5ever/util/buffer_queue.rs b/markup5ever/util/buffer_queue.rs index d5e6864f..bd3cf901 100644 --- a/markup5ever/util/buffer_queue.rs +++ b/markup5ever/util/buffer_queue.rs @@ -265,6 +265,12 @@ impl BufferQueue { } } +impl html_named_entities::InputSource for BufferQueue { + fn push_front(&self, value: String) { + self.push_front(value.into()); + } +} + #[cfg(test)] #[allow(non_snake_case)] mod test { diff --git a/web_atoms/build.rs b/web_atoms/build.rs index 73cad2f3..5ffe5314 100644 --- a/web_atoms/build.rs +++ b/web_atoms/build.rs @@ -10,14 +10,11 @@ extern crate phf_codegen; extern crate string_cache_codegen; -use std::collections::BTreeMap; use std::env; use std::fs::File; use std::io::{BufRead, BufReader, BufWriter, Write}; use std::path::Path; -mod entities; - static NAMESPACES: &[(&str, &str)] = &[ ("", ""), ("*", "*"), @@ -33,8 +30,6 @@ fn main() { let generated = Path::new(&env::var("OUT_DIR").unwrap()).join("generated.rs"); let mut generated = BufWriter::new(File::create(generated).unwrap()); - named_entities_to_phf(&Path::new(&env::var("OUT_DIR").unwrap()).join("named_entities.rs")); - // Create a string cache for local names let local_names = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).join("local_names.txt"); let mut local_names_atom = string_cache_codegen::AtomType::new("LocalName", "local_name!"); @@ -65,7 +60,7 @@ fn main() { writeln!( generated, r#" - /// Maps the input of [`namespace_prefix!`](macro.namespace_prefix.html) to + /// Maps the input of [`namespace_prefix!`](macro.namespace_prefix.html) to /// the output of [`namespace_url!`](macro.namespace_url.html). /// #[macro_export] macro_rules! ns {{ @@ -81,50 +76,3 @@ fn main() { } writeln!(generated, "}}").unwrap(); } - -fn named_entities_to_phf(to: &Path) { - let mut entities: BTreeMap<&str, (u32, u32)> = entities::NAMED_ENTITIES - .iter() - .map(|(name, cp1, cp2)| { - assert!(name.starts_with('&')); - (&name[1..], (*cp1, *cp2)) - }) - .collect(); - - // Add every missing prefix of those keys, mapping to NULL characters. - for key in entities.keys().cloned().collect::>() { - for n in 1..key.len() { - entities.entry(&key[..n]).or_insert((0, 0)); - } - } - entities.insert("", (0, 0)); - - let mut phf_map = phf_codegen::Map::new(); - for (key, value) in entities { - phf_map.entry(key, &format!("{value:?}")); - } - - let mut file = File::create(to).unwrap(); - writeln!( - &mut file, - r#" -/// A map of entity names to their codepoints. The second codepoint will -/// be 0 if the entity contains a single codepoint. Entities have their preceding '&' removed. -/// -/// # Examples -/// -/// ``` -/// use web_atoms::NAMED_ENTITIES; -/// -/// assert_eq!(NAMED_ENTITIES.get("gt;").unwrap(), &(62, 0)); -/// ``` -"# - ) - .unwrap(); - writeln!( - &mut file, - "pub static NAMED_ENTITIES: Map<&'static str, (u32, u32)> = {};", - phf_map.build(), - ) - .unwrap(); -} diff --git a/web_atoms/entities.rs b/web_atoms/entities.rs deleted file mode 100644 index 9cd46f16..00000000 --- a/web_atoms/entities.rs +++ /dev/null @@ -1,2233 +0,0 @@ -pub static NAMED_ENTITIES: [(&str, u32, u32); 2231] = [ - ("Á", 193, 0), - ("Á", 193, 0), - ("á", 225, 0), - ("á", 225, 0), - ("Ă", 258, 0), - ("ă", 259, 0), - ("∾", 8766, 0), - ("∿", 8767, 0), - ("∾̳", 8766, 819), - ("Â", 194, 0), - ("Â", 194, 0), - ("â", 226, 0), - ("â", 226, 0), - ("´", 180, 0), - ("´", 180, 0), - ("А", 1040, 0), - ("а", 1072, 0), - ("Æ", 198, 0), - ("Æ", 198, 0), - ("æ", 230, 0), - ("æ", 230, 0), - ("⁡", 8289, 0), - ("𝔄", 120068, 0), - ("𝔞", 120094, 0), - ("À", 192, 0), - ("À", 192, 0), - ("à", 224, 0), - ("à", 224, 0), - ("ℵ", 8501, 0), - ("ℵ", 8501, 0), - ("Α", 913, 0), - ("α", 945, 0), - ("Ā", 256, 0), - ("ā", 257, 0), - ("⨿", 10815, 0), - ("&", 38, 0), - ("&", 38, 0), - ("&", 38, 0), - ("&", 38, 0), - ("⩕", 10837, 0), - ("⩓", 10835, 0), - ("∧", 8743, 0), - ("⩜", 10844, 0), - ("⩘", 10840, 0), - ("⩚", 10842, 0), - ("∠", 8736, 0), - ("⦤", 10660, 0), - ("∠", 8736, 0), - ("⦨", 10664, 0), - ("⦩", 10665, 0), - ("⦪", 10666, 0), - ("⦫", 10667, 0), - ("⦬", 10668, 0), - ("⦭", 10669, 0), - ("⦮", 10670, 0), - ("⦯", 10671, 0), - ("∡", 8737, 0), - ("∟", 8735, 0), - ("⊾", 8894, 0), - ("⦝", 10653, 0), - ("∢", 8738, 0), - ("Å", 197, 0), - ("⍼", 9084, 0), - ("Ą", 260, 0), - ("ą", 261, 0), - ("𝔸", 120120, 0), - ("𝕒", 120146, 0), - ("⩯", 10863, 0), - ("≈", 8776, 0), - ("⩰", 10864, 0), - ("≊", 8778, 0), - ("≋", 8779, 0), - ("'", 39, 0), - ("⁡", 8289, 0), - ("≈", 8776, 0), - ("≊", 8778, 0), - ("Å", 197, 0), - ("Å", 197, 0), - ("å", 229, 0), - ("å", 229, 0), - ("𝒜", 119964, 0), - ("𝒶", 119990, 0), - ("≔", 8788, 0), - ("*", 42, 0), - ("≈", 8776, 0), - ("≍", 8781, 0), - ("Ã", 195, 0), - ("Ã", 195, 0), - ("ã", 227, 0), - ("ã", 227, 0), - ("Ä", 196, 0), - ("Ä", 196, 0), - ("ä", 228, 0), - ("ä", 228, 0), - ("∳", 8755, 0), - ("⨑", 10769, 0), - ("≌", 8780, 0), - ("϶", 1014, 0), - ("‵", 8245, 0), - ("∽", 8765, 0), - ("⋍", 8909, 0), - ("∖", 8726, 0), - ("⫧", 10983, 0), - ("⊽", 8893, 0), - ("⌅", 8965, 0), - ("⌆", 8966, 0), - ("⌅", 8965, 0), - ("⎵", 9141, 0), - ("⎶", 9142, 0), - ("≌", 8780, 0), - ("Б", 1041, 0), - ("б", 1073, 0), - ("„", 8222, 0), - ("∵", 8757, 0), - ("∵", 8757, 0), - ("∵", 8757, 0), - ("⦰", 10672, 0), - ("϶", 1014, 0), - ("ℬ", 8492, 0), - ("ℬ", 8492, 0), - ("Β", 914, 0), - ("β", 946, 0), - ("ℶ", 8502, 0), - ("≬", 8812, 0), - ("𝔅", 120069, 0), - ("𝔟", 120095, 0), - ("⋂", 8898, 0), - ("◯", 9711, 0), - ("⋃", 8899, 0), - ("⨀", 10752, 0), - ("⨁", 10753, 0), - ("⨂", 10754, 0), - ("⨆", 10758, 0), - ("★", 9733, 0), - ("▽", 9661, 0), - ("△", 9651, 0), - ("⨄", 10756, 0), - ("⋁", 8897, 0), - ("⋀", 8896, 0), - ("⤍", 10509, 0), - ("⧫", 10731, 0), - ("▪", 9642, 0), - ("▴", 9652, 0), - ("▾", 9662, 0), - ("◂", 9666, 0), - ("▸", 9656, 0), - ("␣", 9251, 0), - ("▒", 9618, 0), - ("░", 9617, 0), - ("▓", 9619, 0), - ("█", 9608, 0), - ("=⃥", 61, 8421), - ("≡⃥", 8801, 8421), - ("⫭", 10989, 0), - ("⌐", 8976, 0), - ("𝔹", 120121, 0), - ("𝕓", 120147, 0), - ("⊥", 8869, 0), - ("⊥", 8869, 0), - ("⋈", 8904, 0), - ("⧉", 10697, 0), - ("┐", 9488, 0), - ("╕", 9557, 0), - ("╖", 9558, 0), - ("╗", 9559, 0), - ("┌", 9484, 0), - ("╒", 9554, 0), - ("╓", 9555, 0), - ("╔", 9556, 0), - ("─", 9472, 0), - ("═", 9552, 0), - ("┬", 9516, 0), - ("╤", 9572, 0), - ("╥", 9573, 0), - ("╦", 9574, 0), - ("┴", 9524, 0), - ("╧", 9575, 0), - ("╨", 9576, 0), - ("╩", 9577, 0), - ("⊟", 8863, 0), - ("⊞", 8862, 0), - ("⊠", 8864, 0), - ("┘", 9496, 0), - ("╛", 9563, 0), - ("╜", 9564, 0), - ("╝", 9565, 0), - ("└", 9492, 0), - ("╘", 9560, 0), - ("╙", 9561, 0), - ("╚", 9562, 0), - ("│", 9474, 0), - ("║", 9553, 0), - ("┼", 9532, 0), - ("╪", 9578, 0), - ("╫", 9579, 0), - ("╬", 9580, 0), - ("┤", 9508, 0), - ("╡", 9569, 0), - ("╢", 9570, 0), - ("╣", 9571, 0), - ("├", 9500, 0), - ("╞", 9566, 0), - ("╟", 9567, 0), - ("╠", 9568, 0), - ("‵", 8245, 0), - ("˘", 728, 0), - ("˘", 728, 0), - ("¦", 166, 0), - ("¦", 166, 0), - ("𝒷", 119991, 0), - ("ℬ", 8492, 0), - ("⁏", 8271, 0), - ("∽", 8765, 0), - ("⋍", 8909, 0), - ("⧅", 10693, 0), - ("\", 92, 0), - ("⟈", 10184, 0), - ("•", 8226, 0), - ("•", 8226, 0), - ("≎", 8782, 0), - ("⪮", 10926, 0), - ("≏", 8783, 0), - ("≎", 8782, 0), - ("≏", 8783, 0), - ("Ć", 262, 0), - ("ć", 263, 0), - ("⩄", 10820, 0), - ("⩉", 10825, 0), - ("⩋", 10827, 0), - ("∩", 8745, 0), - ("⋒", 8914, 0), - ("⩇", 10823, 0), - ("⩀", 10816, 0), - ("ⅅ", 8517, 0), - ("∩︀", 8745, 65024), - ("⁁", 8257, 0), - ("ˇ", 711, 0), - ("ℭ", 8493, 0), - ("⩍", 10829, 0), - ("Č", 268, 0), - ("č", 269, 0), - ("Ç", 199, 0), - ("Ç", 199, 0), - ("ç", 231, 0), - ("ç", 231, 0), - ("Ĉ", 264, 0), - ("ĉ", 265, 0), - ("∰", 8752, 0), - ("⩌", 10828, 0), - ("⩐", 10832, 0), - ("Ċ", 266, 0), - ("ċ", 267, 0), - ("¸", 184, 0), - ("¸", 184, 0), - ("¸", 184, 0), - ("⦲", 10674, 0), - ("¢", 162, 0), - ("¢", 162, 0), - ("·", 183, 0), - ("·", 183, 0), - ("𝔠", 120096, 0), - ("ℭ", 8493, 0), - ("Ч", 1063, 0), - ("ч", 1095, 0), - ("✓", 10003, 0), - ("✓", 10003, 0), - ("Χ", 935, 0), - ("χ", 967, 0), - ("ˆ", 710, 0), - ("≗", 8791, 0), - ("↺", 8634, 0), - ("↻", 8635, 0), - ("⊛", 8859, 0), - ("⊚", 8858, 0), - ("⊝", 8861, 0), - ("⊙", 8857, 0), - ("®", 174, 0), - ("Ⓢ", 9416, 0), - ("⊖", 8854, 0), - ("⊕", 8853, 0), - ("⊗", 8855, 0), - ("○", 9675, 0), - ("⧃", 10691, 0), - ("≗", 8791, 0), - ("⨐", 10768, 0), - ("⫯", 10991, 0), - ("⧂", 10690, 0), - ("∲", 8754, 0), - ("”", 8221, 0), - ("’", 8217, 0), - ("♣", 9827, 0), - ("♣", 9827, 0), - (":", 58, 0), - ("∷", 8759, 0), - ("⩴", 10868, 0), - ("≔", 8788, 0), - ("≔", 8788, 0), - (",", 44, 0), - ("@", 64, 0), - ("∁", 8705, 0), - ("∘", 8728, 0), - ("∁", 8705, 0), - ("ℂ", 8450, 0), - ("≅", 8773, 0), - ("⩭", 10861, 0), - ("≡", 8801, 0), - ("∮", 8750, 0), - ("∯", 8751, 0), - ("∮", 8750, 0), - ("𝕔", 120148, 0), - ("ℂ", 8450, 0), - ("∐", 8720, 0), - ("∐", 8720, 0), - ("©", 169, 0), - ("©", 169, 0), - ("©", 169, 0), - ("©", 169, 0), - ("℗", 8471, 0), - ("∳", 8755, 0), - ("↵", 8629, 0), - ("✗", 10007, 0), - ("⨯", 10799, 0), - ("𝒞", 119966, 0), - ("𝒸", 119992, 0), - ("⫏", 10959, 0), - ("⫑", 10961, 0), - ("⫐", 10960, 0), - ("⫒", 10962, 0), - ("⋯", 8943, 0), - ("⤸", 10552, 0), - ("⤵", 10549, 0), - ("⋞", 8926, 0), - ("⋟", 8927, 0), - ("↶", 8630, 0), - ("⤽", 10557, 0), - ("⩈", 10824, 0), - ("⩆", 10822, 0), - ("≍", 8781, 0), - ("∪", 8746, 0), - ("⋓", 8915, 0), - ("⩊", 10826, 0), - ("⊍", 8845, 0), - ("⩅", 10821, 0), - ("∪︀", 8746, 65024), - ("↷", 8631, 0), - ("⤼", 10556, 0), - ("⋞", 8926, 0), - ("⋟", 8927, 0), - ("⋎", 8910, 0), - ("⋏", 8911, 0), - ("¤", 164, 0), - ("¤", 164, 0), - ("↶", 8630, 0), - ("↷", 8631, 0), - ("⋎", 8910, 0), - ("⋏", 8911, 0), - ("∲", 8754, 0), - ("∱", 8753, 0), - ("⌭", 9005, 0), - ("†", 8224, 0), - ("‡", 8225, 0), - ("ℸ", 8504, 0), - ("↓", 8595, 0), - ("↡", 8609, 0), - ("⇓", 8659, 0), - ("‐", 8208, 0), - ("⫤", 10980, 0), - ("⊣", 8867, 0), - ("⤏", 10511, 0), - ("˝", 733, 0), - ("Ď", 270, 0), - ("ď", 271, 0), - ("Д", 1044, 0), - ("д", 1076, 0), - ("‡", 8225, 0), - ("⇊", 8650, 0), - ("ⅅ", 8517, 0), - ("ⅆ", 8518, 0), - ("⤑", 10513, 0), - ("⩷", 10871, 0), - ("°", 176, 0), - ("°", 176, 0), - ("∇", 8711, 0), - ("Δ", 916, 0), - ("δ", 948, 0), - ("⦱", 10673, 0), - ("⥿", 10623, 0), - ("𝔇", 120071, 0), - ("𝔡", 120097, 0), - ("⥥", 10597, 0), - ("⇃", 8643, 0), - ("⇂", 8642, 0), - ("´", 180, 0), - ("˙", 729, 0), - ("˝", 733, 0), - ("`", 96, 0), - ("˜", 732, 0), - ("⋄", 8900, 0), - ("⋄", 8900, 0), - ("⋄", 8900, 0), - ("♦", 9830, 0), - ("♦", 9830, 0), - ("¨", 168, 0), - ("ⅆ", 8518, 0), - ("ϝ", 989, 0), - ("⋲", 8946, 0), - ("÷", 247, 0), - ("÷", 247, 0), - ("÷", 247, 0), - ("⋇", 8903, 0), - ("⋇", 8903, 0), - ("Ђ", 1026, 0), - ("ђ", 1106, 0), - ("⌞", 8990, 0), - ("⌍", 8973, 0), - ("$", 36, 0), - ("𝔻", 120123, 0), - ("𝕕", 120149, 0), - ("¨", 168, 0), - ("˙", 729, 0), - ("⃜", 8412, 0), - ("≐", 8784, 0), - ("≑", 8785, 0), - ("≐", 8784, 0), - ("∸", 8760, 0), - ("∔", 8724, 0), - ("⊡", 8865, 0), - ("⌆", 8966, 0), - ("∯", 8751, 0), - ("¨", 168, 0), - ("⇓", 8659, 0), - ("⇐", 8656, 0), - ("⇔", 8660, 0), - ("⫤", 10980, 0), - ("⟸", 10232, 0), - ("⟺", 10234, 0), - ("⟹", 10233, 0), - ("⇒", 8658, 0), - ("⊨", 8872, 0), - ("⇑", 8657, 0), - ("⇕", 8661, 0), - ("∥", 8741, 0), - ("⤓", 10515, 0), - ("↓", 8595, 0), - ("↓", 8595, 0), - ("⇓", 8659, 0), - ("⇵", 8693, 0), - ("̑", 785, 0), - ("⇊", 8650, 0), - ("⇃", 8643, 0), - ("⇂", 8642, 0), - ("⥐", 10576, 0), - ("⥞", 10590, 0), - ("⥖", 10582, 0), - ("↽", 8637, 0), - ("⥟", 10591, 0), - ("⥗", 10583, 0), - ("⇁", 8641, 0), - ("↧", 8615, 0), - ("⊤", 8868, 0), - ("⤐", 10512, 0), - ("⌟", 8991, 0), - ("⌌", 8972, 0), - ("𝒟", 119967, 0), - ("𝒹", 119993, 0), - ("Ѕ", 1029, 0), - ("ѕ", 1109, 0), - ("⧶", 10742, 0), - ("Đ", 272, 0), - ("đ", 273, 0), - ("⋱", 8945, 0), - ("▿", 9663, 0), - ("▾", 9662, 0), - ("⇵", 8693, 0), - ("⥯", 10607, 0), - ("⦦", 10662, 0), - ("Џ", 1039, 0), - ("џ", 1119, 0), - ("⟿", 10239, 0), - ("É", 201, 0), - ("É", 201, 0), - ("é", 233, 0), - ("é", 233, 0), - ("⩮", 10862, 0), - ("Ě", 282, 0), - ("ě", 283, 0), - ("Ê", 202, 0), - ("Ê", 202, 0), - ("ê", 234, 0), - ("ê", 234, 0), - ("≖", 8790, 0), - ("≕", 8789, 0), - ("Э", 1069, 0), - ("э", 1101, 0), - ("⩷", 10871, 0), - ("Ė", 278, 0), - ("ė", 279, 0), - ("≑", 8785, 0), - ("ⅇ", 8519, 0), - ("≒", 8786, 0), - ("𝔈", 120072, 0), - ("𝔢", 120098, 0), - ("⪚", 10906, 0), - ("È", 200, 0), - ("È", 200, 0), - ("è", 232, 0), - ("è", 232, 0), - ("⪖", 10902, 0), - ("⪘", 10904, 0), - ("⪙", 10905, 0), - ("∈", 8712, 0), - ("⏧", 9191, 0), - ("ℓ", 8467, 0), - ("⪕", 10901, 0), - ("⪗", 10903, 0), - ("Ē", 274, 0), - ("ē", 275, 0), - ("∅", 8709, 0), - ("∅", 8709, 0), - ("◻", 9723, 0), - ("∅", 8709, 0), - ("▫", 9643, 0), - (" ", 8196, 0), - (" ", 8197, 0), - (" ", 8195, 0), - ("Ŋ", 330, 0), - ("ŋ", 331, 0), - (" ", 8194, 0), - ("Ę", 280, 0), - ("ę", 281, 0), - ("𝔼", 120124, 0), - ("𝕖", 120150, 0), - ("⋕", 8917, 0), - ("⧣", 10723, 0), - ("⩱", 10865, 0), - ("ε", 949, 0), - ("Ε", 917, 0), - ("ε", 949, 0), - ("ϵ", 1013, 0), - ("≖", 8790, 0), - ("≕", 8789, 0), - ("≂", 8770, 0), - ("⪖", 10902, 0), - ("⪕", 10901, 0), - ("⩵", 10869, 0), - ("=", 61, 0), - ("≂", 8770, 0), - ("≟", 8799, 0), - ("⇌", 8652, 0), - ("≡", 8801, 0), - ("⩸", 10872, 0), - ("⧥", 10725, 0), - ("⥱", 10609, 0), - ("≓", 8787, 0), - ("ℯ", 8495, 0), - ("ℰ", 8496, 0), - ("≐", 8784, 0), - ("⩳", 10867, 0), - ("≂", 8770, 0), - ("Η", 919, 0), - ("η", 951, 0), - ("Ð", 208, 0), - ("Ð", 208, 0), - ("ð", 240, 0), - ("ð", 240, 0), - ("Ë", 203, 0), - ("Ë", 203, 0), - ("ë", 235, 0), - ("ë", 235, 0), - ("€", 8364, 0), - ("!", 33, 0), - ("∃", 8707, 0), - ("∃", 8707, 0), - ("ℰ", 8496, 0), - ("ⅇ", 8519, 0), - ("ⅇ", 8519, 0), - ("≒", 8786, 0), - ("Ф", 1060, 0), - ("ф", 1092, 0), - ("♀", 9792, 0), - ("ffi", 64259, 0), - ("ff", 64256, 0), - ("ffl", 64260, 0), - ("𝔉", 120073, 0), - ("𝔣", 120099, 0), - ("fi", 64257, 0), - ("◼", 9724, 0), - ("▪", 9642, 0), - ("fj", 102, 106), - ("♭", 9837, 0), - ("fl", 64258, 0), - ("▱", 9649, 0), - ("ƒ", 402, 0), - ("𝔽", 120125, 0), - ("𝕗", 120151, 0), - ("∀", 8704, 0), - ("∀", 8704, 0), - ("⋔", 8916, 0), - ("⫙", 10969, 0), - ("ℱ", 8497, 0), - ("⨍", 10765, 0), - ("½", 189, 0), - ("½", 189, 0), - ("⅓", 8531, 0), - ("¼", 188, 0), - ("¼", 188, 0), - ("⅕", 8533, 0), - ("⅙", 8537, 0), - ("⅛", 8539, 0), - ("⅔", 8532, 0), - ("⅖", 8534, 0), - ("¾", 190, 0), - ("¾", 190, 0), - ("⅗", 8535, 0), - ("⅜", 8540, 0), - ("⅘", 8536, 0), - ("⅚", 8538, 0), - ("⅝", 8541, 0), - ("⅞", 8542, 0), - ("⁄", 8260, 0), - ("⌢", 8994, 0), - ("𝒻", 119995, 0), - ("ℱ", 8497, 0), - ("ǵ", 501, 0), - ("Γ", 915, 0), - ("γ", 947, 0), - ("Ϝ", 988, 0), - ("ϝ", 989, 0), - ("⪆", 10886, 0), - ("Ğ", 286, 0), - ("ğ", 287, 0), - ("Ģ", 290, 0), - ("Ĝ", 284, 0), - ("ĝ", 285, 0), - ("Г", 1043, 0), - ("г", 1075, 0), - ("Ġ", 288, 0), - ("ġ", 289, 0), - ("≥", 8805, 0), - ("≧", 8807, 0), - ("⪌", 10892, 0), - ("⋛", 8923, 0), - ("≥", 8805, 0), - ("≧", 8807, 0), - ("⩾", 10878, 0), - ("⪩", 10921, 0), - ("⩾", 10878, 0), - ("⪀", 10880, 0), - ("⪂", 10882, 0), - ("⪄", 10884, 0), - ("⋛︀", 8923, 65024), - ("⪔", 10900, 0), - ("𝔊", 120074, 0), - ("𝔤", 120100, 0), - ("≫", 8811, 0), - ("⋙", 8921, 0), - ("⋙", 8921, 0), - ("ℷ", 8503, 0), - ("Ѓ", 1027, 0), - ("ѓ", 1107, 0), - ("⪥", 10917, 0), - ("≷", 8823, 0), - ("⪒", 10898, 0), - ("⪤", 10916, 0), - ("⪊", 10890, 0), - ("⪊", 10890, 0), - ("⪈", 10888, 0), - ("≩", 8809, 0), - ("⪈", 10888, 0), - ("≩", 8809, 0), - ("⋧", 8935, 0), - ("𝔾", 120126, 0), - ("𝕘", 120152, 0), - ("`", 96, 0), - ("≥", 8805, 0), - ("⋛", 8923, 0), - ("≧", 8807, 0), - ("⪢", 10914, 0), - ("≷", 8823, 0), - ("⩾", 10878, 0), - ("≳", 8819, 0), - ("𝒢", 119970, 0), - ("ℊ", 8458, 0), - ("≳", 8819, 0), - ("⪎", 10894, 0), - ("⪐", 10896, 0), - ("⪧", 10919, 0), - ("⩺", 10874, 0), - (">", 62, 0), - (">", 62, 0), - (">", 62, 0), - (">", 62, 0), - ("≫", 8811, 0), - ("⋗", 8919, 0), - ("⦕", 10645, 0), - ("⩼", 10876, 0), - ("⪆", 10886, 0), - ("⥸", 10616, 0), - ("⋗", 8919, 0), - ("⋛", 8923, 0), - ("⪌", 10892, 0), - ("≷", 8823, 0), - ("≳", 8819, 0), - ("≩︀", 8809, 65024), - ("≩︀", 8809, 65024), - ("ˇ", 711, 0), - (" ", 8202, 0), - ("½", 189, 0), - ("ℋ", 8459, 0), - ("Ъ", 1066, 0), - ("ъ", 1098, 0), - ("⥈", 10568, 0), - ("↔", 8596, 0), - ("⇔", 8660, 0), - ("↭", 8621, 0), - ("^", 94, 0), - ("ℏ", 8463, 0), - ("Ĥ", 292, 0), - ("ĥ", 293, 0), - ("♥", 9829, 0), - ("♥", 9829, 0), - ("…", 8230, 0), - ("⊹", 8889, 0), - ("𝔥", 120101, 0), - ("ℌ", 8460, 0), - ("ℋ", 8459, 0), - ("⤥", 10533, 0), - ("⤦", 10534, 0), - ("⇿", 8703, 0), - ("∻", 8763, 0), - ("↩", 8617, 0), - ("↪", 8618, 0), - ("𝕙", 120153, 0), - ("ℍ", 8461, 0), - ("―", 8213, 0), - ("─", 9472, 0), - ("𝒽", 119997, 0), - ("ℋ", 8459, 0), - ("ℏ", 8463, 0), - ("Ħ", 294, 0), - ("ħ", 295, 0), - ("≎", 8782, 0), - ("≏", 8783, 0), - ("⁃", 8259, 0), - ("‐", 8208, 0), - ("Í", 205, 0), - ("Í", 205, 0), - ("í", 237, 0), - ("í", 237, 0), - ("⁣", 8291, 0), - ("Î", 206, 0), - ("Î", 206, 0), - ("î", 238, 0), - ("î", 238, 0), - ("И", 1048, 0), - ("и", 1080, 0), - ("İ", 304, 0), - ("Е", 1045, 0), - ("е", 1077, 0), - ("¡", 161, 0), - ("¡", 161, 0), - ("⇔", 8660, 0), - ("𝔦", 120102, 0), - ("ℑ", 8465, 0), - ("Ì", 204, 0), - ("Ì", 204, 0), - ("ì", 236, 0), - ("ì", 236, 0), - ("ⅈ", 8520, 0), - ("⨌", 10764, 0), - ("∭", 8749, 0), - ("⧜", 10716, 0), - ("℩", 8489, 0), - ("IJ", 306, 0), - ("ij", 307, 0), - ("Ī", 298, 0), - ("ī", 299, 0), - ("ℑ", 8465, 0), - ("ⅈ", 8520, 0), - ("ℐ", 8464, 0), - ("ℑ", 8465, 0), - ("ı", 305, 0), - ("ℑ", 8465, 0), - ("⊷", 8887, 0), - ("Ƶ", 437, 0), - ("⇒", 8658, 0), - ("℅", 8453, 0), - ("∈", 8712, 0), - ("∞", 8734, 0), - ("⧝", 10717, 0), - ("ı", 305, 0), - ("⊺", 8890, 0), - ("∫", 8747, 0), - ("∬", 8748, 0), - ("ℤ", 8484, 0), - ("∫", 8747, 0), - ("⊺", 8890, 0), - ("⋂", 8898, 0), - ("⨗", 10775, 0), - ("⨼", 10812, 0), - ("⁣", 8291, 0), - ("⁢", 8290, 0), - ("Ё", 1025, 0), - ("ё", 1105, 0), - ("Į", 302, 0), - ("į", 303, 0), - ("𝕀", 120128, 0), - ("𝕚", 120154, 0), - ("Ι", 921, 0), - ("ι", 953, 0), - ("⨼", 10812, 0), - ("¿", 191, 0), - ("¿", 191, 0), - ("𝒾", 119998, 0), - ("ℐ", 8464, 0), - ("∈", 8712, 0), - ("⋵", 8949, 0), - ("⋹", 8953, 0), - ("⋴", 8948, 0), - ("⋳", 8947, 0), - ("∈", 8712, 0), - ("⁢", 8290, 0), - ("Ĩ", 296, 0), - ("ĩ", 297, 0), - ("І", 1030, 0), - ("і", 1110, 0), - ("Ï", 207, 0), - ("Ï", 207, 0), - ("ï", 239, 0), - ("ï", 239, 0), - ("Ĵ", 308, 0), - ("ĵ", 309, 0), - ("Й", 1049, 0), - ("й", 1081, 0), - ("𝔍", 120077, 0), - ("𝔧", 120103, 0), - ("ȷ", 567, 0), - ("𝕁", 120129, 0), - ("𝕛", 120155, 0), - ("𝒥", 119973, 0), - ("𝒿", 119999, 0), - ("Ј", 1032, 0), - ("ј", 1112, 0), - ("Є", 1028, 0), - ("є", 1108, 0), - ("Κ", 922, 0), - ("κ", 954, 0), - ("ϰ", 1008, 0), - ("Ķ", 310, 0), - ("ķ", 311, 0), - ("К", 1050, 0), - ("к", 1082, 0), - ("𝔎", 120078, 0), - ("𝔨", 120104, 0), - ("ĸ", 312, 0), - ("Х", 1061, 0), - ("х", 1093, 0), - ("Ќ", 1036, 0), - ("ќ", 1116, 0), - ("𝕂", 120130, 0), - ("𝕜", 120156, 0), - ("𝒦", 119974, 0), - ("𝓀", 120000, 0), - ("⇚", 8666, 0), - ("Ĺ", 313, 0), - ("ĺ", 314, 0), - ("⦴", 10676, 0), - ("ℒ", 8466, 0), - ("Λ", 923, 0), - ("λ", 955, 0), - ("⟨", 10216, 0), - ("⟪", 10218, 0), - ("⦑", 10641, 0), - ("⟨", 10216, 0), - ("⪅", 10885, 0), - ("ℒ", 8466, 0), - ("«", 171, 0), - ("«", 171, 0), - ("⇤", 8676, 0), - ("⤟", 10527, 0), - ("←", 8592, 0), - ("↞", 8606, 0), - ("⇐", 8656, 0), - ("⤝", 10525, 0), - ("↩", 8617, 0), - ("↫", 8619, 0), - ("⤹", 10553, 0), - ("⥳", 10611, 0), - ("↢", 8610, 0), - ("⤙", 10521, 0), - ("⤛", 10523, 0), - ("⪫", 10923, 0), - ("⪭", 10925, 0), - ("⪭︀", 10925, 65024), - ("⤌", 10508, 0), - ("⤎", 10510, 0), - ("❲", 10098, 0), - ("{", 123, 0), - ("[", 91, 0), - ("⦋", 10635, 0), - ("⦏", 10639, 0), - ("⦍", 10637, 0), - ("Ľ", 317, 0), - ("ľ", 318, 0), - ("Ļ", 315, 0), - ("ļ", 316, 0), - ("⌈", 8968, 0), - ("{", 123, 0), - ("Л", 1051, 0), - ("л", 1083, 0), - ("⤶", 10550, 0), - ("“", 8220, 0), - ("„", 8222, 0), - ("⥧", 10599, 0), - ("⥋", 10571, 0), - ("↲", 8626, 0), - ("≤", 8804, 0), - ("≦", 8806, 0), - ("⟨", 10216, 0), - ("⇤", 8676, 0), - ("←", 8592, 0), - ("←", 8592, 0), - ("⇐", 8656, 0), - ("⇆", 8646, 0), - ("↢", 8610, 0), - ("⌈", 8968, 0), - ("⟦", 10214, 0), - ("⥡", 10593, 0), - ("⥙", 10585, 0), - ("⇃", 8643, 0), - ("⌊", 8970, 0), - ("↽", 8637, 0), - ("↼", 8636, 0), - ("⇇", 8647, 0), - ("↔", 8596, 0), - ("↔", 8596, 0), - ("⇔", 8660, 0), - ("⇆", 8646, 0), - ("⇋", 8651, 0), - ("↭", 8621, 0), - ("⥎", 10574, 0), - ("↤", 8612, 0), - ("⊣", 8867, 0), - ("⥚", 10586, 0), - ("⋋", 8907, 0), - ("⧏", 10703, 0), - ("⊲", 8882, 0), - ("⊴", 8884, 0), - ("⥑", 10577, 0), - ("⥠", 10592, 0), - ("⥘", 10584, 0), - ("↿", 8639, 0), - ("⥒", 10578, 0), - ("↼", 8636, 0), - ("⪋", 10891, 0), - ("⋚", 8922, 0), - ("≤", 8804, 0), - ("≦", 8806, 0), - ("⩽", 10877, 0), - ("⪨", 10920, 0), - ("⩽", 10877, 0), - ("⩿", 10879, 0), - ("⪁", 10881, 0), - ("⪃", 10883, 0), - ("⋚︀", 8922, 65024), - ("⪓", 10899, 0), - ("⪅", 10885, 0), - ("⋖", 8918, 0), - ("⋚", 8922, 0), - ("⪋", 10891, 0), - ("⋚", 8922, 0), - ("≦", 8806, 0), - ("≶", 8822, 0), - ("≶", 8822, 0), - ("⪡", 10913, 0), - ("≲", 8818, 0), - ("⩽", 10877, 0), - ("≲", 8818, 0), - ("⥼", 10620, 0), - ("⌊", 8970, 0), - ("𝔏", 120079, 0), - ("𝔩", 120105, 0), - ("≶", 8822, 0), - ("⪑", 10897, 0), - ("⥢", 10594, 0), - ("↽", 8637, 0), - ("↼", 8636, 0), - ("⥪", 10602, 0), - ("▄", 9604, 0), - ("Љ", 1033, 0), - ("љ", 1113, 0), - ("⇇", 8647, 0), - ("≪", 8810, 0), - ("⋘", 8920, 0), - ("⌞", 8990, 0), - ("⇚", 8666, 0), - ("⥫", 10603, 0), - ("◺", 9722, 0), - ("Ŀ", 319, 0), - ("ŀ", 320, 0), - ("⎰", 9136, 0), - ("⎰", 9136, 0), - ("⪉", 10889, 0), - ("⪉", 10889, 0), - ("⪇", 10887, 0), - ("≨", 8808, 0), - ("⪇", 10887, 0), - ("≨", 8808, 0), - ("⋦", 8934, 0), - ("⟬", 10220, 0), - ("⇽", 8701, 0), - ("⟦", 10214, 0), - ("⟵", 10229, 0), - ("⟵", 10229, 0), - ("⟸", 10232, 0), - ("⟷", 10231, 0), - ("⟷", 10231, 0), - ("⟺", 10234, 0), - ("⟼", 10236, 0), - ("⟶", 10230, 0), - ("⟶", 10230, 0), - ("⟹", 10233, 0), - ("↫", 8619, 0), - ("↬", 8620, 0), - ("⦅", 10629, 0), - ("𝕃", 120131, 0), - ("𝕝", 120157, 0), - ("⨭", 10797, 0), - ("⨴", 10804, 0), - ("∗", 8727, 0), - ("_", 95, 0), - ("↙", 8601, 0), - ("↘", 8600, 0), - ("◊", 9674, 0), - ("◊", 9674, 0), - ("⧫", 10731, 0), - ("(", 40, 0), - ("⦓", 10643, 0), - ("⇆", 8646, 0), - ("⌟", 8991, 0), - ("⇋", 8651, 0), - ("⥭", 10605, 0), - ("‎", 8206, 0), - ("⊿", 8895, 0), - ("‹", 8249, 0), - ("𝓁", 120001, 0), - ("ℒ", 8466, 0), - ("↰", 8624, 0), - ("↰", 8624, 0), - ("≲", 8818, 0), - ("⪍", 10893, 0), - ("⪏", 10895, 0), - ("[", 91, 0), - ("‘", 8216, 0), - ("‚", 8218, 0), - ("Ł", 321, 0), - ("ł", 322, 0), - ("⪦", 10918, 0), - ("⩹", 10873, 0), - ("<", 60, 0), - ("<", 60, 0), - ("<", 60, 0), - ("<", 60, 0), - ("≪", 8810, 0), - ("⋖", 8918, 0), - ("⋋", 8907, 0), - ("⋉", 8905, 0), - ("⥶", 10614, 0), - ("⩻", 10875, 0), - ("◃", 9667, 0), - ("⊴", 8884, 0), - ("◂", 9666, 0), - ("⦖", 10646, 0), - ("⥊", 10570, 0), - ("⥦", 10598, 0), - ("≨︀", 8808, 65024), - ("≨︀", 8808, 65024), - ("¯", 175, 0), - ("¯", 175, 0), - ("♂", 9794, 0), - ("✠", 10016, 0), - ("✠", 10016, 0), - ("⤅", 10501, 0), - ("↦", 8614, 0), - ("↦", 8614, 0), - ("↧", 8615, 0), - ("↤", 8612, 0), - ("↥", 8613, 0), - ("▮", 9646, 0), - ("⨩", 10793, 0), - ("М", 1052, 0), - ("м", 1084, 0), - ("—", 8212, 0), - ("∺", 8762, 0), - ("∡", 8737, 0), - (" ", 8287, 0), - ("ℳ", 8499, 0), - ("𝔐", 120080, 0), - ("𝔪", 120106, 0), - ("℧", 8487, 0), - ("µ", 181, 0), - ("µ", 181, 0), - ("*", 42, 0), - ("⫰", 10992, 0), - ("∣", 8739, 0), - ("·", 183, 0), - ("·", 183, 0), - ("⊟", 8863, 0), - ("−", 8722, 0), - ("∸", 8760, 0), - ("⨪", 10794, 0), - ("∓", 8723, 0), - ("⫛", 10971, 0), - ("…", 8230, 0), - ("∓", 8723, 0), - ("⊧", 8871, 0), - ("𝕄", 120132, 0), - ("𝕞", 120158, 0), - ("∓", 8723, 0), - ("𝓂", 120002, 0), - ("ℳ", 8499, 0), - ("∾", 8766, 0), - ("Μ", 924, 0), - ("μ", 956, 0), - ("⊸", 8888, 0), - ("⊸", 8888, 0), - ("∇", 8711, 0), - ("Ń", 323, 0), - ("ń", 324, 0), - ("∠⃒", 8736, 8402), - ("≉", 8777, 0), - ("⩰̸", 10864, 824), - ("≋̸", 8779, 824), - ("ʼn", 329, 0), - ("≉", 8777, 0), - ("♮", 9838, 0), - ("ℕ", 8469, 0), - ("♮", 9838, 0), - (" ", 160, 0), - (" ", 160, 0), - ("≎̸", 8782, 824), - ("≏̸", 8783, 824), - ("⩃", 10819, 0), - ("Ň", 327, 0), - ("ň", 328, 0), - ("Ņ", 325, 0), - ("ņ", 326, 0), - ("≇", 8775, 0), - ("⩭̸", 10861, 824), - ("⩂", 10818, 0), - ("Н", 1053, 0), - ("н", 1085, 0), - ("–", 8211, 0), - ("⤤", 10532, 0), - ("↗", 8599, 0), - ("⇗", 8663, 0), - ("↗", 8599, 0), - ("≠", 8800, 0), - ("≐̸", 8784, 824), - ("​", 8203, 0), - ("​", 8203, 0), - ("​", 8203, 0), - ("​", 8203, 0), - ("≢", 8802, 0), - ("⤨", 10536, 0), - ("≂̸", 8770, 824), - ("≫", 8811, 0), - ("≪", 8810, 0), - (" ", 10, 0), - ("∄", 8708, 0), - ("∄", 8708, 0), - ("𝔑", 120081, 0), - ("𝔫", 120107, 0), - ("≧̸", 8807, 824), - ("≱", 8817, 0), - ("≱", 8817, 0), - ("≧̸", 8807, 824), - ("⩾̸", 10878, 824), - ("⩾̸", 10878, 824), - ("⋙̸", 8921, 824), - ("≵", 8821, 0), - ("≫⃒", 8811, 8402), - ("≯", 8815, 0), - ("≯", 8815, 0), - ("≫̸", 8811, 824), - ("↮", 8622, 0), - ("⇎", 8654, 0), - ("⫲", 10994, 0), - ("∋", 8715, 0), - ("⋼", 8956, 0), - ("⋺", 8954, 0), - ("∋", 8715, 0), - ("Њ", 1034, 0), - ("њ", 1114, 0), - ("↚", 8602, 0), - ("⇍", 8653, 0), - ("‥", 8229, 0), - ("≦̸", 8806, 824), - ("≰", 8816, 0), - ("↚", 8602, 0), - ("⇍", 8653, 0), - ("↮", 8622, 0), - ("⇎", 8654, 0), - ("≰", 8816, 0), - ("≦̸", 8806, 824), - ("⩽̸", 10877, 824), - ("⩽̸", 10877, 824), - ("≮", 8814, 0), - ("⋘̸", 8920, 824), - ("≴", 8820, 0), - ("≪⃒", 8810, 8402), - ("≮", 8814, 0), - ("⋪", 8938, 0), - ("⋬", 8940, 0), - ("≪̸", 8810, 824), - ("∤", 8740, 0), - ("⁠", 8288, 0), - (" ", 160, 0), - ("𝕟", 120159, 0), - ("ℕ", 8469, 0), - ("⫬", 10988, 0), - ("¬", 172, 0), - ("¬", 172, 0), - ("≢", 8802, 0), - ("≭", 8813, 0), - ("∦", 8742, 0), - ("∉", 8713, 0), - ("≠", 8800, 0), - ("≂̸", 8770, 824), - ("∄", 8708, 0), - ("≯", 8815, 0), - ("≱", 8817, 0), - ("≧̸", 8807, 824), - ("≫̸", 8811, 824), - ("≹", 8825, 0), - ("⩾̸", 10878, 824), - ("≵", 8821, 0), - ("≎̸", 8782, 824), - ("≏̸", 8783, 824), - ("∉", 8713, 0), - ("⋵̸", 8949, 824), - ("⋹̸", 8953, 824), - ("∉", 8713, 0), - ("⋷", 8951, 0), - ("⋶", 8950, 0), - ("⧏̸", 10703, 824), - ("⋪", 8938, 0), - ("⋬", 8940, 0), - ("≮", 8814, 0), - ("≰", 8816, 0), - ("≸", 8824, 0), - ("≪̸", 8810, 824), - ("⩽̸", 10877, 824), - ("≴", 8820, 0), - ("⪢̸", 10914, 824), - ("⪡̸", 10913, 824), - ("∌", 8716, 0), - ("∌", 8716, 0), - ("⋾", 8958, 0), - ("⋽", 8957, 0), - ("⊀", 8832, 0), - ("⪯̸", 10927, 824), - ("⋠", 8928, 0), - ("∌", 8716, 0), - ("⧐̸", 10704, 824), - ("⋫", 8939, 0), - ("⋭", 8941, 0), - ("⊏̸", 8847, 824), - ("⋢", 8930, 0), - ("⊐̸", 8848, 824), - ("⋣", 8931, 0), - ("⊂⃒", 8834, 8402), - ("⊈", 8840, 0), - ("⊁", 8833, 0), - ("⪰̸", 10928, 824), - ("⋡", 8929, 0), - ("≿̸", 8831, 824), - ("⊃⃒", 8835, 8402), - ("⊉", 8841, 0), - ("≁", 8769, 0), - ("≄", 8772, 0), - ("≇", 8775, 0), - ("≉", 8777, 0), - ("∤", 8740, 0), - ("∦", 8742, 0), - ("∦", 8742, 0), - ("⫽⃥", 11005, 8421), - ("∂̸", 8706, 824), - ("⨔", 10772, 0), - ("⊀", 8832, 0), - ("⋠", 8928, 0), - ("⊀", 8832, 0), - ("⪯̸", 10927, 824), - ("⪯̸", 10927, 824), - ("⤳̸", 10547, 824), - ("↛", 8603, 0), - ("⇏", 8655, 0), - ("↝̸", 8605, 824), - ("↛", 8603, 0), - ("⇏", 8655, 0), - ("⋫", 8939, 0), - ("⋭", 8941, 0), - ("⊁", 8833, 0), - ("⋡", 8929, 0), - ("⪰̸", 10928, 824), - ("𝒩", 119977, 0), - ("𝓃", 120003, 0), - ("∤", 8740, 0), - ("∦", 8742, 0), - ("≁", 8769, 0), - ("≄", 8772, 0), - ("≄", 8772, 0), - ("∤", 8740, 0), - ("∦", 8742, 0), - ("⋢", 8930, 0), - ("⋣", 8931, 0), - ("⊄", 8836, 0), - ("⫅̸", 10949, 824), - ("⊈", 8840, 0), - ("⊂⃒", 8834, 8402), - ("⊈", 8840, 0), - ("⫅̸", 10949, 824), - ("⊁", 8833, 0), - ("⪰̸", 10928, 824), - ("⊅", 8837, 0), - ("⫆̸", 10950, 824), - ("⊉", 8841, 0), - ("⊃⃒", 8835, 8402), - ("⊉", 8841, 0), - ("⫆̸", 10950, 824), - ("≹", 8825, 0), - ("Ñ", 209, 0), - ("Ñ", 209, 0), - ("ñ", 241, 0), - ("ñ", 241, 0), - ("≸", 8824, 0), - ("⋪", 8938, 0), - ("⋬", 8940, 0), - ("⋫", 8939, 0), - ("⋭", 8941, 0), - ("Ν", 925, 0), - ("ν", 957, 0), - ("#", 35, 0), - ("№", 8470, 0), - (" ", 8199, 0), - ("≍⃒", 8781, 8402), - ("⊬", 8876, 0), - ("⊭", 8877, 0), - ("⊮", 8878, 0), - ("⊯", 8879, 0), - ("≥⃒", 8805, 8402), - (">⃒", 62, 8402), - ("⤄", 10500, 0), - ("⧞", 10718, 0), - ("⤂", 10498, 0), - ("≤⃒", 8804, 8402), - ("<⃒", 60, 8402), - ("⊴⃒", 8884, 8402), - ("⤃", 10499, 0), - ("⊵⃒", 8885, 8402), - ("∼⃒", 8764, 8402), - ("⤣", 10531, 0), - ("↖", 8598, 0), - ("⇖", 8662, 0), - ("↖", 8598, 0), - ("⤧", 10535, 0), - ("Ó", 211, 0), - ("Ó", 211, 0), - ("ó", 243, 0), - ("ó", 243, 0), - ("⊛", 8859, 0), - ("Ô", 212, 0), - ("Ô", 212, 0), - ("ô", 244, 0), - ("ô", 244, 0), - ("⊚", 8858, 0), - ("О", 1054, 0), - ("о", 1086, 0), - ("⊝", 8861, 0), - ("Ő", 336, 0), - ("ő", 337, 0), - ("⨸", 10808, 0), - ("⊙", 8857, 0), - ("⦼", 10684, 0), - ("Œ", 338, 0), - ("œ", 339, 0), - ("⦿", 10687, 0), - ("𝔒", 120082, 0), - ("𝔬", 120108, 0), - ("˛", 731, 0), - ("Ò", 210, 0), - ("Ò", 210, 0), - ("ò", 242, 0), - ("ò", 242, 0), - ("⧁", 10689, 0), - ("⦵", 10677, 0), - ("Ω", 937, 0), - ("∮", 8750, 0), - ("↺", 8634, 0), - ("⦾", 10686, 0), - ("⦻", 10683, 0), - ("‾", 8254, 0), - ("⧀", 10688, 0), - ("Ō", 332, 0), - ("ō", 333, 0), - ("Ω", 937, 0), - ("ω", 969, 0), - ("Ο", 927, 0), - ("ο", 959, 0), - ("⦶", 10678, 0), - ("⊖", 8854, 0), - ("𝕆", 120134, 0), - ("𝕠", 120160, 0), - ("⦷", 10679, 0), - ("“", 8220, 0), - ("‘", 8216, 0), - ("⦹", 10681, 0), - ("⊕", 8853, 0), - ("↻", 8635, 0), - ("⩔", 10836, 0), - ("∨", 8744, 0), - ("⩝", 10845, 0), - ("ℴ", 8500, 0), - ("ℴ", 8500, 0), - ("ª", 170, 0), - ("ª", 170, 0), - ("º", 186, 0), - ("º", 186, 0), - ("⊶", 8886, 0), - ("⩖", 10838, 0), - ("⩗", 10839, 0), - ("⩛", 10843, 0), - ("Ⓢ", 9416, 0), - ("𝒪", 119978, 0), - ("ℴ", 8500, 0), - ("Ø", 216, 0), - ("Ø", 216, 0), - ("ø", 248, 0), - ("ø", 248, 0), - ("⊘", 8856, 0), - ("Õ", 213, 0), - ("Õ", 213, 0), - ("õ", 245, 0), - ("õ", 245, 0), - ("⨶", 10806, 0), - ("⨷", 10807, 0), - ("⊗", 8855, 0), - ("Ö", 214, 0), - ("Ö", 214, 0), - ("ö", 246, 0), - ("ö", 246, 0), - ("⌽", 9021, 0), - ("‾", 8254, 0), - ("⏞", 9182, 0), - ("⎴", 9140, 0), - ("⏜", 9180, 0), - ("¶", 182, 0), - ("¶", 182, 0), - ("∥", 8741, 0), - ("∥", 8741, 0), - ("⫳", 10995, 0), - ("⫽", 11005, 0), - ("∂", 8706, 0), - ("∂", 8706, 0), - ("П", 1055, 0), - ("п", 1087, 0), - ("%", 37, 0), - (".", 46, 0), - ("‰", 8240, 0), - ("⊥", 8869, 0), - ("‱", 8241, 0), - ("𝔓", 120083, 0), - ("𝔭", 120109, 0), - ("Φ", 934, 0), - ("φ", 966, 0), - ("ϕ", 981, 0), - ("ℳ", 8499, 0), - ("☎", 9742, 0), - ("Π", 928, 0), - ("π", 960, 0), - ("⋔", 8916, 0), - ("ϖ", 982, 0), - ("ℏ", 8463, 0), - ("ℎ", 8462, 0), - ("ℏ", 8463, 0), - ("⨣", 10787, 0), - ("⊞", 8862, 0), - ("⨢", 10786, 0), - ("+", 43, 0), - ("∔", 8724, 0), - ("⨥", 10789, 0), - ("⩲", 10866, 0), - ("±", 177, 0), - ("±", 177, 0), - ("±", 177, 0), - ("⨦", 10790, 0), - ("⨧", 10791, 0), - ("±", 177, 0), - ("ℌ", 8460, 0), - ("⨕", 10773, 0), - ("𝕡", 120161, 0), - ("ℙ", 8473, 0), - ("£", 163, 0), - ("£", 163, 0), - ("⪷", 10935, 0), - ("⪻", 10939, 0), - ("≺", 8826, 0), - ("≼", 8828, 0), - ("⪷", 10935, 0), - ("≺", 8826, 0), - ("≼", 8828, 0), - ("≺", 8826, 0), - ("⪯", 10927, 0), - ("≼", 8828, 0), - ("≾", 8830, 0), - ("⪯", 10927, 0), - ("⪹", 10937, 0), - ("⪵", 10933, 0), - ("⋨", 8936, 0), - ("⪯", 10927, 0), - ("⪳", 10931, 0), - ("≾", 8830, 0), - ("′", 8242, 0), - ("″", 8243, 0), - ("ℙ", 8473, 0), - ("⪹", 10937, 0), - ("⪵", 10933, 0), - ("⋨", 8936, 0), - ("∏", 8719, 0), - ("∏", 8719, 0), - ("⌮", 9006, 0), - ("⌒", 8978, 0), - ("⌓", 8979, 0), - ("∝", 8733, 0), - ("∝", 8733, 0), - ("∷", 8759, 0), - ("∝", 8733, 0), - ("≾", 8830, 0), - ("⊰", 8880, 0), - ("𝒫", 119979, 0), - ("𝓅", 120005, 0), - ("Ψ", 936, 0), - ("ψ", 968, 0), - (" ", 8200, 0), - ("𝔔", 120084, 0), - ("𝔮", 120110, 0), - ("⨌", 10764, 0), - ("𝕢", 120162, 0), - ("ℚ", 8474, 0), - ("⁗", 8279, 0), - ("𝒬", 119980, 0), - ("𝓆", 120006, 0), - ("ℍ", 8461, 0), - ("⨖", 10774, 0), - ("?", 63, 0), - ("≟", 8799, 0), - (""", 34, 0), - (""", 34, 0), - (""", 34, 0), - (""", 34, 0), - ("⇛", 8667, 0), - ("∽̱", 8765, 817), - ("Ŕ", 340, 0), - ("ŕ", 341, 0), - ("√", 8730, 0), - ("⦳", 10675, 0), - ("⟩", 10217, 0), - ("⟫", 10219, 0), - ("⦒", 10642, 0), - ("⦥", 10661, 0), - ("⟩", 10217, 0), - ("»", 187, 0), - ("»", 187, 0), - ("⥵", 10613, 0), - ("⇥", 8677, 0), - ("⤠", 10528, 0), - ("⤳", 10547, 0), - ("→", 8594, 0), - ("↠", 8608, 0), - ("⇒", 8658, 0), - ("⤞", 10526, 0), - ("↪", 8618, 0), - ("↬", 8620, 0), - ("⥅", 10565, 0), - ("⥴", 10612, 0), - ("⤖", 10518, 0), - ("↣", 8611, 0), - ("↝", 8605, 0), - ("⤚", 10522, 0), - ("⤜", 10524, 0), - ("∶", 8758, 0), - ("ℚ", 8474, 0), - ("⤍", 10509, 0), - ("⤏", 10511, 0), - ("⤐", 10512, 0), - ("❳", 10099, 0), - ("}", 125, 0), - ("]", 93, 0), - ("⦌", 10636, 0), - ("⦎", 10638, 0), - ("⦐", 10640, 0), - ("Ř", 344, 0), - ("ř", 345, 0), - ("Ŗ", 342, 0), - ("ŗ", 343, 0), - ("⌉", 8969, 0), - ("}", 125, 0), - ("Р", 1056, 0), - ("р", 1088, 0), - ("⤷", 10551, 0), - ("⥩", 10601, 0), - ("”", 8221, 0), - ("”", 8221, 0), - ("↳", 8627, 0), - ("ℜ", 8476, 0), - ("ℛ", 8475, 0), - ("ℜ", 8476, 0), - ("ℝ", 8477, 0), - ("ℜ", 8476, 0), - ("▭", 9645, 0), - ("®", 174, 0), - ("®", 174, 0), - ("®", 174, 0), - ("®", 174, 0), - ("∋", 8715, 0), - ("⇋", 8651, 0), - ("⥯", 10607, 0), - ("⥽", 10621, 0), - ("⌋", 8971, 0), - ("𝔯", 120111, 0), - ("ℜ", 8476, 0), - ("⥤", 10596, 0), - ("⇁", 8641, 0), - ("⇀", 8640, 0), - ("⥬", 10604, 0), - ("Ρ", 929, 0), - ("ρ", 961, 0), - ("ϱ", 1009, 0), - ("⟩", 10217, 0), - ("⇥", 8677, 0), - ("→", 8594, 0), - ("→", 8594, 0), - ("⇒", 8658, 0), - ("⇄", 8644, 0), - ("↣", 8611, 0), - ("⌉", 8969, 0), - ("⟧", 10215, 0), - ("⥝", 10589, 0), - ("⥕", 10581, 0), - ("⇂", 8642, 0), - ("⌋", 8971, 0), - ("⇁", 8641, 0), - ("⇀", 8640, 0), - ("⇄", 8644, 0), - ("⇌", 8652, 0), - ("⇉", 8649, 0), - ("↝", 8605, 0), - ("↦", 8614, 0), - ("⊢", 8866, 0), - ("⥛", 10587, 0), - ("⋌", 8908, 0), - ("⧐", 10704, 0), - ("⊳", 8883, 0), - ("⊵", 8885, 0), - ("⥏", 10575, 0), - ("⥜", 10588, 0), - ("⥔", 10580, 0), - ("↾", 8638, 0), - ("⥓", 10579, 0), - ("⇀", 8640, 0), - ("˚", 730, 0), - ("≓", 8787, 0), - ("⇄", 8644, 0), - ("⇌", 8652, 0), - ("‏", 8207, 0), - ("⎱", 9137, 0), - ("⎱", 9137, 0), - ("⫮", 10990, 0), - ("⟭", 10221, 0), - ("⇾", 8702, 0), - ("⟧", 10215, 0), - ("⦆", 10630, 0), - ("𝕣", 120163, 0), - ("ℝ", 8477, 0), - ("⨮", 10798, 0), - ("⨵", 10805, 0), - ("⥰", 10608, 0), - (")", 41, 0), - ("⦔", 10644, 0), - ("⨒", 10770, 0), - ("⇉", 8649, 0), - ("⇛", 8667, 0), - ("›", 8250, 0), - ("𝓇", 120007, 0), - ("ℛ", 8475, 0), - ("↱", 8625, 0), - ("↱", 8625, 0), - ("]", 93, 0), - ("’", 8217, 0), - ("’", 8217, 0), - ("⋌", 8908, 0), - ("⋊", 8906, 0), - ("▹", 9657, 0), - ("⊵", 8885, 0), - ("▸", 9656, 0), - ("⧎", 10702, 0), - ("⧴", 10740, 0), - ("⥨", 10600, 0), - ("℞", 8478, 0), - ("Ś", 346, 0), - ("ś", 347, 0), - ("‚", 8218, 0), - ("⪸", 10936, 0), - ("Š", 352, 0), - ("š", 353, 0), - ("⪼", 10940, 0), - ("≻", 8827, 0), - ("≽", 8829, 0), - ("⪰", 10928, 0), - ("⪴", 10932, 0), - ("Ş", 350, 0), - ("ş", 351, 0), - ("Ŝ", 348, 0), - ("ŝ", 349, 0), - ("⪺", 10938, 0), - ("⪶", 10934, 0), - ("⋩", 8937, 0), - ("⨓", 10771, 0), - ("≿", 8831, 0), - ("С", 1057, 0), - ("с", 1089, 0), - ("⊡", 8865, 0), - ("⋅", 8901, 0), - ("⩦", 10854, 0), - ("⤥", 10533, 0), - ("↘", 8600, 0), - ("⇘", 8664, 0), - ("↘", 8600, 0), - ("§", 167, 0), - ("§", 167, 0), - (";", 59, 0), - ("⤩", 10537, 0), - ("∖", 8726, 0), - ("∖", 8726, 0), - ("✶", 10038, 0), - ("𝔖", 120086, 0), - ("𝔰", 120112, 0), - ("⌢", 8994, 0), - ("♯", 9839, 0), - ("Щ", 1065, 0), - ("щ", 1097, 0), - ("Ш", 1064, 0), - ("ш", 1096, 0), - ("↓", 8595, 0), - ("←", 8592, 0), - ("∣", 8739, 0), - ("∥", 8741, 0), - ("→", 8594, 0), - ("↑", 8593, 0), - ("­", 173, 0), - ("­", 173, 0), - ("Σ", 931, 0), - ("σ", 963, 0), - ("ς", 962, 0), - ("ς", 962, 0), - ("∼", 8764, 0), - ("⩪", 10858, 0), - ("≃", 8771, 0), - ("≃", 8771, 0), - ("⪞", 10910, 0), - ("⪠", 10912, 0), - ("⪝", 10909, 0), - ("⪟", 10911, 0), - ("≆", 8774, 0), - ("⨤", 10788, 0), - ("⥲", 10610, 0), - ("←", 8592, 0), - ("∘", 8728, 0), - ("∖", 8726, 0), - ("⨳", 10803, 0), - ("⧤", 10724, 0), - ("∣", 8739, 0), - ("⌣", 8995, 0), - ("⪪", 10922, 0), - ("⪬", 10924, 0), - ("⪬︀", 10924, 65024), - ("Ь", 1068, 0), - ("ь", 1100, 0), - ("⌿", 9023, 0), - ("⧄", 10692, 0), - ("/", 47, 0), - ("𝕊", 120138, 0), - ("𝕤", 120164, 0), - ("♠", 9824, 0), - ("♠", 9824, 0), - ("∥", 8741, 0), - ("⊓", 8851, 0), - ("⊓︀", 8851, 65024), - ("⊔", 8852, 0), - ("⊔︀", 8852, 65024), - ("√", 8730, 0), - ("⊏", 8847, 0), - ("⊑", 8849, 0), - ("⊏", 8847, 0), - ("⊑", 8849, 0), - ("⊐", 8848, 0), - ("⊒", 8850, 0), - ("⊐", 8848, 0), - ("⊒", 8850, 0), - ("□", 9633, 0), - ("□", 9633, 0), - ("⊓", 8851, 0), - ("⊏", 8847, 0), - ("⊑", 8849, 0), - ("⊐", 8848, 0), - ("⊒", 8850, 0), - ("⊔", 8852, 0), - ("▪", 9642, 0), - ("□", 9633, 0), - ("▪", 9642, 0), - ("→", 8594, 0), - ("𝒮", 119982, 0), - ("𝓈", 120008, 0), - ("∖", 8726, 0), - ("⌣", 8995, 0), - ("⋆", 8902, 0), - ("⋆", 8902, 0), - ("☆", 9734, 0), - ("★", 9733, 0), - ("ϵ", 1013, 0), - ("ϕ", 981, 0), - ("¯", 175, 0), - ("⊂", 8834, 0), - ("⋐", 8912, 0), - ("⪽", 10941, 0), - ("⫅", 10949, 0), - ("⊆", 8838, 0), - ("⫃", 10947, 0), - ("⫁", 10945, 0), - ("⫋", 10955, 0), - ("⊊", 8842, 0), - ("⪿", 10943, 0), - ("⥹", 10617, 0), - ("⊂", 8834, 0), - ("⋐", 8912, 0), - ("⊆", 8838, 0), - ("⫅", 10949, 0), - ("⊆", 8838, 0), - ("⊊", 8842, 0), - ("⫋", 10955, 0), - ("⫇", 10951, 0), - ("⫕", 10965, 0), - ("⫓", 10963, 0), - ("⪸", 10936, 0), - ("≻", 8827, 0), - ("≽", 8829, 0), - ("≻", 8827, 0), - ("⪰", 10928, 0), - ("≽", 8829, 0), - ("≿", 8831, 0), - ("⪰", 10928, 0), - ("⪺", 10938, 0), - ("⪶", 10934, 0), - ("⋩", 8937, 0), - ("≿", 8831, 0), - ("∋", 8715, 0), - ("∑", 8721, 0), - ("∑", 8721, 0), - ("♪", 9834, 0), - ("¹", 185, 0), - ("¹", 185, 0), - ("²", 178, 0), - ("²", 178, 0), - ("³", 179, 0), - ("³", 179, 0), - ("⊃", 8835, 0), - ("⋑", 8913, 0), - ("⪾", 10942, 0), - ("⫘", 10968, 0), - ("⫆", 10950, 0), - ("⊇", 8839, 0), - ("⫄", 10948, 0), - ("⊃", 8835, 0), - ("⊇", 8839, 0), - ("⟉", 10185, 0), - ("⫗", 10967, 0), - ("⥻", 10619, 0), - ("⫂", 10946, 0), - ("⫌", 10956, 0), - ("⊋", 8843, 0), - ("⫀", 10944, 0), - ("⊃", 8835, 0), - ("⋑", 8913, 0), - ("⊇", 8839, 0), - ("⫆", 10950, 0), - ("⊋", 8843, 0), - ("⫌", 10956, 0), - ("⫈", 10952, 0), - ("⫔", 10964, 0), - ("⫖", 10966, 0), - ("⤦", 10534, 0), - ("↙", 8601, 0), - ("⇙", 8665, 0), - ("↙", 8601, 0), - ("⤪", 10538, 0), - ("ß", 223, 0), - ("ß", 223, 0), - (" ", 9, 0), - ("⌖", 8982, 0), - ("Τ", 932, 0), - ("τ", 964, 0), - ("⎴", 9140, 0), - ("Ť", 356, 0), - ("ť", 357, 0), - ("Ţ", 354, 0), - ("ţ", 355, 0), - ("Т", 1058, 0), - ("т", 1090, 0), - ("⃛", 8411, 0), - ("⌕", 8981, 0), - ("𝔗", 120087, 0), - ("𝔱", 120113, 0), - ("∴", 8756, 0), - ("∴", 8756, 0), - ("∴", 8756, 0), - ("Θ", 920, 0), - ("θ", 952, 0), - ("ϑ", 977, 0), - ("ϑ", 977, 0), - ("≈", 8776, 0), - ("∼", 8764, 0), - ("  ", 8287, 8202), - (" ", 8201, 0), - (" ", 8201, 0), - ("≈", 8776, 0), - ("∼", 8764, 0), - ("Þ", 222, 0), - ("Þ", 222, 0), - ("þ", 254, 0), - ("þ", 254, 0), - ("˜", 732, 0), - ("∼", 8764, 0), - ("≃", 8771, 0), - ("≅", 8773, 0), - ("≈", 8776, 0), - ("⨱", 10801, 0), - ("⊠", 8864, 0), - ("×", 215, 0), - ("×", 215, 0), - ("⨰", 10800, 0), - ("∭", 8749, 0), - ("⤨", 10536, 0), - ("⌶", 9014, 0), - ("⫱", 10993, 0), - ("⊤", 8868, 0), - ("𝕋", 120139, 0), - ("𝕥", 120165, 0), - ("⫚", 10970, 0), - ("⤩", 10537, 0), - ("‴", 8244, 0), - ("™", 8482, 0), - ("™", 8482, 0), - ("▵", 9653, 0), - ("▿", 9663, 0), - ("◃", 9667, 0), - ("⊴", 8884, 0), - ("≜", 8796, 0), - ("▹", 9657, 0), - ("⊵", 8885, 0), - ("◬", 9708, 0), - ("≜", 8796, 0), - ("⨺", 10810, 0), - ("⃛", 8411, 0), - ("⨹", 10809, 0), - ("⧍", 10701, 0), - ("⨻", 10811, 0), - ("⏢", 9186, 0), - ("𝒯", 119983, 0), - ("𝓉", 120009, 0), - ("Ц", 1062, 0), - ("ц", 1094, 0), - ("Ћ", 1035, 0), - ("ћ", 1115, 0), - ("Ŧ", 358, 0), - ("ŧ", 359, 0), - ("≬", 8812, 0), - ("↞", 8606, 0), - ("↠", 8608, 0), - ("Ú", 218, 0), - ("Ú", 218, 0), - ("ú", 250, 0), - ("ú", 250, 0), - ("↑", 8593, 0), - ("↟", 8607, 0), - ("⇑", 8657, 0), - ("⥉", 10569, 0), - ("Ў", 1038, 0), - ("ў", 1118, 0), - ("Ŭ", 364, 0), - ("ŭ", 365, 0), - ("Û", 219, 0), - ("Û", 219, 0), - ("û", 251, 0), - ("û", 251, 0), - ("У", 1059, 0), - ("у", 1091, 0), - ("⇅", 8645, 0), - ("Ű", 368, 0), - ("ű", 369, 0), - ("⥮", 10606, 0), - ("⥾", 10622, 0), - ("𝔘", 120088, 0), - ("𝔲", 120114, 0), - ("Ù", 217, 0), - ("Ù", 217, 0), - ("ù", 249, 0), - ("ù", 249, 0), - ("⥣", 10595, 0), - ("↿", 8639, 0), - ("↾", 8638, 0), - ("▀", 9600, 0), - ("⌜", 8988, 0), - ("⌜", 8988, 0), - ("⌏", 8975, 0), - ("◸", 9720, 0), - ("Ū", 362, 0), - ("ū", 363, 0), - ("¨", 168, 0), - ("¨", 168, 0), - ("_", 95, 0), - ("⏟", 9183, 0), - ("⎵", 9141, 0), - ("⏝", 9181, 0), - ("⋃", 8899, 0), - ("⊎", 8846, 0), - ("Ų", 370, 0), - ("ų", 371, 0), - ("𝕌", 120140, 0), - ("𝕦", 120166, 0), - ("⤒", 10514, 0), - ("↑", 8593, 0), - ("↑", 8593, 0), - ("⇑", 8657, 0), - ("⇅", 8645, 0), - ("↕", 8597, 0), - ("↕", 8597, 0), - ("⇕", 8661, 0), - ("⥮", 10606, 0), - ("↿", 8639, 0), - ("↾", 8638, 0), - ("⊎", 8846, 0), - ("↖", 8598, 0), - ("↗", 8599, 0), - ("υ", 965, 0), - ("ϒ", 978, 0), - ("ϒ", 978, 0), - ("Υ", 933, 0), - ("υ", 965, 0), - ("↥", 8613, 0), - ("⊥", 8869, 0), - ("⇈", 8648, 0), - ("⌝", 8989, 0), - ("⌝", 8989, 0), - ("⌎", 8974, 0), - ("Ů", 366, 0), - ("ů", 367, 0), - ("◹", 9721, 0), - ("𝒰", 119984, 0), - ("𝓊", 120010, 0), - ("⋰", 8944, 0), - ("Ũ", 360, 0), - ("ũ", 361, 0), - ("▵", 9653, 0), - ("▴", 9652, 0), - ("⇈", 8648, 0), - ("Ü", 220, 0), - ("Ü", 220, 0), - ("ü", 252, 0), - ("ü", 252, 0), - ("⦧", 10663, 0), - ("⦜", 10652, 0), - ("ϵ", 1013, 0), - ("ϰ", 1008, 0), - ("∅", 8709, 0), - ("ϕ", 981, 0), - ("ϖ", 982, 0), - ("∝", 8733, 0), - ("↕", 8597, 0), - ("⇕", 8661, 0), - ("ϱ", 1009, 0), - ("ς", 962, 0), - ("⊊︀", 8842, 65024), - ("⫋︀", 10955, 65024), - ("⊋︀", 8843, 65024), - ("⫌︀", 10956, 65024), - ("ϑ", 977, 0), - ("⊲", 8882, 0), - ("⊳", 8883, 0), - ("⫨", 10984, 0), - ("⫫", 10987, 0), - ("⫩", 10985, 0), - ("В", 1042, 0), - ("в", 1074, 0), - ("⊢", 8866, 0), - ("⊨", 8872, 0), - ("⊩", 8873, 0), - ("⊫", 8875, 0), - ("⫦", 10982, 0), - ("⊻", 8891, 0), - ("∨", 8744, 0), - ("⋁", 8897, 0), - ("≚", 8794, 0), - ("⋮", 8942, 0), - ("|", 124, 0), - ("‖", 8214, 0), - ("|", 124, 0), - ("‖", 8214, 0), - ("∣", 8739, 0), - ("|", 124, 0), - ("❘", 10072, 0), - ("≀", 8768, 0), - (" ", 8202, 0), - ("𝔙", 120089, 0), - ("𝔳", 120115, 0), - ("⊲", 8882, 0), - ("⊂⃒", 8834, 8402), - ("⊃⃒", 8835, 8402), - ("𝕍", 120141, 0), - ("𝕧", 120167, 0), - ("∝", 8733, 0), - ("⊳", 8883, 0), - ("𝒱", 119985, 0), - ("𝓋", 120011, 0), - ("⫋︀", 10955, 65024), - ("⊊︀", 8842, 65024), - ("⫌︀", 10956, 65024), - ("⊋︀", 8843, 65024), - ("⊪", 8874, 0), - ("⦚", 10650, 0), - ("Ŵ", 372, 0), - ("ŵ", 373, 0), - ("⩟", 10847, 0), - ("∧", 8743, 0), - ("⋀", 8896, 0), - ("≙", 8793, 0), - ("℘", 8472, 0), - ("𝔚", 120090, 0), - ("𝔴", 120116, 0), - ("𝕎", 120142, 0), - ("𝕨", 120168, 0), - ("℘", 8472, 0), - ("≀", 8768, 0), - ("≀", 8768, 0), - ("𝒲", 119986, 0), - ("𝓌", 120012, 0), - ("⋂", 8898, 0), - ("◯", 9711, 0), - ("⋃", 8899, 0), - ("▽", 9661, 0), - ("𝔛", 120091, 0), - ("𝔵", 120117, 0), - ("⟷", 10231, 0), - ("⟺", 10234, 0), - ("Ξ", 926, 0), - ("ξ", 958, 0), - ("⟵", 10229, 0), - ("⟸", 10232, 0), - ("⟼", 10236, 0), - ("⋻", 8955, 0), - ("⨀", 10752, 0), - ("𝕏", 120143, 0), - ("𝕩", 120169, 0), - ("⨁", 10753, 0), - ("⨂", 10754, 0), - ("⟶", 10230, 0), - ("⟹", 10233, 0), - ("𝒳", 119987, 0), - ("𝓍", 120013, 0), - ("⨆", 10758, 0), - ("⨄", 10756, 0), - ("△", 9651, 0), - ("⋁", 8897, 0), - ("⋀", 8896, 0), - ("Ý", 221, 0), - ("Ý", 221, 0), - ("ý", 253, 0), - ("ý", 253, 0), - ("Я", 1071, 0), - ("я", 1103, 0), - ("Ŷ", 374, 0), - ("ŷ", 375, 0), - ("Ы", 1067, 0), - ("ы", 1099, 0), - ("¥", 165, 0), - ("¥", 165, 0), - ("𝔜", 120092, 0), - ("𝔶", 120118, 0), - ("Ї", 1031, 0), - ("ї", 1111, 0), - ("𝕐", 120144, 0), - ("𝕪", 120170, 0), - ("𝒴", 119988, 0), - ("𝓎", 120014, 0), - ("Ю", 1070, 0), - ("ю", 1102, 0), - ("ÿ", 255, 0), - ("ÿ", 255, 0), - ("Ÿ", 376, 0), - ("Ź", 377, 0), - ("ź", 378, 0), - ("Ž", 381, 0), - ("ž", 382, 0), - ("З", 1047, 0), - ("з", 1079, 0), - ("Ż", 379, 0), - ("ż", 380, 0), - ("ℨ", 8488, 0), - ("​", 8203, 0), - ("Ζ", 918, 0), - ("ζ", 950, 0), - ("𝔷", 120119, 0), - ("ℨ", 8488, 0), - ("Ж", 1046, 0), - ("ж", 1078, 0), - ("⇝", 8669, 0), - ("𝕫", 120171, 0), - ("ℤ", 8484, 0), - ("𝒵", 119989, 0), - ("𝓏", 120015, 0), - ("‍", 8205, 0), - ("‌", 8204, 0), -]; diff --git a/web_atoms/lib.rs b/web_atoms/lib.rs index 88bccfce..ae1a108b 100644 --- a/web_atoms/lib.rs +++ b/web_atoms/lib.rs @@ -11,8 +11,6 @@ // This error is coming from code generated by PHF which we cannot directly fix #![allow(clippy::empty_line_after_doc_comments)] -use phf::Map; - /// The spec replaces most characters in the ISO-2022 C1 control code range /// (U+0080 through U+009F) with these characters, based on Windows 8-bit /// codepages. @@ -51,5 +49,4 @@ pub static C1_REPLACEMENTS: [Option; 32] = [ Some('\u{0178}'), ]; -include!(concat!(env!("OUT_DIR"), "/named_entities.rs")); include!(concat!(env!("OUT_DIR"), "/generated.rs")); diff --git a/xml5ever/Cargo.toml b/xml5ever/Cargo.toml index e70c4997..539b0606 100644 --- a/xml5ever/Cargo.toml +++ b/xml5ever/Cargo.toml @@ -19,6 +19,7 @@ trace_tokenizer = [] [dependencies] markup5ever = { workspace = true } +html_named_entities = { workspace = true } log = { workspace = true } [dev-dependencies] diff --git a/xml5ever/src/serialize/mod.rs b/xml5ever/src/serialize/mod.rs index d39e0599..a2d26710 100644 --- a/xml5ever/src/serialize/mod.rs +++ b/xml5ever/src/serialize/mod.rs @@ -152,9 +152,9 @@ impl Serializer for XmlSerializer { if let Some(current_namespace) = self.namespace_stack.0.last() { for (prefix, url_opt) in current_namespace.get_scope_iter() { self.writer.write_all(b" xmlns")?; - if let Some(ref p) = *prefix { + if let Some(ref prefix) = *prefix { self.writer.write_all(b":")?; - self.writer.write_all(p.as_bytes())?; + self.writer.write_all(prefix.as_bytes())?; } self.writer.write_all(b"=\"")?; diff --git a/xml5ever/src/tokenizer/char_ref/mod.rs b/xml5ever/src/tokenizer/char_ref/mod.rs index 4728a76b..15f4f94c 100644 --- a/xml5ever/src/tokenizer/char_ref/mod.rs +++ b/xml5ever/src/tokenizer/char_ref/mod.rs @@ -14,19 +14,15 @@ use log::debug; use markup5ever::buffer_queue::BufferQueue; use std::borrow::Cow::{self, Borrowed}; use std::char::from_u32; +use std::mem; + +use html_named_entities::{ + format_name_error, CharRef, NamedReferenceTokenizationResult, NamedReferenceTokenizerState, +}; use self::State::*; pub use self::Status::*; -//§ tokenizing-character-references -pub struct CharRef { - /// The resulting character(s) - pub chars: [char; 2], - - /// How many slots in `chars` are valid? - pub num_chars: u8, -} - pub enum Status { Stuck, Progress, @@ -39,8 +35,8 @@ enum State { Octothorpe, Numeric(u32), // base NumericSemicolon, - Named, - BogusName, + Named(NamedReferenceTokenizerState), + BogusName(StrTendril), } pub struct CharRefTokenizer { @@ -52,10 +48,6 @@ pub struct CharRefTokenizer { num_too_big: bool, seen_digit: bool, hex_marker: Option, - - name_buf_opt: Option, - name_match: Option<(u32, u32)>, - name_len: usize, } impl CharRefTokenizer { @@ -70,9 +62,6 @@ impl CharRefTokenizer { num_too_big: false, seen_digit: false, hex_marker: None, - name_buf_opt: None, - name_match: None, - name_len: 0, } } @@ -82,23 +71,8 @@ impl CharRefTokenizer { self.result.expect("get_result called before done") } - fn name_buf(&self) -> &StrTendril { - self.name_buf_opt - .as_ref() - .expect("name_buf missing in named character reference") - } - - fn name_buf_mut(&mut self) -> &mut StrTendril { - self.name_buf_opt - .as_mut() - .expect("name_buf missing in named character reference") - } - fn finish_none(&mut self) -> Status { - self.result = Some(CharRef { - chars: ['\0', '\0'], - num_chars: 0, - }); + self.result = Some(CharRef::EMPTY); Done } @@ -127,8 +101,42 @@ impl CharRefTokenizer { Octothorpe => self.do_octothorpe(tokenizer, input), Numeric(base) => self.do_numeric(tokenizer, base, input), NumericSemicolon => self.do_numeric_semicolon(tokenizer, input), - Named => self.do_named(tokenizer, input), - BogusName => self.do_bogus_name(tokenizer, input), + Named(ref mut named_tokenizer) => loop { + let Some(c) = tokenizer.peek(input) else { + return Status::Stuck; + }; + tokenizer.discard_char(input); + + match named_tokenizer.feed_character(c, input, |error| tokenizer.emit_error(error)) + { + NamedReferenceTokenizationResult::Success(reference) => { + self.result = Some(reference); + return Status::Done; + }, + NamedReferenceTokenizationResult::Failed(characters) => { + self.state = State::BogusName(characters.into()); + return Status::Progress; + }, + NamedReferenceTokenizationResult::Continue => {}, + } + }, + State::BogusName(ref mut invalid_name) => { + let Some(c) = tokenizer.peek(input) else { + return Status::Stuck; + }; + tokenizer.discard_char(input); + invalid_name.push_char(c); + match c { + _ if c.is_ascii_alphanumeric() => return Status::Progress, + ';' => { + tokenizer.emit_error(Cow::from(format_name_error(&invalid_name))); + }, + _ => (), + } + input.push_front(mem::take(invalid_name)); + self.result = Some(CharRef::EMPTY); + Status::Done + }, } } @@ -146,8 +154,9 @@ impl CharRefTokenizer { Progress }, Some(_) => { - self.state = Named; - self.name_buf_opt = Some(StrTendril::new()); + self.state = Named(NamedReferenceTokenizerState::new( + self.addnl_allowed.is_some(), + )); Progress }, None => Stuck, @@ -272,156 +281,6 @@ impl CharRefTokenizer { self.finish_one(c) } - fn do_named( - &mut self, - tokenizer: &XmlTokenizer, - input: &BufferQueue, - ) -> Status { - let Some(c) = tokenizer.get_char(input) else { - return Stuck; - }; - self.name_buf_mut().push_char(c); - match data::NAMED_ENTITIES.get(&self.name_buf()[..]) { - // We have either a full match or a prefix of one. - Some(&m) => { - if m.0 != 0 { - // We have a full match, but there might be a longer one to come. - self.name_match = Some(m); - self.name_len = self.name_buf().len(); - } - // Otherwise we just have a prefix match. - Progress - }, - - // Can't continue the match. - None => self.finish_named(tokenizer, Some(c), input), - } - } - - fn emit_name_error(&mut self, tokenizer: &XmlTokenizer) { - let msg = if tokenizer.opts.exact_errors { - Cow::from(format!("Invalid character reference &{}", self.name_buf())) - } else { - Cow::from("Invalid character reference") - }; - tokenizer.emit_error(msg); - } - - fn unconsume_name( - &mut self, - tokenizer: &XmlTokenizer, - input: &BufferQueue, - ) { - tokenizer.unconsume(input, self.name_buf_opt.take().unwrap()); - } - - fn finish_named( - &mut self, - tokenizer: &XmlTokenizer, - end_char: Option, - input: &BufferQueue, - ) -> Status { - match self.name_match { - None => { - match end_char { - Some(c) if c.is_ascii_alphanumeric() => { - // Keep looking for a semicolon, to determine whether - // we emit a parse error. - self.state = BogusName; - return Progress; - }, - - // Check length because &; is not a parse error. - Some(';') if self.name_buf().len() > 1 => self.emit_name_error(tokenizer), - - _ => (), - } - self.unconsume_name(tokenizer, input); - self.finish_none() - }, - - Some((c1, c2)) => { - // We have a complete match, but we may have consumed - // additional characters into self.name_buf. Usually - // at least one, but several in cases like - // - // ¬ => match for U+00AC - // ¬i => valid prefix for ¬in - // ¬it => can't continue match - - let name_len = self.name_len; - assert!(name_len > 0); - let last_matched = self.name_buf()[name_len - 1..].chars().next().unwrap(); - - // There might not be a next character after the match, if - // we had a full match and then hit EOF. - let next_after = if name_len == self.name_buf().len() { - None - } else { - Some(self.name_buf()[name_len..].chars().next().unwrap()) - }; - - // "If the character reference is being consumed as part of an - // attribute, and the last character matched is not a U+003B - // SEMICOLON character (;), and the next character is either a - // U+003D EQUALS SIGN character (=) or an alphanumeric ASCII - // character, then, for historical reasons, all the characters - // that were matched after the U+0026 AMPERSAND character (&) - // must be unconsumed, and nothing is returned. However, if - // this next character is in fact a U+003D EQUALS SIGN - // character (=), then this is a parse error" - - let unconsume_all = match (self.addnl_allowed, last_matched, next_after) { - (_, ';', _) => false, - (Some(_), _, Some('=')) => { - tokenizer.emit_error(Borrowed( - "Equals sign after character reference in attribute", - )); - true - }, - (Some(_), _, Some(c)) if c.is_ascii_alphanumeric() => true, - _ => { - tokenizer.emit_error(Borrowed( - "Character reference does not end with semicolon", - )); - false - }, - }; - - if unconsume_all { - self.unconsume_name(tokenizer, input); - self.finish_none() - } else { - tokenizer - .unconsume(input, StrTendril::from_slice(&self.name_buf()[name_len..])); - self.result = Some(CharRef { - chars: [from_u32(c1).unwrap(), from_u32(c2).unwrap()], - num_chars: if c2 == 0 { 1 } else { 2 }, - }); - Done - } - }, - } - } - - fn do_bogus_name( - &mut self, - tokenizer: &XmlTokenizer, - input: &BufferQueue, - ) -> Status { - let Some(c) = tokenizer.get_char(input) else { - return Stuck; - }; - self.name_buf_mut().push_char(c); - match c { - _ if c.is_ascii_alphanumeric() => return Progress, - ';' => self.emit_name_error(tokenizer), - _ => (), - } - self.unconsume_name(tokenizer, input); - self.finish_none() - } - pub fn end_of_file( &mut self, tokenizer: &XmlTokenizer, @@ -438,10 +297,18 @@ impl CharRefTokenizer { self.finish_numeric(tokenizer); }, - Named => drop(self.finish_named(tokenizer, None, input)), + Named(ref mut state) => { + let character_reference = state + .notify_end_of_file(input, |error| tokenizer.emit_error(error)) + .unwrap_or(CharRef::EMPTY); + self.result = Some(character_reference); + }, - BogusName => { - self.unconsume_name(tokenizer, input); + BogusName(ref mut bogus_name) => { + input.push_front(bogus_name.clone()); + if bogus_name.ends_with(';') { + tokenizer.emit_error(Cow::from(format_name_error(&bogus_name))); + } self.finish_none(); }, diff --git a/xml5ever/src/tokenizer/mod.rs b/xml5ever/src/tokenizer/mod.rs index 3834598a..837b8703 100644 --- a/xml5ever/src/tokenizer/mod.rs +++ b/xml5ever/src/tokenizer/mod.rs @@ -27,12 +27,12 @@ use std::cell::{Cell, RefCell, RefMut}; use std::collections::BTreeMap; use std::mem::replace; -use self::buffer_queue::{BufferQueue, FromSet, NotFromSet, SetResult}; -use self::char_ref::{CharRef, CharRefTokenizer}; -use self::qname::QualNameTokenizer; -use self::states::XmlState; -use self::states::{DoctypeKind, Public, System}; -use self::states::{DoubleQuoted, SingleQuoted, Unquoted}; +use buffer_queue::{BufferQueue, FromSet, NotFromSet, SetResult}; +use char_ref::CharRefTokenizer; +use qname::QualNameTokenizer; +use states::{AttrValueKind::*, DoctypeKind, DoctypeKind::*, XmlState}; + +use html_named_entities::CharRef; /// Copy of Tokenizer options, with an impl for `Default`. #[derive(Copy, Clone)] @@ -51,7 +51,7 @@ pub struct XmlTokenizerOpts { /// Initial state override. Only the test runner should use /// a non-`None` value! - pub initial_state: Option, + pub initial_state: Option, } fn process_qname(tag_name: StrTendril) -> QualName { @@ -104,7 +104,7 @@ pub struct XmlTokenizer { pub sink: Sink, /// The abstract machine state as described in the spec. - state: Cell, + state: Cell, /// Are we at the end of the file, once buffers have been processed /// completely? This affects whether we will wait for lookahead or not. @@ -158,7 +158,7 @@ pub struct XmlTokenizer { current_pi_data: RefCell, /// Record of how many ns we spent in each state, if profiling is enabled. - state_profile: RefCell>, + state_profile: RefCell>, /// Record of how many ns we spent in the token sink. time_in_sink: Cell, @@ -171,7 +171,7 @@ impl XmlTokenizer { panic!("Can't profile tokenizer when built as a C library"); } - let state = *opts.initial_state.as_ref().unwrap_or(&states::Data); + let state = *opts.initial_state.as_ref().unwrap_or(&XmlState::Data); let discard_bom = opts.discard_bom; XmlTokenizer { opts, @@ -578,9 +578,9 @@ macro_rules! go ( // These can only come at the end. - ( $me:ident : to $s:ident ) => ({ $me.state.set(states::$s); return ProcessResult::Continue; }); - ( $me:ident : to $s:ident $k1:expr ) => ({ $me.state.set(states::$s($k1)); return ProcessResult::Continue; }); - ( $me:ident : to $s:ident $k1:ident $k2:expr ) => ({ $me.state.set(states::$s($k1($k2))); return ProcessResult::Continue; }); + ( $me:ident : to $s:ident ) => ({ $me.state.set(XmlState::$s); return ProcessResult::Continue; }); + ( $me:ident : to $s:ident $k1:expr ) => ({ $me.state.set(XmlState::$s($k1)); return ProcessResult::Continue; }); + ( $me:ident : to $s:ident $k1:ident $k2:expr ) => ({ $me.state.set(XmlState::$s($k1($k2))); return ProcessResult::Continue; }); ( $me:ident : reconsume $s:ident ) => ({ $me.reconsume.set(true); go!($me: to $s); }); ( $me:ident : reconsume $s:ident $k1:expr ) => ({ $me.reconsume.set(true); go!($me: to $s $k1); }); @@ -591,28 +591,28 @@ macro_rules! go ( // We have a default next state after emitting a tag, but the sink can override. ( $me:ident : emit_tag $s:ident ) => ({ - $me.state.set(states::$s); + $me.state.set(XmlState::$s); return $me.emit_current_tag(); }); // We have a special when dealing with empty and short tags in Xml ( $me:ident : emit_short_tag $s:ident ) => ({ - $me.state.set(states::$s); + $me.state.set(XmlState::$s); return $me.emit_short_tag(); }); ( $me:ident : emit_empty_tag $s:ident ) => ({ - $me.state.set(states::$s); + $me.state.set(XmlState::$s); return $me.emit_empty_tag(); }); ( $me:ident : emit_start_tag $s:ident ) => ({ - $me.state.set(states::$s); + $me.state.set(XmlState::$s); return $me.emit_start_tag(); }); ( $me:ident : emit_pi $s:ident ) => ({ - $me.state.set(states::$s); + $me.state.set(XmlState::$s); return $me.emit_pi(); }); @@ -1137,7 +1137,7 @@ impl XmlTokenizer { #[cfg(not(for_c))] fn dump_profile(&self) { - let mut results: Vec<(states::XmlState, u64)> = self + let mut results: Vec<(XmlState, u64)> = self .state_profile .borrow() .iter() @@ -1225,9 +1225,9 @@ impl XmlTokenizer { for i in 0..num_chars { let c = chars[i as usize]; match self.state.get() { - states::Data | states::Cdata => go!(self: emit c), + XmlState::Data | XmlState::Cdata => go!(self: emit c), - states::TagAttrValue(_) => go!(self: push_value c), + XmlState::TagAttrValue(_) => go!(self: push_value c), _ => panic!( "state {:?} should not be reachable in process_char_ref", diff --git a/xml5ever/src/tokenizer/states.rs b/xml5ever/src/tokenizer/states.rs index 5e9a19a4..c7aef3ad 100644 --- a/xml5ever/src/tokenizer/states.rs +++ b/xml5ever/src/tokenizer/states.rs @@ -9,10 +9,6 @@ //! Tokenizer states. -pub use AttrValueKind::*; -pub use DoctypeKind::*; -pub use XmlState::*; - /// Specifies either the public or system identifier from a [Document Type Declaration] (DTD). /// /// [Document Type Declaration]: https://en.wikipedia.org/wiki/Document_type_declaration