diff --git a/build.rs b/build.rs
index 82f44e9..37d42d6 100644
--- a/build.rs
+++ b/build.rs
@@ -1,9 +1,10 @@
const LINE_BREAK_TABLE_URL: &str = "http://www.unicode.org/Public/UCD/latest/ucd/LineBreak.txt";
-use std::fs::File;
-use std::io::prelude::*;
-use std::io::BufReader;
-use std::path::PathBuf;
-use std::process::Command;
+use std::{
+ fs::File,
+ io::{prelude::*, BufReader},
+ path::PathBuf,
+ process::Command,
+};
include!("src/text_processing/types.rs");
@@ -23,7 +24,7 @@ fn main() -> Result<(), std::io::Error> {
);
tmpdir_path.push("LineBreak.txt");
Command::new("curl")
- .args(&["-o", tmpdir_path.to_str().unwrap(), LINE_BREAK_TABLE_URL])
+ .args(["-o", tmpdir_path.to_str().unwrap(), LINE_BREAK_TABLE_URL])
.output()?;
let file = File::open(&tmpdir_path)?;
@@ -38,7 +39,8 @@ fn main() -> Result<(), std::io::Error> {
let tokens: &str = line.split_whitespace().next().unwrap();
let semicolon_idx: usize = tokens.chars().position(|c| c == ';').unwrap();
- /* LineBreak.txt list is ascii encoded so we can assume each char takes one byte: */
+ // LineBreak.txt list is ascii encoded so we can assume each char takes one
+ // byte:
let chars_str: &str = &tokens[..semicolon_idx];
let mut codepoint_iter = chars_str.split("..");
diff --git a/rustfmt.toml b/rustfmt.toml
new file mode 100644
index 0000000..0038b1d
--- /dev/null
+++ b/rustfmt.toml
@@ -0,0 +1,8 @@
+edition = "2018"
+format_generated_files = false
+format_code_in_doc_comments = true
+format_strings = true
+imports_granularity = "Crate"
+group_imports = "StdExternalCrate"
+wrap_comments = true
+normalize_comments = true
diff --git a/src/components.rs b/src/components.rs
index efb500a..b9e88ec 100644
--- a/src/components.rs
+++ b/src/components.rs
@@ -1,43 +1,42 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
-/*!
-Components are ways to handle application data. They can draw on the terminal and receive events, but also do other stuff as well. (For example, see the `notifications` module.)
+//! Components are ways to handle application data. They can draw on the
+//! terminal and receive events, but also do other stuff as well. (For example,
+//! see the `notifications` module.)
+//!
+//! See the `Component` Trait for more details.
-See the `Component` Trait for more details.
-*/
-
-use crate::state::*;
-use crate::terminal::*;
+use crate::{state::*, terminal::*};
mod utilities;
pub use utilities::*;
mod kernel;
pub use kernel::*;
pub mod processes;
-pub use processes::*;
+use std::{
+ collections::{HashMap, VecDeque},
+ fmt,
+ fmt::{Debug, Display},
+};
-use std::collections::{HashMap, VecDeque};
-use std::fmt;
-use std::fmt::{Debug, Display};
+pub use processes::*;
use super::{Key, UIEvent};
// The upper and lower boundary char. const HORZ_BOUNDARY: char = '─';
@@ -47,8 +46,6 @@ pub type ShortcutMap = HashMap<&'static str, Key>;
pub type ShortcutMaps = HashMap;
/// Types implementing this Trait can draw on the terminal and receive events.
-/// If a type wants to skip drawing if it has not changed anything, it can hold some flag in its
-/// fields (eg self.dirty = false) and act upon that in their `draw` implementation.
pub trait Component: Display + Debug + Send {
fn draw(
&mut self,
@@ -74,16 +71,15 @@ pub fn create_box(grid: &mut CellBuffer, area: Area) {
let upper_left = upper_left!(area);
let bottom_right = bottom_right!(area);
- /*for x in get_x(upper_left)..=get_x(bottom_right) {
- grid[(x, get_y(upper_left))].set_ch(HORZ_BOUNDARY);
- grid[(x, get_y(bottom_right))].set_ch(HORZ_BOUNDARY);
- grid[(x, get_y(bottom_right))].set_ch('▒');
- grid[(x, get_y(bottom_right))].set_fg(Color::Byte(240));
- }
- */
+ // for x in get_x(upper_left)..=get_x(bottom_right) {
+ // grid[(x, get_y(upper_left))].set_ch(HORZ_BOUNDARY);
+ // grid[(x, get_y(bottom_right))].set_ch(HORZ_BOUNDARY);
+ // grid[(x, get_y(bottom_right))].set_ch('▒');
+ // grid[(x, get_y(bottom_right))].set_fg(Color::Byte(240));
+ // }
for y in get_y(upper_left)..=get_y(bottom_right) {
- //grid[(get_x(upper_left), y)].set_ch(VERT_BOUNDARY);
+ // grid[(get_x(upper_left), y)].set_ch(VERT_BOUNDARY);
grid[(get_x(bottom_right), y)]
.set_ch('▒')
.set_fg(Color::Byte(240));
diff --git a/src/components/kernel.rs b/src/components/kernel.rs
index 33d3295..0e08d72 100644
--- a/src/components/kernel.rs
+++ b/src/components/kernel.rs
@@ -1,32 +1,29 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+
+use std::{fs::File, io::prelude::*, str::FromStr};
use super::*;
-use std::fs::File;
-use std::io::prelude::*;
-use std::str::FromStr;
-/* if cpu_no > MAX_CPU_ROWS, the cpu bars wrap in columns */
+/// if cpu_no > MAX_CPU_ROWS, the cpu bars wrap in columns
static MAX_CPU_ROWS: usize = 5;
-/* Kernel metrics components */
+/// Kernel metrics components
#[derive(Debug)]
pub struct KernelMetrics {
hostname: String,
@@ -44,6 +41,12 @@ impl fmt::Display for KernelMetrics {
}
}
+impl Default for KernelMetrics {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
impl KernelMetrics {
pub fn new() -> Self {
let mut file = File::open("/proc/sys/kernel/hostname").expect(crate::PROC_FS_ERROR_STR);
@@ -68,35 +71,36 @@ impl KernelMetrics {
}
}
- /* Returns width of entire widget */
+ /// Returns width of entire widget
fn draw_cpu_bars(&mut self, grid: &mut CellBuffer, area: Area) -> usize {
let upper_left = upper_left!(area);
let total_cols = width!(area);
- /* no of bars is no of CPUs along with the total CPU usage */
+ // no of bars is no of CPUs along with the total CPU usage
let cpu_no = self.cpu_stat.len();
- /* Calculate how much horizontal space the labels (ie CPU0, CPU1, CPU2) take in order to
- * distribute the remainder for each column, specifically the bars */
+ // Calculate how much horizontal space the labels (ie CPU0, CPU1, CPU2) take
+ // in order to distribute the remainder for each column, specifically
+ // the bars
let mut cpu_label_space = 0;
let mut cpu_bar_columns = 0;
let mut i = 0;
while i < cpu_no {
- /* Reserve space for CPU labels */
+ // Reserve space for CPU labels
if i < 10 {
- /* label will be " CPU0 " */
+ // label will be " CPU0 "
cpu_label_space += 7;
} else if i < 100 {
- /* label will be " CPU32 " */
+ // label will be " CPU32 "
cpu_label_space += 8;
} else {
- /* label will be " CPU128 " */
+ // label will be " CPU128 "
cpu_label_space += 9;
}
- /* each column holds MAX_CPU_ROWS */
+ // each column holds MAX_CPU_ROWS
i += MAX_CPU_ROWS;
cpu_bar_columns += 1;
}
- /* max width of each cpu bar */
+ // max width of each cpu bar
let bar_width = if cpu_no < MAX_CPU_ROWS {
total_cols
} else {
@@ -132,7 +136,7 @@ impl KernelMetrics {
None,
)
} else {
- /* add padding */
+ // add padding
let (x, y) = write_string_to_grid(
"Σ",
grid,
@@ -157,7 +161,7 @@ impl KernelMetrics {
};
x += 2;
- /* Calculate percentages for the cpu usage bar */
+ // Calculate percentages for the cpu usage bar
let bar_length: usize = ((cpu_stat
.busy_time()
.saturating_sub(self.cpu_stat[i].busy_time())
@@ -170,7 +174,7 @@ impl KernelMetrics {
return x_offset;
}
- /* Sometimes you draw the bar */
+ // Sometimes you draw the bar
let mut _x_offset = 0;
while _x_offset < bar_length {
write_string_to_grid(
@@ -184,7 +188,7 @@ impl KernelMetrics {
);
_x_offset += 1;
}
- /* and sometimes the bar draws you */
+ // and sometimes the bar draws you
while _x_offset <= bar_width {
write_string_to_grid(
"▁",
@@ -224,26 +228,24 @@ impl KernelMetrics {
let upper_left = upper_left!(area);
let bottom_right = bottom_right!(area);
if bars_max == 0 {
- /* In first draw, we have no cpu data since there is no previous measurement to use
- * in the calculation so bars_max will be 0 */
+ // In first draw, we have no cpu data since there is no previous measurement
+ // to use in the calculation so bars_max will be 0
return;
}
let (available, total) = get_mem_info();
- /* available_length == the length the spaces takes up in this case:
- * |******** | 50%
- */
+ // available_length == the length the spaces takes up in this case:
+ // |******** | 50%
let available_length = ((available as f64 / total as f64) * (bars_max * 8) as f64) as usize;
- /* mem_bar length == the length the asterisks takes up in this case:
- * |******** | 50%
- */
+ // mem_bar length == the length the asterisks takes up in this case:
+ // |******** | 50%
let mem_bar_length = bars_max * 8 - available_length;
let mem_display = format!(
"RAM {}/{}",
Bytes((total - available) * 1024).as_convenient_string(),
Bytes(total * 1024).as_convenient_string()
);
- /* Put the "RAM XGB/YGB" in the middle of the RAM bar */
+ // Put the "RAM XGB/YGB" in the middle of the RAM bar
let mem_display_padding = bars_max.saturating_sub(mem_display.len()) / 2;
let y_offset = 2 + MAX_CPU_ROWS;
@@ -369,7 +371,7 @@ impl Component for KernelMetrics {
self.dirty = false;
}
- /* Draw uptime */
+ // Draw uptime
let mut file = File::open("/proc/uptime").expect(crate::PROC_FS_ERROR_STR);
self.uptime.clear();
file.read_to_string(&mut self.uptime).unwrap();
@@ -406,9 +408,9 @@ impl Component for KernelMetrics {
}
let old_cpu_stat = self.cpu_stat[0];
- /* Draw CPU usage bars */
+ // Draw CPU usage bars
- /* max width of cpu bar area */
+ // max width of cpu bar area
let bars_max = (0.6 * total_cols as f32) as usize;
let cpu_widget_width = self.draw_cpu_bars(
grid,
@@ -417,14 +419,14 @@ impl Component for KernelMetrics {
pos_inc(upper_left, (bars_max + 1, MAX_CPU_ROWS + 1)),
),
);
- /* Draw RAM usage bar */
+ // Draw RAM usage bar
self.draw_ram_bar(grid, area, cpu_widget_width.saturating_sub(2));
- /* Various values table */
- /* max width of cpu bar area */
+ // Various values table
+ // max width of cpu bar area
let bars_max = (0.6 * total_cols as f32) as usize;
- /* CPU Times */
+ // CPU Times
let mut cpu_column_width = "CPU".len();
let upper_left = pos_inc(upper_left, (bars_max + 5, 2));
clear_area(grid, (upper_left, bottom_right));
@@ -471,7 +473,7 @@ impl Component for KernelMetrics {
cpu_column_width = std::cmp::max(tag.len() + s.len() + 4, cpu_column_width);
}
- /* Load average */
+ // Load average
let upper_left = pos_inc(upper_left, (cpu_column_width + 3, 0));
if get_x(upper_left) >= get_x(bottom_right) {
return;
@@ -512,11 +514,8 @@ impl Component for KernelMetrics {
}
fn process_event(&mut self, event: &mut UIEvent, _ui_mode: &mut UIMode) {
- match event {
- UIEvent::Resize => {
- self.dirty = true;
- }
- _ => {}
+ if let UIEvent::Resize = event {
+ self.dirty = true;
}
}
@@ -538,11 +537,10 @@ fn get_mem_info() -> (usize, usize) {
let mut counter = 0;
for line in res.lines() {
if line.starts_with("MemTotal") {
- mem_total = usize::from_str(line.split_whitespace().skip(1).next().unwrap()).unwrap();
+ mem_total = usize::from_str(line.split_whitespace().nth(1).unwrap()).unwrap();
counter += 1;
} else if line.starts_with("MemAvailable") {
- mem_available =
- usize::from_str(line.split_whitespace().skip(1).next().unwrap()).unwrap();
+ mem_available = usize::from_str(line.split_whitespace().nth(1).unwrap()).unwrap();
counter += 1;
}
@@ -605,17 +603,17 @@ fn get_cpu_times(
},
));
};
- };
+ }
- /* user % */
+ // user %
val!("user ", user_time);
- /* system % */
+ // system %
val!("system ", system_time);
- /* nice % */
+ // nice %
val!("nice ", nice_time);
- /* idle % */
+ // idle %
val!("idle ", idle_time);
- /* iowait % */
+ // iowait %
val!("iowait ", iowait_time);
ret
diff --git a/src/components/processes.rs b/src/components/processes.rs
index 42b49b3..9c6129c 100644
--- a/src/components/processes.rs
+++ b/src/components/processes.rs
@@ -1,30 +1,32 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+
+use std::{
+ collections::{HashMap, HashSet},
+ fs::File,
+ io::prelude::*,
+ path::PathBuf,
+ str::FromStr,
+};
use super::*;
-use std::collections::{HashMap, HashSet};
-use std::fs::File;
-use std::io::prelude::*;
-use std::path::PathBuf;
-use std::str::FromStr;
+
#[derive(Debug)]
pub struct ProcessData {
cpu_stat: Stat,
@@ -36,7 +38,7 @@ pub struct ProcessData {
tree: Vec<(usize, Pid)>,
}
-const SIGNAL_LIST: &[(i32, &'static str)] = &[
+const SIGNAL_LIST: &[(i32, &str)] = &[
(1, "1 HUP"),
(2, "2 INT"),
(3, "3 QUIT"),
@@ -70,14 +72,14 @@ const SIGNAL_LIST: &[(i32, &'static str)] = &[
(31, "31 SYS"),
];
-//const ARROW_UP: &str = "↑";
-//const ARROW_DOWN: &str = "↓";
-//const ARROW_UP: &str = "▲";
-//const ARROW_DOWN: &str = "▼";
+// const ARROW_UP: &str = "↑";
+// const ARROW_DOWN: &str = "↓";
+// const ARROW_UP: &str = "▲";
+// const ARROW_DOWN: &str = "▼";
const ARROW_UP: &str = "🠉";
const ARROW_DOWN: &str = "🠋";
-/* Hold maximum width for each column */
+/// Hold maximum width for each column
#[derive(Debug)]
pub struct ColumnWidthMaxima {
pid: usize,
@@ -112,6 +114,11 @@ macro_rules! define_column_string {
pub fn len(&self) -> usize {
self.0.len()
}
+
+ #[allow(dead_code)]
+ pub fn is_empty(&self) -> bool {
+ self.0.len() == 0
+ }
}
impl std::fmt::Display for $typename {
@@ -148,7 +155,7 @@ enum Sort {
CmdLineDesc,
}
-/* Wrapper type for display strings */
+/// Wrapper type for display strings
#[derive(Debug)]
pub struct ProcessDisplay {
pub i: Pid,
@@ -165,31 +172,29 @@ pub struct ProcessDisplay {
pub is_thread: bool,
}
-/* process list components */
+/// Process list component
#[derive(Debug)]
pub struct ProcessList {
page_movement: Option,
- cpu_stat: Stat,
data: ProcessData,
cursor: usize,
height: usize,
dirty: bool,
force_redraw: bool,
maxima: ColumnWidthMaxima,
- /* stop updating data */
+ /// stop updating data
freeze: bool,
draw_tree: bool,
draw_help: bool,
- processes_times: HashMap,
- threads_times: HashMap,
processes: Vec,
sort: Sort,
mode: FunctionModes,
}
-#[derive(Debug, PartialEq)]
+#[derive(Debug, PartialEq, Default)]
enum Input {
Active,
+ #[default]
Inactive,
}
@@ -205,11 +210,6 @@ impl Input {
}
}
-impl Default for Input {
- fn default() -> Self {
- Inactive
- }
-}
use Input::*;
const FOLLOW_ACTIVE: u8 = 0x01;
@@ -223,7 +223,9 @@ const FILTER_ACTIVE: u8 = 0x40;
struct FunctionModes {
follow: Pid,
locate: Pid,
- search: (String, usize, usize, bool), /* (search term, current result y_offset, previous result offset, is cursor focused on results?) */
+ /// (search term, current result y_offset, previous result offset, is cursor
+ /// focused on results?)
+ search: (String, usize, usize, bool),
kill: u16,
filter: String,
active: u8,
@@ -239,19 +241,19 @@ impl FunctionModes {
#[derive(Debug, PartialEq)]
pub enum State {
- /* Z Zombie */
+ /// `Z` Zombie
Zombie,
- /* R Running */
+ /// `R` Running
Running,
- /* S Sleeping in an interruptible wait */
+ /// `S` Sleeping in an interruptible wait
Sleeping,
- /* D Waiting in uninterruptible disk sleep */
+ /// `D` Waiting in uninterruptible disk sleep
Waiting,
- /* T Stopped (on a signal) or (before Linux 2.6.33) trace stopped */
+ /// `T` Stopped (on a signal) or (before Linux 2.6.33) trace stopped
Stopped,
- /* t Tracing stop (Linux 2.6.33 onward) */
+ /// `t` Tracing stop (Linux 2.6.33 onward)
Tracing,
- /* X Dead (from Linux 2.6.0 onward) */
+ /// `X` Dead (from Linux 2.6.0 onward)
Dead,
}
@@ -306,6 +308,12 @@ impl fmt::Display for ProcessList {
}
}
+impl Default for ProcessList {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
impl ProcessList {
pub fn new() -> Self {
let data = ProcessData {
@@ -320,11 +328,8 @@ impl ProcessList {
ProcessList {
cursor: 0,
page_movement: None,
- cpu_stat: get_stat(&mut 0).remove(0),
data,
processes: Vec::with_capacity(1024),
- processes_times: Default::default(),
- threads_times: Default::default(),
height: 0,
maxima: ColumnWidthMaxima::new(),
freeze: false,
@@ -384,8 +389,7 @@ impl ProcessList {
.map(|(k, v)| (*k, v))
.collect::>();
shortcuts.sort_by_key(|s| s.0);
- let mut y = 0;
- for (k, v) in shortcuts.iter() {
+ for (y, (k, v)) in shortcuts.iter().enumerate() {
write_string_to_grid(
&format!("{k:>max_key$} {v}", k = k, v = v, max_key = max_key),
grid,
@@ -393,12 +397,11 @@ impl ProcessList {
Color::Default,
Attr::Default,
(
- pos_inc(upper_left!(box_area), (2, 4 + y)),
+ pos_inc(upper_left!(box_area), (2, y + 4)),
bottom_right!(box_area),
),
None,
);
- y += 1;
}
let box_area = (
(margin_left, margin_top + 13),
@@ -448,20 +451,23 @@ impl ProcessList {
let p = &self.processes[self.data.processes_index[pid]];
if self.mode.is_active(SEARCH_ACTIVE) {
let (ref search, ref mut n, ref mut n_prev, is_cursor_focused) = self.mode.search;
- if (*n != *n_prev || tick) && is_cursor_focused {
- if !stop_search && search.len() > 1 && p.cmd_line.0.contains(search) {
- if search_results == *n {
- let i = y_offset;
- pages = i / height;
- self.cursor = i;
- stop_search = true;
- *n_prev = *n;
- } else {
- search_results += 1;
- }
- if search_results < *n {
- *n = search_results;
- }
+ if (*n != *n_prev || tick)
+ && is_cursor_focused
+ && !stop_search
+ && search.len() > 1
+ && p.cmd_line.0.contains(search)
+ {
+ if search_results == *n {
+ let i = y_offset;
+ pages = i / height;
+ self.cursor = i;
+ stop_search = true;
+ *n_prev = *n;
+ } else {
+ search_results += 1;
+ }
+ if search_results < *n {
+ *n = search_results;
}
}
}
@@ -472,7 +478,7 @@ impl ProcessList {
.data
.parents
.get(&p.p)
- .and_then(|v| Some(v.len() - 1))
+ .map(|v| v.len() - 1)
.unwrap_or(0)
})
.unwrap_or(false);
@@ -492,16 +498,12 @@ impl ProcessList {
} else {
s.push(' ');
}
- if i > 0 {}
s.push(' ');
}
if *ind > 0 || (has_sibling || is_first) {
if p.is_thread {
- if has_sibling && is_first {
- s.push(' ');
- s.push('┠');
- } else if has_sibling {
+ if has_sibling {
s.push(' ');
s.push('┠');
} else {
@@ -510,10 +512,7 @@ impl ProcessList {
}
s.push('┄');
} else {
- if has_sibling && is_first {
- s.push(' ');
- s.push('┣');
- } else if has_sibling {
+ if has_sibling {
s.push(' ');
s.push('┣');
} else {
@@ -568,8 +567,10 @@ impl ProcessList {
match executable_path_color(&p.cmd_line) {
Ok((path, bin, rest)) => {
let (x, _) = write_string_to_grid(
- &format!(
- "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} {branches}",
+ &format!(
+ "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} \
+ {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% \
+ {state:>max_state$} {branches}",
pid = p.pid,
ppid = p.ppid,
username = p.username,
@@ -583,13 +584,14 @@ impl ProcessList {
max_cpu_percent = self.maxima.cpu_percent,
max_state = self.maxima.state,
branches = s,
- ),
- grid,
- fg_color,
- bg_color,
- Attr::Default,
- (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
- None,);
+ ),
+ grid,
+ fg_color,
+ bg_color,
+ Attr::Default,
+ (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
+ None,
+ );
if p.state == State::Running {
grid[pos_inc(
upper_left,
@@ -652,8 +654,10 @@ impl ProcessList {
}
Err((bin, rest)) => {
let (x, _) = write_string_to_grid(
- &format!(
- "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} {branches}",
+ &format!(
+ "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} \
+ {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% \
+ {state:>max_state$} {branches}",
pid = p.pid,
ppid = p.ppid,
username = p.username,
@@ -667,13 +671,14 @@ impl ProcessList {
max_cpu_percent = self.maxima.cpu_percent,
max_state = self.maxima.state,
branches = s,
- ),
- grid,
- fg_color,
- bg_color,
- Attr::Default,
- (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
- None,);
+ ),
+ grid,
+ fg_color,
+ bg_color,
+ Attr::Default,
+ (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
+ None,
+ );
if p.state == State::Running {
grid[pos_inc(
upper_left,
@@ -732,8 +737,8 @@ impl ProcessList {
}
}
-/* Prints the process list */
impl Component for ProcessList {
+ /// Prints the process list
fn draw(
&mut self,
grid: &mut CellBuffer,
@@ -753,7 +758,7 @@ impl Component for ProcessList {
let mut upper_left = pos_inc(upper_left!(area), (1, 0));
let bottom_right = pos_dec(bottom_right!(area), (1, 1));
- /* Reserve first row for column headers */
+ // Reserve first row for column headers
let height = height!(area)
- 2
- if self.mode.is_active(LOCATE_ACTIVE) {
@@ -809,7 +814,7 @@ impl Component for ProcessList {
dirty_areas.push_back(area);
if !self.freeze && update_maxima {
- /* Keep tabs on biggest element in each column */
+ // Keep tabs on biggest element in each column
self.maxima = ColumnWidthMaxima::new();
for p in &self.processes {
@@ -871,34 +876,65 @@ impl Component for ProcessList {
None
};
- /* Write column headers */
+ // Write column headers
let (x, y) = write_string_to_grid(
&format!(
- "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$}{usernamesort} {vm_rss:>max_vm_rss$}{vmrsssort} {cpu_percent:>max_cpu_percent$}{cpusort} {state:>max_state$} {cmd_line}{cmd_linesort}",
+ "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$}{usernamesort} \
+ {vm_rss:>max_vm_rss$}{vmrsssort} {cpu_percent:>max_cpu_percent$}{cpusort} \
+ {state:>max_state$} {cmd_line}{cmd_linesort}",
pid = "PID",
- ppid ="PPID",
+ ppid = "PPID",
username = "USER",
vm_rss = "VM_RSS",
cpu_percent = " CPU%",
state = " ",
- cmd_line = if let Some(ref cmd_header) = cmd_header { &cmd_header } else { "CMD_LINE"} ,
+ cmd_line = if let Some(ref cmd_header) = cmd_header {
+ &cmd_header
+ } else {
+ "CMD_LINE"
+ },
max_pid = self.maxima.pid,
max_ppid = self.maxima.ppid,
max_username = self.maxima.username,
max_vm_rss = self.maxima.vm_rss,
max_cpu_percent = self.maxima.cpu_percent,
max_state = self.maxima.state,
- usernamesort = if let Sort::UserAsc = self.sort { ARROW_UP } else if let Sort::UserDesc = self.sort { ARROW_DOWN } else { " " },
- vmrsssort = if let Sort::VmRssAsc = self.sort { ARROW_UP } else if let Sort::VmRssDesc = self.sort { ARROW_DOWN } else { " " },
- cpusort = if let Sort::CpuAsc = self.sort { ARROW_UP } else if let Sort::CpuDesc = self.sort { ARROW_DOWN } else { " " },
- cmd_linesort = if let Sort::CmdLineAsc = self.sort { ARROW_UP } else if let Sort::CmdLineDesc = self.sort { ARROW_DOWN } else { "" },
+ usernamesort = if let Sort::UserAsc = self.sort {
+ ARROW_UP
+ } else if let Sort::UserDesc = self.sort {
+ ARROW_DOWN
+ } else {
+ " "
+ },
+ vmrsssort = if let Sort::VmRssAsc = self.sort {
+ ARROW_UP
+ } else if let Sort::VmRssDesc = self.sort {
+ ARROW_DOWN
+ } else {
+ " "
+ },
+ cpusort = if let Sort::CpuAsc = self.sort {
+ ARROW_UP
+ } else if let Sort::CpuDesc = self.sort {
+ ARROW_DOWN
+ } else {
+ " "
+ },
+ cmd_linesort = if let Sort::CmdLineAsc = self.sort {
+ ARROW_UP
+ } else if let Sort::CmdLineDesc = self.sort {
+ ARROW_DOWN
+ } else {
+ ""
+ },
),
grid,
Color::Black,
Color::White,
Attr::Default,
(pos_inc(upper_left, (0, 1)), bottom_right),
- None,);
+ None,
+ );
if self.mode.is_active(SEARCH_ACTIVE | FILTER_ACTIVE) && self.mode.input == Active {
grid[(x - 1, y)].set_fg(Color::White);
grid[(x - 1, y)].set_bg(Color::Black);
@@ -910,7 +946,7 @@ impl Component for ProcessList {
Some(Color::White),
);
- /* Write current selected status if any. eg. if list is frozen, show 'FROZEN'. */
+ // Write current selected status if any. eg. if list is frozen, show 'FROZEN'.
{
let (mut x, y) = set_y(upper_left!(area), get_y(bottom_right) + 1);
if self.freeze {
@@ -1057,27 +1093,30 @@ impl Component for ProcessList {
match executable_path_color(&p.cmd_line) {
Ok((path, bin, rest)) => {
let (x, _) = write_string_to_grid(
- &format!(
- "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ",
- pid = p.pid,
- ppid = p.ppid,
- username = p.username,
- vm_rss = p.vm_rss,
- cpu_percent = (p.cpu_percent as f64 / 100.0),
- state = p.state,
- max_pid = self.maxima.pid,
- max_ppid = self.maxima.ppid,
- max_username = self.maxima.username,
- max_vm_rss = self.maxima.vm_rss,
- max_cpu_percent = self.maxima.cpu_percent,
- max_state = self.maxima.state,
+ &format!(
+ "{pid:>max_pid$} {ppid:>max_ppid$} \
+ {username:>max_username$} {vm_rss:>max_vm_rss$} \
+ {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ",
+ pid = p.pid,
+ ppid = p.ppid,
+ username = p.username,
+ vm_rss = p.vm_rss,
+ cpu_percent = (p.cpu_percent as f64 / 100.0),
+ state = p.state,
+ max_pid = self.maxima.pid,
+ max_ppid = self.maxima.ppid,
+ max_username = self.maxima.username,
+ max_vm_rss = self.maxima.vm_rss,
+ max_cpu_percent = self.maxima.cpu_percent,
+ max_state = self.maxima.state,
),
- grid,
- fg_color,
- bg_color,
- Attr::Default,
- (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
- None,);
+ grid,
+ fg_color,
+ bg_color,
+ Attr::Default,
+ (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
+ None,
+ );
if p.state == State::Running {
grid[pos_inc(
upper_left,
@@ -1140,27 +1179,30 @@ impl Component for ProcessList {
}
Err((bin, rest)) => {
let (x, _) = write_string_to_grid(
- &format!(
- "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ",
- pid = p.pid,
- ppid = p.ppid,
- username = p.username,
- vm_rss = p.vm_rss,
- cpu_percent = (p.cpu_percent as f64 / 100.0),
- state = p.state,
- max_pid = self.maxima.pid,
- max_ppid = self.maxima.ppid,
- max_username = self.maxima.username,
- max_vm_rss = self.maxima.vm_rss,
- max_cpu_percent = self.maxima.cpu_percent,
- max_state = self.maxima.state,
- ),
- grid,
- fg_color,
- bg_color,
- Attr::Default,
- (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
- None,);
+ &format!(
+ "{pid:>max_pid$} {ppid:>max_ppid$} \
+ {username:>max_username$} {vm_rss:>max_vm_rss$} \
+ {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ",
+ pid = p.pid,
+ ppid = p.ppid,
+ username = p.username,
+ vm_rss = p.vm_rss,
+ cpu_percent = (p.cpu_percent as f64 / 100.0),
+ state = p.state,
+ max_pid = self.maxima.pid,
+ max_ppid = self.maxima.ppid,
+ max_username = self.maxima.username,
+ max_vm_rss = self.maxima.vm_rss,
+ max_cpu_percent = self.maxima.cpu_percent,
+ max_state = self.maxima.state,
+ ),
+ grid,
+ fg_color,
+ bg_color,
+ Attr::Default,
+ (pos_inc(upper_left, (0, y_offset + 2)), bottom_right),
+ None,
+ );
if p.state == State::Running {
grid[pos_inc(
upper_left,
@@ -1302,46 +1344,44 @@ impl Component for ProcessList {
change_colors(grid, old_area, None, Some(bg_color));
dirty_areas.push_back(old_area);
dirty_areas.push_back(new_area);
- } else {
- if self.mode.is_active(FOLLOW_ACTIVE) {
- let pid = self.mode.follow;
- let info = format!("Following PID == {pid} || PPID == {pid}", pid = pid);
- let (_, y) = write_string_to_grid(
- &info,
- grid,
- Color::Default,
- Color::Default,
- Attr::Bold,
- (
- pos_inc(
- upper_left!(area),
- ((width / 2).saturating_sub(info.len() / 2), 1),
- ),
- bottom_right!(area),
+ } else if self.mode.is_active(FOLLOW_ACTIVE) {
+ let pid = self.mode.follow;
+ let info = format!("Following PID == {pid} || PPID == {pid}", pid = pid);
+ let (_, y) = write_string_to_grid(
+ &info,
+ grid,
+ Color::Default,
+ Color::Default,
+ Attr::Bold,
+ (
+ pos_inc(
+ upper_left!(area),
+ ((width / 2).saturating_sub(info.len() / 2), 1),
),
- None,
- );
- dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y)));
- } else if self.mode.is_active(LOCATE_ACTIVE) {
- let pid = self.mode.locate;
- let info = format!("Highlighting PID == {pid}", pid = pid);
- let (_, y) = write_string_to_grid(
- &info,
- grid,
- Color::Default,
- Color::Default,
- Attr::Bold,
- (
- pos_inc(
- upper_left!(area),
- ((width / 2).saturating_sub(info.len() / 2), 1),
- ),
- bottom_right!(area),
+ bottom_right!(area),
+ ),
+ None,
+ );
+ dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y)));
+ } else if self.mode.is_active(LOCATE_ACTIVE) {
+ let pid = self.mode.locate;
+ let info = format!("Highlighting PID == {pid}", pid = pid);
+ let (_, y) = write_string_to_grid(
+ &info,
+ grid,
+ Color::Default,
+ Color::Default,
+ Attr::Bold,
+ (
+ pos_inc(
+ upper_left!(area),
+ ((width / 2).saturating_sub(info.len() / 2), 1),
),
- None,
- );
- dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y)));
- }
+ bottom_right!(area),
+ ),
+ None,
+ );
+ dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y)));
}
if self.mode.is_active(KILL_ACTIVE) {
@@ -1357,18 +1397,16 @@ impl Component for ProcessList {
create_box(grid, box_area);
let mut x = 1;
for s in SIGNAL_LIST.chunks(11) {
- let mut y = 0;
- for sig in s {
+ for (y, sig) in s.iter().enumerate() {
write_string_to_grid(
sig.1,
grid,
Color::Default,
Color::Default,
Attr::Default,
- (pos_inc(upper_left!(box_area), (x, 1 + y)), bottom_right),
+ (pos_inc(upper_left!(box_area), (x, y + 1)), bottom_right),
None,
);
- y += 1;
}
x += 11;
}
@@ -1379,7 +1417,7 @@ impl Component for ProcessList {
clear_area(grid, box_area);
create_box(grid, box_area);
let signal_fmt = if n == 0 {
- format!("__")
+ "__".to_string()
} else if n < 32 {
format!("{} [{}]", SIGNAL_LIST[n as usize - 1].1, n)
} else {
@@ -1600,7 +1638,7 @@ impl Component for ProcessList {
self.force_redraw = true;
}
UIEvent::Input(k) if *k == map["cancel"] => {
- /* layered cancelling */
+ // layered cancelling
if self.mode.is_active(HELP_ACTIVE) {
self.mode.active &= !HELP_ACTIVE;
} else if self.mode.is_active(KILL_ACTIVE) {
@@ -1641,14 +1679,14 @@ impl Component for ProcessList {
&& f.is_numeric() =>
{
if self.mode.is_active(KILL_ACTIVE) {
- let ref mut n = self.mode.kill;
+ let n = &mut self.mode.kill;
if let Some(add) = (*n).checked_mul(10) {
*n = add
.checked_add(f.to_digit(10).unwrap() as u16)
.unwrap_or(*n);
}
} else {
- let ref mut p = self.mode.locate;
+ let p = &mut self.mode.locate;
if let Some(add) = (*p).checked_mul(10) {
*p = add
.checked_add(f.to_digit(10).unwrap() as i32)
@@ -1660,7 +1698,7 @@ impl Component for ProcessList {
UIEvent::Input(Key::Backspace) if self.mode.input == Active => {
if self.mode.is_active(KILL_ACTIVE) {
let n = &mut self.mode.kill;
- *n = *n / 10;
+ *n /= 10;
} else if self.mode.is_active(SEARCH_ACTIVE) {
let (ref mut p, ref mut n, ref mut n_prev, _) = self.mode.search;
if p.is_empty() {
@@ -1673,7 +1711,7 @@ impl Component for ProcessList {
}
} else if self.mode.is_active(LOCATE_ACTIVE) {
let p = &mut self.mode.locate;
- *p = *p / 10;
+ *p /= 10;
} else if self.mode.is_active(FILTER_ACTIVE) {
let filter = &mut self.mode.filter;
if filter.is_empty() {
@@ -1690,10 +1728,11 @@ impl Component for ProcessList {
UIEvent::Input(Key::Char('\n'))
if self.mode.input == Active && self.mode.is_active(KILL_ACTIVE) =>
{
- let ref n = self.mode.kill;
- use nix::sys::signal::kill;
+ let n = &self.mode.kill;
use std::convert::TryFrom;
+ use nix::sys::signal::kill;
+
kill(
nix::unistd::Pid::from_raw(self.get_pid_under_cursor(self.cursor)),
nix::sys::signal::Signal::try_from(*n as i32).unwrap(),
@@ -1721,7 +1760,7 @@ impl Component for ProcessList {
*n_prev = *n;
*n += 1;
} else {
- /* regain focus */
+ // regain focus
*n_prev = *n + 1;
*is_cursor_focused = true;
}
@@ -1732,7 +1771,7 @@ impl Component for ProcessList {
*n_prev = *n;
*n = (*n).saturating_sub(1);
} else {
- /* regain focus */
+ // regain focus
*n_prev = *n + 1;
*is_cursor_focused = true;
}
@@ -1798,15 +1837,13 @@ fn executable_path_color(p: &CmdLineString) -> Result<(&str, &str, &str), (&str,
Ok((path, rest, ""))
}
} else {
- return Err(p.split_at(first_whitespace));
+ Err(p.split_at(first_whitespace))
}
+ } else if let Some(path_end) = p.as_bytes().iter().rposition(|c| *c == b'/') {
+ let (path, bin) = p.split_at(path_end + 1);
+ Ok((path, bin, ""))
} else {
- if let Some(path_end) = p.as_bytes().iter().rposition(|c| *c == b'/') {
- let (path, bin) = p.split_at(path_end + 1);
- Ok((path, bin, ""))
- } else {
- return Err((p, ""));
- }
+ Err((p, ""))
}
}
@@ -1849,7 +1886,7 @@ fn get(data: &mut ProcessData, follow_pid: Option, sort: Sort) -> Vec, sort: Sort) -> Vec, sort: Sort) -> Vec, sort: Sort) -> Vec Result {
- /* proc file structure can be found in man 5 proc.*/
+ // proc file structure can be found in man 5 proc.
path.push("status");
let mut file: File = File::open(&path)?;
let mut res = String::with_capacity(2048);
@@ -2076,19 +2112,21 @@ fn get_pid_info(mut path: PathBuf, thread: bool) -> Result>().join(" "));
+ // values are separated by null bytes
+ ret.cmd_line = res.split('\0').collect::>().join(" ").to_string();
}
path.pop();
path.push("stat");
let mut file: File = File::open(&path)?;
res.clear();
file.read_to_string(&mut res)?;
- /* values are separated by whitespace and are in a specific order */
+ // values are separated by whitespace and are in a specific order
if !res.is_empty() {
let mut vals = res.split_whitespace().skip(13);
- ret.rtime = err!(usize::from_str(none_err!(vals.next()))); /* utime */
- ret.rtime += err!(usize::from_str(none_err!(vals.next()))); /* stime */
+ // utime
+ ret.rtime = err!(usize::from_str(none_err!(vals.next())));
+ // stime
+ ret.rtime += err!(usize::from_str(none_err!(vals.next())));
}
Ok(ret)
}
diff --git a/src/components/utilities.rs b/src/components/utilities.rs
index 95a04b2..f6db640 100644
--- a/src/components/utilities.rs
+++ b/src/components/utilities.rs
@@ -1,35 +1,34 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+
+//! Various useful utilities
-/*! Various useful components that can be used in a generic fashion.
- */
extern crate cassowary;
-use super::*;
-use std::fs::File;
-use std::io::prelude::*;
-use std::str::FromStr;
+use std::{fs::File, io::prelude::*, str::FromStr};
-use cassowary::strength::{REQUIRED, STRONG, WEAK};
-use cassowary::WeightedRelation::*;
-use cassowary::{Solver, Variable};
+use cassowary::{
+ strength::{REQUIRED, STRONG, WEAK},
+ Solver, Variable,
+ WeightedRelation::*,
+};
+
+use super::*;
#[derive(Debug)]
pub enum PageMovement {
@@ -125,16 +124,16 @@ pub fn get_stat(boot_time: &mut usize) -> Vec {
let mut mut_value_iter = line.split_whitespace().skip(1);
- let user_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let nice_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let system_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let idle_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let iowait_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let irq = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let soft_irq = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let steal = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let guest = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
- let guest_nice = usize::from_str(&mut_value_iter.next().unwrap()).unwrap();
+ let user_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let nice_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let system_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let idle_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let iowait_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let irq = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let soft_irq = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let steal = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let guest = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
+ let guest_nice = usize::from_str(mut_value_iter.next().unwrap()).unwrap();
ret.push(Stat {
user_time,
system_time,
@@ -151,7 +150,7 @@ pub fn get_stat(boot_time: &mut usize) -> Vec {
while !line.starts_with("btime") {
line = lines_iter.next().unwrap();
}
- *boot_time = usize::from_str(&line.split_whitespace().skip(1).next().unwrap()).unwrap();
+ *boot_time = usize::from_str(line.split_whitespace().nth(1).unwrap()).unwrap();
ret
}
@@ -216,10 +215,10 @@ impl Component for Window {
top_bars.top | LE(REQUIRED) | top_bars.bottom,
list.top | LE(REQUIRED) | list.bottom,
// preferred heights:
- top_bars.bottom - top_bars.top | GE(REQUIRED) | 6.0,
- top_bars.bottom - top_bars.top | EQ(WEAK) | 8.0,
- top_bars.bottom - top_bars.top | LE(REQUIRED) | 8.0,
- list.bottom - list.top | GE(REQUIRED) | 11.0,
+ (top_bars.bottom - top_bars.top) | GE(REQUIRED) | 6.0,
+ (top_bars.bottom - top_bars.top) | EQ(WEAK) | 8.0,
+ (top_bars.bottom - top_bars.top) | LE(REQUIRED) | 8.0,
+ (list.bottom - list.top) | GE(REQUIRED) | 11.0,
])
.unwrap();
@@ -268,7 +267,7 @@ impl Component for Window {
fn get_shortcuts(&self) -> ShortcutMaps {
let mut top_bars_map = self.top_bars.get_shortcuts();
- top_bars_map.extend(self.list.get_shortcuts().into_iter());
+ top_bars_map.extend(self.list.get_shortcuts());
top_bars_map
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 434f703..076b495 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,20 +1,18 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
diff --git a/src/main.rs b/src/main.rs
index 08683f3..7d0e545 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,36 +1,39 @@
-/*
- * bb - bin.rs
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb - bin.rs
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
extern crate crossbeam;
extern crate nix;
extern crate signal_hook;
extern crate termion;
-use crossbeam::channel::{bounded, tick};
-use crossbeam::select;
-use libc::c_int;
-use std::io::Error;
-use std::sync::{
- atomic::{AtomicBool, AtomicPtr},
- Arc,
+use std::{
+ io::Error,
+ sync::{
+ atomic::{AtomicBool, AtomicPtr},
+ Arc,
+ },
+ time::Duration,
+};
+
+use crossbeam::{
+ channel::{bounded, tick},
+ select,
};
-use std::time::Duration;
+use libc::c_int;
pub const PROC_FS_ERROR_STR: &str = "/proc/ filesystem not found, are you running this on linux?";
@@ -49,12 +52,12 @@ pub mod state;
pub use crate::state::*;
pub mod components;
-pub use crate::components::*;
-pub use crate::username::*;
+pub use crate::{components::*, username::*};
pub mod username {
- use libc;
use std::ptr::null_mut;
- /* taken from whoami-0.1.1 */
+
+ use libc;
+ // taken from whoami-0.1.1
fn getpwuid(
pw_uid: u32,
#[cfg(not(any(
@@ -142,7 +145,7 @@ pub mod username {
None => uid.to_string(),
Some(p) => ::std::ffi::CStr::from_ptr(p.pw_name)
.to_str()
- .unwrap_or_else(|_| "")
+ .unwrap_or("")
.to_string(),
}
}
@@ -195,7 +198,7 @@ fn notify(
}
fn main() -> Result<(), Error> {
- /* Create the application State */
+ // Create the application State
let mut state = UIState::new();
let signals = &[
@@ -228,9 +231,10 @@ fn main() -> Result<(), Error> {
state.render();
state.redraw(true);
- /* Keep track of the input mode. See UIMode for details */
+ // Keep track of the input mode. See UIMode for details
'main: loop {
- /* Poll on all channels. Currently we have the input channel for stdin, watching events and the signal watcher. */
+ // Poll on all channels. Currently we have the input channel for stdin,
+ // watching events and the signal watcher.
select! {
recv(ticker) -> _ => {
state.redraw(true);
diff --git a/src/state.rs b/src/state.rs
index 5216de0..9ca5a82 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -1,41 +1,42 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
-
-/*! The application's state.
-
-The UI crate has an Box-Component-System design. The System part, is also the application's state, so they're both merged in the `State` struct.
-
-`State` owns all the Components of the UI. In the application's main event loop, input is handed to the state in the form of `UIEvent` objects which traverse the component graph. Components decide to handle each input or not.
-
-Input is received in the main loop from threads which listen on the stdin for user input, observe folders for file changes etc. The relevant struct is `ThreadEvent`.
-*/
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+
+//! The application's state.
+//!
+//! The UI crate has an Box-Component-System design. The System
+//! part, is also the application's state, so they're both merged in the `State`
+//! struct.
+//!
+//! `State` owns all the Components of the UI. In the application's main event
+//! loop, input is handed to the state in the form of `UIEvent` objects which
+//! traverse the component graph. Components decide to handle each input or not.
+//!
+//! Input is received in the main loop from threads which listen on the stdin
+//! for user input, observe folders for file changes etc. The relevant struct is
+//! `ThreadEvent`.
+
+use std::{collections::VecDeque, io::Write};
-use super::*;
use crossbeam::channel::{Receiver, Sender};
-use std::collections::VecDeque;
-use std::io::Write;
+use termion::{clear, cursor, raw::IntoRawMode, screen::AlternateScreen};
-use termion::raw::IntoRawMode;
-use termion::screen::AlternateScreen;
-use termion::{clear, cursor};
+use super::*;
#[derive(PartialEq)]
pub enum UIMode {
@@ -76,8 +77,8 @@ impl InputHandler {
}
}
-/// A State object to manage and own components and components of the UI. `State` is responsible for
-/// managing the terminal
+/// A State object to manage and own components and components of the UI.
+/// `State` is responsible for managing the terminal
pub struct UIState {
cols: usize,
rows: usize,
@@ -107,15 +108,13 @@ impl Default for UIState {
impl UIState {
pub fn new() -> Self {
- /* Create a channel to communicate with other threads. The main process is the sole receiver.
- * */
+ // Create a channel to communicate with other threads. The main process is
+ // the sole receiver.
let (sender, receiver) =
crossbeam::channel::bounded(32 * ::std::mem::size_of::());
- /*
- * Create async channel to block the input-thread if we need to fork and stop it from reading
- * stdin, see get_events() for details
- * */
+ // Create async channel to block the input-thread if we need to fork and stop
+ // it from reading stdin, see get_events() for details
let (input_sender, input_receiver) = crossbeam::channel::unbounded();
let termsize = termion::terminal_size().ok();
@@ -143,8 +142,8 @@ impl UIState {
s
}
- /// Switch back to the terminal's main screen (The command line the user sees before opening
- /// the application)
+ /// Switch back to the terminal's main screen (The command line the user
+ /// sees before opening the application)
pub fn switch_to_main_screen(&mut self) {
write!(
self.stdout(),
@@ -179,7 +178,7 @@ impl UIState {
cursor::Goto(1, 1),
BracketModeStart,
save_title_to_stack = SaveWindowTitleIconToStack,
- window_title = "\x1b]2;bb\x07",
+ window_title = concat!("\x1b]2;", env!("CARGO_PKG_NAME"), "bb\x07"),
)
.unwrap();
@@ -193,7 +192,8 @@ impl UIState {
self.receiver.clone()
}
- /// On `SIGWNICH` the `State` redraws itself according to the new terminal size.
+ /// On `SIGWNICH` the `State` redraws itself according to the new terminal
+ /// size.
pub fn update_size(&mut self) {
let termsize = termion::terminal_size().ok();
let termcols = termsize.map(|(w, _)| w);
@@ -225,9 +225,9 @@ impl UIState {
self.draw_component(i, tick);
}
let mut areas: Vec = self.dirty_areas.drain(0..).collect();
- /* Sort by x_start, ie upper_left corner's x coordinate */
+ // Sort by x_start, ie upper_left corner's x coordinate
areas.sort_by(|a, b| (a.0).0.partial_cmp(&(b.0).0).unwrap());
- /* draw each dirty area */
+ // draw each dirty area
let rows = self.rows;
for y in 0..rows {
let mut segment = None;
@@ -340,7 +340,7 @@ impl UIState {
}
/// The application's main loop sends `UIEvents` to state via this method.
pub fn rcv_event(&mut self, mut event: UIEvent) {
- /* inform each component */
+ // inform each component
for i in 0..self.components.len() {
self.components[i].process_event(&mut event, &mut self.mode);
}
diff --git a/src/terminal.rs b/src/terminal.rs
index df95db1..cfc9ee4 100644
--- a/src/terminal.rs
+++ b/src/terminal.rs
@@ -1,29 +1,25 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
#[macro_use]
mod position;
#[macro_use]
mod cells;
#[macro_use]
mod keys;
-pub use self::cells::*;
-pub use self::keys::*;
-pub use self::position::*;
+pub use self::{cells::*, keys::*, position::*};
diff --git a/src/terminal/cells.rs b/src/terminal/cells.rs
index 4d40aab..f6e7c50 100644
--- a/src/terminal/cells.rs
+++ b/src/terminal/cells.rs
@@ -1,39 +1,38 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
-
-/*!
- Define a (x, y) point in the terminal display as a holder of a character, foreground/background
- colors and attributes.
-*/
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+
+//! Define a (x, y) point in the terminal display as a holder of a character,
+//! foreground/background colors and attributes.
+
+use std::{
+ convert::From,
+ fmt,
+ ops::{Deref, DerefMut, Index, IndexMut},
+};
+
+use termion::color::{AnsiValue, Rgb as TermionRgb};
use super::position::*;
use crate::text_processing::wcwidth;
-use std::convert::From;
-use std::fmt;
-use std::ops::{Deref, DerefMut, Index, IndexMut};
-use termion::color::{AnsiValue, Rgb as TermionRgb};
-
-/// In a scroll region up and down cursor movements shift the region vertically. The new lines are
-/// empty.
+/// In a scroll region up and down cursor movements shift the region vertically.
+/// The new lines are empty.
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct ScrollRegion {
pub top: usize,
@@ -44,11 +43,12 @@ pub struct ScrollRegion {
/// An array of `Cell`s that represents a terminal display.
///
-/// A `CellBuffer` is a two-dimensional array of `Cell`s, each pair of indices correspond to a
-/// single point on the underlying terminal.
+/// A `CellBuffer` is a two-dimensional array of `Cell`s, each pair of indices
+/// correspond to a single point on the underlying terminal.
///
-/// The first index, `Cellbuffer[y]`, corresponds to a row, and thus the y-axis. The second
-/// index, `Cellbuffer[y][x]`, corresponds to a column within a row and thus the x-axis.
+/// The first index, `Cellbuffer[y]`, corresponds to a row, and thus the y-axis.
+/// The second index, `Cellbuffer[y][x]`, corresponds to a column within a row
+/// and thus the x-axis.
#[derive(Clone, PartialEq, Eq)]
pub struct CellBuffer {
cols: usize,
@@ -79,8 +79,8 @@ impl CellBuffer {
self.cols = new_cols;
}
- /// Constructs a new `CellBuffer` with the given number of columns and rows, using the given
- /// `cell` as a blank.
+ /// Constructs a new `CellBuffer` with the given number of columns and rows,
+ /// using the given `cell` as a blank.
pub fn new(cols: usize, rows: usize, cell: Cell) -> CellBuffer {
CellBuffer {
cols,
@@ -89,8 +89,8 @@ impl CellBuffer {
}
}
- /// Resizes `CellBuffer` to the given number of rows and columns, using the given `Cell` as
- /// a blank.
+ /// Resizes `CellBuffer` to the given number of rows and columns, using the
+ /// given `Cell` as a blank.
pub fn resize(&mut self, newcols: usize, newrows: usize, blank: Cell) {
let newlen = newcols * newrows;
if self.buf.len() == newlen {
@@ -141,13 +141,12 @@ impl CellBuffer {
}
}
- /// Returns a reference to the `Cell` at the given coordinates, or `None` if the index is out of
- /// bounds.
+ /// Returns a reference to the `Cell` at the given coordinates, or `None` if
+ /// the index is out of bounds.
///
/// # Examples
///
/// ```norun
- ///
/// let mut term = Terminal::new().unwrap();
///
/// let a_cell = term.get(5, 5);
@@ -159,13 +158,12 @@ impl CellBuffer {
}
}
- /// Returns a mutable reference to the `Cell` at the given coordinates, or `None` if the index
- /// is out of bounds.
+ /// Returns a mutable reference to the `Cell` at the given coordinates, or
+ /// `None` if the index is out of bounds.
///
/// # Examples
///
/// ```norun
- ///
/// let mut term = Terminal::new().unwrap();
///
/// let a_mut_cell = term.get_mut(5, 5);
@@ -234,7 +232,6 @@ impl CellBuffer {
/// | 555555555555 | | 666666666666 |
/// | 666666666666 | | |
/// ```
- ///
pub fn scroll_up(&mut self, scroll_region: &ScrollRegion, top: usize, offset: usize) {
let l = scroll_region.left;
let r = if scroll_region.right == 0 {
@@ -293,7 +290,6 @@ impl CellBuffer {
/// | 555555555555 | | 444444444444 |
/// | 666666666666 | | 555555555555 |
/// ```
- ///
pub fn scroll_down(&mut self, scroll_region: &ScrollRegion, top: usize, offset: usize) {
for y in (scroll_region.bottom - offset + 1)..=scroll_region.bottom {
for x in 0..self.size().0 {
@@ -367,7 +363,8 @@ impl IndexMut for CellBuffer {
}
impl Default for CellBuffer {
- /// Constructs a new `CellBuffer` with a size of `(0, 0)`, using the default `Cell` as a blank.
+ /// Constructs a new `CellBuffer` with a size of `(0, 0)`, using the default
+ /// `Cell` as a blank.
fn default() -> CellBuffer {
CellBuffer::new(0, 0, Cell::default())
}
@@ -409,7 +406,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let cell = Cell::new('x', Color::Default, Color::Green, Attr::Default);
/// assert_eq!(cell.ch(), 'x');
/// assert_eq!(cell.fg(), Color::Default);
@@ -433,7 +429,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::with_char('x');
/// assert_eq!(cell.ch(), 'x');
/// assert_eq!(cell.fg(), Color::Default);
@@ -449,7 +444,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::with_style(Color::Default, Color::Red, Attr::Bold);
/// assert_eq!(cell.fg(), Color::Default);
/// assert_eq!(cell.bg(), Color::Red);
@@ -465,7 +459,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::with_char('x');
/// assert_eq!(cell.ch(), 'x');
/// ```
@@ -478,7 +471,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::with_char('x');
/// assert_eq!(cell.ch(), 'x');
///
@@ -497,7 +489,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::with_style(Color::Blue, Color::Default, Attr::Default);
/// assert_eq!(cell.fg(), Color::Blue);
/// ```
@@ -510,7 +501,6 @@ impl Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::default();
/// assert_eq!(cell.fg(), Color::Default);
///
@@ -563,8 +553,8 @@ impl Cell {
self
}
- /// Set a `Cell` as empty when a previous cell spans multiple columns and it would
- /// "overflow" to this cell.
+ /// Set a `Cell` as empty when a previous cell spans multiple columns and it
+ /// would "overflow" to this cell.
pub fn empty(&self) -> bool {
self.empty
}
@@ -574,15 +564,15 @@ impl Cell {
self
}
- /// Sets `keep_fg` field. If true, the foreground color will not be altered if attempted so
- /// until the character content of the cell is changed.
+ /// Sets `keep_fg` field. If true, the foreground color will not be altered
+ /// if attempted so until the character content of the cell is changed.
pub fn set_keep_fg(&mut self, new_val: bool) -> &mut Cell {
self.keep_fg = new_val;
self
}
- /// Sets `keep_bg` field. If true, the background color will not be altered if attempted so
- /// until the character content of the cell is changed.
+ /// Sets `keep_bg` field. If true, the background color will not be altered
+ /// if attempted so until the character content of the cell is changed.
pub fn set_keep_bg(&mut self, new_val: bool) -> &mut Cell {
self.keep_bg = new_val;
self
@@ -595,7 +585,6 @@ impl Default for Cell {
/// # Examples
///
/// ```norun
- ///
/// let mut cell = Cell::default();
/// assert_eq!(cell.ch(), ' ');
/// assert_eq!(cell.fg(), Color::Default);
@@ -610,16 +599,15 @@ impl Default for Cell {
///
/// `Color::Default` represents the default color of the underlying terminal.
///
-/// The eight basic colors may be used directly and correspond to 0x00..0x07 in the 8-bit (256)
-/// color range; in addition, the eight basic colors coupled with `Attr::Bold` correspond to
-/// 0x08..0x0f in the 8-bit color range.
+/// The eight basic colors may be used directly and correspond to 0x00..0x07 in
+/// the 8-bit (256) color range; in addition, the eight basic colors coupled
+/// with `Attr::Bold` correspond to 0x08..0x0f in the 8-bit color range.
///
/// `Color::Byte(..)` may be used to specify a color in the 8-bit range.
///
/// # Examples
///
/// ```norun
-///
/// // The default color.
/// let default = Color::Default;
///
@@ -632,7 +620,7 @@ impl Default for Cell {
/// // Basic colors are also 8-bit colors (but not vice-versa).
/// assert_eq!(red.as_byte(), fancy.as_byte())
/// ```
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
pub enum Color {
Black,
Red,
@@ -644,6 +632,7 @@ pub enum Color {
White,
Byte(u8),
Rgb(u8, u8, u8),
+ #[default]
Default,
}
@@ -714,12 +703,6 @@ impl Color {
}
}
-impl Default for Color {
- fn default() -> Self {
- Color::Default
- }
-}
-
/// The attributes of a `Cell`.
///
/// `Attr` enumerates all combinations of attributes a given style may have.
@@ -729,7 +712,6 @@ impl Default for Color {
/// # Examples
///
/// ```norun
-///
/// // Default attribute.
/// let def = Attr::Default;
///
@@ -739,8 +721,9 @@ impl Default for Color {
/// // Combination.
/// let comb = Attr::UnderlineReverse;
/// ```
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
pub enum Attr {
+ #[default]
Default = 0b000,
Bold = 0b001,
Underline = 0b100,
@@ -794,12 +777,6 @@ impl core::ops::BitOrAssign for Attr {
}
}
-impl Default for Attr {
- fn default() -> Self {
- Attr::Default
- }
-}
-
impl Attr {
pub fn write(self, prev: Attr, stdout: &mut crate::state::StateStdout) -> std::io::Result<()> {
use std::io::Write;
@@ -861,7 +838,7 @@ pub fn copy_area_with_break(
src_y += 1;
src_x = 0;
if src_y >= get_y(bottom_right!(src)) {
- //clear_area(grid_dest, ((get_x(upper_left!(dest)), y), bottom_right!(dest)));
+ // clear_area(grid_dest, ((get_x(upper_left!(dest)), y), bottom_right!(dest)));
ret.1 = y;
break 'y_;
}
@@ -910,7 +887,8 @@ macro_rules! inspect_bounds {
};
}
-/// Write an `&str` to a `CellBuffer` in a specified `Area` with the passed colors.
+/// Write an `&str` to a `CellBuffer` in a specified `Area` with the passed
+/// colors.
pub fn write_string_to_grid(
s: &str,
grid: &mut CellBuffer,
@@ -955,12 +933,12 @@ pub fn write_string_to_grid(
match wcwidth(u32::from(c)) {
Some(0) | None => {
- /* Skip drawing zero width characters */
+ // Skip drawing zero width characters
grid[(x, y)].empty = true;
}
Some(2) => {
- /* Grapheme takes more than one column, so the next cell will be
- * drawn over. Set it as empty to skip drawing it. */
+ // Grapheme takes more than one column, so the next cell will be
+ // drawn over. Set it as empty to skip drawing it.
x += 1;
inspect_bounds!(grid, area, x, y, line_break);
grid[(x, y)] = Cell::default();
@@ -979,7 +957,8 @@ pub fn write_string_to_grid(
(x, y)
}
-/// Completely clear an `Area` with an empty char and the terminal's default colors.
+/// Completely clear an `Area` with an empty char and the terminal's default
+/// colors.
pub fn clear_area(grid: &mut CellBuffer, area: Area) {
if !is_valid_area!(area) {
return;
@@ -991,10 +970,10 @@ pub fn clear_area(grid: &mut CellBuffer, area: Area) {
}
}
-/// Use `RowIterator` to iterate the cells of a row without the need to do any bounds checking;
-/// the iterator will simply return `None` when it reaches the end of the row.
-/// `RowIterator` can be created via the `CellBuffer::row_iter` method and can be returned by
-/// `BoundsIterator` which iterates each row.
+/// Use `RowIterator` to iterate the cells of a row without the need to do any
+/// bounds checking; the iterator will simply return `None` when it reaches the
+/// end of the row. `RowIterator` can be created via the `CellBuffer::row_iter`
+/// method and can be returned by `BoundsIterator` which iterates each row.
/// ```norun
/// for c in grid.row_iter(
/// x..(x + 11),
diff --git a/src/terminal/keys.rs b/src/terminal/keys.rs
index 9212451..57fa779 100644
--- a/src/terminal/keys.rs
+++ b/src/terminal/keys.rs
@@ -1,32 +1,31 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+
+use std::{fmt, io};
+
+use termion::{
+ event::{Event as TermionEvent, Key as TermionKey},
+ input::TermRead,
+};
use crate::crossbeam::*;
-use std::fmt;
-use std::io;
-use termion::event::Event as TermionEvent;
-use termion::event::Key as TermionKey;
-use termion::input::TermRead;
-
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum Key {
/// Backspace.
@@ -61,7 +60,8 @@ pub enum Key {
Alt(char),
/// Ctrl modified character.
///
- /// Note that certain keys may not be modifiable with `ctrl`, due to limitations of terminals.
+ /// Note that certain keys may not be modifiable with `ctrl`, due to
+ /// limitations of terminals.
Ctrl(char),
/// Null byte.
Null,
@@ -185,9 +185,7 @@ pub fn get_events(
}
}
-/*
- * CSI events we use
- */
+// CSI events we use
// Some macros taken from termion:
/// Create a CSI-introduced sequence.
@@ -237,11 +235,13 @@ pub const BRACKET_PASTE_START: &[u8] = b"\x1B[200~";
pub const BRACKET_PASTE_END: &[u8] = b"\x1B[201~";
derive_csi_sequence!(
- #[doc = "`CSI Ps ; Ps ; Ps t`, where `Ps = 2 2 ; 0` -> Save xterm icon and window title on stack."]
+ #[doc = "`CSI Ps ; Ps ; Ps t`, where `Ps = 2 2 ; 0` -> Save xterm icon and window title on \
+ stack."]
(SaveWindowTitleIconToStack, "22;0t")
);
derive_csi_sequence!(
- #[doc = "Restore window title and icon from terminal's title stack. `CSI Ps ; Ps ; Ps t`, where `Ps = 2 3 ; 0` -> Restore xterm icon and window title from stack."]
+ #[doc = "Restore window title and icon from terminal's title stack. `CSI Ps ; Ps ; Ps t`, \
+ where `Ps = 2 3 ; 0` -> Restore xterm icon and window title from stack."]
(RestoreWindowTitleIconFromStack, "23;0t")
);
diff --git a/src/terminal/position.rs b/src/terminal/position.rs
index 2c8c398..7207886 100644
--- a/src/terminal/position.rs
+++ b/src/terminal/position.rs
@@ -1,29 +1,26 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
-/*!
-Simple type definitions and macro helper for a (x,y) position on the terminal and the areas they define.
-
-An `Area` consists of two points: the upper left and bottom right corners.
-*/
+//! Simple type definitions and macro helper for a (x,y) position on the
+//! terminal and the areas they define.
+//!
+//! An `Area` consists of two points: the upper left and bottom right corners.
/// A `(x, y)` position on screen.
pub type Pos = (usize, usize);
diff --git a/src/text_processing.rs b/src/text_processing.rs
index 995aef9..48047a6 100644
--- a/src/text_processing.rs
+++ b/src/text_processing.rs
@@ -1,23 +1,21 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
pub mod grapheme_clusters;
pub mod line_break;
diff --git a/src/text_processing/grapheme_clusters.rs b/src/text_processing/grapheme_clusters.rs
index ddc61ed..81a67d1 100644
--- a/src/text_processing/grapheme_clusters.rs
+++ b/src/text_processing/grapheme_clusters.rs
@@ -1,44 +1,40 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
-
-/*
- Breaks a string into individual user-perceived "characters"
- Unicode UAX-29 standard, version 10.0.0
-
- Usage:
- //returns an array of strings, one string for each grapheme cluster
- let mut graphemes = split_graphemes(string);
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
-*/
+// Breaks a string into individual user-perceived "characters"
+// Unicode UAX-29 standard, version 10.0.0
+//
+// Usage:
+// returns an array of strings, one string for each grapheme cluster
+// let mut graphemes = split_graphemes(string);
+//
use crate::wcwidth::{wcwidth, CodePointsIter};
extern crate unicode_segmentation;
use self::unicode_segmentation::UnicodeSegmentation;
pub trait Graphemes: UnicodeSegmentation + CodePointsIter {
- fn split_graphemes<'a>(&'a self) -> Vec<&'a str> {
+ fn split_graphemes(&self) -> Vec<&str> {
UnicodeSegmentation::graphemes(self, true).collect::>()
}
- fn graphemes_indices<'a>(&'a self) -> Vec<(usize, &'a str)> {
+ fn graphemes_indices(&self) -> Vec<(usize, &str)> {
UnicodeSegmentation::grapheme_indices(self, true).collect::>()
}
@@ -53,7 +49,7 @@ pub trait Graphemes: UnicodeSegmentation + CodePointsIter {
fn grapheme_width(&self) -> usize {
let mut count = 0;
for c in self.code_points() {
- count += if let Some(w) = wcwidth(c) { w } else { 0 };
+ count += wcwidth(c).unwrap_or_default();
}
count
@@ -77,7 +73,7 @@ impl<'s> Iterator for WordBreakIter<'s> {
if self.input.is_empty() {
return None;
}
- self.input = self.input.trim_start_matches(|c| c == ' ');
+ self.input = self.input.trim_start_matches(' ');
if self.input.starts_with('\n') {
let ret = &self.input[0..0];
self.input = &self.input[1..];
@@ -108,7 +104,7 @@ impl<'s> Iterator for WordBreakIter<'s> {
Some(ret)
}
} else {
- /* graphemes.len() < width */
+ // graphemes.len() < width
let ret = self.input;
self.input = &self.input[0..0];
Some(ret)
@@ -122,7 +118,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
}
//#[derive(PartialEq)]
-//enum Property {
+// enum Property {
// CR,
// LF,
// Control,
@@ -142,19 +138,17 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// Glue_After_Zwj,
// E_Base_GAZ,
//}
-//
-//enum Breaks {
+// enum Breaks {
// NotBreak,
// BreakStart,
// Break,
// BreakLastRegional,
// BreakPenultimateRegional,
//}
+// use Property::*;
+// use Breaks::*;
//
-//use Property::*;
-//use Breaks::*;
-//
-//impl From for Breaks {
+// impl From for Breaks {
// fn from(u: u8) -> Breaks {
// match u {
// 0 => NotBreak,
@@ -166,15 +160,15 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// }
// }
//}
-//
-//fn is_surrogate(s: &str, pos: usize) -> bool {
-// return 0xd800 <= char_code_at(s, pos) && char_code_at(s, pos) <= 0xdbff &&
-// 0xdc00 <= char_code_at(s, pos + 1) && char_code_at(s, pos + 1) <= 0xdfff;
+// fn is_surrogate(s: &str, pos: usize) -> bool {
+// return 0xd800 <= char_code_at(s, pos) && char_code_at(s, pos) <= 0xdbff
+// && 0xdc00 <= char_code_at(s, pos + 1) && char_code_at(s, pos + 1) <=
+// 0xdfff;
//}
//
-//// Private function, gets a Unicode code point from a java_script UTF-16 string
-//// handling surrogate pairs appropriately
-//fn code_point_at(s: &str, idx: usize) -> u8 {
+//// Private function, gets a Unicode code point from a java_script UTF-16
+//// string handling surrogate pairs appropriately
+// fn code_point_at(s: &str, idx: usize) -> u8 {
// let mut code: u8 = char_code_at(s, idx);
//
// // if a high surrogate
@@ -206,7 +200,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
//
//// Private function, returns whether a break is allowed between the
//// two given grapheme breaking classes
-//fn should_break(start, mid, end) -> Breaks {
+// fn should_break(start, mid, end) -> Breaks {
// let mut all = [start, mid, end].into();
// let mut previous = start;
// let mut next = end
@@ -215,8 +209,8 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// // GB10. (E_Base | EBG) Extend* ? E_Modifier
// let mut e_modifier_index = all.last_index_of(E_Modifier)
// if(e_modifier_index > 1 &&
-// all.slice(1, e_modifier_index).every(function(c){return c == Extend}) &&
-// [Extend, E_Base, E_Base_GAZ].index_of(start) == -1){
+// all.slice(1, e_modifier_index).every(function(c){return c ==
+// Extend}) && [Extend, E_Base, E_Base_GAZ].index_of(start) == -1){
// return Break
// }
//
@@ -225,9 +219,10 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// // GB13. [^RI] (RI RI)* RI ? RI
// let mut r_iIndex = all.last_index_of(Regional_Indicator)
// if(r_iIndex > 0 &&
-// all.slice(1, r_iIndex).every(function(c){return c == Regional_Indicator}) &&
-// [Prepend, Regional_Indicator].index_of(previous) == -1) {
-// if(all.filter(function(c){return c == Regional_Indicator}).length % 2 == 1) {
+// all.slice(1, r_iIndex).every(function(c){return c ==
+// Regional_Indicator}) && [Prepend,
+// Regional_Indicator].index_of(previous) == -1) {
+// if(all.filter(function(c){return c == Regional_Indicator}).length % 2 == 1) {
// return BreakLastRegional
// }
// else {
@@ -281,10 +276,11 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// }
//
// // GB10. (E_Base | EBG) Extend* ? E_Modifier
-// let mut previous_non_extend_index = all.index_of(Extend) != -1 ? all.last_index_of(Extend) - 1 : all.length - 2;
-// if([E_Base, E_Base_GAZ].index_of(all[previous_non_extend_index]) != -1 &&
-// all.slice(previous_non_extend_index + 1, -1).every(function(c){return c == Extend}) &&
-// next == E_Modifier){
+// let mut previous_non_extend_index = all.index_of(Extend) != -1 ?
+// all.last_index_of(Extend) - 1 : all.length - 2; if([E_Base,
+// E_Base_GAZ].index_of(all[previous_non_extend_index]) != -1 &&
+// all.slice(previous_non_extend_index + 1, -1).every(function(c){return c
+// == Extend}) && next == E_Modifier){
// return NotBreak;
// }
//
@@ -307,7 +303,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
//}
//
//// Returns the next grapheme break in the string after the given index
-//fn next_break(s: &str, index: usize) -> Breaks {
+// fn next_break(s: &str, index: usize) -> Breaks {
// // if(index < 0){
// // return 0;
// // }
@@ -333,7 +329,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
//};
//
//// Breaks the given string into an array of grapheme cluster strings
-//fn split_graphemes(s: &str) -> Vec<&str> {
+// fn split_graphemes(s: &str) -> Vec<&str> {
// let mut res = Vec::new()
// let mut index = 0;
//
@@ -350,34 +346,34 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
//};
//
//// Returns the iterator of grapheme clusters there are in the given string
-////fn iterate_graphemes(s: &str) {
-//// let mut index = 0;
-//// let mut res = {
-//// next: (function() {
-//// let mut value;
-//// let mut brk;
-//// if ((brk = this.next_break(str, index)) < str.length) {
-//// value = str.slice(index, brk);
-//// index = brk;
-//// return { value: value, done: false };
-//// }
-//// if (index < str.length) {
-//// value = str.slice(index);
-//// index = str.length;
-//// return { value: value, done: false };
-//// }
-//// return { value: undefined, done: true };
-//// }).bind(this)
-//// };
-//// // ES2015 @@iterator method (iterable) for spread syntax and for...of statement
-//// if (typeof Symbol !== 'undefined' && Symbol.iterator) {
-//// res[Symbol.iterator] = function() {return res};
-//// }
-//// return res;
-////};
+//// fn iterate_graphemes(s: &str) {
+//// let mut index = 0;
+//// let mut res = {
+//// next: (function() {
+//// let mut value;
+//// let mut brk;
+//// if ((brk = this.next_break(str, index)) < str.length) {
+//// value = str.slice(index, brk);
+//// index = brk;
+//// return { value: value, done: false };
+//// }
+//// if (index < str.length) {
+//// value = str.slice(index);
+//// index = str.length;
+//// return { value: value, done: false };
+//// }
+//// return { value: undefined, done: true };
+//// }).bind(this)
+//// };
+//// // ES2015 @@iterator method (iterable) for spread syntax and for...of
+//// statement if (typeof Symbol !== 'undefined' && Symbol.iterator) {
+//// res[Symbol.iterator] = function() {return res};
+//// }
+//// return res;
+//// };
//
//// Returns the number of grapheme clusters there are in the given string
-//fn count_graphemes(s:&str) -> usize {
+// fn count_graphemes(s:&str) -> usize {
// let mut count = 0;
// let mut index = 0;
// while let Some(brk) = next_break(s, index) {
@@ -393,24 +389,25 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
//};
//
////given a Unicode code point, determines this symbol's grapheme break property
-//fn get_grapheme_break_property(code: u8) -> Property {
+// fn get_grapheme_break_property(code: u8) -> Property {
//
// //grapheme break property for Unicode 10.0.0,
// //taken from http://www.unicode.org/Public/10.0.0/ucd/auxiliary/grapheme_break_property.txt
// //and adapted to java_script rules
//
// if(
-// (0x0600 <= code && code <= 0x0605) || // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
-// 0x06DD == code || // Cf ARABIC END OF AYAH
-// 0x070F == code || // Cf SYRIAC ABBREVIATION MARK
+// (0x0600 <= code && code <= 0x0605) || // Cf [6] ARABIC NUMBER
+// SIGN..ARABIC NUMBER MARK ABOVE 0x06DD == code || // Cf ARABIC
+// END OF AYAH 0x070F == code || // Cf SYRIAC ABBREVIATION MARK
// 0x08E2 == code || // Cf ARABIC DISPUTED END OF AYAH
// 0x0D4E == code || // Lo MALAYALAM LETTER DOT REPH
// 0x110BD == code || // Cf KAITHI NUMBER SIGN
-// (0x111C2 <= code && code <= 0x111C3) || // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA
-// 0x11A3A == code || // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
-// (0x11A86 <= code && code <= 0x11A89) || // Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA
-// 0x11D46 == code // Lo MASARAM GONDI REPHA
-// ){
+// (0x111C2 <= code && code <= 0x111C3) || // Lo [2] SHARADA SIGN
+// JIHVAMULIYA..SHARADA SIGN UPADHMANIYA 0x11A3A == code || // Lo
+// ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA (0x11A86 <= code && code <=
+// 0x11A89) || // Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO
+// CLUSTER-INITIAL LETTER SA 0x11D46 == code // Lo MASARAM GONDI
+// REPHA ){
// return Prepend;
// }
// if(
@@ -427,549 +424,679 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
//
//
// if(
-// (0x0000 <= code && code <= 0x0009) || // Cc [10] ..
-// (0x000B <= code && code <= 0x000C) || // Cc [2] ..
-// (0x000E <= code && code <= 0x001F) || // Cc [18] ..
-// (0x007F <= code && code <= 0x009F) || // Cc [33] ..
+// (0x0000 <= code && code <= 0x0009) || // Cc [10]
+// .. (0x000B <= code && code <= 0x000C) ||
+// // Cc [2] .. (0x000E <= code && code <=
+// 0x001F) || // Cc [18] .. (0x007F <= code
+// && code <= 0x009F) || // Cc [33] ..
// 0x00AD == code || // Cf SOFT HYPHEN
// 0x061C == code || // Cf ARABIC LETTER MARK
//
// 0x180E == code || // Cf MONGOLIAN VOWEL SEPARATOR
// 0x200B == code || // Cf ZERO WIDTH SPACE
-// (0x200E <= code && code <= 0x200F) || // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
-// 0x2028 == code || // Zl LINE SEPARATOR
+// (0x200E <= code && code <= 0x200F) || // Cf [2] LEFT-TO-RIGHT
+// MARK..RIGHT-TO-LEFT MARK 0x2028 == code || // Zl LINE SEPARATOR
// 0x2029 == code || // Zp PARAGRAPH SEPARATOR
-// (0x202A <= code && code <= 0x202E) || // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
-// (0x2060 <= code && code <= 0x2064) || // Cf [5] WORD JOINER..INVISIBLE PLUS
-// 0x2065 == code || // Cn
-// (0x2066 <= code && code <= 0x206F) || // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
-// (0x_d800 <= code && code <= 0x_dFFF) || // Cs [2048] ..
-// 0x_fEFF == code || // Cf ZERO WIDTH NO-BREAK SPACE
-// (0x_fFF0 <= code && code <= 0x_fFF8) || // Cn [9] ..
-// (0x_fFF9 <= code && code <= 0x_fFFB) || // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
-// (0x1BCA0 <= code && code <= 0x1BCA3) || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
-// (0x1D173 <= code && code <= 0x1D17A) || // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
-// 0x_e0000 == code || // Cn
-// 0x_e0001 == code || // Cf LANGUAGE TAG
-// (0x_e0002 <= code && code <= 0x_e001F) || // Cn [30] ..
-// (0x_e0080 <= code && code <= 0x_e00FF) || // Cn [128] ..
-// (0x_e01F0 <= code && code <= 0x_e0FFF) // Cn [3600] ..
+// (0x202A <= code && code <= 0x202E) || // Cf [5] LEFT-TO-RIGHT
+// EMBEDDING..RIGHT-TO-LEFT OVERRIDE (0x2060 <= code && code <= 0x2064)
+// || // Cf [5] WORD JOINER..INVISIBLE PLUS 0x2065 == code || // Cn
+// (0x2066 <= code && code <= 0x206F) || // Cf [10]
+// LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES (0x_d800 <= code && code
+// <= 0x_dFFF) || // Cs [2048] .. 0x_fEFF
+// == code || // Cf ZERO WIDTH NO-BREAK SPACE (0x_fFF0 <= code &&
+// code <= 0x_fFF8) || // Cn [9] ..
+// (0x_fFF9 <= code && code <= 0x_fFFB) || // Cf [3] INTERLINEAR
+// ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR (0x1BCA0 <= code
+// && code <= 0x1BCA3) || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND
+// FORMAT UP STEP (0x1D173 <= code && code <= 0x1D17A) || // Cf [8]
+// MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE 0x_e0000 == code
+// || // Cn 0x_e0001 == code || // Cf
+// LANGUAGE TAG (0x_e0002 <= code && code <= 0x_e001F) || // Cn [30]
+// .. (0x_e0080 <= code && code <=
+// 0x_e00FF) || // Cn [128] .. (0x_e01F0
+// <= code && code <= 0x_e0FFF) // Cn [3600] ..
// ){
// return Control;
// }
//
//
// if(
-// (0x0300 <= code && code <= 0x036F) || // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
-// (0x0483 <= code && code <= 0x0487) || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
-// (0x0488 <= code && code <= 0x0489) || // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
-// (0x0591 <= code && code <= 0x05BD) || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
-// 0x05BF == code || // Mn HEBREW POINT RAFE
-// (0x05C1 <= code && code <= 0x05C2) || // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
-// (0x05C4 <= code && code <= 0x05C5) || // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
-// 0x05C7 == code || // Mn HEBREW POINT QAMATS QATAN
-// (0x0610 <= code && code <= 0x061A) || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
-// (0x064B <= code && code <= 0x065F) || // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW
-// 0x0670 == code || // Mn ARABIC LETTER SUPERSCRIPT ALEF
-// (0x06D6 <= code && code <= 0x06DC) || // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
-// (0x06DF <= code && code <= 0x06E4) || // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
-// (0x06E7 <= code && code <= 0x06E8) || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
-// (0x06EA <= code && code <= 0x06ED) || // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
-// 0x0711 == code || // Mn SYRIAC LETTER SUPERSCRIPT ALAPH
-// (0x0730 <= code && code <= 0x074A) || // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
-// (0x07A6 <= code && code <= 0x07B0) || // Mn [11] THAANA ABAFILI..THAANA SUKUN
-// (0x07EB <= code && code <= 0x07F3) || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
-// (0x0816 <= code && code <= 0x0819) || // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
-// (0x081B <= code && code <= 0x0823) || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
-// (0x0825 <= code && code <= 0x0827) || // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
-// (0x0829 <= code && code <= 0x082D) || // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
-// (0x0859 <= code && code <= 0x085B) || // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
-// (0x08D4 <= code && code <= 0x08E1) || // Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
-// (0x08E3 <= code && code <= 0x0902) || // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA
-// 0x093A == code || // Mn DEVANAGARI VOWEL SIGN OE
-// 0x093C == code || // Mn DEVANAGARI SIGN NUKTA
-// (0x0941 <= code && code <= 0x0948) || // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
-// 0x094D == code || // Mn DEVANAGARI SIGN VIRAMA
-// (0x0951 <= code && code <= 0x0957) || // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE
-// (0x0962 <= code && code <= 0x0963) || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
-// 0x0981 == code || // Mn BENGALI SIGN CANDRABINDU
-// 0x09BC == code || // Mn BENGALI SIGN NUKTA
-// 0x09BE == code || // Mc BENGALI VOWEL SIGN AA
-// (0x09C1 <= code && code <= 0x09C4) || // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
-// 0x09CD == code || // Mn BENGALI SIGN VIRAMA
-// 0x09D7 == code || // Mc BENGALI AU LENGTH MARK
-// (0x09E2 <= code && code <= 0x09E3) || // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
-// (0x0A01 <= code && code <= 0x0A02) || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+// (0x0300 <= code && code <= 0x036F) || // Mn [112] COMBINING GRAVE
+// ACCENT..COMBINING LATIN SMALL LETTER X (0x0483 <= code && code <=
+// 0x0487) || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+// (0x0488 <= code && code <= 0x0489) || // Me [2] COMBINING CYRILLIC
+// HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN (0x0591 <=
+// code && code <= 0x05BD) || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT
+// METEG 0x05BF == code || // Mn HEBREW POINT RAFE
+// (0x05C1 <= code && code <= 0x05C2) || // Mn [2] HEBREW POINT SHIN
+// DOT..HEBREW POINT SIN DOT (0x05C4 <= code && code <= 0x05C5) || // Mn
+// [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT 0x05C7 == code || //
+// Mn HEBREW POINT QAMATS QATAN (0x0610 <= code && code <= 0x061A)
+// || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+// (0x064B <= code && code <= 0x065F) || // Mn [21] ARABIC
+// FATHATAN..ARABIC WAVY HAMZA BELOW 0x0670 == code || // Mn ARABIC
+// LETTER SUPERSCRIPT ALEF (0x06D6 <= code && code <= 0x06DC) || // Mn
+// [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL
+// HIGH SEEN (0x06DF <= code && code <= 0x06E4) || // Mn [6] ARABIC
+// SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA (0x06E7 <= code &&
+// code <= 0x06E8) || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+// (0x06EA <= code && code <= 0x06ED) || // Mn [4] ARABIC EMPTY CENTRE
+// LOW STOP..ARABIC SMALL LOW MEEM 0x0711 == code || // Mn SYRIAC
+// LETTER SUPERSCRIPT ALAPH (0x0730 <= code && code <= 0x074A) || // Mn
+// [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH (0x07A6 <= code && code <=
+// 0x07B0) || // Mn [11] THAANA ABAFILI..THAANA SUKUN (0x07EB <= code &&
+// code <= 0x07F3) || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING
+// DOUBLE DOT ABOVE (0x0816 <= code && code <= 0x0819) || // Mn [4]
+// SAMARITAN MARK IN..SAMARITAN MARK DAGESH (0x081B <= code && code <=
+// 0x0823) || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+// (0x0825 <= code && code <= 0x0827) || // Mn [3] SAMARITAN VOWEL SIGN
+// SHORT A..SAMARITAN VOWEL SIGN U (0x0829 <= code && code <= 0x082D) ||
+// // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+// (0x0859 <= code && code <= 0x085B) || // Mn [3] MANDAIC AFFRICATION
+// MARK..MANDAIC GEMINATION MARK (0x08D4 <= code && code <= 0x08E1) || //
+// Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
+// (0x08E3 <= code && code <= 0x0902) || // Mn [32] ARABIC TURNED DAMMA
+// BELOW..DEVANAGARI SIGN ANUSVARA 0x093A == code || // Mn
+// DEVANAGARI VOWEL SIGN OE 0x093C == code || // Mn DEVANAGARI SIGN
+// NUKTA (0x0941 <= code && code <= 0x0948) || // Mn [8] DEVANAGARI
+// VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI 0x094D == code || // Mn
+// DEVANAGARI SIGN VIRAMA (0x0951 <= code && code <= 0x0957) || // Mn
+// [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE (0x0962
+// <= code && code <= 0x0963) || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC
+// L..DEVANAGARI VOWEL SIGN VOCALIC LL 0x0981 == code || // Mn
+// BENGALI SIGN CANDRABINDU 0x09BC == code || // Mn BENGALI SIGN
+// NUKTA 0x09BE == code || // Mc BENGALI VOWEL SIGN AA
+// (0x09C1 <= code && code <= 0x09C4) || // Mn [4] BENGALI VOWEL SIGN
+// U..BENGALI VOWEL SIGN VOCALIC RR 0x09CD == code || // Mn BENGALI
+// SIGN VIRAMA 0x09D7 == code || // Mc BENGALI AU LENGTH MARK
+// (0x09E2 <= code && code <= 0x09E3) || // Mn [2] BENGALI VOWEL SIGN
+// VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL (0x0A01 <= code && code <=
+// 0x0A02) || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
// 0x0A3C == code || // Mn GURMUKHI SIGN NUKTA
-// (0x0A41 <= code && code <= 0x0A42) || // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
-// (0x0A47 <= code && code <= 0x0A48) || // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
-// (0x0A4B <= code && code <= 0x0A4D) || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+// (0x0A41 <= code && code <= 0x0A42) || // Mn [2] GURMUKHI VOWEL SIGN
+// U..GURMUKHI VOWEL SIGN UU (0x0A47 <= code && code <= 0x0A48) || // Mn
+// [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI (0x0A4B <= code &&
+// code <= 0x0A4D) || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
// 0x0A51 == code || // Mn GURMUKHI SIGN UDAAT
-// (0x0A70 <= code && code <= 0x0A71) || // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
-// 0x0A75 == code || // Mn GURMUKHI SIGN YAKASH
-// (0x0A81 <= code && code <= 0x0A82) || // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
-// 0x0ABC == code || // Mn GUJARATI SIGN NUKTA
-// (0x0AC1 <= code && code <= 0x0AC5) || // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
-// (0x0AC7 <= code && code <= 0x0AC8) || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+// (0x0A70 <= code && code <= 0x0A71) || // Mn [2] GURMUKHI
+// TIPPI..GURMUKHI ADDAK 0x0A75 == code || // Mn GURMUKHI SIGN
+// YAKASH (0x0A81 <= code && code <= 0x0A82) || // Mn [2] GUJARATI SIGN
+// CANDRABINDU..GUJARATI SIGN ANUSVARA 0x0ABC == code || // Mn
+// GUJARATI SIGN NUKTA (0x0AC1 <= code && code <= 0x0AC5) || // Mn [5]
+// GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E (0x0AC7 <= code &&
+// code <= 0x0AC8) || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
// 0x0ACD == code || // Mn GUJARATI SIGN VIRAMA
-// (0x0AE2 <= code && code <= 0x0AE3) || // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
-// (0x0AFA <= code && code <= 0x0AFF) || // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
-// 0x0B01 == code || // Mn ORIYA SIGN CANDRABINDU
+// (0x0AE2 <= code && code <= 0x0AE3) || // Mn [2] GUJARATI VOWEL SIGN
+// VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL (0x0AFA <= code && code <=
+// 0x0AFF) || // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA
+// ABOVE 0x0B01 == code || // Mn ORIYA SIGN CANDRABINDU
// 0x0B3C == code || // Mn ORIYA SIGN NUKTA
// 0x0B3E == code || // Mc ORIYA VOWEL SIGN AA
// 0x0B3F == code || // Mn ORIYA VOWEL SIGN I
-// (0x0B41 <= code && code <= 0x0B44) || // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
-// 0x0B4D == code || // Mn ORIYA SIGN VIRAMA
-// 0x0B56 == code || // Mn ORIYA AI LENGTH MARK
+// (0x0B41 <= code && code <= 0x0B44) || // Mn [4] ORIYA VOWEL SIGN
+// U..ORIYA VOWEL SIGN VOCALIC RR 0x0B4D == code || // Mn ORIYA
+// SIGN VIRAMA 0x0B56 == code || // Mn ORIYA AI LENGTH MARK
// 0x0B57 == code || // Mc ORIYA AU LENGTH MARK
-// (0x0B62 <= code && code <= 0x0B63) || // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
-// 0x0B82 == code || // Mn TAMIL SIGN ANUSVARA
-// 0x0BBE == code || // Mc TAMIL VOWEL SIGN AA
+// (0x0B62 <= code && code <= 0x0B63) || // Mn [2] ORIYA VOWEL SIGN
+// VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL 0x0B82 == code || // Mn
+// TAMIL SIGN ANUSVARA 0x0BBE == code || // Mc TAMIL VOWEL SIGN AA
// 0x0BC0 == code || // Mn TAMIL VOWEL SIGN II
// 0x0BCD == code || // Mn TAMIL SIGN VIRAMA
// 0x0BD7 == code || // Mc TAMIL AU LENGTH MARK
// 0x0C00 == code || // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
-// (0x0C3E <= code && code <= 0x0C40) || // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
-// (0x0C46 <= code && code <= 0x0C48) || // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
-// (0x0C4A <= code && code <= 0x0C4D) || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
-// (0x0C55 <= code && code <= 0x0C56) || // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
-// (0x0C62 <= code && code <= 0x0C63) || // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+// (0x0C3E <= code && code <= 0x0C40) || // Mn [3] TELUGU VOWEL SIGN
+// AA..TELUGU VOWEL SIGN II (0x0C46 <= code && code <= 0x0C48) || // Mn
+// [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI (0x0C4A <= code && code
+// <= 0x0C4D) || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+// (0x0C55 <= code && code <= 0x0C56) || // Mn [2] TELUGU LENGTH
+// MARK..TELUGU AI LENGTH MARK (0x0C62 <= code && code <= 0x0C63) || //
+// Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
// 0x0C81 == code || // Mn KANNADA SIGN CANDRABINDU
// 0x0CBC == code || // Mn KANNADA SIGN NUKTA
// 0x0CBF == code || // Mn KANNADA VOWEL SIGN I
// 0x0CC2 == code || // Mc KANNADA VOWEL SIGN UU
// 0x0CC6 == code || // Mn KANNADA VOWEL SIGN E
-// (0x0CCC <= code && code <= 0x0CCD) || // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
-// (0x0CD5 <= code && code <= 0x0CD6) || // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
-// (0x0CE2 <= code && code <= 0x0CE3) || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
-// (0x0D00 <= code && code <= 0x0D01) || // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
-// (0x0D3B <= code && code <= 0x0D3C) || // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
-// 0x0D3E == code || // Mc MALAYALAM VOWEL SIGN AA
-// (0x0D41 <= code && code <= 0x0D44) || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+// (0x0CCC <= code && code <= 0x0CCD) || // Mn [2] KANNADA VOWEL SIGN
+// AU..KANNADA SIGN VIRAMA (0x0CD5 <= code && code <= 0x0CD6) || // Mc
+// [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK (0x0CE2 <= code &&
+// code <= 0x0CE3) || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL
+// SIGN VOCALIC LL (0x0D00 <= code && code <= 0x0D01) || // Mn [2]
+// MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
+// (0x0D3B <= code && code <= 0x0D3C) || // Mn [2] MALAYALAM SIGN
+// VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0x0D3E == code ||
+// // Mc MALAYALAM VOWEL SIGN AA (0x0D41 <= code && code <= 0x0D44)
+// || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
// 0x0D4D == code || // Mn MALAYALAM SIGN VIRAMA
// 0x0D57 == code || // Mc MALAYALAM AU LENGTH MARK
-// (0x0D62 <= code && code <= 0x0D63) || // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
-// 0x0DCA == code || // Mn SINHALA SIGN AL-LAKUNA
-// 0x0DCF == code || // Mc SINHALA VOWEL SIGN AELA-PILLA
-// (0x0DD2 <= code && code <= 0x0DD4) || // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+// (0x0D62 <= code && code <= 0x0D63) || // Mn [2] MALAYALAM VOWEL SIGN
+// VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0x0DCA == code || // Mn
+// SINHALA SIGN AL-LAKUNA 0x0DCF == code || // Mc SINHALA VOWEL
+// SIGN AELA-PILLA (0x0DD2 <= code && code <= 0x0DD4) || // Mn [3]
+// SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
// 0x0DD6 == code || // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
// 0x0DDF == code || // Mc SINHALA VOWEL SIGN GAYANUKITTA
// 0x0E31 == code || // Mn THAI CHARACTER MAI HAN-AKAT
-// (0x0E34 <= code && code <= 0x0E3A) || // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
-// (0x0E47 <= code && code <= 0x0E4E) || // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
-// 0x0EB1 == code || // Mn LAO VOWEL SIGN MAI KAN
-// (0x0EB4 <= code && code <= 0x0EB9) || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
-// (0x0EBB <= code && code <= 0x0EBC) || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
-// (0x0EC8 <= code && code <= 0x0ECD) || // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
-// (0x0F18 <= code && code <= 0x0F19) || // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+// (0x0E34 <= code && code <= 0x0E3A) || // Mn [7] THAI CHARACTER SARA
+// I..THAI CHARACTER PHINTHU (0x0E47 <= code && code <= 0x0E4E) || // Mn
+// [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN 0x0EB1 == code
+// || // Mn LAO VOWEL SIGN MAI KAN (0x0EB4 <= code && code <=
+// 0x0EB9) || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU (0x0EBB <=
+// code && code <= 0x0EBC) || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL
+// SIGN LO (0x0EC8 <= code && code <= 0x0ECD) || // Mn [6] LAO TONE MAI
+// EK..LAO NIGGAHITA (0x0F18 <= code && code <= 0x0F19) || // Mn [2]
+// TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
// 0x0F35 == code || // Mn TIBETAN MARK NGAS BZUNG NYI ZLA
// 0x0F37 == code || // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
// 0x0F39 == code || // Mn TIBETAN MARK TSA -PHRU
-// (0x0F71 <= code && code <= 0x0F7E) || // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
-// (0x0F80 <= code && code <= 0x0F84) || // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
-// (0x0F86 <= code && code <= 0x0F87) || // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
-// (0x0F8D <= code && code <= 0x0F97) || // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
-// (0x0F99 <= code && code <= 0x0FBC) || // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
-// 0x0FC6 == code || // Mn TIBETAN SYMBOL PADMA GDAN
-// (0x102D <= code && code <= 0x1030) || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
-// (0x1032 <= code && code <= 0x1037) || // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
-// (0x1039 <= code && code <= 0x103A) || // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
-// (0x103D <= code && code <= 0x103E) || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
-// (0x1058 <= code && code <= 0x1059) || // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
-// (0x105E <= code && code <= 0x1060) || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
-// (0x1071 <= code && code <= 0x1074) || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
-// 0x1082 == code || // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
-// (0x1085 <= code && code <= 0x1086) || // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
-// 0x108D == code || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
-// 0x109D == code || // Mn MYANMAR VOWEL SIGN AITON AI
-// (0x135D <= code && code <= 0x135F) || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK
-// (0x1712 <= code && code <= 0x1714) || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
-// (0x1732 <= code && code <= 0x1734) || // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
-// (0x1752 <= code && code <= 0x1753) || // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
-// (0x1772 <= code && code <= 0x1773) || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
-// (0x17B4 <= code && code <= 0x17B5) || // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
-// (0x17B7 <= code && code <= 0x17BD) || // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
-// 0x17C6 == code || // Mn KHMER SIGN NIKAHIT
-// (0x17C9 <= code && code <= 0x17D3) || // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
-// 0x17DD == code || // Mn KHMER SIGN ATTHACAN
-// (0x180B <= code && code <= 0x180D) || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
-// (0x1885 <= code && code <= 0x1886) || // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
+// (0x0F71 <= code && code <= 0x0F7E) || // Mn [14] TIBETAN VOWEL SIGN
+// AA..TIBETAN SIGN RJES SU NGA RO (0x0F80 <= code && code <= 0x0F84) ||
+// // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+// (0x0F86 <= code && code <= 0x0F87) || // Mn [2] TIBETAN SIGN LCI
+// RTAGS..TIBETAN SIGN YANG RTAGS (0x0F8D <= code && code <= 0x0F97) ||
+// // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
+// (0x0F99 <= code && code <= 0x0FBC) || // Mn [36] TIBETAN SUBJOINED
+// LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA 0x0FC6 == code ||
+// // Mn TIBETAN SYMBOL PADMA GDAN (0x102D <= code && code <=
+// 0x1030) || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+// (0x1032 <= code && code <= 0x1037) || // Mn [6] MYANMAR VOWEL SIGN
+// AI..MYANMAR SIGN DOT BELOW (0x1039 <= code && code <= 0x103A) || // Mn
+// [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT (0x103D <= code && code <=
+// 0x103E) || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT
+// SIGN MEDIAL HA (0x1058 <= code && code <= 0x1059) || // Mn [2]
+// MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL (0x105E <=
+// code && code <= 0x1060) || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL
+// NA..MYANMAR CONSONANT SIGN MON MEDIAL LA (0x1071 <= code && code <=
+// 0x1074) || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN
+// KAYAH EE 0x1082 == code || // Mn MYANMAR CONSONANT SIGN SHAN
+// MEDIAL WA (0x1085 <= code && code <= 0x1086) || // Mn [2] MYANMAR
+// VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y 0x108D ==
+// code || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE 0x109D ==
+// code || // Mn MYANMAR VOWEL SIGN AITON AI (0x135D <= code &&
+// code <= 0x135F) || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH
+// MARK..ETHIOPIC COMBINING GEMINATION MARK (0x1712 <= code && code <=
+// 0x1714) || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+// (0x1732 <= code && code <= 0x1734) || // Mn [3] HANUNOO VOWEL SIGN
+// I..HANUNOO SIGN PAMUDPOD (0x1752 <= code && code <= 0x1753) || // Mn
+// [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U (0x1772 <= code && code <=
+// 0x1773) || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+// (0x17B4 <= code && code <= 0x17B5) || // Mn [2] KHMER VOWEL INHERENT
+// AQ..KHMER VOWEL INHERENT AA (0x17B7 <= code && code <= 0x17BD) || //
+// Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA 0x17C6 == code || //
+// Mn KHMER SIGN NIKAHIT (0x17C9 <= code && code <= 0x17D3) || //
+// Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 0x17DD == code
+// || // Mn KHMER SIGN ATTHACAN (0x180B <= code && code <= 0x180D)
+// || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE
+// VARIATION SELECTOR THREE (0x1885 <= code && code <= 0x1886) || // Mn
+// [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
// 0x18A9 == code || // Mn MONGOLIAN LETTER ALI GALI DAGALGA
-// (0x1920 <= code && code <= 0x1922) || // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
-// (0x1927 <= code && code <= 0x1928) || // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
-// 0x1932 == code || // Mn LIMBU SMALL LETTER ANUSVARA
-// (0x1939 <= code && code <= 0x193B) || // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
-// (0x1A17 <= code && code <= 0x1A18) || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+// (0x1920 <= code && code <= 0x1922) || // Mn [3] LIMBU VOWEL SIGN
+// A..LIMBU VOWEL SIGN U (0x1927 <= code && code <= 0x1928) || // Mn
+// [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O 0x1932 == code || // Mn
+// LIMBU SMALL LETTER ANUSVARA (0x1939 <= code && code <= 0x193B) || //
+// Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I (0x1A17 <= code && code
+// <= 0x1A18) || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
// 0x1A1B == code || // Mn BUGINESE VOWEL SIGN AE
// 0x1A56 == code || // Mn TAI THAM CONSONANT SIGN MEDIAL LA
-// (0x1A58 <= code && code <= 0x1A5E) || // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
-// 0x1A60 == code || // Mn TAI THAM SIGN SAKOT
-// 0x1A62 == code || // Mn TAI THAM VOWEL SIGN MAI SAT
-// (0x1A65 <= code && code <= 0x1A6C) || // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
-// (0x1A73 <= code && code <= 0x1A7C) || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
-// 0x1A7F == code || // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
-// (0x1AB0 <= code && code <= 0x1ABD) || // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
-// 0x1ABE == code || // Me COMBINING PARENTHESES OVERLAY
-// (0x1B00 <= code && code <= 0x1B03) || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+// (0x1A58 <= code && code <= 0x1A5E) || // Mn [7] TAI THAM SIGN MAI
+// KANG LAI..TAI THAM CONSONANT SIGN SA 0x1A60 == code || // Mn TAI
+// THAM SIGN SAKOT 0x1A62 == code || // Mn TAI THAM VOWEL SIGN MAI
+// SAT (0x1A65 <= code && code <= 0x1A6C) || // Mn [8] TAI THAM VOWEL
+// SIGN I..TAI THAM VOWEL SIGN OA BELOW (0x1A73 <= code && code <=
+// 0x1A7C) || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE
+// KARAN 0x1A7F == code || // Mn TAI THAM COMBINING CRYPTOGRAMMIC
+// DOT (0x1AB0 <= code && code <= 0x1ABD) || // Mn [14] COMBINING
+// DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 0x1ABE == code
+// || // Me COMBINING PARENTHESES OVERLAY (0x1B00 <= code && code
+// <= 0x1B03) || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
// 0x1B34 == code || // Mn BALINESE SIGN REREKAN
-// (0x1B36 <= code && code <= 0x1B3A) || // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
-// 0x1B3C == code || // Mn BALINESE VOWEL SIGN LA LENGA
-// 0x1B42 == code || // Mn BALINESE VOWEL SIGN PEPET
-// (0x1B6B <= code && code <= 0x1B73) || // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
-// (0x1B80 <= code && code <= 0x1B81) || // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
-// (0x1BA2 <= code && code <= 0x1BA5) || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
-// (0x1BA8 <= code && code <= 0x1BA9) || // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
-// (0x1BAB <= code && code <= 0x1BAD) || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA
-// 0x1BE6 == code || // Mn BATAK SIGN TOMPI
-// (0x1BE8 <= code && code <= 0x1BE9) || // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE
-// 0x1BED == code || // Mn BATAK VOWEL SIGN KARO O
-// (0x1BEF <= code && code <= 0x1BF1) || // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H
-// (0x1C2C <= code && code <= 0x1C33) || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
-// (0x1C36 <= code && code <= 0x1C37) || // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
-// (0x1CD0 <= code && code <= 0x1CD2) || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
-// (0x1CD4 <= code && code <= 0x1CE0) || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
-// (0x1CE2 <= code && code <= 0x1CE8) || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
-// 0x1CED == code || // Mn VEDIC SIGN TIRYAK
-// 0x1CF4 == code || // Mn VEDIC TONE CANDRA ABOVE
-// (0x1CF8 <= code && code <= 0x1CF9) || // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
-// (0x1DC0 <= code && code <= 0x1DF9) || // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW
-// (0x1DFB <= code && code <= 0x1DFF) || // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+// (0x1B36 <= code && code <= 0x1B3A) || // Mn [5] BALINESE VOWEL SIGN
+// ULU..BALINESE VOWEL SIGN RA REPA 0x1B3C == code || // Mn
+// BALINESE VOWEL SIGN LA LENGA 0x1B42 == code || // Mn BALINESE
+// VOWEL SIGN PEPET (0x1B6B <= code && code <= 0x1B73) || // Mn [9]
+// BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING
+// GONG (0x1B80 <= code && code <= 0x1B81) || // Mn [2] SUNDANESE SIGN
+// PANYECEK..SUNDANESE SIGN PANGLAYAR (0x1BA2 <= code && code <= 0x1BA5)
+// || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN
+// PANYUKU (0x1BA8 <= code && code <= 0x1BA9) || // Mn [2] SUNDANESE
+// VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG (0x1BAB <= code &&
+// code <= 0x1BAD) || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT
+// SIGN PASANGAN WA 0x1BE6 == code || // Mn BATAK SIGN TOMPI
+// (0x1BE8 <= code && code <= 0x1BE9) || // Mn [2] BATAK VOWEL SIGN
+// PAKPAK E..BATAK VOWEL SIGN EE 0x1BED == code || // Mn BATAK
+// VOWEL SIGN KARO O (0x1BEF <= code && code <= 0x1BF1) || // Mn [3]
+// BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H (0x1C2C
+// <= code && code <= 0x1C33) || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA
+// CONSONANT SIGN T (0x1C36 <= code && code <= 0x1C37) || // Mn [2]
+// LEPCHA SIGN RAN..LEPCHA SIGN NUKTA (0x1CD0 <= code && code <= 0x1CD2)
+// || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA (0x1CD4 <= code
+// && code <= 0x1CE0) || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE
+// SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA (0x1CE2 <=
+// code && code <= 0x1CE8) || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN
+// VISARGA ANUDATTA WITH TAIL 0x1CED == code || // Mn VEDIC SIGN
+// TIRYAK 0x1CF4 == code || // Mn VEDIC TONE CANDRA ABOVE
+// (0x1CF8 <= code && code <= 0x1CF9) || // Mn [2] VEDIC TONE RING
+// ABOVE..VEDIC TONE DOUBLE RING ABOVE (0x1DC0 <= code && code <= 0x1DF9)
+// || // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE
+// BELOW (0x1DFB <= code && code <= 0x1DFF) || // Mn [5] COMBINING
+// DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
// 0x200C == code || // Cf ZERO WIDTH NON-JOINER
-// (0x20D0 <= code && code <= 0x20DC) || // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
-// (0x20DD <= code && code <= 0x20E0) || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
-// 0x20E1 == code || // Mn COMBINING LEFT RIGHT ARROW ABOVE
-// (0x20E2 <= code && code <= 0x20E4) || // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
-// (0x20E5 <= code && code <= 0x20F0) || // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
-// (0x2CEF <= code && code <= 0x2CF1) || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+// (0x20D0 <= code && code <= 0x20DC) || // Mn [13] COMBINING LEFT
+// HARPOON ABOVE..COMBINING FOUR DOTS ABOVE (0x20DD <= code && code <=
+// 0x20E0) || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE
+// BACKSLASH 0x20E1 == code || // Mn COMBINING LEFT RIGHT ARROW
+// ABOVE (0x20E2 <= code && code <= 0x20E4) || // Me [3] COMBINING
+// ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE (0x20E5
+// <= code && code <= 0x20F0) || // Mn [12] COMBINING REVERSE SOLIDUS
+// OVERLAY..COMBINING ASTERISK ABOVE (0x2CEF <= code && code <= 0x2CF1)
+// || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
// 0x2D7F == code || // Mn TIFINAGH CONSONANT JOINER
-// (0x2DE0 <= code && code <= 0x2DFF) || // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
-// (0x302A <= code && code <= 0x302D) || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK
-// (0x302E <= code && code <= 0x302F) || // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK
-// (0x3099 <= code && code <= 0x309A) || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
-// 0x_a66F == code || // Mn COMBINING CYRILLIC VZMET
-// (0x_a670 <= code && code <= 0x_a672) || // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
-// (0x_a674 <= code && code <= 0x_a67D) || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK
-// (0x_a69E <= code && code <= 0x_a69F) || // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E
-// (0x_a6F0 <= code && code <= 0x_a6F1) || // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
-// 0x_a802 == code || // Mn SYLOTI NAGRI SIGN DVISVARA
-// 0x_a806 == code || // Mn SYLOTI NAGRI SIGN HASANTA
-// 0x_a80B == code || // Mn SYLOTI NAGRI SIGN ANUSVARA
-// (0x_a825 <= code && code <= 0x_a826) || // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
-// (0x_a8C4 <= code && code <= 0x_a8C5) || // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU
-// (0x_a8E0 <= code && code <= 0x_a8F1) || // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
-// (0x_a926 <= code && code <= 0x_a92D) || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
-// (0x_a947 <= code && code <= 0x_a951) || // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
-// (0x_a980 <= code && code <= 0x_a982) || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+// (0x2DE0 <= code && code <= 0x2DFF) || // Mn [32] COMBINING CYRILLIC
+// LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS (0x302A <= code
+// && code <= 0x302D) || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC
+// ENTERING TONE MARK (0x302E <= code && code <= 0x302F) || // Mc [2]
+// HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK (0x3099 <=
+// code && code <= 0x309A) || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED
+// SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 0x_a66F
+// == code || // Mn COMBINING CYRILLIC VZMET (0x_a670 <= code &&
+// code <= 0x_a672) || // Me [3] COMBINING CYRILLIC TEN MILLIONS
+// SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN (0x_a674 <= code &&
+// code <= 0x_a67D) || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN
+// IE..COMBINING CYRILLIC PAYEROK (0x_a69E <= code && code <= 0x_a69F) ||
+// // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED
+// E (0x_a6F0 <= code && code <= 0x_a6F1) || // Mn [2] BAMUM COMBINING
+// MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS 0x_a802 == code || // Mn
+// SYLOTI NAGRI SIGN DVISVARA 0x_a806 == code || // Mn SYLOTI NAGRI
+// SIGN HASANTA 0x_a80B == code || // Mn SYLOTI NAGRI SIGN ANUSVARA
+// (0x_a825 <= code && code <= 0x_a826) || // Mn [2] SYLOTI NAGRI VOWEL
+// SIGN U..SYLOTI NAGRI VOWEL SIGN E (0x_a8C4 <= code && code <= 0x_a8C5)
+// || // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU
+// (0x_a8E0 <= code && code <= 0x_a8F1) || // Mn [18] COMBINING
+// DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA (0x_a926 <=
+// code && code <= 0x_a92D) || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE
+// CALYA PLOPHU (0x_a947 <= code && code <= 0x_a951) || // Mn [11]
+// REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R (0x_a980 <= code && code
+// <= 0x_a982) || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
// 0x_a9B3 == code || // Mn JAVANESE SIGN CECAK TELU
-// (0x_a9B6 <= code && code <= 0x_a9B9) || // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
-// 0x_a9BC == code || // Mn JAVANESE VOWEL SIGN PEPET
-// 0x_a9E5 == code || // Mn MYANMAR SIGN SHAN SAW
-// (0x_aA29 <= code && code <= 0x_aA2E) || // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
-// (0x_aA31 <= code && code <= 0x_aA32) || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
-// (0x_aA35 <= code && code <= 0x_aA36) || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
-// 0x_aA43 == code || // Mn CHAM CONSONANT SIGN FINAL NG
+// (0x_a9B6 <= code && code <= 0x_a9B9) || // Mn [4] JAVANESE VOWEL
+// SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT 0x_a9BC == code || // Mn
+// JAVANESE VOWEL SIGN PEPET 0x_a9E5 == code || // Mn MYANMAR SIGN
+// SHAN SAW (0x_aA29 <= code && code <= 0x_aA2E) || // Mn [6] CHAM
+// VOWEL SIGN AA..CHAM VOWEL SIGN OE (0x_aA31 <= code && code <= 0x_aA32)
+// || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE (0x_aA35 <= code
+// && code <= 0x_aA36) || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT
+// SIGN WA 0x_aA43 == code || // Mn CHAM CONSONANT SIGN FINAL NG
// 0x_aA4C == code || // Mn CHAM CONSONANT SIGN FINAL M
// 0x_aA7C == code || // Mn MYANMAR SIGN TAI LAING TONE-2
// 0x_aAB0 == code || // Mn TAI VIET MAI KANG
-// (0x_aAB2 <= code && code <= 0x_aAB4) || // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
-// (0x_aAB7 <= code && code <= 0x_aAB8) || // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
-// (0x_aABE <= code && code <= 0x_aABF) || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+// (0x_aAB2 <= code && code <= 0x_aAB4) || // Mn [3] TAI VIET VOWEL
+// I..TAI VIET VOWEL U (0x_aAB7 <= code && code <= 0x_aAB8) || // Mn
+// [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA (0x_aABE <= code && code <=
+// 0x_aABF) || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
// 0x_aAC1 == code || // Mn TAI VIET TONE MAI THO
-// (0x_aAEC <= code && code <= 0x_aAED) || // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI
-// 0x_aAF6 == code || // Mn MEETEI MAYEK VIRAMA
-// 0x_aBE5 == code || // Mn MEETEI MAYEK VOWEL SIGN ANAP
-// 0x_aBE8 == code || // Mn MEETEI MAYEK VOWEL SIGN UNAP
+// (0x_aAEC <= code && code <= 0x_aAED) || // Mn [2] MEETEI MAYEK VOWEL
+// SIGN UU..MEETEI MAYEK VOWEL SIGN AAI 0x_aAF6 == code || // Mn
+// MEETEI MAYEK VIRAMA 0x_aBE5 == code || // Mn MEETEI MAYEK VOWEL
+// SIGN ANAP 0x_aBE8 == code || // Mn MEETEI MAYEK VOWEL SIGN UNAP
// 0x_aBED == code || // Mn MEETEI MAYEK APUN IYEK
// 0x_fB1E == code || // Mn HEBREW POINT JUDEO-SPANISH VARIKA
-// (0x_fE00 <= code && code <= 0x_fE0F) || // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
-// (0x_fE20 <= code && code <= 0x_fE2F) || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF
-// (0x_fF9E <= code && code <= 0x_fF9F) || // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
-// 0x101FD == code || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
-// 0x102E0 == code || // Mn COPTIC EPACT THOUSANDS MARK
-// (0x10376 <= code && code <= 0x1037A) || // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII
-// (0x10A01 <= code && code <= 0x10A03) || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
-// (0x10A05 <= code && code <= 0x10A06) || // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
-// (0x10A0C <= code && code <= 0x10A0F) || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
-// (0x10A38 <= code && code <= 0x10A3A) || // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
-// 0x10A3F == code || // Mn KHAROSHTHI VIRAMA
-// (0x10AE5 <= code && code <= 0x10AE6) || // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
+// (0x_fE00 <= code && code <= 0x_fE0F) || // Mn [16] VARIATION
+// SELECTOR-1..VARIATION SELECTOR-16 (0x_fE20 <= code && code <= 0x_fE2F)
+// || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT
+// HALF (0x_fF9E <= code && code <= 0x_fF9F) || // Lm [2] HALFWIDTH
+// KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+// 0x101FD == code || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE
+// STROKE 0x102E0 == code || // Mn COPTIC EPACT THOUSANDS MARK
+// (0x10376 <= code && code <= 0x1037A) || // Mn [5] COMBINING OLD
+// PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII (0x10A01 <= code &&
+// code <= 0x10A03) || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL
+// SIGN VOCALIC R (0x10A05 <= code && code <= 0x10A06) || // Mn [2]
+// KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O (0x10A0C <= code &&
+// code <= 0x10A0F) || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN
+// VISARGA (0x10A38 <= code && code <= 0x10A3A) || // Mn [3] KHAROSHTHI
+// SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW 0x10A3F == code || // Mn
+// KHAROSHTHI VIRAMA (0x10AE5 <= code && code <= 0x10AE6) || // Mn [2]
+// MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
// 0x11001 == code || // Mn BRAHMI SIGN ANUSVARA
-// (0x11038 <= code && code <= 0x11046) || // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA
-// (0x1107F <= code && code <= 0x11081) || // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA
-// (0x110B3 <= code && code <= 0x110B6) || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
-// (0x110B9 <= code && code <= 0x110BA) || // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
-// (0x11100 <= code && code <= 0x11102) || // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
-// (0x11127 <= code && code <= 0x1112B) || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
-// (0x1112D <= code && code <= 0x11134) || // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
-// 0x11173 == code || // Mn MAHAJANI SIGN NUKTA
-// (0x11180 <= code && code <= 0x11181) || // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
-// (0x111B6 <= code && code <= 0x111BE) || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
-// (0x111CA <= code && code <= 0x111CC) || // Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
-// (0x1122F <= code && code <= 0x11231) || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
+// (0x11038 <= code && code <= 0x11046) || // Mn [15] BRAHMI VOWEL SIGN
+// AA..BRAHMI VIRAMA (0x1107F <= code && code <= 0x11081) || // Mn [3]
+// BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA (0x110B3 <= code && code <=
+// 0x110B6) || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+// (0x110B9 <= code && code <= 0x110BA) || // Mn [2] KAITHI SIGN
+// VIRAMA..KAITHI SIGN NUKTA (0x11100 <= code && code <= 0x11102) || //
+// Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA (0x11127 <= code
+// && code <= 0x1112B) || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
+// (0x1112D <= code && code <= 0x11134) || // Mn [8] CHAKMA VOWEL SIGN
+// AI..CHAKMA MAAYYAA 0x11173 == code || // Mn MAHAJANI SIGN NUKTA
+// (0x11180 <= code && code <= 0x11181) || // Mn [2] SHARADA SIGN
+// CANDRABINDU..SHARADA SIGN ANUSVARA (0x111B6 <= code && code <=
+// 0x111BE) || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
+// (0x111CA <= code && code <= 0x111CC) || // Mn [3] SHARADA SIGN
+// NUKTA..SHARADA EXTRA SHORT VOWEL MARK (0x1122F <= code && code <=
+// 0x11231) || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
// 0x11234 == code || // Mn KHOJKI SIGN ANUSVARA
-// (0x11236 <= code && code <= 0x11237) || // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
-// 0x1123E == code || // Mn KHOJKI SIGN SUKUN
-// 0x112DF == code || // Mn KHUDAWADI SIGN ANUSVARA
-// (0x112E3 <= code && code <= 0x112EA) || // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
-// (0x11300 <= code && code <= 0x11301) || // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
+// (0x11236 <= code && code <= 0x11237) || // Mn [2] KHOJKI SIGN
+// NUKTA..KHOJKI SIGN SHADDA 0x1123E == code || // Mn KHOJKI SIGN
+// SUKUN 0x112DF == code || // Mn KHUDAWADI SIGN ANUSVARA
+// (0x112E3 <= code && code <= 0x112EA) || // Mn [8] KHUDAWADI VOWEL
+// SIGN U..KHUDAWADI SIGN VIRAMA (0x11300 <= code && code <= 0x11301) ||
+// // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
// 0x1133C == code || // Mn GRANTHA SIGN NUKTA
// 0x1133E == code || // Mc GRANTHA VOWEL SIGN AA
// 0x11340 == code || // Mn GRANTHA VOWEL SIGN II
// 0x11357 == code || // Mc GRANTHA AU LENGTH MARK
-// (0x11366 <= code && code <= 0x1136C) || // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX
-// (0x11370 <= code && code <= 0x11374) || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA
-// (0x11438 <= code && code <= 0x1143F) || // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI
-// (0x11442 <= code && code <= 0x11444) || // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA
-// 0x11446 == code || // Mn NEWA SIGN NUKTA
-// 0x114B0 == code || // Mc TIRHUTA VOWEL SIGN AA
-// (0x114B3 <= code && code <= 0x114B8) || // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
-// 0x114BA == code || // Mn TIRHUTA VOWEL SIGN SHORT E
-// 0x114BD == code || // Mc TIRHUTA VOWEL SIGN SHORT O
-// (0x114BF <= code && code <= 0x114C0) || // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA
-// (0x114C2 <= code && code <= 0x114C3) || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA
+// (0x11366 <= code && code <= 0x1136C) || // Mn [7] COMBINING GRANTHA
+// DIGIT ZERO..COMBINING GRANTHA DIGIT SIX (0x11370 <= code && code <=
+// 0x11374) || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER
+// PA (0x11438 <= code && code <= 0x1143F) || // Mn [8] NEWA VOWEL SIGN
+// U..NEWA VOWEL SIGN AI (0x11442 <= code && code <= 0x11444) || // Mn
+// [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA 0x11446 == code || // Mn
+// NEWA SIGN NUKTA 0x114B0 == code || // Mc TIRHUTA VOWEL SIGN AA
+// (0x114B3 <= code && code <= 0x114B8) || // Mn [6] TIRHUTA VOWEL SIGN
+// U..TIRHUTA VOWEL SIGN VOCALIC LL 0x114BA == code || // Mn
+// TIRHUTA VOWEL SIGN SHORT E 0x114BD == code || // Mc TIRHUTA
+// VOWEL SIGN SHORT O (0x114BF <= code && code <= 0x114C0) || // Mn [2]
+// TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA (0x114C2 <= code &&
+// code <= 0x114C3) || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA
// 0x115AF == code || // Mc SIDDHAM VOWEL SIGN AA
-// (0x115B2 <= code && code <= 0x115B5) || // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR
-// (0x115BC <= code && code <= 0x115BD) || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA
-// (0x115BF <= code && code <= 0x115C0) || // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA
-// (0x115DC <= code && code <= 0x115DD) || // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU
-// (0x11633 <= code && code <= 0x1163A) || // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI
-// 0x1163D == code || // Mn MODI SIGN ANUSVARA
-// (0x1163F <= code && code <= 0x11640) || // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA
-// 0x116AB == code || // Mn TAKRI SIGN ANUSVARA
-// 0x116AD == code || // Mn TAKRI VOWEL SIGN AA
-// (0x116B0 <= code && code <= 0x116B5) || // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU
-// 0x116B7 == code || // Mn TAKRI SIGN NUKTA
-// (0x1171D <= code && code <= 0x1171F) || // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
-// (0x11722 <= code && code <= 0x11725) || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
-// (0x11727 <= code && code <= 0x1172B) || // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER
-// (0x11A01 <= code && code <= 0x11A06) || // Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
-// (0x11A09 <= code && code <= 0x11A0A) || // Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
-// (0x11A33 <= code && code <= 0x11A38) || // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
-// (0x11A3B <= code && code <= 0x11A3E) || // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
-// 0x11A47 == code || // Mn ZANABAZAR SQUARE SUBJOINER
-// (0x11A51 <= code && code <= 0x11A56) || // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE
-// (0x11A59 <= code && code <= 0x11A5B) || // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK
-// (0x11A8A <= code && code <= 0x11A96) || // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA
-// (0x11A98 <= code && code <= 0x11A99) || // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
-// (0x11C30 <= code && code <= 0x11C36) || // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L
-// (0x11C38 <= code && code <= 0x11C3D) || // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA
+// (0x115B2 <= code && code <= 0x115B5) || // Mn [4] SIDDHAM VOWEL SIGN
+// U..SIDDHAM VOWEL SIGN VOCALIC RR (0x115BC <= code && code <= 0x115BD)
+// || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA
+// (0x115BF <= code && code <= 0x115C0) || // Mn [2] SIDDHAM SIGN
+// VIRAMA..SIDDHAM SIGN NUKTA (0x115DC <= code && code <= 0x115DD) || //
+// Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU
+// (0x11633 <= code && code <= 0x1163A) || // Mn [8] MODI VOWEL SIGN
+// U..MODI VOWEL SIGN AI 0x1163D == code || // Mn MODI SIGN
+// ANUSVARA (0x1163F <= code && code <= 0x11640) || // Mn [2] MODI SIGN
+// VIRAMA..MODI SIGN ARDHACANDRA 0x116AB == code || // Mn TAKRI
+// SIGN ANUSVARA 0x116AD == code || // Mn TAKRI VOWEL SIGN AA
+// (0x116B0 <= code && code <= 0x116B5) || // Mn [6] TAKRI VOWEL SIGN
+// U..TAKRI VOWEL SIGN AU 0x116B7 == code || // Mn TAKRI SIGN NUKTA
+// (0x1171D <= code && code <= 0x1171F) || // Mn [3] AHOM CONSONANT
+// SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA (0x11722 <=
+// code && code <= 0x11725) || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
+// (0x11727 <= code && code <= 0x1172B) || // Mn [5] AHOM VOWEL SIGN
+// AW..AHOM SIGN KILLER (0x11A01 <= code && code <= 0x11A06) || // Mn
+// [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
+// (0x11A09 <= code && code <= 0x11A0A) || // Mn [2] ZANABAZAR SQUARE
+// VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK (0x11A33 <=
+// code && code <= 0x11A38) || // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT
+// MARK..ZANABAZAR SQUARE SIGN ANUSVARA (0x11A3B <= code && code <=
+// 0x11A3E) || // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR
+// SQUARE CLUSTER-FINAL LETTER VA 0x11A47 == code || // Mn
+// ZANABAZAR SQUARE SUBJOINER (0x11A51 <= code && code <= 0x11A56) || //
+// Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE (0x11A59 <= code
+// && code <= 0x11A5B) || // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO
+// VOWEL LENGTH MARK (0x11A8A <= code && code <= 0x11A96) || // Mn [13]
+// SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA (0x11A98 <= code
+// && code <= 0x11A99) || // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
+// (0x11C30 <= code && code <= 0x11C36) || // Mn [7] BHAIKSUKI VOWEL
+// SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L (0x11C38 <= code && code <=
+// 0x11C3D) || // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA
// 0x11C3F == code || // Mn BHAIKSUKI SIGN VIRAMA
-// (0x11C92 <= code && code <= 0x11CA7) || // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA
-// (0x11CAA <= code && code <= 0x11CB0) || // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA
-// (0x11CB2 <= code && code <= 0x11CB3) || // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E
-// (0x11CB5 <= code && code <= 0x11CB6) || // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
-// (0x11D31 <= code && code <= 0x11D36) || // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R
-// 0x11D3A == code || // Mn MASARAM GONDI VOWEL SIGN E
-// (0x11D3C <= code && code <= 0x11D3D) || // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
-// (0x11D3F <= code && code <= 0x11D45) || // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA
-// 0x11D47 == code || // Mn MASARAM GONDI RA-KARA
-// (0x16AF0 <= code && code <= 0x16AF4) || // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
-// (0x16B30 <= code && code <= 0x16B36) || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
-// (0x16F8F <= code && code <= 0x16F92) || // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
-// (0x1BC9D <= code && code <= 0x1BC9E) || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
+// (0x11C92 <= code && code <= 0x11CA7) || // Mn [22] MARCHEN SUBJOINED
+// LETTER KA..MARCHEN SUBJOINED LETTER ZA (0x11CAA <= code && code <=
+// 0x11CB0) || // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA
+// (0x11CB2 <= code && code <= 0x11CB3) || // Mn [2] MARCHEN VOWEL SIGN
+// U..MARCHEN VOWEL SIGN E (0x11CB5 <= code && code <= 0x11CB6) || // Mn
+// [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU (0x11D31 <= code
+// && code <= 0x11D36) || // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI
+// VOWEL SIGN VOCALIC R 0x11D3A == code || // Mn MASARAM GONDI
+// VOWEL SIGN E (0x11D3C <= code && code <= 0x11D3D) || // Mn [2]
+// MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O (0x11D3F <=
+// code && code <= 0x11D45) || // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM
+// GONDI VIRAMA 0x11D47 == code || // Mn MASARAM GONDI RA-KARA
+// (0x16AF0 <= code && code <= 0x16AF4) || // Mn [5] BASSA VAH
+// COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE (0x16B30 <=
+// code && code <= 0x16B36) || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH
+// HMONG MARK CIM TAUM (0x16F8F <= code && code <= 0x16F92) || // Mn
+// [4] MIAO TONE RIGHT..MIAO TONE BELOW (0x1BC9D <= code && code <=
+// 0x1BC9E) || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
// 0x1D165 == code || // Mc MUSICAL SYMBOL COMBINING STEM
-// (0x1D167 <= code && code <= 0x1D169) || // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
-// (0x1D16E <= code && code <= 0x1D172) || // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
-// (0x1D17B <= code && code <= 0x1D182) || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
-// (0x1D185 <= code && code <= 0x1D18B) || // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
-// (0x1D1AA <= code && code <= 0x1D1AD) || // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
-// (0x1D242 <= code && code <= 0x1D244) || // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
-// (0x1DA00 <= code && code <= 0x1DA36) || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN
-// (0x1DA3B <= code && code <= 0x1DA6C) || // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT
-// 0x1DA75 == code || // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
-// 0x1DA84 == code || // Mn SIGNWRITING LOCATION HEAD NECK
-// (0x1DA9B <= code && code <= 0x1DA9F) || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6
-// (0x1DAA1 <= code && code <= 0x1DAAF) || // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16
-// (0x1E000 <= code && code <= 0x1E006) || // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
-// (0x1E008 <= code && code <= 0x1E018) || // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
-// (0x1E01B <= code && code <= 0x1E021) || // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
-// (0x1E023 <= code && code <= 0x1E024) || // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
-// (0x1E026 <= code && code <= 0x1E02A) || // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
-// (0x1E8D0 <= code && code <= 0x1E8D6) || // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
-// (0x1E944 <= code && code <= 0x1E94A) || // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
-// (0x_e0020 <= code && code <= 0x_e007F) || // Cf [96] TAG SPACE..CANCEL TAG
-// (0x_e0100 <= code && code <= 0x_e01EF) // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
-// ){
+// (0x1D167 <= code && code <= 0x1D169) || // Mn [3] MUSICAL SYMBOL
+// COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 (0x1D16E <=
+// code && code <= 0x1D172) || // Mc [5] MUSICAL SYMBOL COMBINING
+// FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 (0x1D17B <= code && code <=
+// 0x1D182) || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL
+// COMBINING LOURE (0x1D185 <= code && code <= 0x1D18B) || // Mn [7]
+// MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+// (0x1D1AA <= code && code <= 0x1D1AD) || // Mn [4] MUSICAL SYMBOL
+// COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO (0x1D242
+// <= code && code <= 0x1D244) || // Mn [3] COMBINING GREEK MUSICAL
+// TRISEME..COMBINING GREEK MUSICAL PENTASEME (0x1DA00 <= code && code <=
+// 0x1DA36) || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN
+// (0x1DA3B <= code && code <= 0x1DA6C) || // Mn [50] SIGNWRITING MOUTH
+// CLOSED NEUTRAL..SIGNWRITING EXCITEMENT 0x1DA75 == code || // Mn
+// SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS 0x1DA84 == code || //
+// Mn SIGNWRITING LOCATION HEAD NECK (0x1DA9B <= code && code <=
+// 0x1DA9F) || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL
+// MODIFIER-6 (0x1DAA1 <= code && code <= 0x1DAAF) || // Mn [15]
+// SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16
+// (0x1E000 <= code && code <= 0x1E006) || // Mn [7] COMBINING
+// GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE (0x1E008 <=
+// code && code <= 0x1E018) || // Mn [17] COMBINING GLAGOLITIC LETTER
+// ZEMLJA..COMBINING GLAGOLITIC LETTER HERU (0x1E01B <= code && code <=
+// 0x1E021) || // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING
+// GLAGOLITIC LETTER YATI (0x1E023 <= code && code <= 0x1E024) || // Mn
+// [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
+// (0x1E026 <= code && code <= 0x1E02A) || // Mn [5] COMBINING
+// GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA (0x1E8D0 <=
+// code && code <= 0x1E8D6) || // Mn [7] MENDE KIKAKUI COMBINING NUMBER
+// TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS (0x1E944 <= code &&
+// code <= 0x1E94A) || // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
+// (0x_e0020 <= code && code <= 0x_e007F) || // Cf [96] TAG
+// SPACE..CANCEL TAG (0x_e0100 <= code && code <= 0x_e01EF) // Mn [240]
+// VARIATION SELECTOR-17..VARIATION SELECTOR-256 ){
// return Extend;
// }
//
//
// if(
-// (0x1F1E6 <= code && code <= 0x1F1FF) // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
-// ){
+// (0x1F1E6 <= code && code <= 0x1F1FF) // So [26] REGIONAL INDICATOR
+// SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z ){
// return Regional_Indicator;
// }
//
// if(
// 0x0903 == code || // Mc DEVANAGARI SIGN VISARGA
// 0x093B == code || // Mc DEVANAGARI VOWEL SIGN OOE
-// (0x093E <= code && code <= 0x0940) || // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
-// (0x0949 <= code && code <= 0x094C) || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
-// (0x094E <= code && code <= 0x094F) || // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW
-// (0x0982 <= code && code <= 0x0983) || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
-// (0x09BF <= code && code <= 0x09C0) || // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II
-// (0x09C7 <= code && code <= 0x09C8) || // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
-// (0x09CB <= code && code <= 0x09CC) || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+// (0x093E <= code && code <= 0x0940) || // Mc [3] DEVANAGARI VOWEL
+// SIGN AA..DEVANAGARI VOWEL SIGN II (0x0949 <= code && code <= 0x094C)
+// || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+// (0x094E <= code && code <= 0x094F) || // Mc [2] DEVANAGARI VOWEL
+// SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW (0x0982 <= code && code
+// <= 0x0983) || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+// (0x09BF <= code && code <= 0x09C0) || // Mc [2] BENGALI VOWEL SIGN
+// I..BENGALI VOWEL SIGN II (0x09C7 <= code && code <= 0x09C8) || // Mc
+// [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI (0x09CB <= code &&
+// code <= 0x09CC) || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
// 0x0A03 == code || // Mc GURMUKHI SIGN VISARGA
-// (0x0A3E <= code && code <= 0x0A40) || // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
-// 0x0A83 == code || // Mc GUJARATI SIGN VISARGA
-// (0x0ABE <= code && code <= 0x0AC0) || // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
-// 0x0AC9 == code || // Mc GUJARATI VOWEL SIGN CANDRA O
-// (0x0ACB <= code && code <= 0x0ACC) || // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
-// (0x0B02 <= code && code <= 0x0B03) || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+// (0x0A3E <= code && code <= 0x0A40) || // Mc [3] GURMUKHI VOWEL SIGN
+// AA..GURMUKHI VOWEL SIGN II 0x0A83 == code || // Mc GUJARATI SIGN
+// VISARGA (0x0ABE <= code && code <= 0x0AC0) || // Mc [3] GUJARATI
+// VOWEL SIGN AA..GUJARATI VOWEL SIGN II 0x0AC9 == code || // Mc
+// GUJARATI VOWEL SIGN CANDRA O (0x0ACB <= code && code <= 0x0ACC) || //
+// Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU (0x0B02 <= code
+// && code <= 0x0B03) || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
// 0x0B40 == code || // Mc ORIYA VOWEL SIGN II
-// (0x0B47 <= code && code <= 0x0B48) || // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
-// (0x0B4B <= code && code <= 0x0B4C) || // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
-// 0x0BBF == code || // Mc TAMIL VOWEL SIGN I
-// (0x0BC1 <= code && code <= 0x0BC2) || // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
-// (0x0BC6 <= code && code <= 0x0BC8) || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
-// (0x0BCA <= code && code <= 0x0BCC) || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
-// (0x0C01 <= code && code <= 0x0C03) || // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
-// (0x0C41 <= code && code <= 0x0C44) || // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
-// (0x0C82 <= code && code <= 0x0C83) || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
-// 0x0CBE == code || // Mc KANNADA VOWEL SIGN AA
-// (0x0CC0 <= code && code <= 0x0CC1) || // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U
-// (0x0CC3 <= code && code <= 0x0CC4) || // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR
-// (0x0CC7 <= code && code <= 0x0CC8) || // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
-// (0x0CCA <= code && code <= 0x0CCB) || // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
-// (0x0D02 <= code && code <= 0x0D03) || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
-// (0x0D3F <= code && code <= 0x0D40) || // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II
-// (0x0D46 <= code && code <= 0x0D48) || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
-// (0x0D4A <= code && code <= 0x0D4C) || // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
-// (0x0D82 <= code && code <= 0x0D83) || // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
-// (0x0DD0 <= code && code <= 0x0DD1) || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
-// (0x0DD8 <= code && code <= 0x0DDE) || // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
-// (0x0DF2 <= code && code <= 0x0DF3) || // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+// (0x0B47 <= code && code <= 0x0B48) || // Mc [2] ORIYA VOWEL SIGN
+// E..ORIYA VOWEL SIGN AI (0x0B4B <= code && code <= 0x0B4C) || // Mc
+// [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 0x0BBF == code || // Mc
+// TAMIL VOWEL SIGN I (0x0BC1 <= code && code <= 0x0BC2) || // Mc [2]
+// TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU (0x0BC6 <= code && code <=
+// 0x0BC8) || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI (0x0BCA
+// <= code && code <= 0x0BCC) || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL
+// SIGN AU (0x0C01 <= code && code <= 0x0C03) || // Mc [3] TELUGU SIGN
+// CANDRABINDU..TELUGU SIGN VISARGA (0x0C41 <= code && code <= 0x0C44) ||
+// // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR (0x0C82
+// <= code && code <= 0x0C83) || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN
+// VISARGA 0x0CBE == code || // Mc KANNADA VOWEL SIGN AA
+// (0x0CC0 <= code && code <= 0x0CC1) || // Mc [2] KANNADA VOWEL SIGN
+// II..KANNADA VOWEL SIGN U (0x0CC3 <= code && code <= 0x0CC4) || // Mc
+// [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR
+// (0x0CC7 <= code && code <= 0x0CC8) || // Mc [2] KANNADA VOWEL SIGN
+// EE..KANNADA VOWEL SIGN AI (0x0CCA <= code && code <= 0x0CCB) || // Mc
+// [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO (0x0D02 <= code &&
+// code <= 0x0D03) || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN
+// VISARGA (0x0D3F <= code && code <= 0x0D40) || // Mc [2] MALAYALAM
+// VOWEL SIGN I..MALAYALAM VOWEL SIGN II (0x0D46 <= code && code <=
+// 0x0D48) || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+// (0x0D4A <= code && code <= 0x0D4C) || // Mc [3] MALAYALAM VOWEL SIGN
+// O..MALAYALAM VOWEL SIGN AU (0x0D82 <= code && code <= 0x0D83) || // Mc
+// [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA (0x0DD0 <= code &&
+// code <= 0x0DD1) || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA
+// VOWEL SIGN DIGA AEDA-PILLA (0x0DD8 <= code && code <= 0x0DDE) || // Mc
+// [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA
+// GAYANUKITTA (0x0DF2 <= code && code <= 0x0DF3) || // Mc [2] SINHALA
+// VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
// 0x0E33 == code || // Lo THAI CHARACTER SARA AM
// 0x0EB3 == code || // Lo LAO VOWEL SIGN AM
-// (0x0F3E <= code && code <= 0x0F3F) || // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
-// 0x0F7F == code || // Mc TIBETAN SIGN RNAM BCAD
-// 0x1031 == code || // Mc MYANMAR VOWEL SIGN E
-// (0x103B <= code && code <= 0x103C) || // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
-// (0x1056 <= code && code <= 0x1057) || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
-// 0x1084 == code || // Mc MYANMAR VOWEL SIGN SHAN E
-// 0x17B6 == code || // Mc KHMER VOWEL SIGN AA
-// (0x17BE <= code && code <= 0x17C5) || // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
-// (0x17C7 <= code && code <= 0x17C8) || // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
-// (0x1923 <= code && code <= 0x1926) || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
-// (0x1929 <= code && code <= 0x192B) || // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
-// (0x1930 <= code && code <= 0x1931) || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
-// (0x1933 <= code && code <= 0x1938) || // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
-// (0x1A19 <= code && code <= 0x1A1A) || // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O
-// 0x1A55 == code || // Mc TAI THAM CONSONANT SIGN MEDIAL RA
-// 0x1A57 == code || // Mc TAI THAM CONSONANT SIGN LA TANG LAI
-// (0x1A6D <= code && code <= 0x1A72) || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+// (0x0F3E <= code && code <= 0x0F3F) || // Mc [2] TIBETAN SIGN YAR
+// TSHES..TIBETAN SIGN MAR TSHES 0x0F7F == code || // Mc TIBETAN
+// SIGN RNAM BCAD 0x1031 == code || // Mc MYANMAR VOWEL SIGN E
+// (0x103B <= code && code <= 0x103C) || // Mc [2] MYANMAR CONSONANT
+// SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA (0x1056 <= code &&
+// code <= 0x1057) || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL
+// SIGN VOCALIC RR 0x1084 == code || // Mc MYANMAR VOWEL SIGN SHAN
+// E 0x17B6 == code || // Mc KHMER VOWEL SIGN AA
+// (0x17BE <= code && code <= 0x17C5) || // Mc [8] KHMER VOWEL SIGN
+// OE..KHMER VOWEL SIGN AU (0x17C7 <= code && code <= 0x17C8) || // Mc
+// [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU (0x1923 <= code &&
+// code <= 0x1926) || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+// (0x1929 <= code && code <= 0x192B) || // Mc [3] LIMBU SUBJOINED
+// LETTER YA..LIMBU SUBJOINED LETTER WA (0x1930 <= code && code <=
+// 0x1931) || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+// (0x1933 <= code && code <= 0x1938) || // Mc [6] LIMBU SMALL LETTER
+// TA..LIMBU SMALL LETTER LA (0x1A19 <= code && code <= 0x1A1A) || // Mc
+// [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O 0x1A55 == code || //
+// Mc TAI THAM CONSONANT SIGN MEDIAL RA 0x1A57 == code || // Mc
+// TAI THAM CONSONANT SIGN LA TANG LAI (0x1A6D <= code && code <= 0x1A72)
+// || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
// 0x1B04 == code || // Mc BALINESE SIGN BISAH
// 0x1B35 == code || // Mc BALINESE VOWEL SIGN TEDUNG
// 0x1B3B == code || // Mc BALINESE VOWEL SIGN RA REPA TEDUNG
-// (0x1B3D <= code && code <= 0x1B41) || // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
-// (0x1B43 <= code && code <= 0x1B44) || // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
-// 0x1B82 == code || // Mc SUNDANESE SIGN PANGWISAD
-// 0x1BA1 == code || // Mc SUNDANESE CONSONANT SIGN PAMINGKAL
-// (0x1BA6 <= code && code <= 0x1BA7) || // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
-// 0x1BAA == code || // Mc SUNDANESE SIGN PAMAAEH
-// 0x1BE7 == code || // Mc BATAK VOWEL SIGN E
-// (0x1BEA <= code && code <= 0x1BEC) || // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O
-// 0x1BEE == code || // Mc BATAK VOWEL SIGN U
-// (0x1BF2 <= code && code <= 0x1BF3) || // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN
-// (0x1C24 <= code && code <= 0x1C2B) || // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
-// (0x1C34 <= code && code <= 0x1C35) || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
-// 0x1CE1 == code || // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
-// (0x1CF2 <= code && code <= 0x1CF3) || // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA
+// (0x1B3D <= code && code <= 0x1B41) || // Mc [5] BALINESE VOWEL SIGN
+// LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG (0x1B43 <=
+// code && code <= 0x1B44) || // Mc [2] BALINESE VOWEL SIGN PEPET
+// TEDUNG..BALINESE ADEG ADEG 0x1B82 == code || // Mc SUNDANESE
+// SIGN PANGWISAD 0x1BA1 == code || // Mc SUNDANESE CONSONANT SIGN
+// PAMINGKAL (0x1BA6 <= code && code <= 0x1BA7) || // Mc [2] SUNDANESE
+// VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG 0x1BAA == code ||
+// // Mc SUNDANESE SIGN PAMAAEH 0x1BE7 == code || // Mc BATAK
+// VOWEL SIGN E (0x1BEA <= code && code <= 0x1BEC) || // Mc [3] BATAK
+// VOWEL SIGN I..BATAK VOWEL SIGN O 0x1BEE == code || // Mc BATAK
+// VOWEL SIGN U (0x1BF2 <= code && code <= 0x1BF3) || // Mc [2] BATAK
+// PANGOLAT..BATAK PANONGONAN (0x1C24 <= code && code <= 0x1C2B) || // Mc
+// [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU (0x1C34 <= code
+// && code <= 0x1C35) || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA
+// CONSONANT SIGN KANG 0x1CE1 == code || // Mc VEDIC TONE
+// ATHARVAVEDIC INDEPENDENT SVARITA (0x1CF2 <= code && code <= 0x1CF3) ||
+// // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA
// 0x1CF7 == code || // Mc VEDIC SIGN ATIKRAMA
-// (0x_a823 <= code && code <= 0x_a824) || // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
-// 0x_a827 == code || // Mc SYLOTI NAGRI VOWEL SIGN OO
-// (0x_a880 <= code && code <= 0x_a881) || // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
-// (0x_a8B4 <= code && code <= 0x_a8C3) || // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
-// (0x_a952 <= code && code <= 0x_a953) || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
-// 0x_a983 == code || // Mc JAVANESE SIGN WIGNYAN
-// (0x_a9B4 <= code && code <= 0x_a9B5) || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
-// (0x_a9BA <= code && code <= 0x_a9BB) || // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
-// (0x_a9BD <= code && code <= 0x_a9C0) || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON
-// (0x_aA2F <= code && code <= 0x_aA30) || // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
-// (0x_aA33 <= code && code <= 0x_aA34) || // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
-// 0x_aA4D == code || // Mc CHAM CONSONANT SIGN FINAL H
-// 0x_aAEB == code || // Mc MEETEI MAYEK VOWEL SIGN II
-// (0x_aAEE <= code && code <= 0x_aAEF) || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU
-// 0x_aAF5 == code || // Mc MEETEI MAYEK VOWEL SIGN VISARGA
-// (0x_aBE3 <= code && code <= 0x_aBE4) || // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
-// (0x_aBE6 <= code && code <= 0x_aBE7) || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
-// (0x_aBE9 <= code && code <= 0x_aBEA) || // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
-// 0x_aBEC == code || // Mc MEETEI MAYEK LUM IYEK
-// 0x11000 == code || // Mc BRAHMI SIGN CANDRABINDU
-// 0x11002 == code || // Mc BRAHMI SIGN VISARGA
-// 0x11082 == code || // Mc KAITHI SIGN VISARGA
-// (0x110B0 <= code && code <= 0x110B2) || // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
-// (0x110B7 <= code && code <= 0x110B8) || // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
-// 0x1112C == code || // Mc CHAKMA VOWEL SIGN E
-// 0x11182 == code || // Mc SHARADA SIGN VISARGA
-// (0x111B3 <= code && code <= 0x111B5) || // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
-// (0x111BF <= code && code <= 0x111C0) || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
-// (0x1122C <= code && code <= 0x1122E) || // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II
-// (0x11232 <= code && code <= 0x11233) || // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
-// 0x11235 == code || // Mc KHOJKI SIGN VIRAMA
-// (0x112E0 <= code && code <= 0x112E2) || // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
-// (0x11302 <= code && code <= 0x11303) || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA
+// (0x_a823 <= code && code <= 0x_a824) || // Mc [2] SYLOTI NAGRI VOWEL
+// SIGN A..SYLOTI NAGRI VOWEL SIGN I 0x_a827 == code || // Mc
+// SYLOTI NAGRI VOWEL SIGN OO (0x_a880 <= code && code <= 0x_a881) || //
+// Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA (0x_a8B4 <=
+// code && code <= 0x_a8C3) || // Mc [16] SAURASHTRA CONSONANT SIGN
+// HAARU..SAURASHTRA VOWEL SIGN AU (0x_a952 <= code && code <= 0x_a953)
+// || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA 0x_a983 == code
+// || // Mc JAVANESE SIGN WIGNYAN (0x_a9B4 <= code && code <=
+// 0x_a9B5) || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN
+// TOLONG (0x_a9BA <= code && code <= 0x_a9BB) || // Mc [2] JAVANESE
+// VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE (0x_a9BD <= code &&
+// code <= 0x_a9C0) || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE
+// PANGKON (0x_aA2F <= code && code <= 0x_aA30) || // Mc [2] CHAM VOWEL
+// SIGN O..CHAM VOWEL SIGN AI (0x_aA33 <= code && code <= 0x_aA34) || //
+// Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA 0x_aA4D ==
+// code || // Mc CHAM CONSONANT SIGN FINAL H 0x_aAEB == code || //
+// Mc MEETEI MAYEK VOWEL SIGN II (0x_aAEE <= code && code <=
+// 0x_aAEF) || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN
+// AAU 0x_aAF5 == code || // Mc MEETEI MAYEK VOWEL SIGN VISARGA
+// (0x_aBE3 <= code && code <= 0x_aBE4) || // Mc [2] MEETEI MAYEK VOWEL
+// SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP (0x_aBE6 <= code && code <=
+// 0x_aBE7) || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL
+// SIGN SOUNAP (0x_aBE9 <= code && code <= 0x_aBEA) || // Mc [2] MEETEI
+// MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG 0x_aBEC == code
+// || // Mc MEETEI MAYEK LUM IYEK 0x11000 == code || // Mc
+// BRAHMI SIGN CANDRABINDU 0x11002 == code || // Mc BRAHMI SIGN
+// VISARGA 0x11082 == code || // Mc KAITHI SIGN VISARGA
+// (0x110B0 <= code && code <= 0x110B2) || // Mc [3] KAITHI VOWEL SIGN
+// AA..KAITHI VOWEL SIGN II (0x110B7 <= code && code <= 0x110B8) || // Mc
+// [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU 0x1112C == code || // Mc
+// CHAKMA VOWEL SIGN E 0x11182 == code || // Mc SHARADA SIGN
+// VISARGA (0x111B3 <= code && code <= 0x111B5) || // Mc [3] SHARADA
+// VOWEL SIGN AA..SHARADA VOWEL SIGN II (0x111BF <= code && code <=
+// 0x111C0) || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
+// (0x1122C <= code && code <= 0x1122E) || // Mc [3] KHOJKI VOWEL SIGN
+// AA..KHOJKI VOWEL SIGN II (0x11232 <= code && code <= 0x11233) || // Mc
+// [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU 0x11235 == code || // Mc
+// KHOJKI SIGN VIRAMA (0x112E0 <= code && code <= 0x112E2) || // Mc [3]
+// KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II (0x11302 <= code &&
+// code <= 0x11303) || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA
// 0x1133F == code || // Mc GRANTHA VOWEL SIGN I
-// (0x11341 <= code && code <= 0x11344) || // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR
-// (0x11347 <= code && code <= 0x11348) || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI
-// (0x1134B <= code && code <= 0x1134D) || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA
-// (0x11362 <= code && code <= 0x11363) || // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL
-// (0x11435 <= code && code <= 0x11437) || // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II
-// (0x11440 <= code && code <= 0x11441) || // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU
-// 0x11445 == code || // Mc NEWA SIGN VISARGA
-// (0x114B1 <= code && code <= 0x114B2) || // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II
-// 0x114B9 == code || // Mc TIRHUTA VOWEL SIGN E
-// (0x114BB <= code && code <= 0x114BC) || // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O
-// 0x114BE == code || // Mc TIRHUTA VOWEL SIGN AU
-// 0x114C1 == code || // Mc TIRHUTA SIGN VISARGA
-// (0x115B0 <= code && code <= 0x115B1) || // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II
-// (0x115B8 <= code && code <= 0x115BB) || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU
+// (0x11341 <= code && code <= 0x11344) || // Mc [4] GRANTHA VOWEL SIGN
+// U..GRANTHA VOWEL SIGN VOCALIC RR (0x11347 <= code && code <= 0x11348)
+// || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI (0x1134B
+// <= code && code <= 0x1134D) || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA
+// SIGN VIRAMA (0x11362 <= code && code <= 0x11363) || // Mc [2]
+// GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL (0x11435
+// <= code && code <= 0x11437) || // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL
+// SIGN II (0x11440 <= code && code <= 0x11441) || // Mc [2] NEWA VOWEL
+// SIGN O..NEWA VOWEL SIGN AU 0x11445 == code || // Mc NEWA SIGN
+// VISARGA (0x114B1 <= code && code <= 0x114B2) || // Mc [2] TIRHUTA
+// VOWEL SIGN I..TIRHUTA VOWEL SIGN II 0x114B9 == code || // Mc
+// TIRHUTA VOWEL SIGN E (0x114BB <= code && code <= 0x114BC) || // Mc
+// [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O 0x114BE == code || //
+// Mc TIRHUTA VOWEL SIGN AU 0x114C1 == code || // Mc TIRHUTA
+// SIGN VISARGA (0x115B0 <= code && code <= 0x115B1) || // Mc [2]
+// SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II (0x115B8 <= code && code
+// <= 0x115BB) || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU
// 0x115BE == code || // Mc SIDDHAM SIGN VISARGA
-// (0x11630 <= code && code <= 0x11632) || // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II
-// (0x1163B <= code && code <= 0x1163C) || // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU
-// 0x1163E == code || // Mc MODI SIGN VISARGA
-// 0x116AC == code || // Mc TAKRI SIGN VISARGA
-// (0x116AE <= code && code <= 0x116AF) || // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II
-// 0x116B6 == code || // Mc TAKRI SIGN VIRAMA
-// (0x11720 <= code && code <= 0x11721) || // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
-// 0x11726 == code || // Mc AHOM VOWEL SIGN E
-// (0x11A07 <= code && code <= 0x11A08) || // Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
-// 0x11A39 == code || // Mc ZANABAZAR SQUARE SIGN VISARGA
-// (0x11A57 <= code && code <= 0x11A58) || // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
+// (0x11630 <= code && code <= 0x11632) || // Mc [3] MODI VOWEL SIGN
+// AA..MODI VOWEL SIGN II (0x1163B <= code && code <= 0x1163C) || // Mc
+// [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU 0x1163E == code || // Mc
+// MODI SIGN VISARGA 0x116AC == code || // Mc TAKRI SIGN VISARGA
+// (0x116AE <= code && code <= 0x116AF) || // Mc [2] TAKRI VOWEL SIGN
+// I..TAKRI VOWEL SIGN II 0x116B6 == code || // Mc TAKRI SIGN
+// VIRAMA (0x11720 <= code && code <= 0x11721) || // Mc [2] AHOM VOWEL
+// SIGN A..AHOM VOWEL SIGN AA 0x11726 == code || // Mc AHOM VOWEL
+// SIGN E (0x11A07 <= code && code <= 0x11A08) || // Mc [2] ZANABAZAR
+// SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU 0x11A39 == code
+// || // Mc ZANABAZAR SQUARE SIGN VISARGA (0x11A57 <= code && code
+// <= 0x11A58) || // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
// 0x11A97 == code || // Mc SOYOMBO SIGN VISARGA
// 0x11C2F == code || // Mc BHAIKSUKI VOWEL SIGN AA
// 0x11C3E == code || // Mc BHAIKSUKI SIGN VISARGA
// 0x11CA9 == code || // Mc MARCHEN SUBJOINED LETTER YA
// 0x11CB1 == code || // Mc MARCHEN VOWEL SIGN I
// 0x11CB4 == code || // Mc MARCHEN VOWEL SIGN O
-// (0x16F51 <= code && code <= 0x16F7E) || // Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
-// 0x1D166 == code || // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
-// 0x1D16D == code // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT
-// ){
+// (0x16F51 <= code && code <= 0x16F7E) || // Mc [46] MIAO SIGN
+// ASPIRATION..MIAO VOWEL SIGN NG 0x1D166 == code || // Mc MUSICAL
+// SYMBOL COMBINING SPRECHGESANG STEM 0x1D16D == code // Mc MUSICAL
+// SYMBOL COMBINING AUGMENTATION DOT ){
// return SpacingMark;
// }
//
//
// if(
-// (0x1100 <= code && code <= 0x115F) || // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER
-// (0x_a960 <= code && code <= 0x_a97C) // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
-// ){
+// (0x1100 <= code && code <= 0x115F) || // Lo [96] HANGUL CHOSEONG
+// KIYEOK..HANGUL CHOSEONG FILLER (0x_a960 <= code && code <= 0x_a97C) //
+// Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH ){
// return L;
// }
//
// if(
-// (0x1160 <= code && code <= 0x11A7) || // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE
-// (0x_d7B0 <= code && code <= 0x_d7C6) // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
-// ){
+// (0x1160 <= code && code <= 0x11A7) || // Lo [72] HANGUL JUNGSEONG
+// FILLER..HANGUL JUNGSEONG O-YAE (0x_d7B0 <= code && code <= 0x_d7C6) //
+// Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E ){
// return V;
// }
//
//
// if(
-// (0x11A8 <= code && code <= 0x11FF) || // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN
-// (0x_d7CB <= code && code <= 0x_d7FB) // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
-// ){
+// (0x11A8 <= code && code <= 0x11FF) || // Lo [88] HANGUL JONGSEONG
+// KIYEOK..HANGUL JONGSEONG SSANGNIEUN (0x_d7CB <= code && code <=
+// 0x_d7FB) // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG
+// PHIEUPH-THIEUTH ){
// return T;
// }
//
@@ -1378,448 +1505,601 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// }
//
// if(
-// (0x_aC01 <= code && code <= 0x_aC1B) || // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
-// (0x_aC1D <= code && code <= 0x_aC37) || // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
-// (0x_aC39 <= code && code <= 0x_aC53) || // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
-// (0x_aC55 <= code && code <= 0x_aC6F) || // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
-// (0x_aC71 <= code && code <= 0x_aC8B) || // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
-// (0x_aC8D <= code && code <= 0x_aCA7) || // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
-// (0x_aCA9 <= code && code <= 0x_aCC3) || // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
-// (0x_aCC5 <= code && code <= 0x_aCDF) || // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
-// (0x_aCE1 <= code && code <= 0x_aCFB) || // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
-// (0x_aCFD <= code && code <= 0x_aD17) || // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
-// (0x_aD19 <= code && code <= 0x_aD33) || // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
-// (0x_aD35 <= code && code <= 0x_aD4F) || // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
-// (0x_aD51 <= code && code <= 0x_aD6B) || // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
-// (0x_aD6D <= code && code <= 0x_aD87) || // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
-// (0x_aD89 <= code && code <= 0x_aDA3) || // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
-// (0x_aDA5 <= code && code <= 0x_aDBF) || // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
-// (0x_aDC1 <= code && code <= 0x_aDDB) || // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
-// (0x_aDDD <= code && code <= 0x_aDF7) || // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
-// (0x_aDF9 <= code && code <= 0x_aE13) || // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
-// (0x_aE15 <= code && code <= 0x_aE2F) || // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
-// (0x_aE31 <= code && code <= 0x_aE4B) || // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
-// (0x_aE4D <= code && code <= 0x_aE67) || // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
-// (0x_aE69 <= code && code <= 0x_aE83) || // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
-// (0x_aE85 <= code && code <= 0x_aE9F) || // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
-// (0x_aEA1 <= code && code <= 0x_aEBB) || // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
-// (0x_aEBD <= code && code <= 0x_aED7) || // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
-// (0x_aED9 <= code && code <= 0x_aEF3) || // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
-// (0x_aEF5 <= code && code <= 0x_aF0F) || // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
-// (0x_aF11 <= code && code <= 0x_aF2B) || // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
-// (0x_aF2D <= code && code <= 0x_aF47) || // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
-// (0x_aF49 <= code && code <= 0x_aF63) || // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
-// (0x_aF65 <= code && code <= 0x_aF7F) || // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
-// (0x_aF81 <= code && code <= 0x_aF9B) || // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
-// (0x_aF9D <= code && code <= 0x_aFB7) || // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
-// (0x_aFB9 <= code && code <= 0x_aFD3) || // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
-// (0x_aFD5 <= code && code <= 0x_aFEF) || // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
-// (0x_aFF1 <= code && code <= 0x_b00B) || // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
-// (0x_b00D <= code && code <= 0x_b027) || // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
-// (0x_b029 <= code && code <= 0x_b043) || // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
-// (0x_b045 <= code && code <= 0x_b05F) || // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
-// (0x_b061 <= code && code <= 0x_b07B) || // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
-// (0x_b07D <= code && code <= 0x_b097) || // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
-// (0x_b099 <= code && code <= 0x_b0B3) || // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
-// (0x_b0B5 <= code && code <= 0x_b0CF) || // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
-// (0x_b0D1 <= code && code <= 0x_b0EB) || // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
-// (0x_b0ED <= code && code <= 0x_b107) || // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
-// (0x_b109 <= code && code <= 0x_b123) || // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
-// (0x_b125 <= code && code <= 0x_b13F) || // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
-// (0x_b141 <= code && code <= 0x_b15B) || // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
-// (0x_b15D <= code && code <= 0x_b177) || // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
-// (0x_b179 <= code && code <= 0x_b193) || // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
-// (0x_b195 <= code && code <= 0x_b1AF) || // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
-// (0x_b1B1 <= code && code <= 0x_b1CB) || // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
-// (0x_b1CD <= code && code <= 0x_b1E7) || // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
-// (0x_b1E9 <= code && code <= 0x_b203) || // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
-// (0x_b205 <= code && code <= 0x_b21F) || // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
-// (0x_b221 <= code && code <= 0x_b23B) || // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
-// (0x_b23D <= code && code <= 0x_b257) || // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
-// (0x_b259 <= code && code <= 0x_b273) || // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
-// (0x_b275 <= code && code <= 0x_b28F) || // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
-// (0x_b291 <= code && code <= 0x_b2AB) || // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
-// (0x_b2AD <= code && code <= 0x_b2C7) || // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
-// (0x_b2C9 <= code && code <= 0x_b2E3) || // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
-// (0x_b2E5 <= code && code <= 0x_b2FF) || // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
-// (0x_b301 <= code && code <= 0x_b31B) || // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
-// (0x_b31D <= code && code <= 0x_b337) || // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
-// (0x_b339 <= code && code <= 0x_b353) || // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
-// (0x_b355 <= code && code <= 0x_b36F) || // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
-// (0x_b371 <= code && code <= 0x_b38B) || // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
-// (0x_b38D <= code && code <= 0x_b3A7) || // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
-// (0x_b3A9 <= code && code <= 0x_b3C3) || // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
-// (0x_b3C5 <= code && code <= 0x_b3DF) || // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
-// (0x_b3E1 <= code && code <= 0x_b3FB) || // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
-// (0x_b3FD <= code && code <= 0x_b417) || // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
-// (0x_b419 <= code && code <= 0x_b433) || // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
-// (0x_b435 <= code && code <= 0x_b44F) || // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
-// (0x_b451 <= code && code <= 0x_b46B) || // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
-// (0x_b46D <= code && code <= 0x_b487) || // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
-// (0x_b489 <= code && code <= 0x_b4A3) || // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
-// (0x_b4A5 <= code && code <= 0x_b4BF) || // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
-// (0x_b4C1 <= code && code <= 0x_b4DB) || // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
-// (0x_b4DD <= code && code <= 0x_b4F7) || // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
-// (0x_b4F9 <= code && code <= 0x_b513) || // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
-// (0x_b515 <= code && code <= 0x_b52F) || // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
-// (0x_b531 <= code && code <= 0x_b54B) || // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
-// (0x_b54D <= code && code <= 0x_b567) || // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
-// (0x_b569 <= code && code <= 0x_b583) || // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
-// (0x_b585 <= code && code <= 0x_b59F) || // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
-// (0x_b5A1 <= code && code <= 0x_b5BB) || // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
-// (0x_b5BD <= code && code <= 0x_b5D7) || // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
-// (0x_b5D9 <= code && code <= 0x_b5F3) || // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
-// (0x_b5F5 <= code && code <= 0x_b60F) || // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
-// (0x_b611 <= code && code <= 0x_b62B) || // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
-// (0x_b62D <= code && code <= 0x_b647) || // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
-// (0x_b649 <= code && code <= 0x_b663) || // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
-// (0x_b665 <= code && code <= 0x_b67F) || // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
-// (0x_b681 <= code && code <= 0x_b69B) || // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
-// (0x_b69D <= code && code <= 0x_b6B7) || // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
-// (0x_b6B9 <= code && code <= 0x_b6D3) || // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
-// (0x_b6D5 <= code && code <= 0x_b6EF) || // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
-// (0x_b6F1 <= code && code <= 0x_b70B) || // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
-// (0x_b70D <= code && code <= 0x_b727) || // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
-// (0x_b729 <= code && code <= 0x_b743) || // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
-// (0x_b745 <= code && code <= 0x_b75F) || // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
-// (0x_b761 <= code && code <= 0x_b77B) || // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
-// (0x_b77D <= code && code <= 0x_b797) || // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
-// (0x_b799 <= code && code <= 0x_b7B3) || // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
-// (0x_b7B5 <= code && code <= 0x_b7CF) || // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
-// (0x_b7D1 <= code && code <= 0x_b7EB) || // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
-// (0x_b7ED <= code && code <= 0x_b807) || // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
-// (0x_b809 <= code && code <= 0x_b823) || // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
-// (0x_b825 <= code && code <= 0x_b83F) || // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
-// (0x_b841 <= code && code <= 0x_b85B) || // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
-// (0x_b85D <= code && code <= 0x_b877) || // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
-// (0x_b879 <= code && code <= 0x_b893) || // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
-// (0x_b895 <= code && code <= 0x_b8AF) || // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
-// (0x_b8B1 <= code && code <= 0x_b8CB) || // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
-// (0x_b8CD <= code && code <= 0x_b8E7) || // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
-// (0x_b8E9 <= code && code <= 0x_b903) || // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
-// (0x_b905 <= code && code <= 0x_b91F) || // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
-// (0x_b921 <= code && code <= 0x_b93B) || // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
-// (0x_b93D <= code && code <= 0x_b957) || // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
-// (0x_b959 <= code && code <= 0x_b973) || // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
-// (0x_b975 <= code && code <= 0x_b98F) || // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
-// (0x_b991 <= code && code <= 0x_b9AB) || // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
-// (0x_b9AD <= code && code <= 0x_b9C7) || // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
-// (0x_b9C9 <= code && code <= 0x_b9E3) || // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
-// (0x_b9E5 <= code && code <= 0x_b9FF) || // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
-// (0x_bA01 <= code && code <= 0x_bA1B) || // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
-// (0x_bA1D <= code && code <= 0x_bA37) || // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
-// (0x_bA39 <= code && code <= 0x_bA53) || // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
-// (0x_bA55 <= code && code <= 0x_bA6F) || // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
-// (0x_bA71 <= code && code <= 0x_bA8B) || // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
-// (0x_bA8D <= code && code <= 0x_bAA7) || // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
-// (0x_bAA9 <= code && code <= 0x_bAC3) || // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
-// (0x_bAC5 <= code && code <= 0x_bADF) || // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
-// (0x_bAE1 <= code && code <= 0x_bAFB) || // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
-// (0x_bAFD <= code && code <= 0x_bB17) || // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
-// (0x_bB19 <= code && code <= 0x_bB33) || // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
-// (0x_bB35 <= code && code <= 0x_bB4F) || // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
-// (0x_bB51 <= code && code <= 0x_bB6B) || // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
-// (0x_bB6D <= code && code <= 0x_bB87) || // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
-// (0x_bB89 <= code && code <= 0x_bBA3) || // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
-// (0x_bBA5 <= code && code <= 0x_bBBF) || // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
-// (0x_bBC1 <= code && code <= 0x_bBDB) || // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
-// (0x_bBDD <= code && code <= 0x_bBF7) || // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
-// (0x_bBF9 <= code && code <= 0x_bC13) || // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
-// (0x_bC15 <= code && code <= 0x_bC2F) || // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
-// (0x_bC31 <= code && code <= 0x_bC4B) || // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
-// (0x_bC4D <= code && code <= 0x_bC67) || // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
-// (0x_bC69 <= code && code <= 0x_bC83) || // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
-// (0x_bC85 <= code && code <= 0x_bC9F) || // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
-// (0x_bCA1 <= code && code <= 0x_bCBB) || // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
-// (0x_bCBD <= code && code <= 0x_bCD7) || // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
-// (0x_bCD9 <= code && code <= 0x_bCF3) || // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
-// (0x_bCF5 <= code && code <= 0x_bD0F) || // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
-// (0x_bD11 <= code && code <= 0x_bD2B) || // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
-// (0x_bD2D <= code && code <= 0x_bD47) || // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
-// (0x_bD49 <= code && code <= 0x_bD63) || // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
-// (0x_bD65 <= code && code <= 0x_bD7F) || // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
-// (0x_bD81 <= code && code <= 0x_bD9B) || // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
-// (0x_bD9D <= code && code <= 0x_bDB7) || // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
-// (0x_bDB9 <= code && code <= 0x_bDD3) || // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
-// (0x_bDD5 <= code && code <= 0x_bDEF) || // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
-// (0x_bDF1 <= code && code <= 0x_bE0B) || // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
-// (0x_bE0D <= code && code <= 0x_bE27) || // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
-// (0x_bE29 <= code && code <= 0x_bE43) || // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
-// (0x_bE45 <= code && code <= 0x_bE5F) || // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
-// (0x_bE61 <= code && code <= 0x_bE7B) || // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
-// (0x_bE7D <= code && code <= 0x_bE97) || // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
-// (0x_bE99 <= code && code <= 0x_bEB3) || // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
-// (0x_bEB5 <= code && code <= 0x_bECF) || // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
-// (0x_bED1 <= code && code <= 0x_bEEB) || // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
-// (0x_bEED <= code && code <= 0x_bF07) || // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
-// (0x_bF09 <= code && code <= 0x_bF23) || // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
-// (0x_bF25 <= code && code <= 0x_bF3F) || // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
-// (0x_bF41 <= code && code <= 0x_bF5B) || // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
-// (0x_bF5D <= code && code <= 0x_bF77) || // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
-// (0x_bF79 <= code && code <= 0x_bF93) || // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
-// (0x_bF95 <= code && code <= 0x_bFAF) || // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
-// (0x_bFB1 <= code && code <= 0x_bFCB) || // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
-// (0x_bFCD <= code && code <= 0x_bFE7) || // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
-// (0x_bFE9 <= code && code <= 0x_c003) || // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
-// (0x_c005 <= code && code <= 0x_c01F) || // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
-// (0x_c021 <= code && code <= 0x_c03B) || // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
-// (0x_c03D <= code && code <= 0x_c057) || // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
-// (0x_c059 <= code && code <= 0x_c073) || // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
-// (0x_c075 <= code && code <= 0x_c08F) || // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
-// (0x_c091 <= code && code <= 0x_c0AB) || // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
-// (0x_c0AD <= code && code <= 0x_c0C7) || // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
-// (0x_c0C9 <= code && code <= 0x_c0E3) || // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
-// (0x_c0E5 <= code && code <= 0x_c0FF) || // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
-// (0x_c101 <= code && code <= 0x_c11B) || // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
-// (0x_c11D <= code && code <= 0x_c137) || // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
-// (0x_c139 <= code && code <= 0x_c153) || // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
-// (0x_c155 <= code && code <= 0x_c16F) || // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
-// (0x_c171 <= code && code <= 0x_c18B) || // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
-// (0x_c18D <= code && code <= 0x_c1A7) || // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
-// (0x_c1A9 <= code && code <= 0x_c1C3) || // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
-// (0x_c1C5 <= code && code <= 0x_c1DF) || // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
-// (0x_c1E1 <= code && code <= 0x_c1FB) || // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
-// (0x_c1FD <= code && code <= 0x_c217) || // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
-// (0x_c219 <= code && code <= 0x_c233) || // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
-// (0x_c235 <= code && code <= 0x_c24F) || // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
-// (0x_c251 <= code && code <= 0x_c26B) || // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
-// (0x_c26D <= code && code <= 0x_c287) || // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
-// (0x_c289 <= code && code <= 0x_c2A3) || // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
-// (0x_c2A5 <= code && code <= 0x_c2BF) || // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
-// (0x_c2C1 <= code && code <= 0x_c2DB) || // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
-// (0x_c2DD <= code && code <= 0x_c2F7) || // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
-// (0x_c2F9 <= code && code <= 0x_c313) || // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
-// (0x_c315 <= code && code <= 0x_c32F) || // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
-// (0x_c331 <= code && code <= 0x_c34B) || // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
-// (0x_c34D <= code && code <= 0x_c367) || // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
-// (0x_c369 <= code && code <= 0x_c383) || // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
-// (0x_c385 <= code && code <= 0x_c39F) || // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
-// (0x_c3A1 <= code && code <= 0x_c3BB) || // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
-// (0x_c3BD <= code && code <= 0x_c3D7) || // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
-// (0x_c3D9 <= code && code <= 0x_c3F3) || // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
-// (0x_c3F5 <= code && code <= 0x_c40F) || // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
-// (0x_c411 <= code && code <= 0x_c42B) || // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
-// (0x_c42D <= code && code <= 0x_c447) || // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
-// (0x_c449 <= code && code <= 0x_c463) || // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
-// (0x_c465 <= code && code <= 0x_c47F) || // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
-// (0x_c481 <= code && code <= 0x_c49B) || // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
-// (0x_c49D <= code && code <= 0x_c4B7) || // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
-// (0x_c4B9 <= code && code <= 0x_c4D3) || // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
-// (0x_c4D5 <= code && code <= 0x_c4EF) || // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
-// (0x_c4F1 <= code && code <= 0x_c50B) || // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
-// (0x_c50D <= code && code <= 0x_c527) || // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
-// (0x_c529 <= code && code <= 0x_c543) || // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
-// (0x_c545 <= code && code <= 0x_c55F) || // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
-// (0x_c561 <= code && code <= 0x_c57B) || // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
-// (0x_c57D <= code && code <= 0x_c597) || // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
-// (0x_c599 <= code && code <= 0x_c5B3) || // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
-// (0x_c5B5 <= code && code <= 0x_c5CF) || // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
-// (0x_c5D1 <= code && code <= 0x_c5EB) || // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
-// (0x_c5ED <= code && code <= 0x_c607) || // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
-// (0x_c609 <= code && code <= 0x_c623) || // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
-// (0x_c625 <= code && code <= 0x_c63F) || // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
-// (0x_c641 <= code && code <= 0x_c65B) || // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
-// (0x_c65D <= code && code <= 0x_c677) || // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
-// (0x_c679 <= code && code <= 0x_c693) || // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
-// (0x_c695 <= code && code <= 0x_c6AF) || // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
-// (0x_c6B1 <= code && code <= 0x_c6CB) || // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
-// (0x_c6CD <= code && code <= 0x_c6E7) || // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
-// (0x_c6E9 <= code && code <= 0x_c703) || // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
-// (0x_c705 <= code && code <= 0x_c71F) || // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
-// (0x_c721 <= code && code <= 0x_c73B) || // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
-// (0x_c73D <= code && code <= 0x_c757) || // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
-// (0x_c759 <= code && code <= 0x_c773) || // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
-// (0x_c775 <= code && code <= 0x_c78F) || // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
-// (0x_c791 <= code && code <= 0x_c7AB) || // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
-// (0x_c7AD <= code && code <= 0x_c7C7) || // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
-// (0x_c7C9 <= code && code <= 0x_c7E3) || // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
-// (0x_c7E5 <= code && code <= 0x_c7FF) || // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
-// (0x_c801 <= code && code <= 0x_c81B) || // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
-// (0x_c81D <= code && code <= 0x_c837) || // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
-// (0x_c839 <= code && code <= 0x_c853) || // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
-// (0x_c855 <= code && code <= 0x_c86F) || // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
-// (0x_c871 <= code && code <= 0x_c88B) || // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
-// (0x_c88D <= code && code <= 0x_c8A7) || // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
-// (0x_c8A9 <= code && code <= 0x_c8C3) || // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
-// (0x_c8C5 <= code && code <= 0x_c8DF) || // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
-// (0x_c8E1 <= code && code <= 0x_c8FB) || // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
-// (0x_c8FD <= code && code <= 0x_c917) || // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
-// (0x_c919 <= code && code <= 0x_c933) || // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
-// (0x_c935 <= code && code <= 0x_c94F) || // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
-// (0x_c951 <= code && code <= 0x_c96B) || // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
-// (0x_c96D <= code && code <= 0x_c987) || // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
-// (0x_c989 <= code && code <= 0x_c9A3) || // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
-// (0x_c9A5 <= code && code <= 0x_c9BF) || // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
-// (0x_c9C1 <= code && code <= 0x_c9DB) || // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
-// (0x_c9DD <= code && code <= 0x_c9F7) || // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
-// (0x_c9F9 <= code && code <= 0x_cA13) || // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
-// (0x_cA15 <= code && code <= 0x_cA2F) || // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
-// (0x_cA31 <= code && code <= 0x_cA4B) || // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
-// (0x_cA4D <= code && code <= 0x_cA67) || // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
-// (0x_cA69 <= code && code <= 0x_cA83) || // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
-// (0x_cA85 <= code && code <= 0x_cA9F) || // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
-// (0x_cAA1 <= code && code <= 0x_cABB) || // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
-// (0x_cABD <= code && code <= 0x_cAD7) || // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
-// (0x_cAD9 <= code && code <= 0x_cAF3) || // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
-// (0x_cAF5 <= code && code <= 0x_cB0F) || // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
-// (0x_cB11 <= code && code <= 0x_cB2B) || // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
-// (0x_cB2D <= code && code <= 0x_cB47) || // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
-// (0x_cB49 <= code && code <= 0x_cB63) || // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
-// (0x_cB65 <= code && code <= 0x_cB7F) || // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
-// (0x_cB81 <= code && code <= 0x_cB9B) || // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
-// (0x_cB9D <= code && code <= 0x_cBB7) || // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
-// (0x_cBB9 <= code && code <= 0x_cBD3) || // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
-// (0x_cBD5 <= code && code <= 0x_cBEF) || // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
-// (0x_cBF1 <= code && code <= 0x_cC0B) || // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
-// (0x_cC0D <= code && code <= 0x_cC27) || // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
-// (0x_cC29 <= code && code <= 0x_cC43) || // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
-// (0x_cC45 <= code && code <= 0x_cC5F) || // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
-// (0x_cC61 <= code && code <= 0x_cC7B) || // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
-// (0x_cC7D <= code && code <= 0x_cC97) || // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
-// (0x_cC99 <= code && code <= 0x_cCB3) || // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
-// (0x_cCB5 <= code && code <= 0x_cCCF) || // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
-// (0x_cCD1 <= code && code <= 0x_cCEB) || // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
-// (0x_cCED <= code && code <= 0x_cD07) || // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
-// (0x_cD09 <= code && code <= 0x_cD23) || // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
-// (0x_cD25 <= code && code <= 0x_cD3F) || // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
-// (0x_cD41 <= code && code <= 0x_cD5B) || // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
-// (0x_cD5D <= code && code <= 0x_cD77) || // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
-// (0x_cD79 <= code && code <= 0x_cD93) || // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
-// (0x_cD95 <= code && code <= 0x_cDAF) || // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
-// (0x_cDB1 <= code && code <= 0x_cDCB) || // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
-// (0x_cDCD <= code && code <= 0x_cDE7) || // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
-// (0x_cDE9 <= code && code <= 0x_cE03) || // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
-// (0x_cE05 <= code && code <= 0x_cE1F) || // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
-// (0x_cE21 <= code && code <= 0x_cE3B) || // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
-// (0x_cE3D <= code && code <= 0x_cE57) || // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
-// (0x_cE59 <= code && code <= 0x_cE73) || // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
-// (0x_cE75 <= code && code <= 0x_cE8F) || // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
-// (0x_cE91 <= code && code <= 0x_cEAB) || // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
-// (0x_cEAD <= code && code <= 0x_cEC7) || // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
-// (0x_cEC9 <= code && code <= 0x_cEE3) || // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
-// (0x_cEE5 <= code && code <= 0x_cEFF) || // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
-// (0x_cF01 <= code && code <= 0x_cF1B) || // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
-// (0x_cF1D <= code && code <= 0x_cF37) || // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
-// (0x_cF39 <= code && code <= 0x_cF53) || // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
-// (0x_cF55 <= code && code <= 0x_cF6F) || // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
-// (0x_cF71 <= code && code <= 0x_cF8B) || // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
-// (0x_cF8D <= code && code <= 0x_cFA7) || // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
-// (0x_cFA9 <= code && code <= 0x_cFC3) || // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
-// (0x_cFC5 <= code && code <= 0x_cFDF) || // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
-// (0x_cFE1 <= code && code <= 0x_cFFB) || // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
-// (0x_cFFD <= code && code <= 0x_d017) || // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
-// (0x_d019 <= code && code <= 0x_d033) || // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
-// (0x_d035 <= code && code <= 0x_d04F) || // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
-// (0x_d051 <= code && code <= 0x_d06B) || // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
-// (0x_d06D <= code && code <= 0x_d087) || // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
-// (0x_d089 <= code && code <= 0x_d0A3) || // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
-// (0x_d0A5 <= code && code <= 0x_d0BF) || // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
-// (0x_d0C1 <= code && code <= 0x_d0DB) || // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
-// (0x_d0DD <= code && code <= 0x_d0F7) || // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
-// (0x_d0F9 <= code && code <= 0x_d113) || // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
-// (0x_d115 <= code && code <= 0x_d12F) || // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
-// (0x_d131 <= code && code <= 0x_d14B) || // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
-// (0x_d14D <= code && code <= 0x_d167) || // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
-// (0x_d169 <= code && code <= 0x_d183) || // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
-// (0x_d185 <= code && code <= 0x_d19F) || // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
-// (0x_d1A1 <= code && code <= 0x_d1BB) || // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
-// (0x_d1BD <= code && code <= 0x_d1D7) || // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
-// (0x_d1D9 <= code && code <= 0x_d1F3) || // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
-// (0x_d1F5 <= code && code <= 0x_d20F) || // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
-// (0x_d211 <= code && code <= 0x_d22B) || // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
-// (0x_d22D <= code && code <= 0x_d247) || // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
-// (0x_d249 <= code && code <= 0x_d263) || // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
-// (0x_d265 <= code && code <= 0x_d27F) || // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
-// (0x_d281 <= code && code <= 0x_d29B) || // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
-// (0x_d29D <= code && code <= 0x_d2B7) || // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
-// (0x_d2B9 <= code && code <= 0x_d2D3) || // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
-// (0x_d2D5 <= code && code <= 0x_d2EF) || // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
-// (0x_d2F1 <= code && code <= 0x_d30B) || // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
-// (0x_d30D <= code && code <= 0x_d327) || // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
-// (0x_d329 <= code && code <= 0x_d343) || // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
-// (0x_d345 <= code && code <= 0x_d35F) || // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
-// (0x_d361 <= code && code <= 0x_d37B) || // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
-// (0x_d37D <= code && code <= 0x_d397) || // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
-// (0x_d399 <= code && code <= 0x_d3B3) || // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
-// (0x_d3B5 <= code && code <= 0x_d3CF) || // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
-// (0x_d3D1 <= code && code <= 0x_d3EB) || // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
-// (0x_d3ED <= code && code <= 0x_d407) || // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
-// (0x_d409 <= code && code <= 0x_d423) || // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
-// (0x_d425 <= code && code <= 0x_d43F) || // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
-// (0x_d441 <= code && code <= 0x_d45B) || // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
-// (0x_d45D <= code && code <= 0x_d477) || // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
-// (0x_d479 <= code && code <= 0x_d493) || // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
-// (0x_d495 <= code && code <= 0x_d4AF) || // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
-// (0x_d4B1 <= code && code <= 0x_d4CB) || // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
-// (0x_d4CD <= code && code <= 0x_d4E7) || // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
-// (0x_d4E9 <= code && code <= 0x_d503) || // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
-// (0x_d505 <= code && code <= 0x_d51F) || // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
-// (0x_d521 <= code && code <= 0x_d53B) || // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
-// (0x_d53D <= code && code <= 0x_d557) || // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
-// (0x_d559 <= code && code <= 0x_d573) || // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
-// (0x_d575 <= code && code <= 0x_d58F) || // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
-// (0x_d591 <= code && code <= 0x_d5AB) || // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
-// (0x_d5AD <= code && code <= 0x_d5C7) || // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
-// (0x_d5C9 <= code && code <= 0x_d5E3) || // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
-// (0x_d5E5 <= code && code <= 0x_d5FF) || // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
-// (0x_d601 <= code && code <= 0x_d61B) || // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
-// (0x_d61D <= code && code <= 0x_d637) || // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
-// (0x_d639 <= code && code <= 0x_d653) || // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
-// (0x_d655 <= code && code <= 0x_d66F) || // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
-// (0x_d671 <= code && code <= 0x_d68B) || // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
-// (0x_d68D <= code && code <= 0x_d6A7) || // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
-// (0x_d6A9 <= code && code <= 0x_d6C3) || // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
-// (0x_d6C5 <= code && code <= 0x_d6DF) || // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
-// (0x_d6E1 <= code && code <= 0x_d6FB) || // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
-// (0x_d6FD <= code && code <= 0x_d717) || // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
-// (0x_d719 <= code && code <= 0x_d733) || // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
-// (0x_d735 <= code && code <= 0x_d74F) || // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
-// (0x_d751 <= code && code <= 0x_d76B) || // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
-// (0x_d76D <= code && code <= 0x_d787) || // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
-// (0x_d789 <= code && code <= 0x_d7A3) // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
-// ){
+// (0x_aC01 <= code && code <= 0x_aC1B) || // Lo [27] HANGUL SYLLABLE
+// GAG..HANGUL SYLLABLE GAH (0x_aC1D <= code && code <= 0x_aC37) || // Lo
+// [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH (0x_aC39 <= code &&
+// code <= 0x_aC53) || // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+// (0x_aC55 <= code && code <= 0x_aC6F) || // Lo [27] HANGUL SYLLABLE
+// GYAEG..HANGUL SYLLABLE GYAEH (0x_aC71 <= code && code <= 0x_aC8B) ||
+// // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH (0x_aC8D <=
+// code && code <= 0x_aCA7) || // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE
+// GEH (0x_aCA9 <= code && code <= 0x_aCC3) || // Lo [27] HANGUL
+// SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH (0x_aCC5 <= code && code <=
+// 0x_aCDF) || // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+// (0x_aCE1 <= code && code <= 0x_aCFB) || // Lo [27] HANGUL SYLLABLE
+// GOG..HANGUL SYLLABLE GOH (0x_aCFD <= code && code <= 0x_aD17) || // Lo
+// [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH (0x_aD19 <= code &&
+// code <= 0x_aD33) || // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+// (0x_aD35 <= code && code <= 0x_aD4F) || // Lo [27] HANGUL SYLLABLE
+// GOEG..HANGUL SYLLABLE GOEH (0x_aD51 <= code && code <= 0x_aD6B) || //
+// Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH (0x_aD6D <= code
+// && code <= 0x_aD87) || // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+// (0x_aD89 <= code && code <= 0x_aDA3) || // Lo [27] HANGUL SYLLABLE
+// GWEOG..HANGUL SYLLABLE GWEOH (0x_aDA5 <= code && code <= 0x_aDBF) ||
+// // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH (0x_aDC1 <=
+// code && code <= 0x_aDDB) || // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE
+// GWIH (0x_aDDD <= code && code <= 0x_aDF7) || // Lo [27] HANGUL
+// SYLLABLE GYUG..HANGUL SYLLABLE GYUH (0x_aDF9 <= code && code <=
+// 0x_aE13) || // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+// (0x_aE15 <= code && code <= 0x_aE2F) || // Lo [27] HANGUL SYLLABLE
+// GYIG..HANGUL SYLLABLE GYIH (0x_aE31 <= code && code <= 0x_aE4B) || //
+// Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH (0x_aE4D <= code &&
+// code <= 0x_aE67) || // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+// (0x_aE69 <= code && code <= 0x_aE83) || // Lo [27] HANGUL SYLLABLE
+// GGAEG..HANGUL SYLLABLE GGAEH (0x_aE85 <= code && code <= 0x_aE9F) ||
+// // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH (0x_aEA1 <=
+// code && code <= 0x_aEBB) || // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL
+// SYLLABLE GGYAEH (0x_aEBD <= code && code <= 0x_aED7) || // Lo [27]
+// HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH (0x_aED9 <= code && code
+// <= 0x_aEF3) || // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+// (0x_aEF5 <= code && code <= 0x_aF0F) || // Lo [27] HANGUL SYLLABLE
+// GGYEOG..HANGUL SYLLABLE GGYEOH (0x_aF11 <= code && code <= 0x_aF2B) ||
+// // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH (0x_aF2D <=
+// code && code <= 0x_aF47) || // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE
+// GGOH (0x_aF49 <= code && code <= 0x_aF63) || // Lo [27] HANGUL
+// SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH (0x_aF65 <= code && code <=
+// 0x_aF7F) || // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+// (0x_aF81 <= code && code <= 0x_aF9B) || // Lo [27] HANGUL SYLLABLE
+// GGOEG..HANGUL SYLLABLE GGOEH (0x_aF9D <= code && code <= 0x_aFB7) ||
+// // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH (0x_aFB9 <=
+// code && code <= 0x_aFD3) || // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE
+// GGUH (0x_aFD5 <= code && code <= 0x_aFEF) || // Lo [27] HANGUL
+// SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH (0x_aFF1 <= code && code <=
+// 0x_b00B) || // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+// (0x_b00D <= code && code <= 0x_b027) || // Lo [27] HANGUL SYLLABLE
+// GGWIG..HANGUL SYLLABLE GGWIH (0x_b029 <= code && code <= 0x_b043) ||
+// // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH (0x_b045 <=
+// code && code <= 0x_b05F) || // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL
+// SYLLABLE GGEUH (0x_b061 <= code && code <= 0x_b07B) || // Lo [27]
+// HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH (0x_b07D <= code && code
+// <= 0x_b097) || // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+// (0x_b099 <= code && code <= 0x_b0B3) || // Lo [27] HANGUL SYLLABLE
+// NAG..HANGUL SYLLABLE NAH (0x_b0B5 <= code && code <= 0x_b0CF) || // Lo
+// [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH (0x_b0D1 <= code &&
+// code <= 0x_b0EB) || // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+// (0x_b0ED <= code && code <= 0x_b107) || // Lo [27] HANGUL SYLLABLE
+// NYAEG..HANGUL SYLLABLE NYAEH (0x_b109 <= code && code <= 0x_b123) ||
+// // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH (0x_b125 <=
+// code && code <= 0x_b13F) || // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE
+// NEH (0x_b141 <= code && code <= 0x_b15B) || // Lo [27] HANGUL
+// SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH (0x_b15D <= code && code <=
+// 0x_b177) || // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+// (0x_b179 <= code && code <= 0x_b193) || // Lo [27] HANGUL SYLLABLE
+// NOG..HANGUL SYLLABLE NOH (0x_b195 <= code && code <= 0x_b1AF) || // Lo
+// [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH (0x_b1B1 <= code &&
+// code <= 0x_b1CB) || // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+// (0x_b1CD <= code && code <= 0x_b1E7) || // Lo [27] HANGUL SYLLABLE
+// NOEG..HANGUL SYLLABLE NOEH (0x_b1E9 <= code && code <= 0x_b203) || //
+// Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH (0x_b205 <= code
+// && code <= 0x_b21F) || // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+// (0x_b221 <= code && code <= 0x_b23B) || // Lo [27] HANGUL SYLLABLE
+// NWEOG..HANGUL SYLLABLE NWEOH (0x_b23D <= code && code <= 0x_b257) ||
+// // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH (0x_b259 <=
+// code && code <= 0x_b273) || // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE
+// NWIH (0x_b275 <= code && code <= 0x_b28F) || // Lo [27] HANGUL
+// SYLLABLE NYUG..HANGUL SYLLABLE NYUH (0x_b291 <= code && code <=
+// 0x_b2AB) || // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+// (0x_b2AD <= code && code <= 0x_b2C7) || // Lo [27] HANGUL SYLLABLE
+// NYIG..HANGUL SYLLABLE NYIH (0x_b2C9 <= code && code <= 0x_b2E3) || //
+// Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH (0x_b2E5 <= code &&
+// code <= 0x_b2FF) || // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+// (0x_b301 <= code && code <= 0x_b31B) || // Lo [27] HANGUL SYLLABLE
+// DAEG..HANGUL SYLLABLE DAEH (0x_b31D <= code && code <= 0x_b337) || //
+// Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH (0x_b339 <= code
+// && code <= 0x_b353) || // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE
+// DYAEH (0x_b355 <= code && code <= 0x_b36F) || // Lo [27] HANGUL
+// SYLLABLE DEOG..HANGUL SYLLABLE DEOH (0x_b371 <= code && code <=
+// 0x_b38B) || // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+// (0x_b38D <= code && code <= 0x_b3A7) || // Lo [27] HANGUL SYLLABLE
+// DYEOG..HANGUL SYLLABLE DYEOH (0x_b3A9 <= code && code <= 0x_b3C3) ||
+// // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH (0x_b3C5 <=
+// code && code <= 0x_b3DF) || // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE
+// DOH (0x_b3E1 <= code && code <= 0x_b3FB) || // Lo [27] HANGUL
+// SYLLABLE DWAG..HANGUL SYLLABLE DWAH (0x_b3FD <= code && code <=
+// 0x_b417) || // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+// (0x_b419 <= code && code <= 0x_b433) || // Lo [27] HANGUL SYLLABLE
+// DOEG..HANGUL SYLLABLE DOEH (0x_b435 <= code && code <= 0x_b44F) || //
+// Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH (0x_b451 <= code
+// && code <= 0x_b46B) || // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+// (0x_b46D <= code && code <= 0x_b487) || // Lo [27] HANGUL SYLLABLE
+// DWEOG..HANGUL SYLLABLE DWEOH (0x_b489 <= code && code <= 0x_b4A3) ||
+// // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH (0x_b4A5 <=
+// code && code <= 0x_b4BF) || // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE
+// DWIH (0x_b4C1 <= code && code <= 0x_b4DB) || // Lo [27] HANGUL
+// SYLLABLE DYUG..HANGUL SYLLABLE DYUH (0x_b4DD <= code && code <=
+// 0x_b4F7) || // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+// (0x_b4F9 <= code && code <= 0x_b513) || // Lo [27] HANGUL SYLLABLE
+// DYIG..HANGUL SYLLABLE DYIH (0x_b515 <= code && code <= 0x_b52F) || //
+// Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH (0x_b531 <= code &&
+// code <= 0x_b54B) || // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+// (0x_b54D <= code && code <= 0x_b567) || // Lo [27] HANGUL SYLLABLE
+// DDAEG..HANGUL SYLLABLE DDAEH (0x_b569 <= code && code <= 0x_b583) ||
+// // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH (0x_b585 <=
+// code && code <= 0x_b59F) || // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL
+// SYLLABLE DDYAEH (0x_b5A1 <= code && code <= 0x_b5BB) || // Lo [27]
+// HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH (0x_b5BD <= code && code
+// <= 0x_b5D7) || // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+// (0x_b5D9 <= code && code <= 0x_b5F3) || // Lo [27] HANGUL SYLLABLE
+// DDYEOG..HANGUL SYLLABLE DDYEOH (0x_b5F5 <= code && code <= 0x_b60F) ||
+// // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH (0x_b611 <=
+// code && code <= 0x_b62B) || // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE
+// DDOH (0x_b62D <= code && code <= 0x_b647) || // Lo [27] HANGUL
+// SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH (0x_b649 <= code && code <=
+// 0x_b663) || // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+// (0x_b665 <= code && code <= 0x_b67F) || // Lo [27] HANGUL SYLLABLE
+// DDOEG..HANGUL SYLLABLE DDOEH (0x_b681 <= code && code <= 0x_b69B) ||
+// // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH (0x_b69D <=
+// code && code <= 0x_b6B7) || // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE
+// DDUH (0x_b6B9 <= code && code <= 0x_b6D3) || // Lo [27] HANGUL
+// SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH (0x_b6D5 <= code && code <=
+// 0x_b6EF) || // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+// (0x_b6F1 <= code && code <= 0x_b70B) || // Lo [27] HANGUL SYLLABLE
+// DDWIG..HANGUL SYLLABLE DDWIH (0x_b70D <= code && code <= 0x_b727) ||
+// // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH (0x_b729 <=
+// code && code <= 0x_b743) || // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL
+// SYLLABLE DDEUH (0x_b745 <= code && code <= 0x_b75F) || // Lo [27]
+// HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH (0x_b761 <= code && code
+// <= 0x_b77B) || // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+// (0x_b77D <= code && code <= 0x_b797) || // Lo [27] HANGUL SYLLABLE
+// RAG..HANGUL SYLLABLE RAH (0x_b799 <= code && code <= 0x_b7B3) || // Lo
+// [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH (0x_b7B5 <= code &&
+// code <= 0x_b7CF) || // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+// (0x_b7D1 <= code && code <= 0x_b7EB) || // Lo [27] HANGUL SYLLABLE
+// RYAEG..HANGUL SYLLABLE RYAEH (0x_b7ED <= code && code <= 0x_b807) ||
+// // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH (0x_b809 <=
+// code && code <= 0x_b823) || // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE
+// REH (0x_b825 <= code && code <= 0x_b83F) || // Lo [27] HANGUL
+// SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH (0x_b841 <= code && code <=
+// 0x_b85B) || // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+// (0x_b85D <= code && code <= 0x_b877) || // Lo [27] HANGUL SYLLABLE
+// ROG..HANGUL SYLLABLE ROH (0x_b879 <= code && code <= 0x_b893) || // Lo
+// [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH (0x_b895 <= code &&
+// code <= 0x_b8AF) || // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+// (0x_b8B1 <= code && code <= 0x_b8CB) || // Lo [27] HANGUL SYLLABLE
+// ROEG..HANGUL SYLLABLE ROEH (0x_b8CD <= code && code <= 0x_b8E7) || //
+// Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH (0x_b8E9 <= code
+// && code <= 0x_b903) || // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+// (0x_b905 <= code && code <= 0x_b91F) || // Lo [27] HANGUL SYLLABLE
+// RWEOG..HANGUL SYLLABLE RWEOH (0x_b921 <= code && code <= 0x_b93B) ||
+// // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH (0x_b93D <=
+// code && code <= 0x_b957) || // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE
+// RWIH (0x_b959 <= code && code <= 0x_b973) || // Lo [27] HANGUL
+// SYLLABLE RYUG..HANGUL SYLLABLE RYUH (0x_b975 <= code && code <=
+// 0x_b98F) || // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+// (0x_b991 <= code && code <= 0x_b9AB) || // Lo [27] HANGUL SYLLABLE
+// RYIG..HANGUL SYLLABLE RYIH (0x_b9AD <= code && code <= 0x_b9C7) || //
+// Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH (0x_b9C9 <= code &&
+// code <= 0x_b9E3) || // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+// (0x_b9E5 <= code && code <= 0x_b9FF) || // Lo [27] HANGUL SYLLABLE
+// MAEG..HANGUL SYLLABLE MAEH (0x_bA01 <= code && code <= 0x_bA1B) || //
+// Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH (0x_bA1D <= code
+// && code <= 0x_bA37) || // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE
+// MYAEH (0x_bA39 <= code && code <= 0x_bA53) || // Lo [27] HANGUL
+// SYLLABLE MEOG..HANGUL SYLLABLE MEOH (0x_bA55 <= code && code <=
+// 0x_bA6F) || // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+// (0x_bA71 <= code && code <= 0x_bA8B) || // Lo [27] HANGUL SYLLABLE
+// MYEOG..HANGUL SYLLABLE MYEOH (0x_bA8D <= code && code <= 0x_bAA7) ||
+// // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH (0x_bAA9 <=
+// code && code <= 0x_bAC3) || // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE
+// MOH (0x_bAC5 <= code && code <= 0x_bADF) || // Lo [27] HANGUL
+// SYLLABLE MWAG..HANGUL SYLLABLE MWAH (0x_bAE1 <= code && code <=
+// 0x_bAFB) || // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+// (0x_bAFD <= code && code <= 0x_bB17) || // Lo [27] HANGUL SYLLABLE
+// MOEG..HANGUL SYLLABLE MOEH (0x_bB19 <= code && code <= 0x_bB33) || //
+// Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH (0x_bB35 <= code
+// && code <= 0x_bB4F) || // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+// (0x_bB51 <= code && code <= 0x_bB6B) || // Lo [27] HANGUL SYLLABLE
+// MWEOG..HANGUL SYLLABLE MWEOH (0x_bB6D <= code && code <= 0x_bB87) ||
+// // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH (0x_bB89 <=
+// code && code <= 0x_bBA3) || // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE
+// MWIH (0x_bBA5 <= code && code <= 0x_bBBF) || // Lo [27] HANGUL
+// SYLLABLE MYUG..HANGUL SYLLABLE MYUH (0x_bBC1 <= code && code <=
+// 0x_bBDB) || // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+// (0x_bBDD <= code && code <= 0x_bBF7) || // Lo [27] HANGUL SYLLABLE
+// MYIG..HANGUL SYLLABLE MYIH (0x_bBF9 <= code && code <= 0x_bC13) || //
+// Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH (0x_bC15 <= code &&
+// code <= 0x_bC2F) || // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+// (0x_bC31 <= code && code <= 0x_bC4B) || // Lo [27] HANGUL SYLLABLE
+// BAEG..HANGUL SYLLABLE BAEH (0x_bC4D <= code && code <= 0x_bC67) || //
+// Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH (0x_bC69 <= code
+// && code <= 0x_bC83) || // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE
+// BYAEH (0x_bC85 <= code && code <= 0x_bC9F) || // Lo [27] HANGUL
+// SYLLABLE BEOG..HANGUL SYLLABLE BEOH (0x_bCA1 <= code && code <=
+// 0x_bCBB) || // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+// (0x_bCBD <= code && code <= 0x_bCD7) || // Lo [27] HANGUL SYLLABLE
+// BYEOG..HANGUL SYLLABLE BYEOH (0x_bCD9 <= code && code <= 0x_bCF3) ||
+// // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH (0x_bCF5 <=
+// code && code <= 0x_bD0F) || // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE
+// BOH (0x_bD11 <= code && code <= 0x_bD2B) || // Lo [27] HANGUL
+// SYLLABLE BWAG..HANGUL SYLLABLE BWAH (0x_bD2D <= code && code <=
+// 0x_bD47) || // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+// (0x_bD49 <= code && code <= 0x_bD63) || // Lo [27] HANGUL SYLLABLE
+// BOEG..HANGUL SYLLABLE BOEH (0x_bD65 <= code && code <= 0x_bD7F) || //
+// Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH (0x_bD81 <= code
+// && code <= 0x_bD9B) || // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+// (0x_bD9D <= code && code <= 0x_bDB7) || // Lo [27] HANGUL SYLLABLE
+// BWEOG..HANGUL SYLLABLE BWEOH (0x_bDB9 <= code && code <= 0x_bDD3) ||
+// // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH (0x_bDD5 <=
+// code && code <= 0x_bDEF) || // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE
+// BWIH (0x_bDF1 <= code && code <= 0x_bE0B) || // Lo [27] HANGUL
+// SYLLABLE BYUG..HANGUL SYLLABLE BYUH (0x_bE0D <= code && code <=
+// 0x_bE27) || // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+// (0x_bE29 <= code && code <= 0x_bE43) || // Lo [27] HANGUL SYLLABLE
+// BYIG..HANGUL SYLLABLE BYIH (0x_bE45 <= code && code <= 0x_bE5F) || //
+// Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH (0x_bE61 <= code &&
+// code <= 0x_bE7B) || // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+// (0x_bE7D <= code && code <= 0x_bE97) || // Lo [27] HANGUL SYLLABLE
+// BBAEG..HANGUL SYLLABLE BBAEH (0x_bE99 <= code && code <= 0x_bEB3) ||
+// // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH (0x_bEB5 <=
+// code && code <= 0x_bECF) || // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL
+// SYLLABLE BBYAEH (0x_bED1 <= code && code <= 0x_bEEB) || // Lo [27]
+// HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH (0x_bEED <= code && code
+// <= 0x_bF07) || // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+// (0x_bF09 <= code && code <= 0x_bF23) || // Lo [27] HANGUL SYLLABLE
+// BBYEOG..HANGUL SYLLABLE BBYEOH (0x_bF25 <= code && code <= 0x_bF3F) ||
+// // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH (0x_bF41 <=
+// code && code <= 0x_bF5B) || // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE
+// BBOH (0x_bF5D <= code && code <= 0x_bF77) || // Lo [27] HANGUL
+// SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH (0x_bF79 <= code && code <=
+// 0x_bF93) || // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+// (0x_bF95 <= code && code <= 0x_bFAF) || // Lo [27] HANGUL SYLLABLE
+// BBOEG..HANGUL SYLLABLE BBOEH (0x_bFB1 <= code && code <= 0x_bFCB) ||
+// // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH (0x_bFCD <=
+// code && code <= 0x_bFE7) || // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE
+// BBUH (0x_bFE9 <= code && code <= 0x_c003) || // Lo [27] HANGUL
+// SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH (0x_c005 <= code && code <=
+// 0x_c01F) || // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+// (0x_c021 <= code && code <= 0x_c03B) || // Lo [27] HANGUL SYLLABLE
+// BBWIG..HANGUL SYLLABLE BBWIH (0x_c03D <= code && code <= 0x_c057) ||
+// // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH (0x_c059 <=
+// code && code <= 0x_c073) || // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL
+// SYLLABLE BBEUH (0x_c075 <= code && code <= 0x_c08F) || // Lo [27]
+// HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH (0x_c091 <= code && code
+// <= 0x_c0AB) || // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+// (0x_c0AD <= code && code <= 0x_c0C7) || // Lo [27] HANGUL SYLLABLE
+// SAG..HANGUL SYLLABLE SAH (0x_c0C9 <= code && code <= 0x_c0E3) || // Lo
+// [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH (0x_c0E5 <= code &&
+// code <= 0x_c0FF) || // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+// (0x_c101 <= code && code <= 0x_c11B) || // Lo [27] HANGUL SYLLABLE
+// SYAEG..HANGUL SYLLABLE SYAEH (0x_c11D <= code && code <= 0x_c137) ||
+// // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH (0x_c139 <=
+// code && code <= 0x_c153) || // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE
+// SEH (0x_c155 <= code && code <= 0x_c16F) || // Lo [27] HANGUL
+// SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH (0x_c171 <= code && code <=
+// 0x_c18B) || // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+// (0x_c18D <= code && code <= 0x_c1A7) || // Lo [27] HANGUL SYLLABLE
+// SOG..HANGUL SYLLABLE SOH (0x_c1A9 <= code && code <= 0x_c1C3) || // Lo
+// [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH (0x_c1C5 <= code &&
+// code <= 0x_c1DF) || // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+// (0x_c1E1 <= code && code <= 0x_c1FB) || // Lo [27] HANGUL SYLLABLE
+// SOEG..HANGUL SYLLABLE SOEH (0x_c1FD <= code && code <= 0x_c217) || //
+// Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH (0x_c219 <= code
+// && code <= 0x_c233) || // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+// (0x_c235 <= code && code <= 0x_c24F) || // Lo [27] HANGUL SYLLABLE
+// SWEOG..HANGUL SYLLABLE SWEOH (0x_c251 <= code && code <= 0x_c26B) ||
+// // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH (0x_c26D <=
+// code && code <= 0x_c287) || // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE
+// SWIH (0x_c289 <= code && code <= 0x_c2A3) || // Lo [27] HANGUL
+// SYLLABLE SYUG..HANGUL SYLLABLE SYUH (0x_c2A5 <= code && code <=
+// 0x_c2BF) || // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+// (0x_c2C1 <= code && code <= 0x_c2DB) || // Lo [27] HANGUL SYLLABLE
+// SYIG..HANGUL SYLLABLE SYIH (0x_c2DD <= code && code <= 0x_c2F7) || //
+// Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH (0x_c2F9 <= code &&
+// code <= 0x_c313) || // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+// (0x_c315 <= code && code <= 0x_c32F) || // Lo [27] HANGUL SYLLABLE
+// SSAEG..HANGUL SYLLABLE SSAEH (0x_c331 <= code && code <= 0x_c34B) ||
+// // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH (0x_c34D <=
+// code && code <= 0x_c367) || // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL
+// SYLLABLE SSYAEH (0x_c369 <= code && code <= 0x_c383) || // Lo [27]
+// HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH (0x_c385 <= code && code
+// <= 0x_c39F) || // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+// (0x_c3A1 <= code && code <= 0x_c3BB) || // Lo [27] HANGUL SYLLABLE
+// SSYEOG..HANGUL SYLLABLE SSYEOH (0x_c3BD <= code && code <= 0x_c3D7) ||
+// // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH (0x_c3D9 <=
+// code && code <= 0x_c3F3) || // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE
+// SSOH (0x_c3F5 <= code && code <= 0x_c40F) || // Lo [27] HANGUL
+// SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH (0x_c411 <= code && code <=
+// 0x_c42B) || // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+// (0x_c42D <= code && code <= 0x_c447) || // Lo [27] HANGUL SYLLABLE
+// SSOEG..HANGUL SYLLABLE SSOEH (0x_c449 <= code && code <= 0x_c463) ||
+// // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH (0x_c465 <=
+// code && code <= 0x_c47F) || // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE
+// SSUH (0x_c481 <= code && code <= 0x_c49B) || // Lo [27] HANGUL
+// SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH (0x_c49D <= code && code <=
+// 0x_c4B7) || // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+// (0x_c4B9 <= code && code <= 0x_c4D3) || // Lo [27] HANGUL SYLLABLE
+// SSWIG..HANGUL SYLLABLE SSWIH (0x_c4D5 <= code && code <= 0x_c4EF) ||
+// // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH (0x_c4F1 <=
+// code && code <= 0x_c50B) || // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL
+// SYLLABLE SSEUH (0x_c50D <= code && code <= 0x_c527) || // Lo [27]
+// HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH (0x_c529 <= code && code
+// <= 0x_c543) || // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+// (0x_c545 <= code && code <= 0x_c55F) || // Lo [27] HANGUL SYLLABLE
+// AG..HANGUL SYLLABLE AH (0x_c561 <= code && code <= 0x_c57B) || // Lo
+// [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH (0x_c57D <= code && code
+// <= 0x_c597) || // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+// (0x_c599 <= code && code <= 0x_c5B3) || // Lo [27] HANGUL SYLLABLE
+// YAEG..HANGUL SYLLABLE YAEH (0x_c5B5 <= code && code <= 0x_c5CF) || //
+// Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH (0x_c5D1 <= code &&
+// code <= 0x_c5EB) || // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+// (0x_c5ED <= code && code <= 0x_c607) || // Lo [27] HANGUL SYLLABLE
+// YEOG..HANGUL SYLLABLE YEOH (0x_c609 <= code && code <= 0x_c623) || //
+// Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH (0x_c625 <= code &&
+// code <= 0x_c63F) || // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+// (0x_c641 <= code && code <= 0x_c65B) || // Lo [27] HANGUL SYLLABLE
+// WAG..HANGUL SYLLABLE WAH (0x_c65D <= code && code <= 0x_c677) || // Lo
+// [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH (0x_c679 <= code &&
+// code <= 0x_c693) || // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+// (0x_c695 <= code && code <= 0x_c6AF) || // Lo [27] HANGUL SYLLABLE
+// YOG..HANGUL SYLLABLE YOH (0x_c6B1 <= code && code <= 0x_c6CB) || // Lo
+// [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH (0x_c6CD <= code && code
+// <= 0x_c6E7) || // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+// (0x_c6E9 <= code && code <= 0x_c703) || // Lo [27] HANGUL SYLLABLE
+// WEG..HANGUL SYLLABLE WEH (0x_c705 <= code && code <= 0x_c71F) || // Lo
+// [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH (0x_c721 <= code && code
+// <= 0x_c73B) || // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+// (0x_c73D <= code && code <= 0x_c757) || // Lo [27] HANGUL SYLLABLE
+// EUG..HANGUL SYLLABLE EUH (0x_c759 <= code && code <= 0x_c773) || // Lo
+// [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH (0x_c775 <= code && code
+// <= 0x_c78F) || // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+// (0x_c791 <= code && code <= 0x_c7AB) || // Lo [27] HANGUL SYLLABLE
+// JAG..HANGUL SYLLABLE JAH (0x_c7AD <= code && code <= 0x_c7C7) || // Lo
+// [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH (0x_c7C9 <= code &&
+// code <= 0x_c7E3) || // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+// (0x_c7E5 <= code && code <= 0x_c7FF) || // Lo [27] HANGUL SYLLABLE
+// JYAEG..HANGUL SYLLABLE JYAEH (0x_c801 <= code && code <= 0x_c81B) ||
+// // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH (0x_c81D <=
+// code && code <= 0x_c837) || // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE
+// JEH (0x_c839 <= code && code <= 0x_c853) || // Lo [27] HANGUL
+// SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH (0x_c855 <= code && code <=
+// 0x_c86F) || // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+// (0x_c871 <= code && code <= 0x_c88B) || // Lo [27] HANGUL SYLLABLE
+// JOG..HANGUL SYLLABLE JOH (0x_c88D <= code && code <= 0x_c8A7) || // Lo
+// [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH (0x_c8A9 <= code &&
+// code <= 0x_c8C3) || // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+// (0x_c8C5 <= code && code <= 0x_c8DF) || // Lo [27] HANGUL SYLLABLE
+// JOEG..HANGUL SYLLABLE JOEH (0x_c8E1 <= code && code <= 0x_c8FB) || //
+// Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH (0x_c8FD <= code
+// && code <= 0x_c917) || // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+// (0x_c919 <= code && code <= 0x_c933) || // Lo [27] HANGUL SYLLABLE
+// JWEOG..HANGUL SYLLABLE JWEOH (0x_c935 <= code && code <= 0x_c94F) ||
+// // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH (0x_c951 <=
+// code && code <= 0x_c96B) || // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE
+// JWIH (0x_c96D <= code && code <= 0x_c987) || // Lo [27] HANGUL
+// SYLLABLE JYUG..HANGUL SYLLABLE JYUH (0x_c989 <= code && code <=
+// 0x_c9A3) || // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+// (0x_c9A5 <= code && code <= 0x_c9BF) || // Lo [27] HANGUL SYLLABLE
+// JYIG..HANGUL SYLLABLE JYIH (0x_c9C1 <= code && code <= 0x_c9DB) || //
+// Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH (0x_c9DD <= code &&
+// code <= 0x_c9F7) || // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+// (0x_c9F9 <= code && code <= 0x_cA13) || // Lo [27] HANGUL SYLLABLE
+// JJAEG..HANGUL SYLLABLE JJAEH (0x_cA15 <= code && code <= 0x_cA2F) ||
+// // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH (0x_cA31 <=
+// code && code <= 0x_cA4B) || // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL
+// SYLLABLE JJYAEH (0x_cA4D <= code && code <= 0x_cA67) || // Lo [27]
+// HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH (0x_cA69 <= code && code
+// <= 0x_cA83) || // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+// (0x_cA85 <= code && code <= 0x_cA9F) || // Lo [27] HANGUL SYLLABLE
+// JJYEOG..HANGUL SYLLABLE JJYEOH (0x_cAA1 <= code && code <= 0x_cABB) ||
+// // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH (0x_cABD <=
+// code && code <= 0x_cAD7) || // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE
+// JJOH (0x_cAD9 <= code && code <= 0x_cAF3) || // Lo [27] HANGUL
+// SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH (0x_cAF5 <= code && code <=
+// 0x_cB0F) || // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+// (0x_cB11 <= code && code <= 0x_cB2B) || // Lo [27] HANGUL SYLLABLE
+// JJOEG..HANGUL SYLLABLE JJOEH (0x_cB2D <= code && code <= 0x_cB47) ||
+// // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH (0x_cB49 <=
+// code && code <= 0x_cB63) || // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE
+// JJUH (0x_cB65 <= code && code <= 0x_cB7F) || // Lo [27] HANGUL
+// SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH (0x_cB81 <= code && code <=
+// 0x_cB9B) || // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+// (0x_cB9D <= code && code <= 0x_cBB7) || // Lo [27] HANGUL SYLLABLE
+// JJWIG..HANGUL SYLLABLE JJWIH (0x_cBB9 <= code && code <= 0x_cBD3) ||
+// // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH (0x_cBD5 <=
+// code && code <= 0x_cBEF) || // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL
+// SYLLABLE JJEUH (0x_cBF1 <= code && code <= 0x_cC0B) || // Lo [27]
+// HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH (0x_cC0D <= code && code
+// <= 0x_cC27) || // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+// (0x_cC29 <= code && code <= 0x_cC43) || // Lo [27] HANGUL SYLLABLE
+// CAG..HANGUL SYLLABLE CAH (0x_cC45 <= code && code <= 0x_cC5F) || // Lo
+// [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH (0x_cC61 <= code &&
+// code <= 0x_cC7B) || // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+// (0x_cC7D <= code && code <= 0x_cC97) || // Lo [27] HANGUL SYLLABLE
+// CYAEG..HANGUL SYLLABLE CYAEH (0x_cC99 <= code && code <= 0x_cCB3) ||
+// // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH (0x_cCB5 <=
+// code && code <= 0x_cCCF) || // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE
+// CEH (0x_cCD1 <= code && code <= 0x_cCEB) || // Lo [27] HANGUL
+// SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH (0x_cCED <= code && code <=
+// 0x_cD07) || // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+// (0x_cD09 <= code && code <= 0x_cD23) || // Lo [27] HANGUL SYLLABLE
+// COG..HANGUL SYLLABLE COH (0x_cD25 <= code && code <= 0x_cD3F) || // Lo
+// [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH (0x_cD41 <= code &&
+// code <= 0x_cD5B) || // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+// (0x_cD5D <= code && code <= 0x_cD77) || // Lo [27] HANGUL SYLLABLE
+// COEG..HANGUL SYLLABLE COEH (0x_cD79 <= code && code <= 0x_cD93) || //
+// Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH (0x_cD95 <= code
+// && code <= 0x_cDAF) || // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+// (0x_cDB1 <= code && code <= 0x_cDCB) || // Lo [27] HANGUL SYLLABLE
+// CWEOG..HANGUL SYLLABLE CWEOH (0x_cDCD <= code && code <= 0x_cDE7) ||
+// // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH (0x_cDE9 <=
+// code && code <= 0x_cE03) || // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE
+// CWIH (0x_cE05 <= code && code <= 0x_cE1F) || // Lo [27] HANGUL
+// SYLLABLE CYUG..HANGUL SYLLABLE CYUH (0x_cE21 <= code && code <=
+// 0x_cE3B) || // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+// (0x_cE3D <= code && code <= 0x_cE57) || // Lo [27] HANGUL SYLLABLE
+// CYIG..HANGUL SYLLABLE CYIH (0x_cE59 <= code && code <= 0x_cE73) || //
+// Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH (0x_cE75 <= code &&
+// code <= 0x_cE8F) || // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+// (0x_cE91 <= code && code <= 0x_cEAB) || // Lo [27] HANGUL SYLLABLE
+// KAEG..HANGUL SYLLABLE KAEH (0x_cEAD <= code && code <= 0x_cEC7) || //
+// Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH (0x_cEC9 <= code
+// && code <= 0x_cEE3) || // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE
+// KYAEH (0x_cEE5 <= code && code <= 0x_cEFF) || // Lo [27] HANGUL
+// SYLLABLE KEOG..HANGUL SYLLABLE KEOH (0x_cF01 <= code && code <=
+// 0x_cF1B) || // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+// (0x_cF1D <= code && code <= 0x_cF37) || // Lo [27] HANGUL SYLLABLE
+// KYEOG..HANGUL SYLLABLE KYEOH (0x_cF39 <= code && code <= 0x_cF53) ||
+// // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH (0x_cF55 <=
+// code && code <= 0x_cF6F) || // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE
+// KOH (0x_cF71 <= code && code <= 0x_cF8B) || // Lo [27] HANGUL
+// SYLLABLE KWAG..HANGUL SYLLABLE KWAH (0x_cF8D <= code && code <=
+// 0x_cFA7) || // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+// (0x_cFA9 <= code && code <= 0x_cFC3) || // Lo [27] HANGUL SYLLABLE
+// KOEG..HANGUL SYLLABLE KOEH (0x_cFC5 <= code && code <= 0x_cFDF) || //
+// Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH (0x_cFE1 <= code
+// && code <= 0x_cFFB) || // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+// (0x_cFFD <= code && code <= 0x_d017) || // Lo [27] HANGUL SYLLABLE
+// KWEOG..HANGUL SYLLABLE KWEOH (0x_d019 <= code && code <= 0x_d033) ||
+// // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH (0x_d035 <=
+// code && code <= 0x_d04F) || // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE
+// KWIH (0x_d051 <= code && code <= 0x_d06B) || // Lo [27] HANGUL
+// SYLLABLE KYUG..HANGUL SYLLABLE KYUH (0x_d06D <= code && code <=
+// 0x_d087) || // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+// (0x_d089 <= code && code <= 0x_d0A3) || // Lo [27] HANGUL SYLLABLE
+// KYIG..HANGUL SYLLABLE KYIH (0x_d0A5 <= code && code <= 0x_d0BF) || //
+// Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH (0x_d0C1 <= code &&
+// code <= 0x_d0DB) || // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+// (0x_d0DD <= code && code <= 0x_d0F7) || // Lo [27] HANGUL SYLLABLE
+// TAEG..HANGUL SYLLABLE TAEH (0x_d0F9 <= code && code <= 0x_d113) || //
+// Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH (0x_d115 <= code
+// && code <= 0x_d12F) || // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE
+// TYAEH (0x_d131 <= code && code <= 0x_d14B) || // Lo [27] HANGUL
+// SYLLABLE TEOG..HANGUL SYLLABLE TEOH (0x_d14D <= code && code <=
+// 0x_d167) || // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+// (0x_d169 <= code && code <= 0x_d183) || // Lo [27] HANGUL SYLLABLE
+// TYEOG..HANGUL SYLLABLE TYEOH (0x_d185 <= code && code <= 0x_d19F) ||
+// // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH (0x_d1A1 <=
+// code && code <= 0x_d1BB) || // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE
+// TOH (0x_d1BD <= code && code <= 0x_d1D7) || // Lo [27] HANGUL
+// SYLLABLE TWAG..HANGUL SYLLABLE TWAH (0x_d1D9 <= code && code <=
+// 0x_d1F3) || // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+// (0x_d1F5 <= code && code <= 0x_d20F) || // Lo [27] HANGUL SYLLABLE
+// TOEG..HANGUL SYLLABLE TOEH (0x_d211 <= code && code <= 0x_d22B) || //
+// Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH (0x_d22D <= code
+// && code <= 0x_d247) || // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+// (0x_d249 <= code && code <= 0x_d263) || // Lo [27] HANGUL SYLLABLE
+// TWEOG..HANGUL SYLLABLE TWEOH (0x_d265 <= code && code <= 0x_d27F) ||
+// // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH (0x_d281 <=
+// code && code <= 0x_d29B) || // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE
+// TWIH (0x_d29D <= code && code <= 0x_d2B7) || // Lo [27] HANGUL
+// SYLLABLE TYUG..HANGUL SYLLABLE TYUH (0x_d2B9 <= code && code <=
+// 0x_d2D3) || // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+// (0x_d2D5 <= code && code <= 0x_d2EF) || // Lo [27] HANGUL SYLLABLE
+// TYIG..HANGUL SYLLABLE TYIH (0x_d2F1 <= code && code <= 0x_d30B) || //
+// Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH (0x_d30D <= code &&
+// code <= 0x_d327) || // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+// (0x_d329 <= code && code <= 0x_d343) || // Lo [27] HANGUL SYLLABLE
+// PAEG..HANGUL SYLLABLE PAEH (0x_d345 <= code && code <= 0x_d35F) || //
+// Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH (0x_d361 <= code
+// && code <= 0x_d37B) || // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE
+// PYAEH (0x_d37D <= code && code <= 0x_d397) || // Lo [27] HANGUL
+// SYLLABLE PEOG..HANGUL SYLLABLE PEOH (0x_d399 <= code && code <=
+// 0x_d3B3) || // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+// (0x_d3B5 <= code && code <= 0x_d3CF) || // Lo [27] HANGUL SYLLABLE
+// PYEOG..HANGUL SYLLABLE PYEOH (0x_d3D1 <= code && code <= 0x_d3EB) ||
+// // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH (0x_d3ED <=
+// code && code <= 0x_d407) || // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE
+// POH (0x_d409 <= code && code <= 0x_d423) || // Lo [27] HANGUL
+// SYLLABLE PWAG..HANGUL SYLLABLE PWAH (0x_d425 <= code && code <=
+// 0x_d43F) || // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+// (0x_d441 <= code && code <= 0x_d45B) || // Lo [27] HANGUL SYLLABLE
+// POEG..HANGUL SYLLABLE POEH (0x_d45D <= code && code <= 0x_d477) || //
+// Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH (0x_d479 <= code
+// && code <= 0x_d493) || // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+// (0x_d495 <= code && code <= 0x_d4AF) || // Lo [27] HANGUL SYLLABLE
+// PWEOG..HANGUL SYLLABLE PWEOH (0x_d4B1 <= code && code <= 0x_d4CB) ||
+// // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH (0x_d4CD <=
+// code && code <= 0x_d4E7) || // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE
+// PWIH (0x_d4E9 <= code && code <= 0x_d503) || // Lo [27] HANGUL
+// SYLLABLE PYUG..HANGUL SYLLABLE PYUH (0x_d505 <= code && code <=
+// 0x_d51F) || // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+// (0x_d521 <= code && code <= 0x_d53B) || // Lo [27] HANGUL SYLLABLE
+// PYIG..HANGUL SYLLABLE PYIH (0x_d53D <= code && code <= 0x_d557) || //
+// Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH (0x_d559 <= code &&
+// code <= 0x_d573) || // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+// (0x_d575 <= code && code <= 0x_d58F) || // Lo [27] HANGUL SYLLABLE
+// HAEG..HANGUL SYLLABLE HAEH (0x_d591 <= code && code <= 0x_d5AB) || //
+// Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH (0x_d5AD <= code
+// && code <= 0x_d5C7) || // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE
+// HYAEH (0x_d5C9 <= code && code <= 0x_d5E3) || // Lo [27] HANGUL
+// SYLLABLE HEOG..HANGUL SYLLABLE HEOH (0x_d5E5 <= code && code <=
+// 0x_d5FF) || // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+// (0x_d601 <= code && code <= 0x_d61B) || // Lo [27] HANGUL SYLLABLE
+// HYEOG..HANGUL SYLLABLE HYEOH (0x_d61D <= code && code <= 0x_d637) ||
+// // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH (0x_d639 <=
+// code && code <= 0x_d653) || // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE
+// HOH (0x_d655 <= code && code <= 0x_d66F) || // Lo [27] HANGUL
+// SYLLABLE HWAG..HANGUL SYLLABLE HWAH (0x_d671 <= code && code <=
+// 0x_d68B) || // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+// (0x_d68D <= code && code <= 0x_d6A7) || // Lo [27] HANGUL SYLLABLE
+// HOEG..HANGUL SYLLABLE HOEH (0x_d6A9 <= code && code <= 0x_d6C3) || //
+// Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH (0x_d6C5 <= code
+// && code <= 0x_d6DF) || // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+// (0x_d6E1 <= code && code <= 0x_d6FB) || // Lo [27] HANGUL SYLLABLE
+// HWEOG..HANGUL SYLLABLE HWEOH (0x_d6FD <= code && code <= 0x_d717) ||
+// // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH (0x_d719 <=
+// code && code <= 0x_d733) || // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE
+// HWIH (0x_d735 <= code && code <= 0x_d74F) || // Lo [27] HANGUL
+// SYLLABLE HYUG..HANGUL SYLLABLE HYUH (0x_d751 <= code && code <=
+// 0x_d76B) || // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+// (0x_d76D <= code && code <= 0x_d787) || // Lo [27] HANGUL SYLLABLE
+// HYIG..HANGUL SYLLABLE HYIH (0x_d789 <= code && code <= 0x_d7A3) // Lo
+// [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH ){
// return LVT;
// }
//
// if(
// 0x261D == code || // So WHITE UP POINTING INDEX
// 0x26F9 == code || // So PERSON WITH BALL
-// (0x270A <= code && code <= 0x270D) || // So [4] RAISED FIST..WRITING HAND
-// 0x1F385 == code || // So FATHER CHRISTMAS
-// (0x1F3C2 <= code && code <= 0x1F3C4) || // So [3] SNOWBOARDER..SURFER
-// 0x1F3C7 == code || // So HORSE RACING
+// (0x270A <= code && code <= 0x270D) || // So [4] RAISED FIST..WRITING
+// HAND 0x1F385 == code || // So FATHER CHRISTMAS
+// (0x1F3C2 <= code && code <= 0x1F3C4) || // So [3]
+// SNOWBOARDER..SURFER 0x1F3C7 == code || // So HORSE RACING
// (0x1F3CA <= code && code <= 0x1F3CC) || // So [3] SWIMMER..GOLFER
// (0x1F442 <= code && code <= 0x1F443) || // So [2] EAR..NOSE
-// (0x1F446 <= code && code <= 0x1F450) || // So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN
-// 0x1F46E == code || // So POLICE OFFICER
-// (0x1F470 <= code && code <= 0x1F478) || // So [9] BRIDE WITH VEIL..PRINCESS
-// 0x1F47C == code || // So BABY ANGEL
-// (0x1F481 <= code && code <= 0x1F483) || // So [3] INFORMATION DESK PERSON..DANCER
-// (0x1F485 <= code && code <= 0x1F487) || // So [3] NAIL POLISH..HAIRCUT
-// 0x1F4AA == code || // So FLEXED BICEPS
-// (0x1F574 <= code && code <= 0x1F575) || // So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY
-// 0x1F57A == code || // So MAN DANCING
-// 0x1F590 == code || // So RAISED HAND WITH FINGERS SPLAYED
-// (0x1F595 <= code && code <= 0x1F596) || // So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS
-// (0x1F645 <= code && code <= 0x1F647) || // So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY
-// (0x1F64B <= code && code <= 0x1F64F) || // So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS
-// 0x1F6A3 == code || // So ROWBOAT
-// (0x1F6B4 <= code && code <= 0x1F6B6) || // So [3] BICYCLIST..PEDESTRIAN
-// 0x1F6C0 == code || // So BATH
+// (0x1F446 <= code && code <= 0x1F450) || // So [11] WHITE UP POINTING
+// BACKHAND INDEX..OPEN HANDS SIGN 0x1F46E == code || // So POLICE
+// OFFICER (0x1F470 <= code && code <= 0x1F478) || // So [9] BRIDE WITH
+// VEIL..PRINCESS 0x1F47C == code || // So BABY ANGEL
+// (0x1F481 <= code && code <= 0x1F483) || // So [3] INFORMATION DESK
+// PERSON..DANCER (0x1F485 <= code && code <= 0x1F487) || // So [3]
+// NAIL POLISH..HAIRCUT 0x1F4AA == code || // So FLEXED BICEPS
+// (0x1F574 <= code && code <= 0x1F575) || // So [2] MAN IN BUSINESS
+// SUIT LEVITATING..SLEUTH OR SPY 0x1F57A == code || // So MAN
+// DANCING 0x1F590 == code || // So RAISED HAND WITH FINGERS
+// SPLAYED (0x1F595 <= code && code <= 0x1F596) || // So [2] REVERSED
+// HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND
+// RING FINGERS (0x1F645 <= code && code <= 0x1F647) || // So [3] FACE
+// WITH NO GOOD GESTURE..PERSON BOWING DEEPLY (0x1F64B <= code && code <=
+// 0x1F64F) || // So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED
+// HANDS 0x1F6A3 == code || // So ROWBOAT
+// (0x1F6B4 <= code && code <= 0x1F6B6) || // So [3]
+// BICYCLIST..PEDESTRIAN 0x1F6C0 == code || // So BATH
// 0x1F6CC == code || // So SLEEPING ACCOMMODATION
-// (0x1F918 <= code && code <= 0x1F91C) || // So [5] SIGN OF THE HORNS..RIGHT-FACING FIST
-// (0x1F91E <= code && code <= 0x1F91F) || // So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN
+// (0x1F918 <= code && code <= 0x1F91C) || // So [5] SIGN OF THE
+// HORNS..RIGHT-FACING FIST (0x1F91E <= code && code <= 0x1F91F) || // So
+// [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN
// 0x1F926 == code || // So FACE PALM
-// (0x1F930 <= code && code <= 0x1F939) || // So [10] PREGNANT WOMAN..JUGGLING
-// (0x1F93D <= code && code <= 0x1F93E) || // So [2] WATER POLO..HANDBALL
-// (0x1F9D1 <= code && code <= 0x1F9DD) // So [13] ADULT..ELF
-// ){
+// (0x1F930 <= code && code <= 0x1F939) || // So [10] PREGNANT
+// WOMAN..JUGGLING (0x1F93D <= code && code <= 0x1F93E) || // So [2]
+// WATER POLO..HANDBALL (0x1F9D1 <= code && code <= 0x1F9DD) // So [13]
+// ADULT..ELF ){
// return E_Base;
// }
//
// if(
-// (0x1F3FB <= code && code <= 0x1F3FF) // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
-// ){
+// (0x1F3FB <= code && code <= 0x1F3FF) // Sk [5] EMOJI MODIFIER
+// FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 ){
// return E_Modifier;
// }
//
@@ -1832,8 +2112,8 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// if(
// 0x2640 == code || // So FEMALE SIGN
// 0x2642 == code || // So MALE SIGN
-// (0x2695 <= code && code <= 0x2696) || // So [2] STAFF OF AESCULAPIUS..SCALES
-// 0x2708 == code || // So AIRPLANE
+// (0x2695 <= code && code <= 0x2696) || // So [2] STAFF OF
+// AESCULAPIUS..SCALES 0x2708 == code || // So AIRPLANE
// 0x2764 == code || // So HEAVY BLACK HEART
// 0x1F308 == code || // So RAINBOW
// 0x1F33E == code || // So EAR OF RICE
@@ -1844,8 +2124,8 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> {
// 0x1F3EB == code || // So SCHOOL
// 0x1F3ED == code || // So FACTORY
// 0x1F48B == code || // So KISS MARK
-// (0x1F4BB <= code && code <= 0x1F4BC) || // So [2] PERSONAL COMPUTER..BRIEFCASE
-// 0x1F527 == code || // So WRENCH
+// (0x1F4BB <= code && code <= 0x1F4BC) || // So [2] PERSONAL
+// COMPUTER..BRIEFCASE 0x1F527 == code || // So WRENCH
// 0x1F52C == code || // So MICROSCOPE
// 0x1F5E8 == code || // So LEFT SPEECH BUBBLE
// 0x1F680 == code || // So ROCKET
diff --git a/src/text_processing/line_break.rs b/src/text_processing/line_break.rs
index 27f27de..27243b8 100644
--- a/src/text_processing/line_break.rs
+++ b/src/text_processing/line_break.rs
@@ -1,33 +1,30 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
extern crate unicode_segmentation;
-use self::unicode_segmentation::UnicodeSegmentation;
-use crate::text_processing::tables::LINE_BREAK_RULES;
-use crate::text_processing::types::LineBreakClass;
-use core::cmp::Ordering;
-use core::iter::Peekable;
-use core::str::FromStr;
+use core::{cmp::Ordering, iter::Peekable, str::FromStr};
+
use LineBreakClass::*;
+use self::unicode_segmentation::UnicodeSegmentation;
+use crate::text_processing::{tables::LINE_BREAK_RULES, types::LineBreakClass};
+
#[derive(Debug, PartialEq)]
pub enum LineBreakCandidate {
MandatoryBreak,
@@ -41,7 +38,7 @@ pub struct LineBreakCandidateIter<'a> {
text: &'a str,
iter: Peekable>,
pos: usize,
- /* Needed for rule LB30a */
+ /// Needed for rule `LB30a`
reg_ind_streak: u32,
}
@@ -110,14 +107,32 @@ macro_rules! next_grapheme_class {
/// Returns positions where breaks can happen
/// Examples:
/// ```
-/// use text_processing::{self, LineBreakCandidate::{self, *}};
-/// use text_processing::line_break::LineBreakCandidateIter;
+/// use text_processing::{
+/// self,
+/// line_break::LineBreakCandidateIter,
+/// LineBreakCandidate::{self, *},
+/// };
///
-/// assert!(LineBreakCandidateIter::new("").collect::>().is_empty());
-/// assert_eq!(&[(7, BreakAllowed), (12, MandatoryBreak)],
-/// LineBreakCandidateIter::new("Sample Text.").collect::>().as_slice());
-/// assert_eq!(&[(3, MandatoryBreak), (7, MandatoryBreak), (10, BreakAllowed), (17, MandatoryBreak)],
-/// LineBreakCandidateIter::new("Sa\nmp\r\nle T(e)xt.").collect::>().as_slice());
+/// assert!(LineBreakCandidateIter::new("")
+/// .collect::>()
+/// .is_empty());
+/// assert_eq!(
+/// &[(7, BreakAllowed), (12, MandatoryBreak)],
+/// LineBreakCandidateIter::new("Sample Text.")
+/// .collect::>()
+/// .as_slice()
+/// );
+/// assert_eq!(
+/// &[
+/// (3, MandatoryBreak),
+/// (7, MandatoryBreak),
+/// (10, BreakAllowed),
+/// (17, MandatoryBreak)
+/// ],
+/// LineBreakCandidateIter::new("Sa\nmp\r\nle T(e)xt.")
+/// .collect::>()
+/// .as_slice()
+/// );
/// ```
impl<'a> Iterator for LineBreakCandidateIter<'a> {
type Item = (usize, LineBreakCandidate);
@@ -135,7 +150,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
let (idx, mut grapheme) = self.iter.next().unwrap();
let LineBreakCandidateIter {
ref mut iter,
- ref text,
+ text,
ref mut reg_ind_streak,
ref mut pos,
} = self;
@@ -155,22 +170,21 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
*reg_ind_streak = 0;
}
- /* LB1 Assign a line breaking class to each code point of the input. Resolve AI, CB, CJ,
- * SA, SG, and XX into other line breaking classes depending on criteria outside the scope
- * of this algorithm.
- *
- * In the absence of such criteria all characters with a specific combination of original
- * class and General_Category property value are resolved as follows:
- * Resolved Original General_Category
- * AL AI, SG, XX Any
- * CM SA Only Mn or Mc
- * AL SA Any except Mn and Mc
- * NS SJ Any
- */
+ // LB1 Assign a line breaking class to each code point of the input. Resolve
+ // AI, CB, CJ, SA, SG, and XX into other line breaking classes
+ // depending on criteria outside the scope of this algorithm.
+ //
+ // In the absence of such criteria all characters with a specific combination
+ // of original class and General_Category property value are resolved
+ // as follows: Resolved Original General_Category
+ // AL AI, SG, XX Any
+ // CM SA Only Mn or Mc
+ // AL SA Any except Mn and Mc
+ // NS SJ Any
// TODO: LB1
- /* Check if next character class allows breaks before it */
+ // Check if next character class allows breaks before it
let next_char: Option<&(usize, &str)> = iter.peek();
match class {
@@ -195,13 +209,13 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
if let Some((_, next_grapheme)) = next_char {
let next_class = get_class!(next_grapheme);
match next_class {
- /* LB6 Do not break before hard line breaks. × ( BK | CR | LF | NL ) */
+ // LB6 Do not break before hard line breaks. × ( BK | CR | LF | NL )
BK | CR | LF | NL => {
*pos += grapheme.len();
return self.next();
}
- /* LB7 Do not break before spaces or zero width
- * space. × SP × ZW */
+ // LB7 Do not break before spaces or zero width
+ // space. × SP × ZW
SP | ZW => {
*pos += grapheme.len();
return self.next();
@@ -211,8 +225,8 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
}
match class {
ZW => {
- // LB8 Break before any character following a zero-width space, even if one or more
- // spaces intervene
+ // LB8 Break before any character following a zero-width space, even if one or
+ // more spaces intervene
// ZW SP* ÷
*pos += grapheme.len();
while Some(SP) == next_grapheme_class!(iter, grapheme) {
@@ -227,26 +241,27 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
}
CM => {
- // LB9 Do not break a combining character sequence; treat it as if it has the line
- // breaking class of the base character in all of the following rules. Treat ZWJ as
- // if it were CM.
+ // LB9 Do not break a combining character sequence; treat it as if it has the
+ // line breaking class of the base character in all of the
+ // following rules. Treat ZWJ as if it were CM.
// Treat X (CM | ZWJ)* as if it were X.
// where X is any line break class except BK, CR, LF, NL, SP, or ZW.
- /* Unreachable since we break lines based on graphemes, not characters */
+ // Unreachable since we break lines based on graphemes, not characters
unreachable!();
}
WJ => {
- /*: LB11 Do not break before or after Word joiner and related characters.*/
+ // : LB11 Do not break before or after Word joiner and related characters.
*pos += grapheme.len();
- /* Get next grapheme */
+ // Get next grapheme
if next_grapheme_class!(iter, grapheme).is_some() {
*pos += grapheme.len();
}
return self.next();
}
GL => {
- /*LB12 Non-breaking characters: LB12 Do not break after NBSP and related characters.*/
+ // LB12 Non-breaking characters: LB12 Do not break after NBSP and related
+ // characters.
*pos += grapheme.len();
return self.next();
}
@@ -256,13 +271,13 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
let next_class = get_class!(next_grapheme);
match next_class {
GL if ![SP, BA, HY].contains(&class) => {
- /* LB12a Do not break before NBSP and related characters, except after spaces and
- * hyphens. [^SP BA HY] × GL
- * Also LB12 Do not break after NBSP and related characters */
+ // LB12a Do not break before NBSP and related characters, except after spaces
+ // and hyphens. [^SP BA HY] × GL
+ // Also LB12 Do not break after NBSP and related characters
*pos += grapheme.len();
return self.next();
}
- /* LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. */
+ // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.
CL | CP | EX | IS | SY => {
*pos = *next_idx;
return self.next();
@@ -272,7 +287,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
}
match class {
- /* LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. */
+ // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.
SP if [CL, CP, EX, IS, SY].contains(&get_class!(text[idx..].trim_start())) => {
*pos += grapheme.len();
while ![CL, CP, EX, IS, SY].contains(&next_grapheme_class!(iter, grapheme).unwrap())
@@ -286,7 +301,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
/* LB14 Do not break after ‘[’, even after spaces.
* OP SP* ×
*/
- while let Some((idx, grapheme)) = self.iter.next() {
+ for (idx, grapheme) in self.iter.by_ref() {
*pos = idx + grapheme.len();
if !(get_class!(grapheme) == SP) {
break;
@@ -305,7 +320,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
return self.next();
}
QU => {
- /* LB19 Do not break before or after quotation marks, such as ‘ ” ’. */
+ // LB19 Do not break before or after quotation marks, such as ‘ ” ’.
*pos += grapheme.len();
if let Some((_, g)) = self.iter.next() {
*pos += g.len();
@@ -315,8 +330,8 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
LineBreakClass::CL | LineBreakClass::CP
if get_class!(text[idx..].trim_start()) == NS =>
{
- /* LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with
- * intervening spaces.
+ /* LB16 Do not break between closing punctuation and a nonstarter (lb=NS),
+ * even with intervening spaces.
* (CL | CP) SP* × NS */
*pos += grapheme.len();
while Some(SP) == next_grapheme_class!(iter, grapheme) {
@@ -332,7 +347,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
return self.next();
}
SP => {
- /* LB18 Break after spaces. SP ÷ */
+ // LB18 Break after spaces. SP ÷
// Space 0x20 is 1 byte long.
*pos += 1;
return Some((*pos, BreakAllowed));
@@ -343,7 +358,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
let next_class = get_class!(next_grapheme);
match next_class {
QU if class != SP => {
- /* LB19 Do not break before or after quotation marks, such as ‘ ” ’. */
+ // LB19 Do not break before or after quotation marks, such as ‘ ” ’.
*pos = *next_idx + next_grapheme.len();
self.iter.next();
return self.next();
@@ -353,12 +368,12 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
}
match class {
CB => {
- /* LB20 Break before and after unresolved CB. */
+ // LB20 Break before and after unresolved CB.
*pos += grapheme.len();
return Some((*pos - 1, BreakAllowed));
}
- /* LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small
- * kana, and other non-starters, or after acute accents. × BA, × HY, × NS, BB × */
+ // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small
+ // kana, and other non-starters, or after acute accents. × BA, × HY, × NS, BB ×
BB => {
*pos += grapheme.len();
return self.next();
@@ -370,8 +385,9 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
let next_class = get_class!(next_grapheme);
match next_class {
BA | HY | NS => {
- /* LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small
- * kana, and other non-starters, or after acute accents. × BA, × HY, × NS, BB × */
+ // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces,
+ // small kana, and other non-starters, or after acute
+ // accents. × BA, × HY, × NS, BB ×
*pos += grapheme.len();
return self.next();
}
@@ -380,300 +396,300 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
}
match class {
HL if next_grapheme_class!((next_char is HY, BA)) => {
- /* LB21a Don’t break after Hebrew + Hyphen. HL (HY | BA) × */
+ // LB21a Don’t break after Hebrew + Hyphen. HL (HY | BA) ×
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB21b Don’t break between ,Solidus and Hebrew letters. SY × HL */
+ // LB21b Don’t break between ,Solidus and Hebrew letters. SY × HL
SY if next_grapheme_class!((next_char is HL)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
- /* bypass next_char */
+ // bypass next_char
self.iter.next().unwrap();
if let Some((idx, next_grapheme)) = self.iter.next() {
*pos = idx + next_grapheme.len();
}
- return self.next();
+ self.next()
}
- /* LB22 Do not break between two ellipses, or between letters, numbers or excla-
- * mations and ellipsis.
- * Examples: ‘9...’, ‘a...’, ‘H...’
- * (AL | HL) × IN */
+ // LB22 Do not break between two ellipses, or between letters, numbers or excla-
+ // mations and ellipsis.
+ // Examples: ‘9...’, ‘a...’, ‘H...’
+ // (AL | HL) × IN
AL | HL if next_grapheme_class!((next_char is IN)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* EX × IN */
+ // EX × IN
EX if next_grapheme_class!((next_char is IN)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
EX => {
// LB13
*pos += grapheme.len();
- return self.next();
+ self.next()
}
- /* (ID | EB | EM) × IN */
+ // (ID | EB | EM) × IN
ID | EB | EM if next_grapheme_class!((next_char is IN)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* IN × IN */
+ // IN × IN
IN if next_grapheme_class!((next_char is IN)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* NU × IN */
+ // NU × IN
NU if next_grapheme_class!((next_char is IN)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB23 Do not break between digits and letters.
- * (AL | HL) × NU */
+ // LB23 Do not break between digits and letters.
+ // (AL | HL) × NU
AL | HL if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* NU × (AL | HL) */
+ // NU × (AL | HL)
NU if next_grapheme_class!((next_char is AL, HL)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB23a Do not break between numeric prefixes and ideographs, or between ideographs
- * and numeric postfixes.
- * PR × (ID | EB | EM) */
+ // LB23a Do not break between numeric prefixes and ideographs, or between ideographs
+ // and numeric postfixes.
+ // PR × (ID | EB | EM)
PR if next_grapheme_class!((next_char is ID, EB, EM)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* (ID | EB | EM) × PO */
+ // (ID | EB | EM) × PO
ID | EB | EM if next_grapheme_class!((next_char is PO)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* B24 Do not break between numeric prefix/postfix and letters, or between
- letters and prefix/postfix.
- (PR | PO) × (AL | HL)*/
+ // B24 Do not break between numeric prefix/postfix and letters, or between
+ // letters and prefix/postfix.
+ // (PR | PO) × (AL | HL)
PR | PO if next_grapheme_class!((next_char is AL, HL)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /*(AL | HL) × (PR | PO) */
+ // (AL | HL) × (PR | PO)
AL | HL if next_grapheme_class!((next_char is PR, PO)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB25 Do not break between the following pairs of classes relevant to numbers:
- * CL × PO */
+ // LB25 Do not break between the following pairs of classes relevant to numbers:
+ // CL × PO
CL if next_grapheme_class!((next_char is PO)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* CP × PO */
+ // CP × PO
CP if next_grapheme_class!((next_char is PO)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* CL × PR */
+ // CL × PR
CL if next_grapheme_class!((next_char is PR)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* CP × PR */
+ // CP × PR
CP if next_grapheme_class!((next_char is PR)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* NU × PO */
+ // NU × PO
NU if next_grapheme_class!((next_char is PO)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* NU × PR */
+ // NU × PR
NU if next_grapheme_class!((next_char is PR)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* PO × OP */
+ // PO × OP
PO if next_grapheme_class!((next_char is OP)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* PO × NU */
+ // PO × NU
PO if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* PR × OP */
+ // PR × OP
PR if next_grapheme_class!((next_char is OP)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* PR × NU */
+ // PR × NU
PR if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* HY × NU */
+ // HY × NU
HY if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* IS × NU */
+ // IS × NU
IS if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* NU × NU */
+ // NU × NU
NU if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* SY × NU */
+ // SY × NU
SY if next_grapheme_class!((next_char is NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB26 Do not break a Korean syllable.
- * JL × (JL | JV | H2 | H3) */
+ // LB26 Do not break a Korean syllable.
+ // JL × (JL | JV | H2 | H3)
JL if next_grapheme_class!((next_char is JL, JV, H2, H3)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* (JV | H2) × (JV | JT) */
+ // (JV | H2) × (JV | JT)
JV | H2 if next_grapheme_class!((next_char is JV, JT)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* (JT | H3) × JT */
+ // (JT | H3) × JT
JT | H3 if next_grapheme_class!((next_char is JT)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB27 Treat a Korean Syllable Block the same as ID.
- * (JL | JV | JT | H2 | H3) × IN */
+ // LB27 Treat a Korean Syllable Block the same as ID.
+ // (JL | JV | JT | H2 | H3) × IN
JL | JV | JT | H2 | H3 if next_grapheme_class!((next_char is IN)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* (JL | JV | JT | H2 | H3) × PO */
+ // (JL | JV | JT | H2 | H3) × PO
JL | JV | JT | H2 | H3 if next_grapheme_class!((next_char is PO)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* PR × (JL | JV | JT | H2 | H3) */
+ // PR × (JL | JV | JT | H2 | H3)
PR if next_grapheme_class!((next_char is JL, JV, JT, H2, H3)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB28 Do not break between alphabetics (“at”).
- (AL | HL) × (AL | HL) */
+ // LB28 Do not break between alphabetics (“at”).
+ // (AL | HL) × (AL | HL)
AL | HL if next_grapheme_class!((next_char is AL, HL)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).
- IS × (AL | HL) */
+ // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).
+ // IS × (AL | HL)
IS if next_grapheme_class!((next_char is AL, HL)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* LB30 Do not break between letters, numbers, or ordinary symbols and opening
- or closing parentheses.
- (AL | HL | NU) × OP */
+ // LB30 Do not break between letters, numbers, or ordinary symbols and opening
+ // or closing parentheses.
+ // (AL | HL | NU) × OP
AL | HL | NU if next_grapheme_class!((next_char is OP)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /* CP × (AL | HL | NU) */
+ // CP × (AL | HL | NU)
CP if next_grapheme_class!((next_char is AL, HL , NU)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
- /*LB30b Do not break between an emoji base and an emoji modifier.
- * EB × EM */
+ // LB30b Do not break between an emoji base and an emoji modifier.
+ // EB × EM
EB if next_grapheme_class!((next_char is EM)) => {
let (idx, next_grapheme) = next_char.unwrap();
*pos = idx + next_grapheme.len();
self.iter.next();
- return self.next();
+ self.next()
}
RI => {
- /* LB30a Break between two regional indicator symbols if and only if there are an
- * even number of regional indicators preceding the position of the break.
- * sot (RI RI)* RI × RI
+ /* LB30a Break between two regional indicator symbols if and only if there
+ * are an even number of regional indicators preceding the
+ * position of the break. sot (RI RI)* RI × RI
* [^RI] (RI RI)* RI × RI */
*reg_ind_streak += 1;
*pos += grapheme.len();
@@ -681,11 +697,11 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> {
return Some((*pos - grapheme.len(), BreakAllowed));
}
self.iter.next();
- return self.next();
+ self.next()
}
_ => {
*pos += grapheme.len();
- return Some((*pos - grapheme.len(), BreakAllowed));
+ Some((*pos - grapheme.len(), BreakAllowed))
}
}
}
diff --git a/src/text_processing/tables.rs b/src/text_processing/tables.rs
index 299dcd5..0f2836e 100644
--- a/src/text_processing/tables.rs
+++ b/src/text_processing/tables.rs
@@ -1,28 +1,25 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
-use crate::text_processing::types::LineBreakClass;
-use crate::text_processing::types::LineBreakClass::*;
+use crate::text_processing::types::{LineBreakClass, LineBreakClass::*};
-pub const LINE_BREAK_RULES: &'static [(u32, u32, LineBreakClass)] = &[
+pub const LINE_BREAK_RULES: &[(u32, u32, LineBreakClass)] = &[
(0x0, 0x8, CM),
(0x9, 0x9, BA),
(0xA, 0xA, LF),
diff --git a/src/text_processing/types.rs b/src/text_processing/types.rs
index 47961ac..e4596a3 100644
--- a/src/text_processing/types.rs
+++ b/src/text_processing/types.rs
@@ -1,24 +1,23 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
+#[allow(clippy::upper_case_acronyms)]
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum LineBreakClass {
BK,
diff --git a/src/text_processing/wcwidth.rs b/src/text_processing/wcwidth.rs
index 6145710..c6819d9 100644
--- a/src/text_processing/wcwidth.rs
+++ b/src/text_processing/wcwidth.rs
@@ -1,31 +1,27 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
-/*
- * This is an implementation of wcwidth() and wcswidth() as defined in
- * "The Single UNIX Specification, Version 2, The Open Group, 1997"
- *
- *
- * Markus Kuhn -- 2001-09-08 -- public domain
- */
+// This is an implementation of wcwidth() and wcswidth() as defined in
+// "The Single UNIX Specification, Version 2, The Open Group, 1997"
+//
+//
+// Markus Kuhn -- 2001-09-08 -- public domain
// TODO: Spacing widths
// Update to Unicode 12
@@ -48,16 +44,17 @@ pub struct CodePointsIterator<'a> {
rest: &'a [u8],
}
-/*
- * UTF-8 uses a system of binary prefixes, in which the high bits of each byte mark whether it’s a single byte, the beginning of a multi-byte sequence, or a continuation byte; the remaining bits, concatenated, give the code point index. This table shows how it works:
- *
- * UTF-8 (binary) Code point (binary) Range
- * 0xxxxxxx xxxxxxx U+0000–U+007F
- * 110xxxxx 10yyyyyy xxxxxyyyyyy U+0080–U+07FF
- * 1110xxxx 10yyyyyy 10zzzzzz xxxxyyyyyyzzzzzz U+0800–U+FFFF
- * 11110xxx 10yyyyyy 10zzzzzz 10wwwwww xxxyyyyyyzzzzzzwwwwww U+10000–U+10FFFF
- *
- */
+/// UTF-8 uses a system of binary prefixes, in which the high bits of each
+/// byte mark whether it’s a single byte, the beginning of a multi-byte
+/// sequence, or a continuation byte; the remaining bits, concatenated, give
+/// the code point index. This table shows how it works:
+///
+/// | UTF-8 (binary) | Code point (binary) | Range |
+/// |---------------------------------------|-------------------------|--------------------|
+/// | `0xxxxxxx` | `xxxxxxx` | `U+0000–U+007F` |
+/// | `110xxxxx 10yyyyyy` | `xxxxxyyyyyy` | `U+0080–U+07FF` |
+/// | `1110xxxx 10yyyyyy 10zzzzzz` | `xxxxyyyyyyzzzzzz` | `U+0800–U+FFFF` |
+/// | `11110xxx 10yyyyyy 10zzzzzz 10wwwwww` | `xxxyyyyyyzzzzzzwwwwww` | `U+10000–U+10FFFF` |
impl<'a> Iterator for CodePointsIterator<'a> {
type Item = WChar;
@@ -65,7 +62,7 @@ impl<'a> Iterator for CodePointsIterator<'a> {
if self.rest.is_empty() {
return None;
}
- /* Input is UTF-8 valid strings, guaranteed by Rust's std */
+ // Input is UTF-8 valid strings, guaranteed by Rust's std
if self.rest[0] & 0b1000_0000 == 0x0 {
let ret: WChar = WChar::from(self.rest[0]);
self.rest = &self.rest[1..];
@@ -113,7 +110,7 @@ impl CodePointsIter for &str {
}
}
-/* auxiliary function for binary search in Interval table */
+// auxiliary function for binary search in Interval table
fn bisearch(ucs: WChar, table: &'static [Interval]) -> bool {
let mut min = 0;
let mut mid;
@@ -137,38 +134,35 @@ fn bisearch(ucs: WChar, table: &'static [Interval]) -> bool {
false
}
-/* The following functions define the column width of an ISO 10646
- * character as follows:
- *
- * - The null character (U+0000) has a column width of 0.
- *
- * - Other C0/C1 control characters and DEL will lead to a return
- * value of -1.
- *
- * - Non-spacing and enclosing combining characters (general
- * category code Mn or Me in the Unicode database) have a
- * column width of 0.
- *
- * - Other format characters (general category code Cf in the Unicode
- * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
- *
- * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
- * have a column width of 0.
- *
- * - Spacing characters in the East Asian Wide (W) or East Asian
- * FullWidth (F) category as defined in Unicode Technical
- * Report #11 have a column width of 2.
- *
- * - All remaining characters (including all printable
- * ISO 8859-1 and WGL4 characters, Unicode control characters,
- * etc.) have a column width of 1.
- *
- * This implementation assumes that wchar_t characters are encoded
- * in ISO 10646.
- */
+// The following functions define the column width of an ISO 10646
+// character as follows:
+//
+// - The null character (U+0000) has a column width of 0.
+//
+// - Other C0/C1 control characters and DEL will lead to a return value of
+// -1.
+//
+// - Non-spacing and enclosing combining characters (general category code Mn
+// or Me in the Unicode database) have a column width of 0.
+//
+// - Other format characters (general category code Cf in the Unicode
+// database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
+//
+// - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) have a
+// column width of 0.
+//
+// - Spacing characters in the East Asian Wide (W) or East Asian FullWidth
+// (F) category as defined in Unicode Technical Report #11 have a column
+// width of 2.
+//
+// - All remaining characters (including all printable ISO 8859-1 and WGL4
+// characters, Unicode control characters, etc.) have a column width of 1.
+//
+// This implementation assumes that wchar_t characters are encoded
+// in ISO 10646.
pub fn wcwidth(ucs: WChar) -> Option {
- /* sorted list of non-overlapping intervals of non-spacing characters */
+ // sorted list of non-overlapping intervals of non-spacing characters
let combining: &'static [Interval] = &[
(0x0300, 0x034E),
(0x0360, 0x0362),
@@ -272,37 +266,37 @@ pub fn wcwidth(ucs: WChar) -> Option {
(0xFFF9, 0xFFFB),
];
- /* test for 8-bit control characters */
+ // test for 8-bit control characters
if ucs == 0 {
return Some(0);
}
- if ucs < 32 || (ucs >= 0x7f && ucs < 0xa0) {
+ if ucs < 32 || (0x7f..0xa0).contains(&ucs) {
return None;
}
- /* binary search in table of emojis */
+ // binary search in table of emojis
if bisearch(ucs, EMOJI_RANGES) {
return Some(2);
}
- /* binary search in table of non-spacing characters */
+ // binary search in table of non-spacing characters
if bisearch(ucs, combining) {
return Some(1);
}
- /* if we arrive here, ucs is not a combining or C0/C1 control character */
+ // if we arrive here, ucs is not a combining or C0/C1 control character
Some(
1 + big_if_true!(
ucs >= 0x1100
&& (ucs <= 0x115f || /* Hangul Jamo init. consonants */
- (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & !0x0011) != 0x300a &&
+ ((0x2e80..=0xa4cf).contains(&ucs) && (ucs & !0x0011) != 0x300a &&
ucs != 0x303f) || /* CJK ... Yi */
- (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
- (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
- (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
- (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */
- (ucs >= 0xffe0 && ucs <= 0xffe6) ||
- (ucs >= 0x20000 && ucs <= 0x2ffff))
+ (0xac00..=0xd7a3).contains(&ucs) || /* Hangul Syllables */
+ (0xf900..=0xfaff).contains(&ucs) || /* CJK Compatibility Ideographs */
+ (0xfe30..=0xfe6f).contains(&ucs) || /* CJK Compatibility Forms */
+ (0xff00..=0xff5f).contains(&ucs) || /* Fullwidth Forms */
+ (0xffe0..=0xffe6).contains(&ucs) ||
+ (0x20000..=0x2ffff).contains(&ucs))
),
)
}
@@ -324,359 +318,536 @@ pub fn wcswidth(mut pwcs: WChar, mut n: usize) -> Option {
Some(width)
}
-const EMOJI_RANGES: &'static [Interval] = &[
- (0x231A, 0x231B), // ; Basic_Emoji ; watch # 1.1 [2] (⌚..⌛)
- (0x23E9, 0x23EC), // ; Basic_Emoji ; fast-forward button # 6.0 [4] (⏩..⏬)
- (0x23F0, 0x23F0), // ; Basic_Emoji ; alarm clock # 6.0 [1] (⏰)
- (0x23F3, 0x23F3), // ; Basic_Emoji ; hourglass not done # 6.0 [1] (⏳)
- (0x25FD, 0x25FE), // ; Basic_Emoji ; white medium-small square # 3.2 [2] (◽..◾)
- (0x2614, 0x2615), // ; Basic_Emoji ; umbrella with rain drops # 4.0 [2] (☔..☕)
- (0x2648, 0x2653), // ; Basic_Emoji ; Aries # 1.1 [12] (♈..♓)
- (0x267F, 0x267F), // ; Basic_Emoji ; wheelchair symbol # 4.1 [1] (♿)
- (0x2693, 0x2693), // ; Basic_Emoji ; anchor # 4.1 [1] (⚓)
- (0x26A1, 0x26A1), // ; Basic_Emoji ; high voltage # 4.0 [1] (⚡)
- (0x26AA, 0x26AB), // ; Basic_Emoji ; white circle # 4.1 [2] (⚪..⚫)
- (0x26BD, 0x26BE), // ; Basic_Emoji ; soccer ball # 5.2 [2] (⚽..⚾)
- (0x26C4, 0x26C5), // ; Basic_Emoji ; snowman without snow # 5.2 [2] (⛄..⛅)
- (0x26CE, 0x26CE), // ; Basic_Emoji ; Ophiuchus # 6.0 [1] (⛎)
- (0x26D4, 0x26D4), // ; Basic_Emoji ; no entry # 5.2 [1] (⛔)
- (0x26EA, 0x26EA), // ; Basic_Emoji ; church # 5.2 [1] (⛪)
- (0x26F2, 0x26F3), // ; Basic_Emoji ; fountain # 5.2 [2] (⛲..⛳)
- (0x26F5, 0x26F5), // ; Basic_Emoji ; sailboat # 5.2 [1] (⛵)
- (0x26FA, 0x26FA), // ; Basic_Emoji ; tent # 5.2 [1] (⛺)
- (0x26FD, 0x26FD), // ; Basic_Emoji ; fuel pump # 5.2 [1] (⛽)
- (0x2705, 0x2705), // ; Basic_Emoji ; check mark button # 6.0 [1] (✅)
- (0x270A, 0x270B), // ; Basic_Emoji ; raised fist # 6.0 [2] (✊..✋)
- (0x2728, 0x2728), // ; Basic_Emoji ; sparkles # 6.0 [1] (✨)
- (0x274C, 0x274C), // ; Basic_Emoji ; cross mark # 6.0 [1] (❌)
- (0x274E, 0x274E), // ; Basic_Emoji ; cross mark button # 6.0 [1] (❎)
- (0x2753, 0x2755), // ; Basic_Emoji ; question mark # 6.0 [3] (❓..❕)
- (0x2757, 0x2757), // ; Basic_Emoji ; exclamation mark # 5.2 [1] (❗)
- (0x2795, 0x2797), // ; Basic_Emoji ; plus sign # 6.0 [3] (➕..➗)
- (0x27B0, 0x27B0), // ; Basic_Emoji ; curly loop # 6.0 [1] (➰)
- (0x27BF, 0x27BF), // ; Basic_Emoji ; double curly loop # 6.0 [1] (➿)
- (0x2B1B, 0x2B1C), // ; Basic_Emoji ; black large square # 5.1 [2] (⬛..⬜)
- (0x2B50, 0x2B50), // ; Basic_Emoji ; star # 5.1 [1] (⭐)
- (0x2B55, 0x2B55), // ; Basic_Emoji ; hollow red circle # 5.2 [1] (⭕)
- (0x1F004, 0x1F004), // ; Basic_Emoji ; mahjong red dragon # 5.1 [1] (🀄)
- (0x1F0CF, 0x1F0CF), // ; Basic_Emoji ; joker # 6.0 [1] (🃏)
- (0x1F18E, 0x1F18E), // ; Basic_Emoji ; AB button (blood type) # 6.0 [1] (🆎)
- (0x1F191, 0x1F19A), // ; Basic_Emoji ; CL button # 6.0 [10] (🆑..🆚)
- (0x1F201, 0x1F201), // ; Basic_Emoji ; Japanese “here” button # 6.0 [1] (🈁)
- (0x1F21A, 0x1F21A), // ; Basic_Emoji ; Japanese “free of charge” button # 5.2 [1] (🈚)
- (0x1F22F, 0x1F22F), // ; Basic_Emoji ; Japanese “reserved” button # 5.2 [1] (🈯)
- (0x1F232, 0x1F236), // ; Basic_Emoji ; Japanese “prohibited” button # 6.0 [5] (🈲..🈶)
- (0x1F238, 0x1F23A), // ; Basic_Emoji ; Japanese “application” button # 6.0 [3] (🈸..🈺)
- (0x1F250, 0x1F251), // ; Basic_Emoji ; Japanese “bargain” button # 6.0 [2] (🉐..🉑)
- (0x1F300, 0x1F320), // ; Basic_Emoji ; cyclone # 6.0 [33] (🌀..🌠)
- (0x1F32D, 0x1F32F), // ; Basic_Emoji ; hot dog # 8.0 [3] (🌭..🌯)
- (0x1F330, 0x1F335), // ; Basic_Emoji ; chestnut # 6.0 [6] (🌰..🌵)
- (0x1F337, 0x1F37C), // ; Basic_Emoji ; tulip # 6.0 [70] (🌷..🍼)
- (0x1F37E, 0x1F37F), // ; Basic_Emoji ; bottle with popping cork # 8.0 [2] (🍾..🍿)
- (0x1F380, 0x1F393), // ; Basic_Emoji ; ribbon # 6.0 [20] (🎀..🎓)
- (0x1F3A0, 0x1F3C4), // ; Basic_Emoji ; carousel horse # 6.0 [37] (🎠..🏄)
- (0x1F3C5, 0x1F3C5), // ; Basic_Emoji ; sports medal # 7.0 [1] (🏅)
- (0x1F3C6, 0x1F3CA), // ; Basic_Emoji ; trophy # 6.0 [5] (🏆..🏊)
- (0x1F3CF, 0x1F3D3), // ; Basic_Emoji ; cricket game # 8.0 [5] (🏏..🏓)
- (0x1F3E0, 0x1F3F0), // ; Basic_Emoji ; house # 6.0 [17] (🏠..🏰)
- (0x1F3F4, 0x1F3F4), // ; Basic_Emoji ; black flag # 7.0 [1] (🏴)
- (0x1F3F8, 0x1F3FF), // ; Basic_Emoji ; badminton # 8.0 [8] (🏸..🏿)
- (0x1F400, 0x1F43E), // ; Basic_Emoji ; rat # 6.0 [63] (🐀..🐾)
- (0x1F440, 0x1F440), // ; Basic_Emoji ; eyes # 6.0 [1] (👀)
- (0x1F442, 0x1F4F7), // ; Basic_Emoji ; ear # 6.0[182] (👂..📷)
- (0x1F4F8, 0x1F4F8), // ; Basic_Emoji ; camera with flash # 7.0 [1] (📸)
- (0x1F4F9, 0x1F4FC), // ; Basic_Emoji ; video camera # 6.0 [4] (📹..📼)
- (0x1F4FF, 0x1F4FF), // ; Basic_Emoji ; prayer beads # 8.0 [1] (📿)
- (0x1F500, 0x1F53D), // ; Basic_Emoji ; shuffle tracks button # 6.0 [62] (🔀..🔽)
- (0x1F54B, 0x1F54E), // ; Basic_Emoji ; kaaba # 8.0 [4] (🕋..🕎)
- (0x1F550, 0x1F567), // ; Basic_Emoji ; one o’clock # 6.0 [24] (🕐..🕧)
- (0x1F57A, 0x1F57A), // ; Basic_Emoji ; man dancing # 9.0 [1] (🕺)
- (0x1F595, 0x1F596), // ; Basic_Emoji ; middle finger # 7.0 [2] (🖕..🖖)
- (0x1F5A4, 0x1F5A4), // ; Basic_Emoji ; black heart # 9.0 [1] (🖤)
- (0x1F5FB, 0x1F5FF), // ; Basic_Emoji ; mount fuji # 6.0 [5] (🗻..🗿)
- (0x1F600, 0x1F600), // ; Basic_Emoji ; grinning face # 6.1 [1] (😀)
- (0x1F601, 0x1F610), // ; Basic_Emoji ; beaming face with smiling eyes # 6.0 [16] (😁..😐)
- (0x1F611, 0x1F611), // ; Basic_Emoji ; expressionless face # 6.1 [1] (😑)
- (0x1F612, 0x1F614), // ; Basic_Emoji ; unamused face # 6.0 [3] (😒..😔)
- (0x1F615, 0x1F615), // ; Basic_Emoji ; confused face # 6.1 [1] (😕)
- (0x1F616, 0x1F616), // ; Basic_Emoji ; confounded face # 6.0 [1] (😖)
- (0x1F617, 0x1F617), // ; Basic_Emoji ; kissing face # 6.1 [1] (😗)
- (0x1F618, 0x1F618), // ; Basic_Emoji ; face blowing a kiss # 6.0 [1] (😘)
- (0x1F619, 0x1F619), // ; Basic_Emoji ; kissing face with smiling eyes # 6.1 [1] (😙)
- (0x1F61A, 0x1F61A), // ; Basic_Emoji ; kissing face with closed eyes # 6.0 [1] (😚)
- (0x1F61B, 0x1F61B), // ; Basic_Emoji ; face with tongue # 6.1 [1] (😛)
- (0x1F61C, 0x1F61E), // ; Basic_Emoji ; winking face with tongue # 6.0 [3] (😜..😞)
- (0x1F61F, 0x1F61F), // ; Basic_Emoji ; worried face # 6.1 [1] (😟)
- (0x1F620, 0x1F625), // ; Basic_Emoji ; angry face # 6.0 [6] (😠..😥)
- (0x1F626, 0x1F627), // ; Basic_Emoji ; frowning face with open mouth # 6.1 [2] (😦..😧)
- (0x1F628, 0x1F62B), // ; Basic_Emoji ; fearful face # 6.0 [4] (😨..😫)
- (0x1F62C, 0x1F62C), // ; Basic_Emoji ; grimacing face # 6.1 [1] (😬)
- (0x1F62D, 0x1F62D), // ; Basic_Emoji ; loudly crying face # 6.0 [1] (😭)
- (0x1F62E, 0x1F62F), // ; Basic_Emoji ; face with open mouth # 6.1 [2] (😮..😯)
- (0x1F630, 0x1F633), // ; Basic_Emoji ; anxious face with sweat # 6.0 [4] (😰..😳)
- (0x1F634, 0x1F634), // ; Basic_Emoji ; sleeping face # 6.1 [1] (😴)
- (0x1F635, 0x1F640), // ; Basic_Emoji ; dizzy face # 6.0 [12] (😵..🙀)
- (0x1F641, 0x1F642), // ; Basic_Emoji ; slightly frowning face # 7.0 [2] (🙁..🙂)
- (0x1F643, 0x1F644), // ; Basic_Emoji ; upside-down face # 8.0 [2] (🙃..🙄)
- (0x1F645, 0x1F64F), // ; Basic_Emoji ; person gesturing NO # 6.0 [11] (🙅..🙏)
- (0x1F680, 0x1F6C5), // ; Basic_Emoji ; rocket # 6.0 [70] (🚀..🛅)
- (0x1F6CC, 0x1F6CC), // ; Basic_Emoji ; person in bed # 7.0 [1] (🛌)
- (0x1F6D0, 0x1F6D0), // ; Basic_Emoji ; place of worship # 8.0 [1] (🛐)
- (0x1F6D1, 0x1F6D2), // ; Basic_Emoji ; stop sign # 9.0 [2] (🛑..🛒)
- (0x1F6D5, 0x1F6D5), // ; Basic_Emoji ; hindu temple # 12.0 [1] (🛕)
- (0x1F6EB, 0x1F6EC), // ; Basic_Emoji ; airplane departure # 7.0 [2] (🛫..🛬)
- (0x1F6F4, 0x1F6F6), // ; Basic_Emoji ; kick scooter # 9.0 [3] (🛴..🛶)
- (0x1F6F7, 0x1F6F8), // ; Basic_Emoji ; sled # 10.0 [2] (🛷..🛸)
- (0x1F6F9, 0x1F6F9), // ; Basic_Emoji ; skateboard # 11.0 [1] (🛹)
- (0x1F6FA, 0x1F6FA), // ; Basic_Emoji ; auto rickshaw # 12.0 [1] (🛺)
- (0x1F7E0, 0x1F7EB), // ; Basic_Emoji ; orange circle # 12.0 [12] (🟠..🟫)
- (0x1F90D, 0x1F90F), // ; Basic_Emoji ; white heart # 12.0 [3] (🤍..🤏)
- (0x1F910, 0x1F918), // ; Basic_Emoji ; zipper-mouth face # 8.0 [9] (🤐..🤘)
- (0x1F919, 0x1F91E), // ; Basic_Emoji ; call me hand # 9.0 [6] (🤙..🤞)
- (0x1F91F, 0x1F91F), // ; Basic_Emoji ; love-you gesture # 10.0 [1] (🤟)
- (0x1F920, 0x1F927), // ; Basic_Emoji ; cowboy hat face # 9.0 [8] (🤠..🤧)
- (0x1F928, 0x1F92F), // ; Basic_Emoji ; face with raised eyebrow # 10.0 [8] (🤨..🤯)
- (0x1F930, 0x1F930), // ; Basic_Emoji ; pregnant woman # 9.0 [1] (🤰)
- (0x1F931, 0x1F932), // ; Basic_Emoji ; breast-feeding # 10.0 [2] (🤱..🤲)
- (0x1F933, 0x1F93A), // ; Basic_Emoji ; selfie # 9.0 [8] (🤳..🤺)
- (0x1F93C, 0x1F93E), // ; Basic_Emoji ; people wrestling # 9.0 [3] (🤼..🤾)
- (0x1F93F, 0x1F93F), // ; Basic_Emoji ; diving mask # 12.0 [1] (🤿)
- (0x1F940, 0x1F945), // ; Basic_Emoji ; wilted flower # 9.0 [6] (🥀..🥅)
- (0x1F947, 0x1F94B), // ; Basic_Emoji ; 1st place medal # 9.0 [5] (🥇..🥋)
- (0x1F94C, 0x1F94C), // ; Basic_Emoji ; curling stone # 10.0 [1] (🥌)
- (0x1F94D, 0x1F94F), // ; Basic_Emoji ; lacrosse # 11.0 [3] (🥍..🥏)
- (0x1F950, 0x1F95E), // ; Basic_Emoji ; croissant # 9.0 [15] (🥐..🥞)
- (0x1F95F, 0x1F96B), // ; Basic_Emoji ; dumpling # 10.0 [13] (🥟..🥫)
- (0x1F96C, 0x1F970), // ; Basic_Emoji ; leafy green # 11.0 [5] (🥬..🥰)
- (0x1F971, 0x1F971), // ; Basic_Emoji ; yawning face # 12.0 [1] (🥱)
- (0x1F973, 0x1F976), // ; Basic_Emoji ; partying face # 11.0 [4] (🥳..🥶)
- (0x1F97A, 0x1F97A), // ; Basic_Emoji ; pleading face # 11.0 [1] (🥺)
- (0x1F97B, 0x1F97B), // ; Basic_Emoji ; sari # 12.0 [1] (🥻)
- (0x1F97C, 0x1F97F), // ; Basic_Emoji ; lab coat # 11.0 [4] (🥼..🥿)
- (0x1F980, 0x1F984), // ; Basic_Emoji ; crab # 8.0 [5] (🦀..🦄)
- (0x1F985, 0x1F991), // ; Basic_Emoji ; eagle # 9.0 [13] (🦅..🦑)
- (0x1F992, 0x1F997), // ; Basic_Emoji ; giraffe # 10.0 [6] (🦒..🦗)
- (0x1F998, 0x1F9A2), // ; Basic_Emoji ; kangaroo # 11.0 [11] (🦘..🦢)
- (0x1F9A5, 0x1F9AA), // ; Basic_Emoji ; sloth # 12.0 [6] (🦥..🦪)
- (0x1F9AE, 0x1F9AF), // ; Basic_Emoji ; guide dog # 12.0 [2] (🦮..🦯)
- (0x1F9B0, 0x1F9B9), // ; Basic_Emoji ; red hair # 11.0 [10] (🦰..🦹)
- (0x1F9BA, 0x1F9BF), // ; Basic_Emoji ; safety vest # 12.0 [6] (🦺..🦿)
- (0x1F9C0, 0x1F9C0), // ; Basic_Emoji ; cheese wedge # 8.0 [1] (🧀)
- (0x1F9C1, 0x1F9C2), // ; Basic_Emoji ; cupcake # 11.0 [2] (🧁..🧂)
- (0x1F9C3, 0x1F9CA), // ; Basic_Emoji ; beverage box # 12.0 [8] (🧃..🧊)
- (0x1F9CD, 0x1F9CF), // ; Basic_Emoji ; person standing # 12.0 [3] (🧍..🧏)
- (0x1F9D0, 0x1F9E6), // ; Basic_Emoji ; face with monocle # 10.0 [23] (🧐..🧦)
- (0x1F9E7, 0x1F9FF), // ; Basic_Emoji ; red envelope # 11.0 [25] (🧧..🧿)
- (0x1FA70, 0x1FA73), // ; Basic_Emoji ; ballet shoes # 12.0 [4] (🩰..🩳)
- (0x1FA78, 0x1FA7A), // ; Basic_Emoji ; drop of blood # 12.0 [3] (🩸..🩺)
- (0x1FA80, 0x1FA82), // ; Basic_Emoji ; yo-yo # 12.0 [3] (🪀..🪂)
- (0x1FA90, 0x1FA95), // ; Basic_Emoji ; ringed planet # 12.0 [6] (🪐..🪕)
+const EMOJI_RANGES: &[Interval] = &[
+ (0x231A, 0x231B), /* ; Basic_Emoji ; watch
+ * # 1.1 [2] (⌚..⌛) */
+ (0x23E9, 0x23EC), /* ; Basic_Emoji ; fast-forward button
+ * # 6.0 [4] (⏩..⏬) */
+ (0x23F0, 0x23F0), /* ; Basic_Emoji ; alarm clock
+ * # 6.0 [1] (⏰) */
+ (0x23F3, 0x23F3), /* ; Basic_Emoji ; hourglass not done
+ * # 6.0 [1] (⏳) */
+ (0x25FD, 0x25FE), /* ; Basic_Emoji ; white medium-small square
+ * # 3.2 [2] (◽..◾) */
+ (0x2614, 0x2615), /* ; Basic_Emoji ; umbrella with rain drops
+ * # 4.0 [2] (☔..☕) */
+ (0x2648, 0x2653), /* ; Basic_Emoji ; Aries
+ * # 1.1 [12] (♈..♓) */
+ (0x267F, 0x267F), /* ; Basic_Emoji ; wheelchair symbol
+ * # 4.1 [1] (♿) */
+ (0x2693, 0x2693), /* ; Basic_Emoji ; anchor
+ * # 4.1 [1] (⚓) */
+ (0x26A1, 0x26A1), /* ; Basic_Emoji ; high voltage
+ * # 4.0 [1] (⚡) */
+ (0x26AA, 0x26AB), /* ; Basic_Emoji ; white circle
+ * # 4.1 [2] (⚪..⚫) */
+ (0x26BD, 0x26BE), /* ; Basic_Emoji ; soccer ball
+ * # 5.2 [2] (⚽..⚾) */
+ (0x26C4, 0x26C5), /* ; Basic_Emoji ; snowman without snow
+ * # 5.2 [2] (⛄..⛅) */
+ (0x26CE, 0x26CE), /* ; Basic_Emoji ; Ophiuchus
+ * # 6.0 [1] (⛎) */
+ (0x26D4, 0x26D4), /* ; Basic_Emoji ; no entry
+ * # 5.2 [1] (⛔) */
+ (0x26EA, 0x26EA), /* ; Basic_Emoji ; church
+ * # 5.2 [1] (⛪) */
+ (0x26F2, 0x26F3), /* ; Basic_Emoji ; fountain
+ * # 5.2 [2] (⛲..⛳) */
+ (0x26F5, 0x26F5), /* ; Basic_Emoji ; sailboat
+ * # 5.2 [1] (⛵) */
+ (0x26FA, 0x26FA), /* ; Basic_Emoji ; tent
+ * # 5.2 [1] (⛺) */
+ (0x26FD, 0x26FD), /* ; Basic_Emoji ; fuel pump
+ * # 5.2 [1] (⛽) */
+ (0x2705, 0x2705), /* ; Basic_Emoji ; check mark button
+ * # 6.0 [1] (✅) */
+ (0x270A, 0x270B), /* ; Basic_Emoji ; raised fist
+ * # 6.0 [2] (✊..✋) */
+ (0x2728, 0x2728), /* ; Basic_Emoji ; sparkles
+ * # 6.0 [1] (✨) */
+ (0x274C, 0x274C), /* ; Basic_Emoji ; cross mark
+ * # 6.0 [1] (❌) */
+ (0x274E, 0x274E), /* ; Basic_Emoji ; cross mark button
+ * # 6.0 [1] (❎) */
+ (0x2753, 0x2755), /* ; Basic_Emoji ; question mark
+ * # 6.0 [3] (❓..❕) */
+ (0x2757, 0x2757), /* ; Basic_Emoji ; exclamation mark
+ * # 5.2 [1] (❗) */
+ (0x2795, 0x2797), /* ; Basic_Emoji ; plus sign
+ * # 6.0 [3] (➕..➗) */
+ (0x27B0, 0x27B0), /* ; Basic_Emoji ; curly loop
+ * # 6.0 [1] (➰) */
+ (0x27BF, 0x27BF), /* ; Basic_Emoji ; double curly loop
+ * # 6.0 [1] (➿) */
+ (0x2B1B, 0x2B1C), /* ; Basic_Emoji ; black large square
+ * # 5.1 [2] (⬛..⬜) */
+ (0x2B50, 0x2B50), /* ; Basic_Emoji ; star
+ * # 5.1 [1] (⭐) */
+ (0x2B55, 0x2B55), /* ; Basic_Emoji ; hollow red circle
+ * # 5.2 [1] (⭕) */
+ (0x1F004, 0x1F004), /* ; Basic_Emoji ; mahjong red dragon
+ * # 5.1 [1] (🀄) */
+ (0x1F0CF, 0x1F0CF), /* ; Basic_Emoji ; joker
+ * # 6.0 [1] (🃏) */
+ (0x1F18E, 0x1F18E), /* ; Basic_Emoji ; AB button (blood type)
+ * # 6.0 [1] (🆎) */
+ (0x1F191, 0x1F19A), /* ; Basic_Emoji ; CL button
+ * # 6.0 [10] (🆑..🆚) */
+ (0x1F201, 0x1F201), /* ; Basic_Emoji ; Japanese “here” button
+ * # 6.0 [1] (🈁) */
+ (0x1F21A, 0x1F21A), /* ; Basic_Emoji ; Japanese “free of charge” button
+ * # 5.2 [1] (🈚) */
+ (0x1F22F, 0x1F22F), /* ; Basic_Emoji ; Japanese “reserved” button
+ * # 5.2 [1] (🈯) */
+ (0x1F232, 0x1F236), /* ; Basic_Emoji ; Japanese “prohibited” button
+ * # 6.0 [5] (🈲..🈶) */
+ (0x1F238, 0x1F23A), /* ; Basic_Emoji ; Japanese “application” button
+ * # 6.0 [3] (🈸..🈺) */
+ (0x1F250, 0x1F251), /* ; Basic_Emoji ; Japanese “bargain” button
+ * # 6.0 [2] (🉐..🉑) */
+ (0x1F300, 0x1F320), /* ; Basic_Emoji ; cyclone
+ * # 6.0 [33] (🌀..🌠) */
+ (0x1F32D, 0x1F32F), /* ; Basic_Emoji ; hot dog
+ * # 8.0 [3] (🌭..🌯) */
+ (0x1F330, 0x1F335), /* ; Basic_Emoji ; chestnut
+ * # 6.0 [6] (🌰..🌵) */
+ (0x1F337, 0x1F37C), /* ; Basic_Emoji ; tulip
+ * # 6.0 [70] (🌷..🍼) */
+ (0x1F37E, 0x1F37F), /* ; Basic_Emoji ; bottle with popping cork
+ * # 8.0 [2] (🍾..🍿) */
+ (0x1F380, 0x1F393), /* ; Basic_Emoji ; ribbon
+ * # 6.0 [20] (🎀..🎓) */
+ (0x1F3A0, 0x1F3C4), /* ; Basic_Emoji ; carousel horse
+ * # 6.0 [37] (🎠..🏄) */
+ (0x1F3C5, 0x1F3C5), /* ; Basic_Emoji ; sports medal
+ * # 7.0 [1] (🏅) */
+ (0x1F3C6, 0x1F3CA), /* ; Basic_Emoji ; trophy
+ * # 6.0 [5] (🏆..🏊) */
+ (0x1F3CF, 0x1F3D3), /* ; Basic_Emoji ; cricket game
+ * # 8.0 [5] (🏏..🏓) */
+ (0x1F3E0, 0x1F3F0), /* ; Basic_Emoji ; house
+ * # 6.0 [17] (🏠..🏰) */
+ (0x1F3F4, 0x1F3F4), /* ; Basic_Emoji ; black flag
+ * # 7.0 [1] (🏴) */
+ (0x1F3F8, 0x1F3FF), /* ; Basic_Emoji ; badminton
+ * # 8.0 [8] (🏸..🏿) */
+ (0x1F400, 0x1F43E), /* ; Basic_Emoji ; rat
+ * # 6.0 [63] (🐀..🐾) */
+ (0x1F440, 0x1F440), /* ; Basic_Emoji ; eyes
+ * # 6.0 [1] (👀) */
+ (0x1F442, 0x1F4F7), /* ; Basic_Emoji ; ear
+ * # 6.0[182] (👂..📷) */
+ (0x1F4F8, 0x1F4F8), /* ; Basic_Emoji ; camera with flash
+ * # 7.0 [1] (📸) */
+ (0x1F4F9, 0x1F4FC), /* ; Basic_Emoji ; video camera
+ * # 6.0 [4] (📹..📼) */
+ (0x1F4FF, 0x1F4FF), /* ; Basic_Emoji ; prayer beads
+ * # 8.0 [1] (📿) */
+ (0x1F500, 0x1F53D), /* ; Basic_Emoji ; shuffle tracks button
+ * # 6.0 [62] (🔀..🔽) */
+ (0x1F54B, 0x1F54E), /* ; Basic_Emoji ; kaaba
+ * # 8.0 [4] (🕋..🕎) */
+ (0x1F550, 0x1F567), /* ; Basic_Emoji ; one o’clock
+ * # 6.0 [24] (🕐..🕧) */
+ (0x1F57A, 0x1F57A), /* ; Basic_Emoji ; man dancing
+ * # 9.0 [1] (🕺) */
+ (0x1F595, 0x1F596), /* ; Basic_Emoji ; middle finger
+ * # 7.0 [2] (🖕..🖖) */
+ (0x1F5A4, 0x1F5A4), /* ; Basic_Emoji ; black heart
+ * # 9.0 [1] (🖤) */
+ (0x1F5FB, 0x1F5FF), /* ; Basic_Emoji ; mount fuji
+ * # 6.0 [5] (🗻..🗿) */
+ (0x1F600, 0x1F600), /* ; Basic_Emoji ; grinning face
+ * # 6.1 [1] (😀) */
+ (0x1F601, 0x1F610), /* ; Basic_Emoji ; beaming face with smiling eyes
+ * # 6.0 [16] (😁..😐) */
+ (0x1F611, 0x1F611), /* ; Basic_Emoji ; expressionless face
+ * # 6.1 [1] (😑) */
+ (0x1F612, 0x1F614), /* ; Basic_Emoji ; unamused face
+ * # 6.0 [3] (😒..😔) */
+ (0x1F615, 0x1F615), /* ; Basic_Emoji ; confused face
+ * # 6.1 [1] (😕) */
+ (0x1F616, 0x1F616), /* ; Basic_Emoji ; confounded face
+ * # 6.0 [1] (😖) */
+ (0x1F617, 0x1F617), /* ; Basic_Emoji ; kissing face
+ * # 6.1 [1] (😗) */
+ (0x1F618, 0x1F618), /* ; Basic_Emoji ; face blowing a kiss
+ * # 6.0 [1] (😘) */
+ (0x1F619, 0x1F619), /* ; Basic_Emoji ; kissing face with smiling eyes
+ * # 6.1 [1] (😙) */
+ (0x1F61A, 0x1F61A), /* ; Basic_Emoji ; kissing face with closed eyes
+ * # 6.0 [1] (😚) */
+ (0x1F61B, 0x1F61B), /* ; Basic_Emoji ; face with tongue
+ * # 6.1 [1] (😛) */
+ (0x1F61C, 0x1F61E), /* ; Basic_Emoji ; winking face with tongue
+ * # 6.0 [3] (😜..😞) */
+ (0x1F61F, 0x1F61F), /* ; Basic_Emoji ; worried face
+ * # 6.1 [1] (😟) */
+ (0x1F620, 0x1F625), /* ; Basic_Emoji ; angry face
+ * # 6.0 [6] (😠..😥) */
+ (0x1F626, 0x1F627), /* ; Basic_Emoji ; frowning face with open mouth
+ * # 6.1 [2] (😦..😧) */
+ (0x1F628, 0x1F62B), /* ; Basic_Emoji ; fearful face
+ * # 6.0 [4] (😨..😫) */
+ (0x1F62C, 0x1F62C), /* ; Basic_Emoji ; grimacing face
+ * # 6.1 [1] (😬) */
+ (0x1F62D, 0x1F62D), /* ; Basic_Emoji ; loudly crying face
+ * # 6.0 [1] (😭) */
+ (0x1F62E, 0x1F62F), /* ; Basic_Emoji ; face with open mouth
+ * # 6.1 [2] (😮..😯) */
+ (0x1F630, 0x1F633), /* ; Basic_Emoji ; anxious face with sweat
+ * # 6.0 [4] (😰..😳) */
+ (0x1F634, 0x1F634), /* ; Basic_Emoji ; sleeping face
+ * # 6.1 [1] (😴) */
+ (0x1F635, 0x1F640), /* ; Basic_Emoji ; dizzy face
+ * # 6.0 [12] (😵..🙀) */
+ (0x1F641, 0x1F642), /* ; Basic_Emoji ; slightly frowning face
+ * # 7.0 [2] (🙁..🙂) */
+ (0x1F643, 0x1F644), /* ; Basic_Emoji ; upside-down face
+ * # 8.0 [2] (🙃..🙄) */
+ (0x1F645, 0x1F64F), /* ; Basic_Emoji ; person gesturing NO
+ * # 6.0 [11] (🙅..🙏) */
+ (0x1F680, 0x1F6C5), /* ; Basic_Emoji ; rocket
+ * # 6.0 [70] (🚀..🛅) */
+ (0x1F6CC, 0x1F6CC), /* ; Basic_Emoji ; person in bed
+ * # 7.0 [1] (🛌) */
+ (0x1F6D0, 0x1F6D0), /* ; Basic_Emoji ; place of worship
+ * # 8.0 [1] (🛐) */
+ (0x1F6D1, 0x1F6D2), /* ; Basic_Emoji ; stop sign
+ * # 9.0 [2] (🛑..🛒) */
+ (0x1F6D5, 0x1F6D5), /* ; Basic_Emoji ; hindu temple
+ * # 12.0 [1] (🛕) */
+ (0x1F6EB, 0x1F6EC), /* ; Basic_Emoji ; airplane departure
+ * # 7.0 [2] (🛫..🛬) */
+ (0x1F6F4, 0x1F6F6), /* ; Basic_Emoji ; kick scooter
+ * # 9.0 [3] (🛴..🛶) */
+ (0x1F6F7, 0x1F6F8), /* ; Basic_Emoji ; sled
+ * # 10.0 [2] (🛷..🛸) */
+ (0x1F6F9, 0x1F6F9), /* ; Basic_Emoji ; skateboard
+ * # 11.0 [1] (🛹) */
+ (0x1F6FA, 0x1F6FA), /* ; Basic_Emoji ; auto rickshaw
+ * # 12.0 [1] (🛺) */
+ (0x1F7E0, 0x1F7EB), /* ; Basic_Emoji ; orange circle
+ * # 12.0 [12] (🟠..🟫) */
+ (0x1F90D, 0x1F90F), /* ; Basic_Emoji ; white heart
+ * # 12.0 [3] (🤍..🤏) */
+ (0x1F910, 0x1F918), /* ; Basic_Emoji ; zipper-mouth face
+ * # 8.0 [9] (🤐..🤘) */
+ (0x1F919, 0x1F91E), /* ; Basic_Emoji ; call me hand
+ * # 9.0 [6] (🤙..🤞) */
+ (0x1F91F, 0x1F91F), /* ; Basic_Emoji ; love-you gesture
+ * # 10.0 [1] (🤟) */
+ (0x1F920, 0x1F927), /* ; Basic_Emoji ; cowboy hat face
+ * # 9.0 [8] (🤠..🤧) */
+ (0x1F928, 0x1F92F), /* ; Basic_Emoji ; face with raised eyebrow
+ * # 10.0 [8] (🤨..🤯) */
+ (0x1F930, 0x1F930), /* ; Basic_Emoji ; pregnant woman
+ * # 9.0 [1] (🤰) */
+ (0x1F931, 0x1F932), /* ; Basic_Emoji ; breast-feeding
+ * # 10.0 [2] (🤱..🤲) */
+ (0x1F933, 0x1F93A), /* ; Basic_Emoji ; selfie
+ * # 9.0 [8] (🤳..🤺) */
+ (0x1F93C, 0x1F93E), /* ; Basic_Emoji ; people wrestling
+ * # 9.0 [3] (🤼..🤾) */
+ (0x1F93F, 0x1F93F), /* ; Basic_Emoji ; diving mask
+ * # 12.0 [1] (🤿) */
+ (0x1F940, 0x1F945), /* ; Basic_Emoji ; wilted flower
+ * # 9.0 [6] (🥀..🥅) */
+ (0x1F947, 0x1F94B), /* ; Basic_Emoji ; 1st place medal
+ * # 9.0 [5] (🥇..🥋) */
+ (0x1F94C, 0x1F94C), /* ; Basic_Emoji ; curling stone
+ * # 10.0 [1] (🥌) */
+ (0x1F94D, 0x1F94F), /* ; Basic_Emoji ; lacrosse
+ * # 11.0 [3] (🥍..🥏) */
+ (0x1F950, 0x1F95E), /* ; Basic_Emoji ; croissant
+ * # 9.0 [15] (🥐..🥞) */
+ (0x1F95F, 0x1F96B), /* ; Basic_Emoji ; dumpling
+ * # 10.0 [13] (🥟..🥫) */
+ (0x1F96C, 0x1F970), /* ; Basic_Emoji ; leafy green
+ * # 11.0 [5] (🥬..🥰) */
+ (0x1F971, 0x1F971), /* ; Basic_Emoji ; yawning face
+ * # 12.0 [1] (🥱) */
+ (0x1F973, 0x1F976), /* ; Basic_Emoji ; partying face
+ * # 11.0 [4] (🥳..🥶) */
+ (0x1F97A, 0x1F97A), /* ; Basic_Emoji ; pleading face
+ * # 11.0 [1] (🥺) */
+ (0x1F97B, 0x1F97B), /* ; Basic_Emoji ; sari
+ * # 12.0 [1] (🥻) */
+ (0x1F97C, 0x1F97F), /* ; Basic_Emoji ; lab coat
+ * # 11.0 [4] (🥼..🥿) */
+ (0x1F980, 0x1F984), /* ; Basic_Emoji ; crab
+ * # 8.0 [5] (🦀..🦄) */
+ (0x1F985, 0x1F991), /* ; Basic_Emoji ; eagle
+ * # 9.0 [13] (🦅..🦑) */
+ (0x1F992, 0x1F997), /* ; Basic_Emoji ; giraffe
+ * # 10.0 [6] (🦒..🦗) */
+ (0x1F998, 0x1F9A2), /* ; Basic_Emoji ; kangaroo
+ * # 11.0 [11] (🦘..🦢) */
+ (0x1F9A5, 0x1F9AA), /* ; Basic_Emoji ; sloth
+ * # 12.0 [6] (🦥..🦪) */
+ (0x1F9AE, 0x1F9AF), /* ; Basic_Emoji ; guide dog
+ * # 12.0 [2] (🦮..🦯) */
+ (0x1F9B0, 0x1F9B9), /* ; Basic_Emoji ; red hair
+ * # 11.0 [10] (🦰..🦹) */
+ (0x1F9BA, 0x1F9BF), /* ; Basic_Emoji ; safety vest
+ * # 12.0 [6] (🦺..🦿) */
+ (0x1F9C0, 0x1F9C0), /* ; Basic_Emoji ; cheese wedge
+ * # 8.0 [1] (🧀) */
+ (0x1F9C1, 0x1F9C2), /* ; Basic_Emoji ; cupcake
+ * # 11.0 [2] (🧁..🧂) */
+ (0x1F9C3, 0x1F9CA), /* ; Basic_Emoji ; beverage box
+ * # 12.0 [8] (🧃..🧊) */
+ (0x1F9CD, 0x1F9CF), /* ; Basic_Emoji ; person standing
+ * # 12.0 [3] (🧍..🧏) */
+ (0x1F9D0, 0x1F9E6), /* ; Basic_Emoji ; face with monocle
+ * # 10.0 [23] (🧐..🧦) */
+ (0x1F9E7, 0x1F9FF), /* ; Basic_Emoji ; red envelope
+ * # 11.0 [25] (🧧..🧿) */
+ (0x1FA70, 0x1FA73), /* ; Basic_Emoji ; ballet shoes
+ * # 12.0 [4] (🩰..🩳) */
+ (0x1FA78, 0x1FA7A), /* ; Basic_Emoji ; drop of blood
+ * # 12.0 [3] (🩸..🩺) */
+ (0x1FA80, 0x1FA82), /* ; Basic_Emoji ; yo-yo
+ * # 12.0 [3] (🪀..🪂) */
+ (0x1FA90, 0x1FA95), /* ; Basic_Emoji ; ringed planet
+ * # 12.0 [6] (🪐..🪕) */
];
-/*
-00A9 FE0F ; Basic_Emoji ; copyright # 3.2 [1] (©️)
-00AE FE0F ; Basic_Emoji ; registered # 3.2 [1] (®️)
-203C FE0F ; Basic_Emoji ; double exclamation mark # 3.2 [1] (‼️)
-2049 FE0F ; Basic_Emoji ; exclamation question mark # 3.2 [1] (⁉️)
-2122 FE0F ; Basic_Emoji ; trade mark # 3.2 [1] (™️)
-2139 FE0F ; Basic_Emoji ; information # 3.2 [1] (ℹ️)
-2194 FE0F ; Basic_Emoji ; left-right arrow # 3.2 [1] (↔️)
-2195 FE0F ; Basic_Emoji ; up-down arrow # 3.2 [1] (↕️)
-2196 FE0F ; Basic_Emoji ; up-left arrow # 3.2 [1] (↖️)
-2197 FE0F ; Basic_Emoji ; up-right arrow # 3.2 [1] (↗️)
-2198 FE0F ; Basic_Emoji ; down-right arrow # 3.2 [1] (↘️)
-2199 FE0F ; Basic_Emoji ; down-left arrow # 3.2 [1] (↙️)
-21A9 FE0F ; Basic_Emoji ; right arrow curving left # 3.2 [1] (↩️)
-21AA FE0F ; Basic_Emoji ; left arrow curving right # 3.2 [1] (↪️)
-2328 FE0F ; Basic_Emoji ; keyboard # 3.2 [1] (⌨️)
-23CF FE0F ; Basic_Emoji ; eject button # 4.0 [1] (⏏️)
-23ED FE0F ; Basic_Emoji ; next track button # 6.0 [1] (⏭️)
-23EE FE0F ; Basic_Emoji ; last track button # 6.0 [1] (⏮️)
-23EF FE0F ; Basic_Emoji ; play or pause button # 6.0 [1] (⏯️)
-23F1 FE0F ; Basic_Emoji ; stopwatch # 6.0 [1] (⏱️)
-23F2 FE0F ; Basic_Emoji ; timer clock # 6.0 [1] (⏲️)
-23F8 FE0F ; Basic_Emoji ; pause button # 7.0 [1] (⏸️)
-23F9 FE0F ; Basic_Emoji ; stop button # 7.0 [1] (⏹️)
-23FA FE0F ; Basic_Emoji ; record button # 7.0 [1] (⏺️)
-24C2 FE0F ; Basic_Emoji ; circled M # 3.2 [1] (Ⓜ️)
-25AA FE0F ; Basic_Emoji ; black small square # 3.2 [1] (▪️)
-25AB FE0F ; Basic_Emoji ; white small square # 3.2 [1] (▫️)
-25B6 FE0F ; Basic_Emoji ; play button # 3.2 [1] (▶️)
-25C0 FE0F ; Basic_Emoji ; reverse button # 3.2 [1] (◀️)
-25FB FE0F ; Basic_Emoji ; white medium square # 3.2 [1] (◻️)
-25FC FE0F ; Basic_Emoji ; black medium square # 3.2 [1] (◼️)
-2600 FE0F ; Basic_Emoji ; sun # 3.2 [1] (☀️)
-2601 FE0F ; Basic_Emoji ; cloud # 3.2 [1] (☁️)
-2602 FE0F ; Basic_Emoji ; umbrella # 3.2 [1] (☂️)
-2603 FE0F ; Basic_Emoji ; snowman # 3.2 [1] (☃️)
-2604 FE0F ; Basic_Emoji ; comet # 3.2 [1] (☄️)
-260E FE0F ; Basic_Emoji ; telephone # 3.2 [1] (☎️)
-2611 FE0F ; Basic_Emoji ; check box with check # 3.2 [1] (☑️)
-2618 FE0F ; Basic_Emoji ; shamrock # 4.1 [1] (☘️)
-261D FE0F ; Basic_Emoji ; index pointing up # 3.2 [1] (☝️)
-2620 FE0F ; Basic_Emoji ; skull and crossbones # 3.2 [1] (☠️)
-2622 FE0F ; Basic_Emoji ; radioactive # 3.2 [1] (☢️)
-2623 FE0F ; Basic_Emoji ; biohazard # 3.2 [1] (☣️)
-2626 FE0F ; Basic_Emoji ; orthodox cross # 3.2 [1] (☦️)
-262A FE0F ; Basic_Emoji ; star and crescent # 3.2 [1] (☪️)
-262E FE0F ; Basic_Emoji ; peace symbol # 3.2 [1] (☮️)
-262F FE0F ; Basic_Emoji ; yin yang # 3.2 [1] (☯️)
-2638 FE0F ; Basic_Emoji ; wheel of dharma # 3.2 [1] (☸️)
-2639 FE0F ; Basic_Emoji ; frowning face # 3.2 [1] (☹️)
-263A FE0F ; Basic_Emoji ; smiling face # 3.2 [1] (☺️)
-2640 FE0F ; Basic_Emoji ; female sign # 3.2 [1] (♀️)
-2642 FE0F ; Basic_Emoji ; male sign # 3.2 [1] (♂️)
-265F FE0F ; Basic_Emoji ; chess pawn # 3.2 [1] (♟️)
-2660 FE0F ; Basic_Emoji ; spade suit # 3.2 [1] (♠️)
-2663 FE0F ; Basic_Emoji ; club suit # 3.2 [1] (♣️)
-2665 FE0F ; Basic_Emoji ; heart suit # 3.2 [1] (♥️)
-2666 FE0F ; Basic_Emoji ; diamond suit # 3.2 [1] (♦️)
-2668 FE0F ; Basic_Emoji ; hot springs # 3.2 [1] (♨️)
-267B FE0F ; Basic_Emoji ; recycling symbol # 3.2 [1] (♻️)
-267E FE0F ; Basic_Emoji ; infinity # 4.1 [1] (♾️)
-2692 FE0F ; Basic_Emoji ; hammer and pick # 4.1 [1] (⚒️)
-2694 FE0F ; Basic_Emoji ; crossed swords # 4.1 [1] (⚔️)
-2695 FE0F ; Basic_Emoji ; medical symbol # 4.1 [1] (⚕️)
-2696 FE0F ; Basic_Emoji ; balance scale # 4.1 [1] (⚖️)
-2697 FE0F ; Basic_Emoji ; alembic # 4.1 [1] (⚗️)
-2699 FE0F ; Basic_Emoji ; gear # 4.1 [1] (⚙️)
-269B FE0F ; Basic_Emoji ; atom symbol # 4.1 [1] (⚛️)
-269C FE0F ; Basic_Emoji ; fleur-de-lis # 4.1 [1] (⚜️)
-26A0 FE0F ; Basic_Emoji ; warning # 4.0 [1] (⚠️)
-26B0 FE0F ; Basic_Emoji ; coffin # 4.1 [1] (⚰️)
-26B1 FE0F ; Basic_Emoji ; funeral urn # 4.1 [1] (⚱️)
-26C8 FE0F ; Basic_Emoji ; cloud with lightning and rain # 5.2 [1] (⛈️)
-26CF FE0F ; Basic_Emoji ; pick # 5.2 [1] (⛏️)
-26D1 FE0F ; Basic_Emoji ; rescue worker’s helmet # 5.2 [1] (⛑️)
-26D3 FE0F ; Basic_Emoji ; chains # 5.2 [1] (⛓️)
-26E9 FE0F ; Basic_Emoji ; shinto shrine # 5.2 [1] (⛩️)
-26F0 FE0F ; Basic_Emoji ; mountain # 5.2 [1] (⛰️)
-26F1 FE0F ; Basic_Emoji ; umbrella on ground # 5.2 [1] (⛱️)
-26F4 FE0F ; Basic_Emoji ; ferry # 5.2 [1] (⛴️)
-26F7 FE0F ; Basic_Emoji ; skier # 5.2 [1] (⛷️)
-26F8 FE0F ; Basic_Emoji ; ice skate # 5.2 [1] (⛸️)
-26F9 FE0F ; Basic_Emoji ; person bouncing ball # 5.2 [1] (⛹️)
-2702 FE0F ; Basic_Emoji ; scissors # 3.2 [1] (✂️)
-2708 FE0F ; Basic_Emoji ; airplane # 3.2 [1] (✈️)
-2709 FE0F ; Basic_Emoji ; envelope # 3.2 [1] (✉️)
-270C FE0F ; Basic_Emoji ; victory hand # 3.2 [1] (✌️)
-270D FE0F ; Basic_Emoji ; writing hand # 3.2 [1] (✍️)
-270F FE0F ; Basic_Emoji ; pencil # 3.2 [1] (✏️)
-2712 FE0F ; Basic_Emoji ; black nib # 3.2 [1] (✒️)
-2714 FE0F ; Basic_Emoji ; check mark # 3.2 [1] (✔️)
-2716 FE0F ; Basic_Emoji ; multiplication sign # 3.2 [1] (✖️)
-271D FE0F ; Basic_Emoji ; latin cross # 3.2 [1] (✝️)
-2721 FE0F ; Basic_Emoji ; star of David # 3.2 [1] (✡️)
-2733 FE0F ; Basic_Emoji ; eight-spoked asterisk # 3.2 [1] (✳️)
-2734 FE0F ; Basic_Emoji ; eight-pointed star # 3.2 [1] (✴️)
-2744 FE0F ; Basic_Emoji ; snowflake # 3.2 [1] (❄️)
-2747 FE0F ; Basic_Emoji ; sparkle # 3.2 [1] (❇️)
-2763 FE0F ; Basic_Emoji ; heart exclamation # 3.2 [1] (❣️)
-2764 FE0F ; Basic_Emoji ; red heart # 3.2 [1] (❤️)
-27A1 FE0F ; Basic_Emoji ; right arrow # 3.2 [1] (➡️)
-2934 FE0F ; Basic_Emoji ; right arrow curving up # 3.2 [1] (⤴️)
-2935 FE0F ; Basic_Emoji ; right arrow curving down # 3.2 [1] (⤵️)
-2B05 FE0F ; Basic_Emoji ; left arrow # 4.0 [1] (⬅️)
-2B06 FE0F ; Basic_Emoji ; up arrow # 4.0 [1] (⬆️)
-2B07 FE0F ; Basic_Emoji ; down arrow # 4.0 [1] (⬇️)
-3030 FE0F ; Basic_Emoji ; wavy dash # 3.2 [1] (〰️)
-303D FE0F ; Basic_Emoji ; part alternation mark # 3.2 [1] (〽️)
-3297 FE0F ; Basic_Emoji ; Japanese “congratulations” button # 3.2 [1] (㊗️)
-3299 FE0F ; Basic_Emoji ; Japanese “secret” button # 3.2 [1] (㊙️)
-1F170 FE0F ; Basic_Emoji ; A button (blood type) # 6.0 [1] (🅰️)
-1F171 FE0F ; Basic_Emoji ; B button (blood type) # 6.0 [1] (🅱️)
-1F17E FE0F ; Basic_Emoji ; O button (blood type) # 6.0 [1] (🅾️)
-1F17F FE0F ; Basic_Emoji ; P button # 5.2 [1] (🅿️)
-1F202 FE0F ; Basic_Emoji ; Japanese “service charge” button # 6.0 [1] (🈂️)
-1F237 FE0F ; Basic_Emoji ; Japanese “monthly amount” button # 6.0 [1] (🈷️)
-1F321 FE0F ; Basic_Emoji ; thermometer # 7.0 [1] (🌡️)
-1F324 FE0F ; Basic_Emoji ; sun behind small cloud # 7.0 [1] (🌤️)
-1F325 FE0F ; Basic_Emoji ; sun behind large cloud # 7.0 [1] (🌥️)
-1F326 FE0F ; Basic_Emoji ; sun behind rain cloud # 7.0 [1] (🌦️)
-1F327 FE0F ; Basic_Emoji ; cloud with rain # 7.0 [1] (🌧️)
-1F328 FE0F ; Basic_Emoji ; cloud with snow # 7.0 [1] (🌨️)
-1F329 FE0F ; Basic_Emoji ; cloud with lightning # 7.0 [1] (🌩️)
-1F32A FE0F ; Basic_Emoji ; tornado # 7.0 [1] (🌪️)
-1F32B FE0F ; Basic_Emoji ; fog # 7.0 [1] (🌫️)
-1F32C FE0F ; Basic_Emoji ; wind face # 7.0 [1] (🌬️)
-1F336 FE0F ; Basic_Emoji ; hot pepper # 7.0 [1] (🌶️)
-1F37D FE0F ; Basic_Emoji ; fork and knife with plate # 7.0 [1] (🍽️)
-1F396 FE0F ; Basic_Emoji ; military medal # 7.0 [1] (🎖️)
-1F397 FE0F ; Basic_Emoji ; reminder ribbon # 7.0 [1] (🎗️)
-1F399 FE0F ; Basic_Emoji ; studio microphone # 7.0 [1] (🎙️)
-1F39A FE0F ; Basic_Emoji ; level slider # 7.0 [1] (🎚️)
-1F39B FE0F ; Basic_Emoji ; control knobs # 7.0 [1] (🎛️)
-1F39E FE0F ; Basic_Emoji ; film frames # 7.0 [1] (🎞️)
-1F39F FE0F ; Basic_Emoji ; admission tickets # 7.0 [1] (🎟️)
-1F3CB FE0F ; Basic_Emoji ; person lifting weights # 7.0 [1] (🏋️)
-1F3CC FE0F ; Basic_Emoji ; person golfing # 7.0 [1] (🏌️)
-1F3CD FE0F ; Basic_Emoji ; motorcycle # 7.0 [1] (🏍️)
-1F3CE FE0F ; Basic_Emoji ; racing car # 7.0 [1] (🏎️)
-1F3D4 FE0F ; Basic_Emoji ; snow-capped mountain # 7.0 [1] (🏔️)
-1F3D5 FE0F ; Basic_Emoji ; camping # 7.0 [1] (🏕️)
-1F3D6 FE0F ; Basic_Emoji ; beach with umbrella # 7.0 [1] (🏖️)
-1F3D7 FE0F ; Basic_Emoji ; building construction # 7.0 [1] (🏗️)
-1F3D8 FE0F ; Basic_Emoji ; houses # 7.0 [1] (🏘️)
-1F3D9 FE0F ; Basic_Emoji ; cityscape # 7.0 [1] (🏙️)
-1F3DA FE0F ; Basic_Emoji ; derelict house # 7.0 [1] (🏚️)
-1F3DB FE0F ; Basic_Emoji ; classical building # 7.0 [1] (🏛️)
-1F3DC FE0F ; Basic_Emoji ; desert # 7.0 [1] (🏜️)
-1F3DD FE0F ; Basic_Emoji ; desert island # 7.0 [1] (🏝️)
-1F3DE FE0F ; Basic_Emoji ; national park # 7.0 [1] (🏞️)
-1F3DF FE0F ; Basic_Emoji ; stadium # 7.0 [1] (🏟️)
-1F3F3 FE0F ; Basic_Emoji ; white flag # 7.0 [1] (🏳️)
-1F3F5 FE0F ; Basic_Emoji ; rosette # 7.0 [1] (🏵️)
-1F3F7 FE0F ; Basic_Emoji ; label # 7.0 [1] (🏷️)
-1F43F FE0F ; Basic_Emoji ; chipmunk # 7.0 [1] (🐿️)
-1F441 FE0F ; Basic_Emoji ; eye # 7.0 [1] (👁️)
-1F4FD FE0F ; Basic_Emoji ; film projector # 7.0 [1] (📽️)
-1F549 FE0F ; Basic_Emoji ; om # 7.0 [1] (🕉️)
-1F54A FE0F ; Basic_Emoji ; dove # 7.0 [1] (🕊️)
-1F56F FE0F ; Basic_Emoji ; candle # 7.0 [1] (🕯️)
-1F570 FE0F ; Basic_Emoji ; mantelpiece clock # 7.0 [1] (🕰️)
-1F573 FE0F ; Basic_Emoji ; hole # 7.0 [1] (🕳️)
-1F574 FE0F ; Basic_Emoji ; man in suit levitating # 7.0 [1] (🕴️)
-1F575 FE0F ; Basic_Emoji ; detective # 7.0 [1] (🕵️)
-1F576 FE0F ; Basic_Emoji ; sunglasses # 7.0 [1] (🕶️)
-1F577 FE0F ; Basic_Emoji ; spider # 7.0 [1] (🕷️)
-1F578 FE0F ; Basic_Emoji ; spider web # 7.0 [1] (🕸️)
-1F579 FE0F ; Basic_Emoji ; joystick # 7.0 [1] (🕹️)
-1F587 FE0F ; Basic_Emoji ; linked paperclips # 7.0 [1] (🖇️)
-1F58A FE0F ; Basic_Emoji ; pen # 7.0 [1] (🖊️)
-1F58B FE0F ; Basic_Emoji ; fountain pen # 7.0 [1] (🖋️)
-1F58C FE0F ; Basic_Emoji ; paintbrush # 7.0 [1] (🖌️)
-1F58D FE0F ; Basic_Emoji ; crayon # 7.0 [1] (🖍️)
-1F590 FE0F ; Basic_Emoji ; hand with fingers splayed # 7.0 [1] (🖐️)
-1F5A5 FE0F ; Basic_Emoji ; desktop computer # 7.0 [1] (🖥️)
-1F5A8 FE0F ; Basic_Emoji ; printer # 7.0 [1] (🖨️)
-1F5B1 FE0F ; Basic_Emoji ; computer mouse # 7.0 [1] (🖱️)
-1F5B2 FE0F ; Basic_Emoji ; trackball # 7.0 [1] (🖲️)
-1F5BC FE0F ; Basic_Emoji ; framed picture # 7.0 [1] (🖼️)
-1F5C2 FE0F ; Basic_Emoji ; card index dividers # 7.0 [1] (🗂️)
-1F5C3 FE0F ; Basic_Emoji ; card file box # 7.0 [1] (🗃️)
-1F5C4 FE0F ; Basic_Emoji ; file cabinet # 7.0 [1] (🗄️)
-1F5D1 FE0F ; Basic_Emoji ; wastebasket # 7.0 [1] (🗑️)
-1F5D2 FE0F ; Basic_Emoji ; spiral notepad # 7.0 [1] (🗒️)
-1F5D3 FE0F ; Basic_Emoji ; spiral calendar # 7.0 [1] (🗓️)
-1F5DC FE0F ; Basic_Emoji ; clamp # 7.0 [1] (🗜️)
-1F5DD FE0F ; Basic_Emoji ; old key # 7.0 [1] (🗝️)
-1F5DE FE0F ; Basic_Emoji ; rolled-up newspaper # 7.0 [1] (🗞️)
-1F5E1 FE0F ; Basic_Emoji ; dagger # 7.0 [1] (🗡️)
-1F5E3 FE0F ; Basic_Emoji ; speaking head # 7.0 [1] (🗣️)
-1F5E8 FE0F ; Basic_Emoji ; left speech bubble # 7.0 [1] (🗨️)
-1F5EF FE0F ; Basic_Emoji ; right anger bubble # 7.0 [1] (🗯️)
-1F5F3 FE0F ; Basic_Emoji ; ballot box with ballot # 7.0 [1] (🗳️)
-1F5FA FE0F ; Basic_Emoji ; world map # 7.0 [1] (🗺️)
-1F6CB FE0F ; Basic_Emoji ; couch and lamp # 7.0 [1] (🛋️)
-1F6CD FE0F ; Basic_Emoji ; shopping bags # 7.0 [1] (🛍️)
-1F6CE FE0F ; Basic_Emoji ; bellhop bell # 7.0 [1] (🛎️)
-1F6CF FE0F ; Basic_Emoji ; bed # 7.0 [1] (🛏️)
-1F6E0 FE0F ; Basic_Emoji ; hammer and wrench # 7.0 [1] (🛠️)
-1F6E1 FE0F ; Basic_Emoji ; shield # 7.0 [1] (🛡️)
-1F6E2 FE0F ; Basic_Emoji ; oil drum # 7.0 [1] (🛢️)
-1F6E3 FE0F ; Basic_Emoji ; motorway # 7.0 [1] (🛣️)
-1F6E4 FE0F ; Basic_Emoji ; railway track # 7.0 [1] (🛤️)
-1F6E5 FE0F ; Basic_Emoji ; motor boat # 7.0 [1] (🛥️)
-1F6E9 FE0F ; Basic_Emoji ; small airplane # 7.0 [1] (🛩️)
-1F6F0 FE0F ; Basic_Emoji ; satellite # 7.0 [1] (🛰️)
-1F6F3 FE0F ; Basic_Emoji ; passenger ship # 7.0 [1] (🛳️)
-*/
+// 00A9 FE0F ; Basic_Emoji ; copyright
+// # 3.2 [1] (©️) 00AE FE0F ; Basic_Emoji ; registered
+// # 3.2 [1] (®️) 203C FE0F ; Basic_Emoji ; double
+// exclamation mark # 3.2 [1] (‼️) 2049
+// FE0F ; Basic_Emoji ; exclamation question mark
+// # 3.2 [1] (⁉️) 2122 FE0F ; Basic_Emoji ; trade mark
+// # 3.2 [1] (™️) 2139 FE0F ; Basic_Emoji ; information
+// # 3.2 [1] (ℹ️) 2194 FE0F ; Basic_Emoji ; left-right arrow
+// # 3.2 [1] (↔️) 2195 FE0F ; Basic_Emoji ; up-down arrow
+// # 3.2 [1] (↕️) 2196 FE0F ; Basic_Emoji ; up-left arrow
+// # 3.2 [1] (↖️) 2197 FE0F ; Basic_Emoji ; up-right arrow
+// # 3.2 [1] (↗️) 2198 FE0F ; Basic_Emoji ; down-right arrow
+// # 3.2 [1] (↘️) 2199 FE0F ; Basic_Emoji ; down-left arrow
+// # 3.2 [1] (↙️) 21A9 FE0F ; Basic_Emoji ; right arrow
+// curving left # 3.2 [1] (↩️) 21AA FE0F
+// ; Basic_Emoji ; left arrow curving right
+// # 3.2 [1] (↪️) 2328 FE0F ; Basic_Emoji ; keyboard
+// # 3.2 [1] (⌨️) 23CF FE0F ; Basic_Emoji ; eject button
+// # 4.0 [1] (⏏️) 23ED FE0F ; Basic_Emoji ; next track button
+// # 6.0 [1] (⏭️) 23EE FE0F ; Basic_Emoji ; last track button
+// # 6.0 [1] (⏮️) 23EF FE0F ; Basic_Emoji ; play or pause
+// button # 6.0 [1] (⏯️) 23F1 FE0F
+// ; Basic_Emoji ; stopwatch
+// # 6.0 [1] (⏱️) 23F2 FE0F ; Basic_Emoji ; timer clock
+// # 6.0 [1] (⏲️) 23F8 FE0F ; Basic_Emoji ; pause button
+// # 7.0 [1] (⏸️) 23F9 FE0F ; Basic_Emoji ; stop button
+// # 7.0 [1] (⏹️) 23FA FE0F ; Basic_Emoji ; record button
+// # 7.0 [1] (⏺️) 24C2 FE0F ; Basic_Emoji ; circled M
+// # 3.2 [1] (Ⓜ️) 25AA FE0F ; Basic_Emoji ; black small
+// square # 3.2 [1] (▪️) 25AB FE0F
+// ; Basic_Emoji ; white small square
+// # 3.2 [1] (▫️) 25B6 FE0F ; Basic_Emoji ; play button
+// # 3.2 [1] (▶️) 25C0 FE0F ; Basic_Emoji ; reverse button
+// # 3.2 [1] (◀️) 25FB FE0F ; Basic_Emoji ; white medium
+// square # 3.2 [1] (◻️) 25FC FE0F
+// ; Basic_Emoji ; black medium square
+// # 3.2 [1] (◼️) 2600 FE0F ; Basic_Emoji ; sun
+// # 3.2 [1] (☀️) 2601 FE0F ; Basic_Emoji ; cloud
+// # 3.2 [1] (☁️) 2602 FE0F ; Basic_Emoji ; umbrella
+// # 3.2 [1] (☂️) 2603 FE0F ; Basic_Emoji ; snowman
+// # 3.2 [1] (☃️) 2604 FE0F ; Basic_Emoji ; comet
+// # 3.2 [1] (☄️) 260E FE0F ; Basic_Emoji ; telephone
+// # 3.2 [1] (☎️) 2611 FE0F ; Basic_Emoji ; check box with
+// check # 3.2 [1] (☑️) 2618 FE0F
+// ; Basic_Emoji ; shamrock
+// # 4.1 [1] (☘️) 261D FE0F ; Basic_Emoji ; index pointing up
+// # 3.2 [1] (☝️) 2620 FE0F ; Basic_Emoji ; skull and
+// crossbones # 3.2 [1] (☠️)
+// 2622 FE0F ; Basic_Emoji ; radioactive
+// # 3.2 [1] (☢️) 2623 FE0F ; Basic_Emoji ; biohazard
+// # 3.2 [1] (☣️) 2626 FE0F ; Basic_Emoji ; orthodox cross
+// # 3.2 [1] (☦️) 262A FE0F ; Basic_Emoji ; star and crescent
+// # 3.2 [1] (☪️) 262E FE0F ; Basic_Emoji ; peace symbol
+// # 3.2 [1] (☮️) 262F FE0F ; Basic_Emoji ; yin yang
+// # 3.2 [1] (☯️) 2638 FE0F ; Basic_Emoji ; wheel of dharma
+// # 3.2 [1] (☸️) 2639 FE0F ; Basic_Emoji ; frowning face
+// # 3.2 [1] (☹️) 263A FE0F ; Basic_Emoji ; smiling face
+// # 3.2 [1] (☺️) 2640 FE0F ; Basic_Emoji ; female sign
+// # 3.2 [1] (♀️) 2642 FE0F ; Basic_Emoji ; male sign
+// # 3.2 [1] (♂️) 265F FE0F ; Basic_Emoji ; chess pawn
+// # 3.2 [1] (♟️) 2660 FE0F ; Basic_Emoji ; spade suit
+// # 3.2 [1] (♠️) 2663 FE0F ; Basic_Emoji ; club suit
+// # 3.2 [1] (♣️) 2665 FE0F ; Basic_Emoji ; heart suit
+// # 3.2 [1] (♥️) 2666 FE0F ; Basic_Emoji ; diamond suit
+// # 3.2 [1] (♦️) 2668 FE0F ; Basic_Emoji ; hot springs
+// # 3.2 [1] (♨️) 267B FE0F ; Basic_Emoji ; recycling symbol
+// # 3.2 [1] (♻️) 267E FE0F ; Basic_Emoji ; infinity
+// # 4.1 [1] (♾️) 2692 FE0F ; Basic_Emoji ; hammer and pick
+// # 4.1 [1] (⚒️) 2694 FE0F ; Basic_Emoji ; crossed swords
+// # 4.1 [1] (⚔️) 2695 FE0F ; Basic_Emoji ; medical symbol
+// # 4.1 [1] (⚕️) 2696 FE0F ; Basic_Emoji ; balance scale
+// # 4.1 [1] (⚖️) 2697 FE0F ; Basic_Emoji ; alembic
+// # 4.1 [1] (⚗️) 2699 FE0F ; Basic_Emoji ; gear
+// # 4.1 [1] (⚙️) 269B FE0F ; Basic_Emoji ; atom symbol
+// # 4.1 [1] (⚛️) 269C FE0F ; Basic_Emoji ; fleur-de-lis
+// # 4.1 [1] (⚜️) 26A0 FE0F ; Basic_Emoji ; warning
+// # 4.0 [1] (⚠️) 26B0 FE0F ; Basic_Emoji ; coffin
+// # 4.1 [1] (⚰️) 26B1 FE0F ; Basic_Emoji ; funeral urn
+// # 4.1 [1] (⚱️) 26C8 FE0F ; Basic_Emoji ; cloud with
+// lightning and rain # 5.2 [1] (⛈️)
+// 26CF FE0F ; Basic_Emoji ; pick
+// # 5.2 [1] (⛏️) 26D1 FE0F ; Basic_Emoji ; rescue worker’s
+// helmet # 5.2 [1] (⛑️) 26D3 FE0F
+// ; Basic_Emoji ; chains
+// # 5.2 [1] (⛓️) 26E9 FE0F ; Basic_Emoji ; shinto shrine
+// # 5.2 [1] (⛩️) 26F0 FE0F ; Basic_Emoji ; mountain
+// # 5.2 [1] (⛰️) 26F1 FE0F ; Basic_Emoji ; umbrella on
+// ground # 5.2 [1] (⛱️) 26F4 FE0F
+// ; Basic_Emoji ; ferry
+// # 5.2 [1] (⛴️) 26F7 FE0F ; Basic_Emoji ; skier
+// # 5.2 [1] (⛷️) 26F8 FE0F ; Basic_Emoji ; ice skate
+// # 5.2 [1] (⛸️) 26F9 FE0F ; Basic_Emoji ; person bouncing
+// ball # 5.2 [1] (⛹️) 2702 FE0F
+// ; Basic_Emoji ; scissors
+// # 3.2 [1] (✂️) 2708 FE0F ; Basic_Emoji ; airplane
+// # 3.2 [1] (✈️) 2709 FE0F ; Basic_Emoji ; envelope
+// # 3.2 [1] (✉️) 270C FE0F ; Basic_Emoji ; victory hand
+// # 3.2 [1] (✌️) 270D FE0F ; Basic_Emoji ; writing hand
+// # 3.2 [1] (✍️) 270F FE0F ; Basic_Emoji ; pencil
+// # 3.2 [1] (✏️) 2712 FE0F ; Basic_Emoji ; black nib
+// # 3.2 [1] (✒️) 2714 FE0F ; Basic_Emoji ; check mark
+// # 3.2 [1] (✔️) 2716 FE0F ; Basic_Emoji ; multiplication
+// sign # 3.2 [1] (✖️) 271D FE0F
+// ; Basic_Emoji ; latin cross
+// # 3.2 [1] (✝️) 2721 FE0F ; Basic_Emoji ; star of David
+// # 3.2 [1] (✡️) 2733 FE0F ; Basic_Emoji ; eight-spoked
+// asterisk # 3.2 [1] (✳️) 2734 FE0F
+// ; Basic_Emoji ; eight-pointed star
+// # 3.2 [1] (✴️) 2744 FE0F ; Basic_Emoji ; snowflake
+// # 3.2 [1] (❄️) 2747 FE0F ; Basic_Emoji ; sparkle
+// # 3.2 [1] (❇️) 2763 FE0F ; Basic_Emoji ; heart exclamation
+// # 3.2 [1] (❣️) 2764 FE0F ; Basic_Emoji ; red heart
+// # 3.2 [1] (❤️) 27A1 FE0F ; Basic_Emoji ; right arrow
+// # 3.2 [1] (➡️) 2934 FE0F ; Basic_Emoji ; right arrow
+// curving up # 3.2 [1] (⤴️) 2935 FE0F
+// ; Basic_Emoji ; right arrow curving down
+// # 3.2 [1] (⤵️) 2B05 FE0F ; Basic_Emoji ; left arrow
+// # 4.0 [1] (⬅️) 2B06 FE0F ; Basic_Emoji ; up arrow
+// # 4.0 [1] (⬆️) 2B07 FE0F ; Basic_Emoji ; down arrow
+// # 4.0 [1] (⬇️) 3030 FE0F ; Basic_Emoji ; wavy dash
+// # 3.2 [1] (〰️) 303D FE0F ; Basic_Emoji ; part alternation
+// mark # 3.2 [1] (〽️) 3297 FE0F
+// ; Basic_Emoji ; Japanese “congratulations” button
+// # 3.2 [1] (㊗️) 3299 FE0F ; Basic_Emoji ; Japanese “secret”
+// button # 3.2 [1] (㊙️) 1F170 FE0F ;
+// Basic_Emoji ; A button (blood type)
+// # 6.0 [1] (🅰️) 1F171 FE0F ; Basic_Emoji ; B button (blood
+// type) # 6.0 [1] (🅱️) 1F17E FE0F
+// ; Basic_Emoji ; O button (blood type)
+// # 6.0 [1] (🅾️) 1F17F FE0F ; Basic_Emoji ; P button
+// # 5.2 [1] (🅿️) 1F202 FE0F ; Basic_Emoji ; Japanese “service
+// charge” button # 6.0 [1] (🈂️) 1F237 FE0F ;
+// Basic_Emoji ; Japanese “monthly amount” button
+// # 6.0 [1] (🈷️) 1F321 FE0F ; Basic_Emoji ; thermometer
+// # 7.0 [1] (🌡️) 1F324 FE0F ; Basic_Emoji ; sun behind small
+// cloud # 7.0 [1] (🌤️) 1F325 FE0F
+// ; Basic_Emoji ; sun behind large cloud
+// # 7.0 [1] (🌥️) 1F326 FE0F ; Basic_Emoji ; sun behind rain
+// cloud # 7.0 [1] (🌦️) 1F327 FE0F
+// ; Basic_Emoji ; cloud with rain
+// # 7.0 [1] (🌧️) 1F328 FE0F ; Basic_Emoji ; cloud with snow
+// # 7.0 [1] (🌨️) 1F329 FE0F ; Basic_Emoji ; cloud with
+// lightning # 7.0 [1] (🌩️)
+// 1F32A FE0F ; Basic_Emoji ; tornado
+// # 7.0 [1] (🌪️) 1F32B FE0F ; Basic_Emoji ; fog
+// # 7.0 [1] (🌫️) 1F32C FE0F ; Basic_Emoji ; wind face
+// # 7.0 [1] (🌬️) 1F336 FE0F ; Basic_Emoji ; hot pepper
+// # 7.0 [1] (🌶️) 1F37D FE0F ; Basic_Emoji ; fork and knife
+// with plate # 7.0 [1] (🍽️) 1F396 FE0F
+// ; Basic_Emoji ; military medal
+// # 7.0 [1] (🎖️) 1F397 FE0F ; Basic_Emoji ; reminder ribbon
+// # 7.0 [1] (🎗️) 1F399 FE0F ; Basic_Emoji ; studio microphone
+// # 7.0 [1] (🎙️) 1F39A FE0F ; Basic_Emoji ; level slider
+// # 7.0 [1] (🎚️) 1F39B FE0F ; Basic_Emoji ; control knobs
+// # 7.0 [1] (🎛️) 1F39E FE0F ; Basic_Emoji ; film frames
+// # 7.0 [1] (🎞️) 1F39F FE0F ; Basic_Emoji ; admission tickets
+// # 7.0 [1] (🎟️) 1F3CB FE0F ; Basic_Emoji ; person lifting
+// weights # 7.0 [1] (🏋️) 1F3CC FE0F
+// ; Basic_Emoji ; person golfing
+// # 7.0 [1] (🏌️) 1F3CD FE0F ; Basic_Emoji ; motorcycle
+// # 7.0 [1] (🏍️) 1F3CE FE0F ; Basic_Emoji ; racing car
+// # 7.0 [1] (🏎️) 1F3D4 FE0F ; Basic_Emoji ; snow-capped
+// mountain # 7.0 [1] (🏔️)
+// 1F3D5 FE0F ; Basic_Emoji ; camping
+// # 7.0 [1] (🏕️) 1F3D6 FE0F ; Basic_Emoji ; beach with
+// umbrella # 7.0 [1] (🏖️)
+// 1F3D7 FE0F ; Basic_Emoji ; building construction
+// # 7.0 [1] (🏗️) 1F3D8 FE0F ; Basic_Emoji ; houses
+// # 7.0 [1] (🏘️) 1F3D9 FE0F ; Basic_Emoji ; cityscape
+// # 7.0 [1] (🏙️) 1F3DA FE0F ; Basic_Emoji ; derelict house
+// # 7.0 [1] (🏚️) 1F3DB FE0F ; Basic_Emoji ; classical
+// building # 7.0 [1] (🏛️)
+// 1F3DC FE0F ; Basic_Emoji ; desert
+// # 7.0 [1] (🏜️) 1F3DD FE0F ; Basic_Emoji ; desert island
+// # 7.0 [1] (🏝️) 1F3DE FE0F ; Basic_Emoji ; national park
+// # 7.0 [1] (🏞️) 1F3DF FE0F ; Basic_Emoji ; stadium
+// # 7.0 [1] (🏟️) 1F3F3 FE0F ; Basic_Emoji ; white flag
+// # 7.0 [1] (🏳️) 1F3F5 FE0F ; Basic_Emoji ; rosette
+// # 7.0 [1] (🏵️) 1F3F7 FE0F ; Basic_Emoji ; label
+// # 7.0 [1] (🏷️) 1F43F FE0F ; Basic_Emoji ; chipmunk
+// # 7.0 [1] (🐿️) 1F441 FE0F ; Basic_Emoji ; eye
+// # 7.0 [1] (👁️) 1F4FD FE0F ; Basic_Emoji ; film projector
+// # 7.0 [1] (📽️) 1F549 FE0F ; Basic_Emoji ; om
+// # 7.0 [1] (🕉️) 1F54A FE0F ; Basic_Emoji ; dove
+// # 7.0 [1] (🕊️) 1F56F FE0F ; Basic_Emoji ; candle
+// # 7.0 [1] (🕯️) 1F570 FE0F ; Basic_Emoji ; mantelpiece clock
+// # 7.0 [1] (🕰️) 1F573 FE0F ; Basic_Emoji ; hole
+// # 7.0 [1] (🕳️) 1F574 FE0F ; Basic_Emoji ; man in suit
+// levitating # 7.0 [1] (🕴️)
+// 1F575 FE0F ; Basic_Emoji ; detective
+// # 7.0 [1] (🕵️) 1F576 FE0F ; Basic_Emoji ; sunglasses
+// # 7.0 [1] (🕶️) 1F577 FE0F ; Basic_Emoji ; spider
+// # 7.0 [1] (🕷️) 1F578 FE0F ; Basic_Emoji ; spider web
+// # 7.0 [1] (🕸️) 1F579 FE0F ; Basic_Emoji ; joystick
+// # 7.0 [1] (🕹️) 1F587 FE0F ; Basic_Emoji ; linked paperclips
+// # 7.0 [1] (🖇️) 1F58A FE0F ; Basic_Emoji ; pen
+// # 7.0 [1] (🖊️) 1F58B FE0F ; Basic_Emoji ; fountain pen
+// # 7.0 [1] (🖋️) 1F58C FE0F ; Basic_Emoji ; paintbrush
+// # 7.0 [1] (🖌️) 1F58D FE0F ; Basic_Emoji ; crayon
+// # 7.0 [1] (🖍️) 1F590 FE0F ; Basic_Emoji ; hand with fingers
+// splayed # 7.0 [1] (🖐️) 1F5A5 FE0F ;
+// Basic_Emoji ; desktop computer
+// # 7.0 [1] (🖥️) 1F5A8 FE0F ; Basic_Emoji ; printer
+// # 7.0 [1] (🖨️) 1F5B1 FE0F ; Basic_Emoji ; computer mouse
+// # 7.0 [1] (🖱️) 1F5B2 FE0F ; Basic_Emoji ; trackball
+// # 7.0 [1] (🖲️) 1F5BC FE0F ; Basic_Emoji ; framed picture
+// # 7.0 [1] (🖼️) 1F5C2 FE0F ; Basic_Emoji ; card index
+// dividers # 7.0 [1] (🗂️)
+// 1F5C3 FE0F ; Basic_Emoji ; card file box
+// # 7.0 [1] (🗃️) 1F5C4 FE0F ; Basic_Emoji ; file cabinet
+// # 7.0 [1] (🗄️) 1F5D1 FE0F ; Basic_Emoji ; wastebasket
+// # 7.0 [1] (🗑️) 1F5D2 FE0F ; Basic_Emoji ; spiral notepad
+// # 7.0 [1] (🗒️) 1F5D3 FE0F ; Basic_Emoji ; spiral calendar
+// # 7.0 [1] (🗓️) 1F5DC FE0F ; Basic_Emoji ; clamp
+// # 7.0 [1] (🗜️) 1F5DD FE0F ; Basic_Emoji ; old key
+// # 7.0 [1] (🗝️) 1F5DE FE0F ; Basic_Emoji ; rolled-up
+// newspaper # 7.0 [1] (🗞️)
+// 1F5E1 FE0F ; Basic_Emoji ; dagger
+// # 7.0 [1] (🗡️) 1F5E3 FE0F ; Basic_Emoji ; speaking head
+// # 7.0 [1] (🗣️) 1F5E8 FE0F ; Basic_Emoji ; left speech
+// bubble # 7.0 [1] (🗨️)
+// 1F5EF FE0F ; Basic_Emoji ; right anger bubble
+// # 7.0 [1] (🗯️) 1F5F3 FE0F ; Basic_Emoji ; ballot box with
+// ballot # 7.0 [1] (🗳️) 1F5FA FE0F
+// ; Basic_Emoji ; world map
+// # 7.0 [1] (🗺️) 1F6CB FE0F ; Basic_Emoji ; couch and lamp
+// # 7.0 [1] (🛋️) 1F6CD FE0F ; Basic_Emoji ; shopping bags
+// # 7.0 [1] (🛍️) 1F6CE FE0F ; Basic_Emoji ; bellhop bell
+// # 7.0 [1] (🛎️) 1F6CF FE0F ; Basic_Emoji ; bed
+// # 7.0 [1] (🛏️) 1F6E0 FE0F ; Basic_Emoji ; hammer and wrench
+// # 7.0 [1] (🛠️) 1F6E1 FE0F ; Basic_Emoji ; shield
+// # 7.0 [1] (🛡️) 1F6E2 FE0F ; Basic_Emoji ; oil drum
+// # 7.0 [1] (🛢️) 1F6E3 FE0F ; Basic_Emoji ; motorway
+// # 7.0 [1] (🛣️) 1F6E4 FE0F ; Basic_Emoji ; railway track
+// # 7.0 [1] (🛤️) 1F6E5 FE0F ; Basic_Emoji ; motor boat
+// # 7.0 [1] (🛥️) 1F6E9 FE0F ; Basic_Emoji ; small airplane
+// # 7.0 [1] (🛩️) 1F6F0 FE0F ; Basic_Emoji ; satellite
+// # 7.0 [1] (🛰️) 1F6F3 FE0F ; Basic_Emoji ; passenger ship
+// # 7.0 [1] (🛳️)
diff --git a/src/types.rs b/src/types.rs
index c121ca4..a5cd4bb 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -1,28 +1,26 @@
-/*
- * bb
- *
- * Copyright 2019 Manos Pitsidianakis
- *
- * This file is part of bb.
- *
- * bb is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * bb is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with bb. If not, see .
- */
+// bb
+//
+// Copyright 2019 Manos Pitsidianakis
+//
+// This file is part of bb.
+//
+// bb is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// bb is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with bb. If not, see .
use crate::Key;
-/// `ThreadEvent` encapsulates all of the possible values we need to transfer between our threads
-/// to the main process.
+/// `ThreadEvent` encapsulates all of the possible values we need to transfer
+/// between our threads to the main process.
#[derive(Debug)]
pub enum ThreadEvent {
Input(Key),