termwiz-0.23.3/.cargo_vcs_info.json0000644000000001450000000000100126220ustar { "git": { "sha1": "a87358516004a652ad840bc1661bdf65ffc89b43" }, "path_in_vcs": "termwiz" }termwiz-0.23.3/CHANGELOG.md000064400000000000000000000340631046102023000132310ustar 00000000000000# Changelog All notable changes to this project will be documented in this file. ## [termwiz-0.23.3] - 2025-03-20 ### 💼 Other - Update changelog - Set workspace pest dep to 2.7 ## [termwiz-0.23.2] - 2025-03-19 ### 🐛 Bug Fixes - Tmux -CC error on %config-error (#6773) - Deal with Windows Terminal mouse move with no buttons SGR report ### 💼 Other - Add update-changelog.sh - Fix panic when appending long runs to clusterline - Update for Unicode 16 - Update for unicode 16 - Add is_white_space_(char|grapheme) helper functions - Bump version ## [termwiz-0.23.0] - 2025-02-10 ### 🚀 Features - Add a way to spawn populated LineEditor ### 🐛 Bug Fixes - Better handling of hyperlinks with parentheses ### 💼 Other - Support NO_COLOR environment variable (#5020) - Update criterion - Update reqwest to 0.12 - Speculative compile fix for termwiz - Dedup some nix versions - Update/dedup num, num-derive - Nix requires fs + mman for shm_open - Update terminfo - Remove semver dep - Fixup per code review - Fixup regex range - Parse ConEmu progress OSC sequence - Prep for making a new release - Update dynamic dep for publish ## [termwiz-0.22.0] - 2024-01-27 ### 🐛 Bug Fixes - Update bitflags to 2.0 and fix compilation errors - Update signal-hook to 0.3 and fix compilation errors - Formatting - Use serde with bitflags - Derive Eq on Selection - Issue 3935 handle F13-F24 (#3937) ### 💼 Other - :File -> EncodedLease - Update sha2 - Plumb more modifier+state information through - Improve support for numpad buttons - :Modifiers is now wezterm_input_types::Modifiers - Ignore caps/num lock when encoding keys in xterm encoding - Move led status to separate enum - Input: avoid panic for certain numpad keys - Use double height text for host key failure case - Windows: speculative build fix - Work better with tmux and conpty - Refactor terminal probing - Fix windows build - Adjust screensize probing - TeenyString: use heap string when col width > 2 - Ordered-float -> 4.1.0 - Add terminator to Sync capability - Update env-logger - Surface: Fix cell diffing in presence of wide cells - Surface: Fix cursor movement in DiffState - Bump version of crates.io publish - Prep for crates.io publish ### 🚜 Refactor - Dedup ctrl_mapping function - Move encode_modifiers to Modifiers::encode_xterm ### 📚 Documentation - Shift from return {} style to config.something style ### ⚙️ Miscellaneous Tasks - Update phf to 0.11 - Update nix to 0.26 - Update criterion to 0.4 ## [termwiz-0.20.0] - 2023-02-12 ### 🐛 Bug Fixes - Correctly set WHEEL_POSITIVE - *(input)* Support alt-left-bracket ### 💼 Other - Add statusline entries - Update base64 - Horizontal scroll support - Update Symbols Nerd Font Mono - Bump version ready for publish ### ⚡ Performance - Adjust clustering when bidi is disabled ## [termwiz-0.19.0] - 2022-11-02 ### 🐛 Bug Fixes - Temp fix for Android build error ### 💼 Other - Request xterm modifyOtherKeys - Update widechar_width for unicode 15 - Fixup for 32-bit systems - Upgrade finl_unicode to 1.2 - Release 0.19 ## [termwiz-0.18.0] - 2022-09-22 ### 💼 Other - Associate appdata with a Line - Remove reverse video attribute from Line - Use interior mutability for Line::set_appdata - Remove assertions - Slim down size of clustered line storage - Add test to track size_of Action - Save 8 bytes per line - Track size of sgr enum - Update finl_unicode - Update nerdfont symbol data - Fix recognizing \u{1b}[>4;m as modifyOtherKeys - Ignore various unsupported private mode codes - Recognize some dec private SGR codes - Add flag to force use of standard ANSI SGR codes - Prepare for a 0.18.0 release ### ⚡ Performance - Cache quads by line ## [termwiz-0.17.1] - 2022-08-03 ### 💼 Other - Fix min version dep on winapi. publish 0.17.1 ## [termwiz-0.17.0] - 2022-08-02 ### 🐛 Bug Fixes - Properly restore cooked mode in windows ### 💼 Other - Recognize utf8 encoded c1 codes in more cases - Update to use newer mouse protocol by default - Remove anyhow from public interface - Ordered-float 2.1 -> 2.5 - Avoid file io when terminfo db is pre-filled - Erase_cell could panic if erasing beyond EOL - Respect Dec Private Mode 8452 - Hide internal red, green, blue fields - Store 10bpc - Move fg/bg color accesses to accesors - Split color into thin/fat components - Cargo update, and a couple of dependabot suggestions - Improve CSI parsing fidelity - Simplify csi dispatch - Recognize the XTGETTCAP DCS sequence - Fixup regression in sgr parsing for empty parameter case - Parse APC sequences - Parse and encode kitty image protocol - Add KittyImageData::load_data - Add ImageData::hash - Change image frame caching scheme to use frame hash - Better fidelity Emoji_Presentation logic - Break clusters when presentation varies - Fixup window transparency - Replace LineBits::DIRTY with a sequence number - Update to include more tmux extensions - Fix test build when image feature is disabled - Improve performance of emoji presentation lookup - Fix off-by-one in computing line length - Restore line length pre-allocation - Update unicode-segmentation to 1.8 - Fix lost sync with the cell position in the renderer - Update bitflags -> 1.3 - Move key encoding to termwiz - Fix DCH removing cells instead of setting to current bg color - Ordered-float -> 2.8 - Fix encoding F1-F4 - Fix shaping metrics - Fancier tab bar - Allow degenerate empty parameter in iTerm2 protocol - Import widechar_width wcwidth implementation - Fix 10bpc color bug. Allow hsl color specs - Allow arbitrary whitespace between hsl color components - S/Fuschia/Fuchsia/g - Windows: force CP_UTF8, fix alt-screen and examples - Publish 0.15 - Introduce right&bottom padding to ImageCell - Fix overinvalidation of selection on Windows - Make seqno a required param for Line - Clamp grapheme column width to 2 - Sync with upstream wichdechar_width - Introduce KeyboardEncoding enum, existence of win32-input-mode - Generate win32-input-mode for a subset of keys - Fix modifier only win32-input-mode reporting - Add Backspace to win32-input-mode list - Revise win32-input-mode flow - Ordered-float -> 2.10 - Capture initial screen contents - Fix mouse reporting on windows - Recognize some bidi-related escape sequences - Allow harfbuzz to guess the script - Add experimental_bidi config option and very basic bidi - Feed reordered runs through to harfbuzz - Tag Line with bidi mode - Re-order numerics so that 10 comes after 1 etc. - Image -> 0.24 - Update widechar_width - Allow slightly poorly formed sixel data - Improve sixel parsing performance. - Remove leftover debug - Improve handling of image attachments - Add test for partial bracketed paste - Fix partial bracketed paste panic - Add comment about bracketed paste offset - Prep for crates.io - Fix code formatting - Remove pretty_env_loggger - Treat graphemes in Unassigned range as width=1 rather than 0 - Fixup test build for ambiguous width change - Use perfect hashing for emoji variation sequences - Ordered-float - Replace pretty_assertions dep with k9 - Nix -> 0.24 - Avoid panic with a malformed escape - Cut over to wezterm-dynamic - Allow specifying the animation speed for images - Implement OSC 1337 ReportCellSize - Add kitty keyboard CSI control escapes - Support kitty keyboard protocol - Fix key up events in neovim + kitty keyboard protocol - Increase MAX_OSC to load dynamic color scripts - Fix encoding for modified F1-F4 - Make emoji presentation very slightly more efficient - Add criterion benches for wcwidth - Micro-optimize grapheme_column_width - Add static WcLookupTable to codegen - Add bench for Cell creation/drop - Refactor Line::visible_cells() - Introduce possibility of alternate cell backing - Add clustered line storage for line - :as_str() -> Cow - Default to cluster storage - Avoid cluster -> vec conversions in a few more cases - Don't claim that visible_cells is double-ended - Micro-optimize ClusteredLine::new(), set_last_wrapped - Microoptimize ClusteredLine::set_last_cell_was_wrapped - Microoptimize set cell - Refactor getting logical lines - :wrap now prefers cluster storage - Refactor: split line into sub-modules - ColorSpec now allows for alpha to be tracked - Allow setting alpha for SGR fg, bg attributes - Use `6` for the rgba colorspace - Add test cases for parse_first_as_vec w/ OSC+ST - Ensure ST sequence is grouped with OSC - Bump version to 0.17 ### 🚜 Refactor - Move cursor sprite generation to be dynamic - Move color parsing into wezerm-color-types crate - Move sixel parser/builder to own file ### 📚 Documentation - Embed nerd fonts symbols on the nerdfonts page ## [termwiz-0.13.0] - 2021-04-14 ### 💼 Other - Add example program that strips escape sequences - Fix a widget layout and optimization issue - Fix panic in RgbColor::from_rgb_str w/ empty string - Fixup DECKPAM/DECANM/DECCKM interaction - Enable scrollback in the error window - Recognize wezterm as supporting iterm2 images - Implement window/pixel size responses - Fix DCS parsing - Fix dec private mode parsing - Shift Boxing of DCS around - Fix swapped width/height in size reporting sequences - Add types for sixel parsing - Sixel rendering basically working - Add dec private mode 1070 for sixel color map control - Add CursorVisibility - Separate CursorVisibility from CursorShape - Trim `num` dep to `num_traits` - Make serde an optional dep - Upgrade unicode-segmentation - Also allow `#FFF` form of color spec - Improve esctest BS test conformance - Improve rgb color parsing conformance with XParseColor - Improve CSI parsing conformance - Fix hyperlink matching issue with double wide chars - Improved emulation conformance in a number of areas - Recognize CSI > PP ; Pv m sequence - Improve Debug impl for EnterDeviceControlMode - Add Display impl for device control mode - Add basic support for DECRQSS - Add Overline support - Allow OperatingSystemCommandCode to have non-numeric mappings - Handle OSC L and OSC l - More freebsd compat - Implement leader key binding support - Fix bounds checking in Line::compute_double_click_range - Add a test to assert size of cell structs - Reduce Cell memory consumption by 24 bytes - Save 8 bytes per Cell in common case - Fixup windows tests after b3f51e8ee20fe8431d3a75e374dae1c149840a84 - Add a way to render previews - Avoid panic for some malformed escapes - Add OSC 133 Semantic Marker sequences - Add Cell::semantic_type - Add ScrollToPrompt key assignment - Fixup sixel width calculation - Normalize the lazy-static version - Deallocate "fat" attrs if all are none - Improve shaping of emoji - Improve fallback font scaling - Allow optional width and height specifier - Ordered-float -> 2.0 - Misc updates - Allow for CSI parameters to be : separated - Remove anyhow::Result from public API - Fixup win32 build - Really fixup windows build - Update to ordered-float 2.1 - Add window::effective_config() method - Add wezterm.format function - Improve restoring cursor visibility under tmux - Alternate plan for restoring cursor visibility in tmux - Revert tmux workarounds - Use cnorm instead of cvvis for CursorVisibility::Visible - Shrink-to-fit Line::cells when clearing the line - Remove redundant semicolons - Fix some clippy stuff - Do not use terminfo for unsupported 256-colors - Prep for release ### 📚 Documentation - Start documenting supporting escape sequences ## [termwiz-0.9.0] - 2020-05-17 ### 💼 Other - Allow using terminfo on Windows - Ensure virtual terminal processing is enabled on windows - Remove Position::NoChange, fixup multiline line editing and moar! - Improve performance of windows console renderer - Line editor: fixup cursor positioning for multiline - Windows: fix bounds check for cursor positioning - Windows: tidy up flushing a bit - Windows: fixup viewport handling - Windows: auto-detect virtual terminal support - Windows: allow ESC to be recognized again - Recognize MS terminal mode 25 for cursor visibility - Line editor: allow for multi-line prompts - Windows: toggle autonewline when toggling cooked/raw - Line editor: exit completion state for a single completion result - Line editor: allow application cursor keys - History::get() -> Option> - Line editor: allow embedded app to override key map - Line editor: allow custom editor actions - Line editor: add incremental history search - Line editor: add ChangeSequence helper - Line editor: fix a couple of bugs - Process OSC 110+: ResetDynamicColors - Use long form ST when rendering OSC - Fix categorization of F keys - Cut 0.9.0 release ## [termwiz-0.7.1] - 2020-04-04 ### 💼 Other - Fix poll interval. show update indicator - Windows: fix default text foreground color ## [termwiz-0.7.0] - 2020-02-22 ### 💼 Other - Lineedit: replace a println with render/flush - Make the E's show up on the cursor positioning test - Remove dep on palette - Do not depend on derive_builder - Bump regex to 1.0+ - Bump version for publish ## [termwiz-0.6.0] - 2020-01-18 ### 💼 Other - Fix a bug where the cursor style wasn't restore on exit - Fixup input parser to match backspace/delete - Fixup test case for 18bbd2ac6f69973ab9961e82f54a1e318dfbf6d5 - Windows: normalize SHIFT+ASCII ## [termwiz-0.5.0] - 2019-12-22 ### 💼 Other - Extract configuration to a trait ## [termwiz-0.4.0] - 2019-06-30 ### 💼 Other - Update version ## [termwiz-0.3.1] - 2019-06-03 ### 💼 Other - Avoid emitting a resize event on a spurious sigwinch read - Avoid emitting a wake event on a spurious pipe wakeup - Ensure that the tty is in blocking mode - Bump version for crates.io/streampager ## [termwiz-0.3.0] - 2019-06-02 ### 💼 Other - Use filedescriptor crate instead of RawFd bits - Use filedescriptor crate instead of RawHandle bits ## [termwiz-0.1.0] - 2019-05-28 ### 💼 Other - :contains is now stable; use it. - Fixup key_tester example on macOS - Add very basic line editor - Improve line editor - Add ctrl-L repaint/refresh binding - Split out action and movement concepts - Implement ctrl-k and fixup deletion of emoji - Add word movement commands - Add ctrl-w to delete word up to cursor - Ctrl-c cancels the current line - Introduce host concept, prompt and coloring - Add history - Add ctrl-d -> EOF - Add tab completion support - Prep for publishing on crates.io termwiz-0.23.3/Cargo.lock0000644000001623320000000000100106040ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "adler2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "aligned-vec" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" [[package]] name = "anes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arbitrary" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" [[package]] name = "arg_enum_proc_macro" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "atomic" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" dependencies = [ "bytemuck", ] [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "av1-grain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" dependencies = [ "anyhow", "arrayvec", "log", "nom", "num-rational", "v_frame", ] [[package]] name = "avif-serialize" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" dependencies = [ "arrayvec", ] [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bit-set" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bit_field" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] [[package]] name = "bitstream-io" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "built" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "byteorder-lite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "cassowary" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "cast" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", "libc", "shlex", ] [[package]] name = "cfg-expr" version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "ciborium" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", "serde", ] [[package]] name = "ciborium-io" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", ] [[package]] name = "clap" version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" dependencies = [ "anstyle", "clap_lex", ] [[package]] name = "clap_lex" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "colored" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", "windows-sys 0.59.0", ] [[package]] name = "cpufeatures" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "criterion" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", "cast", "ciborium", "clap", "criterion-plot", "is-terminal", "itertools 0.10.5", "num-traits", "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", "serde_derive", "serde_json", "tinytemplate", "walkdir", ] [[package]] name = "criterion-plot" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", "itertools 0.10.5", ] [[package]] name = "crossbeam-deque" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "csscolorparser" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" dependencies = [ "lab", "phf", ] [[package]] name = "deltae" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "env_filter" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", ] [[package]] name = "env_logger" version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", "env_filter", "humantime", "log", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", "windows-sys 0.59.0", ] [[package]] name = "euclid" version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" dependencies = [ "num-traits", ] [[package]] name = "exr" version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", "half", "lebe", "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", ] [[package]] name = "fancy-regex" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" dependencies = [ "bit-set", "regex", ] [[package]] name = "fdeflate" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "filedescriptor" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" dependencies = [ "libc", "thiserror 1.0.69", "winapi", ] [[package]] name = "finl_unicode" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94c970b525906eb37d3940083aa65b95e481fc1857d467d13374e1d925cfc163" [[package]] name = "fixedbitset" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", "libc", "wasi 0.13.3+wasi-0.2.2", "windows-targets 0.52.6", ] [[package]] name = "gif" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", ] [[package]] name = "half" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", ] [[package]] name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "image" version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", "exr", "gif", "image-webp", "num-traits", "png", "qoi", "ravif", "rayon", "rgb", "tiff", "zune-core", "zune-jpeg", ] [[package]] name = "image-webp" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" dependencies = [ "byteorder-lite", "quick-error", ] [[package]] name = "imgref" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" [[package]] name = "indexmap" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "interpolate_name" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "io-lifetimes" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] [[package]] name = "is-terminal" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", "windows-sys 0.59.0", ] [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itertools" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "k9" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "088bcebb5b68b1b14b64d7f05b0f802719250b97fdc0338ec42529ea777ed614" dependencies = [ "anyhow", "colored", "diff", "lazy_static", "libc", "proc-macro2", "regex", "syn 2.0.99", "terminal_size", ] [[package]] name = "lab" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leb128" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "lebe" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libfuzzer-sys" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" dependencies = [ "arbitrary", "cc", ] [[package]] name = "linux-raw-sys" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "log" version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "loop9" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ "imgref", ] [[package]] name = "mac_address" version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" dependencies = [ "nix", "winapi", ] [[package]] name = "maybe-rayon" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", "rayon", ] [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmem" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" [[package]] name = "memoffset" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", "simd-adler32", ] [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", "memoffset", ] [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "noop_proc_macro" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "num-bigint" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", ] [[package]] name = "num-derive" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "num-integer" version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ "num-traits", ] [[package]] name = "num-rational" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ "num-bigint", "num-integer", "num-traits", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "oorandom" version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "ordered-float" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ "num-traits", ] [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pest" version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pest_derive" version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ "pest", "pest_generator", ] [[package]] name = "pest_generator" version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "pest_meta" version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" dependencies = [ "once_cell", "pest", "sha2", ] [[package]] name = "phf" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", "phf_shared", ] [[package]] name = "phf_codegen" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ "phf_generator", "phf_shared", ] [[package]] name = "phf_generator" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", "rand", ] [[package]] name = "phf_macros" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "phf_shared" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plotters" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] [[package]] name = "png" version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] [[package]] name = "ppv-lite86" version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ "zerocopy", ] [[package]] name = "proc-macro2" version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", "syn 2.0.99", ] [[package]] name = "qoi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ "bytemuck", ] [[package]] name = "quick-error" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.15", ] [[package]] name = "rav1e" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" dependencies = [ "arbitrary", "arg_enum_proc_macro", "arrayvec", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", "itertools 0.12.1", "libc", "libfuzzer-sys", "log", "maybe-rayon", "new_debug_unreachable", "noop_proc_macro", "num-derive", "num-traits", "once_cell", "paste", "profiling", "rand", "rand_chacha", "simd_helpers", "system-deps", "thiserror 1.0.69", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", "rav1e", "rayon", "rgb", ] [[package]] name = "rayon" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "regex" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" [[package]] name = "rustix" version = "0.37.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", "linux-raw-sys", "windows-sys 0.48.0", ] [[package]] name = "rustversion" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "serde" version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "serde_json" version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-registry" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "simd_helpers" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" dependencies = [ "quote", ] [[package]] name = "siphasher" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "smallvec" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "system-deps" version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "target-lexicon" version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "terminal_size" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" dependencies = [ "rustix", "windows-sys 0.48.0", ] [[package]] name = "terminfo" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" dependencies = [ "fnv", "nom", "phf", "phf_codegen", ] [[package]] name = "termios" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" dependencies = [ "libc", ] [[package]] name = "termwiz" version = "0.23.3" dependencies = [ "anyhow", "base64", "bitflags 2.9.0", "cassowary", "criterion", "env_logger", "fancy-regex", "filedescriptor", "finl_unicode", "fixedbitset", "fnv", "hex", "image", "k9", "lazy_static", "libc", "log", "memmem", "nix", "num-derive", "num-traits", "ordered-float", "pest", "pest_derive", "phf", "serde", "sha2", "signal-hook", "siphasher", "terminfo", "termios", "thiserror 1.0.69", "ucd-trie", "unicode-segmentation", "varbincode", "vtparse", "wezterm-bidi", "wezterm-blob-leases", "wezterm-color-types", "wezterm-dynamic", "wezterm-input-types", "winapi", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "thiserror-impl" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "tiff" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", "weezl", ] [[package]] name = "tinytemplate" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ "serde", "serde_json", ] [[package]] name = "toml" version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" dependencies = [ "atomic", "getrandom 0.3.1", "serde", ] [[package]] name = "v_frame" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" dependencies = [ "aligned-vec", "num-traits", "wasm-bindgen", ] [[package]] name = "varbincode" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b712fa900b441e2d5226a094ca37ca70c0d26d26b79822a5cf34a853a9e26f9f" dependencies = [ "byteorder", "leb128", "serde", ] [[package]] name = "version-compare" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vtparse" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" dependencies = [ "utf8parse", ] [[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" version = "0.13.3+wasi-0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" dependencies = [ "wit-bindgen-rt", ] [[package]] name = "wasm-bindgen" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", "syn 2.0.99", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "weezl" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wezterm-bidi" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" dependencies = [ "log", "wezterm-dynamic", ] [[package]] name = "wezterm-blob-leases" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" dependencies = [ "getrandom 0.3.1", "mac_address", "serde", "sha2", "thiserror 1.0.69", "uuid", ] [[package]] name = "wezterm-color-types" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" dependencies = [ "csscolorparser", "deltae", "lazy_static", "serde", "wezterm-dynamic", ] [[package]] name = "wezterm-dynamic" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" dependencies = [ "log", "ordered-float", "strsim", "thiserror 1.0.69", "wezterm-dynamic-derive", ] [[package]] name = "wezterm-dynamic-derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "wezterm-input-types" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" dependencies = [ "bitflags 1.3.2", "euclid", "lazy_static", "serde", "wezterm-dynamic", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets 0.48.5", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-targets" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm 0.48.5", "windows_aarch64_msvc 0.48.5", "windows_i686_gnu 0.48.5", "windows_i686_msvc 0.48.5", "windows_x86_64_gnu 0.48.5", "windows_x86_64_gnullvm 0.48.5", "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen-rt" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ "bitflags 2.9.0", ] [[package]] name = "zerocopy" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", "syn 2.0.99", ] [[package]] name = "zune-core" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" [[package]] name = "zune-inflate" version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] [[package]] name = "zune-jpeg" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" dependencies = [ "zune-core", ] termwiz-0.23.3/Cargo.toml0000644000000104030000000000100106160ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2018" name = "termwiz" version = "0.23.3" authors = ["Wez Furlong"] build = false autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "Terminal Wizardry for Unix and Windows" documentation = "https://docs.rs/termwiz" readme = "README.md" keywords = [ "terminal", "readline", "console", "curses", ] license = "MIT" repository = "https://github.com/wezterm/wezterm" resolver = "2" [package.metadata.docs.rs] features = ["docs"] rustdoc-args = [ "--cfg", 'feature="docs"', ] [features] docs = [ "widgets", "use_serde", ] use_image = ["image"] use_serde = [ "serde", "wezterm-color-types/use_serde", "wezterm-blob-leases/serde", "bitflags/serde", "wezterm-input-types/serde", ] widgets = [ "cassowary", "fnv", ] [lib] name = "termwiz" path = "src/lib.rs" [[example]] name = "buffered_terminal" path = "examples/buffered_terminal.rs" [[example]] name = "gennerdfonts" path = "examples/gennerdfonts.rs" [[example]] name = "hello" path = "examples/hello.rs" [[example]] name = "key_tester" path = "examples/key_tester.rs" [[example]] name = "line_editor" path = "examples/line_editor.rs" [[example]] name = "strip-ansi-escapes" path = "examples/strip-ansi-escapes.rs" [[example]] name = "terminal_direct" path = "examples/terminal_direct.rs" [[example]] name = "widgets_basic" path = "examples/widgets_basic.rs" [[example]] name = "widgets_nested" path = "examples/widgets_nested.rs" [[bench]] name = "cell" path = "benches/cell.rs" harness = false [[bench]] name = "wcwidth" path = "benches/wcwidth.rs" harness = false [dependencies.anyhow] version = "1.0" [dependencies.base64] version = "0.22" [dependencies.bitflags] version = "2.0" [dependencies.cassowary] version = "0.3" optional = true [dependencies.fancy-regex] version = "0.11" [dependencies.filedescriptor] version = "0.8.3" [dependencies.finl_unicode] version = "1.2" [dependencies.fixedbitset] version = "0.4" [dependencies.fnv] version = "1.0" optional = true [dependencies.hex] version = "0.4" [dependencies.image] version = "0.25" optional = true [dependencies.lazy_static] version = "1.4" [dependencies.libc] version = "0.2" [dependencies.log] version = "0.4" [dependencies.memmem] version = "0.1" [dependencies.num-derive] version = "0.4" [dependencies.num-traits] version = "0.2" [dependencies.ordered-float] version = "4.1" [dependencies.pest] version = "2.7" [dependencies.pest_derive] version = "2.7" [dependencies.phf] version = "0.11" [dependencies.serde] version = "1.0" features = [ "derive", "rc", "derive", ] optional = true [dependencies.sha2] version = "0.10" [dependencies.siphasher] version = "1.0.1" [dependencies.terminfo] version = "0.9" [dependencies.thiserror] version = "1.0" [dependencies.ucd-trie] version = "0.1" [dependencies.unicode-segmentation] version = "1.12" [dependencies.vtparse] version = "0.6.2" [dependencies.wezterm-bidi] version = "0.2.3" [dependencies.wezterm-blob-leases] version = "0.1.1" [dependencies.wezterm-color-types] version = "0.3" [dependencies.wezterm-dynamic] version = "0.2.1" [dependencies.wezterm-input-types] version = "0.1" [dev-dependencies.criterion] version = "0.5" [dev-dependencies.env_logger] version = "0.11" [dev-dependencies.k9] version = "0.12.0" [dev-dependencies.varbincode] version = "0.1" [target."cfg(unix)".dependencies.nix] version = "0.29" features = [ "mman", "fs", ] [target."cfg(unix)".dependencies.signal-hook] version = "0.3" [target."cfg(unix)".dependencies.termios] version = "0.3" [target."cfg(windows)".dependencies.winapi] version = "0.3.9" features = [ "winbase", "winerror", "winnls", "winuser", "consoleapi", "handleapi", "fileapi", "synchapi", "memoryapi", "winnt", "impl-default", ] termwiz-0.23.3/Cargo.toml.orig0000644000000043530000000000100115640ustar [package] authors = ["Wez Furlong"] name = "termwiz" version = "0.23.3" edition = "2018" repository = "https://github.com/wezterm/wezterm" description = "Terminal Wizardry for Unix and Windows" license = "MIT" documentation = "https://docs.rs/termwiz" keywords = ["terminal", "readline", "console", "curses"] readme = "README.md" [dependencies] anyhow.workspace = true base64.workspace = true bitflags = "2.0" cassowary = {workspace=true, optional=true} fancy-regex.workspace = true filedescriptor.workspace = true finl_unicode.workspace = true fixedbitset.workspace = true fnv = {workspace=true, optional=true} hex.workspace = true image = {workspace=true, optional=true} lazy_static.workspace = true libc.workspace = true log.workspace = true memmem.workspace = true num-derive.workspace = true num-traits.workspace = true ordered-float.workspace = true pest.workspace = true pest_derive.workspace = true phf.workspace = true serde = {workspace=true, features = ["rc", "derive"], optional=true} sha2.workspace = true siphasher.workspace = true terminfo.workspace = true thiserror.workspace = true ucd-trie.workspace = true unicode-segmentation.workspace = true vtparse.workspace = true wezterm-bidi.workspace = true wezterm-blob-leases.workspace = true wezterm-color-types.workspace = true wezterm-dynamic.workspace = true wezterm-input-types.workspace = true [features] widgets = ["cassowary", "fnv"] use_serde = ["serde", "wezterm-color-types/use_serde", "wezterm-blob-leases/serde", "bitflags/serde", "wezterm-input-types/serde"] use_image = ["image"] docs = ["widgets", "use_serde"] [dev-dependencies] criterion.workspace = true env_logger.workspace = true k9.workspace = true varbincode.workspace = true [target."cfg(unix)".dependencies] signal-hook.workspace = true termios.workspace = true nix = {workspace=true, features=["mman", "fs"]} [target."cfg(windows)".dependencies.winapi] features = [ "winbase", "winerror", "winnls", "winuser", "consoleapi", "handleapi", "fileapi", "synchapi", "memoryapi", "winnt", "impl-default" ] workspace = true [package.metadata.docs.rs] features = ["docs"] rustdoc-args = ["--cfg", "feature=\"docs\""] [[bench]] name = "wcwidth" harness = false [[bench]] name = "cell" harness = false termwiz-0.23.3/Cargo.toml.orig000064400000000000000000000043531046102023000143060ustar 00000000000000[package] authors = ["Wez Furlong"] name = "termwiz" version = "0.23.3" edition = "2018" repository = "https://github.com/wezterm/wezterm" description = "Terminal Wizardry for Unix and Windows" license = "MIT" documentation = "https://docs.rs/termwiz" keywords = ["terminal", "readline", "console", "curses"] readme = "README.md" [dependencies] anyhow.workspace = true base64.workspace = true bitflags = "2.0" cassowary = {workspace=true, optional=true} fancy-regex.workspace = true filedescriptor.workspace = true finl_unicode.workspace = true fixedbitset.workspace = true fnv = {workspace=true, optional=true} hex.workspace = true image = {workspace=true, optional=true} lazy_static.workspace = true libc.workspace = true log.workspace = true memmem.workspace = true num-derive.workspace = true num-traits.workspace = true ordered-float.workspace = true pest.workspace = true pest_derive.workspace = true phf.workspace = true serde = {workspace=true, features = ["rc", "derive"], optional=true} sha2.workspace = true siphasher.workspace = true terminfo.workspace = true thiserror.workspace = true ucd-trie.workspace = true unicode-segmentation.workspace = true vtparse.workspace = true wezterm-bidi.workspace = true wezterm-blob-leases.workspace = true wezterm-color-types.workspace = true wezterm-dynamic.workspace = true wezterm-input-types.workspace = true [features] widgets = ["cassowary", "fnv"] use_serde = ["serde", "wezterm-color-types/use_serde", "wezterm-blob-leases/serde", "bitflags/serde", "wezterm-input-types/serde"] use_image = ["image"] docs = ["widgets", "use_serde"] [dev-dependencies] criterion.workspace = true env_logger.workspace = true k9.workspace = true varbincode.workspace = true [target."cfg(unix)".dependencies] signal-hook.workspace = true termios.workspace = true nix = {workspace=true, features=["mman", "fs"]} [target."cfg(windows)".dependencies.winapi] features = [ "winbase", "winerror", "winnls", "winuser", "consoleapi", "handleapi", "fileapi", "synchapi", "memoryapi", "winnt", "impl-default" ] workspace = true [package.metadata.docs.rs] features = ["docs"] rustdoc-args = ["--cfg", "feature=\"docs\""] [[bench]] name = "wcwidth" harness = false [[bench]] name = "cell" harness = false termwiz-0.23.3/LICENSE.md000064400000000000000000000020541046102023000130170ustar 00000000000000MIT License Copyright (c) 2018 Wez Furlong Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. termwiz-0.23.3/README.md000064400000000000000000000035501046102023000126740ustar 00000000000000# Terminal Wizardry This is a rust crate that provides a number of support functions for applications interested in either displaying data to a terminal or in building a terminal emulator. It is currently in active development and subject to fairly wild sweeping changes. Included functionality: * `Surface` models a terminal display and its component `Cell`s * Terminal attributes are aware of modern features such as True Color, [Hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda) and will also support sixel and iterm style terminal graphics display. * `Surface`s include a log of `Change`s and an API for consuming and applying deltas. This is a powerful building block for synchronizing screen instances. * Escape sequence parser decodes inscrutable escape sequences and gives them semantic meaning, making the code that uses them clearer. The decoded escapes can be re-encoded, allowing applications to start with the semantic meaning and emit the appropriate escape sequence without embedding obscure binary bytes. * `Capabilities` allows probing for terminal capabilities that may not be included in the system terminfo database, and overriding them in an embedding application. * `Terminal` trait provides an abstraction over unix style ttys and Windows style console APIs. `Change`s from `Surface` can be rendered to `Terminal`s. `Terminal`s allow decoding mouse and keyboard inputs in both blocking or non-blocking mode. * `Widget` trait allows composition of UI elements at a higher level. * `LineEditor` implements shell-like line editing functionality. # Windows Support Termwiz understands how to work with both the legacy console APIs and the new PTY and virtual terminal features available in Windows 10, allowing for true color terminal applications on Windows 10. # Documentation https://docs.rs/termwiz termwiz-0.23.3/benches/cell.rs000064400000000000000000000015351046102023000143120ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, Criterion}; use termwiz::cell::{Cell, CellAttributes}; pub fn criterion_benchmark(c: &mut Criterion) { c.bench_function("Cell::blank", |b| b.iter(|| black_box(Cell::blank()))); c.bench_function("Cell::new", |b| { b.iter(|| Cell::new(black_box('a'), CellAttributes::default())) }); c.bench_function("Cell::new_grapheme", |b| { b.iter(|| Cell::new_grapheme(black_box("a"), CellAttributes::default(), None)) }); c.bench_function("Cell::new_grapheme_with_width", |b| { b.iter(|| Cell::new_grapheme_with_width(black_box("a"), 1, CellAttributes::default())) }); c.bench_function("CellAttributes::blank", |b| { b.iter(|| black_box(CellAttributes::blank())) }); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); termwiz-0.23.3/benches/wcwidth.rs000064400000000000000000000060601046102023000150420ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, Criterion}; use termwiz::cell::{grapheme_column_width, UnicodeVersion}; include!("../src/widechar_width.rs"); pub fn criterion_benchmark(c: &mut Criterion) { let table = WcLookupTable::new(); { let mut group = c.benchmark_group("Classify ASCII"); group.bench_function("WcWidth", |b| b.iter(|| WcWidth::from_char(black_box('a')))); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('a'))) }); group.finish(); } { let mut group = c.benchmark_group("Classify DoubleWidth"); group.bench_function("WcWidth", |b| { b.iter(|| WcWidth::from_char(black_box('\u{1100}'))) }); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('\u{1100}'))) }); group.finish(); } { let mut group = c.benchmark_group("Classify WidenedIn9"); group.bench_function("WcWidth", |b| { b.iter(|| WcWidth::from_char(black_box('\u{231a}'))) }); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('\u{231a}'))) }); group.finish(); } { let mut group = c.benchmark_group("Classify Unassigned"); group.bench_function("WcWidth", |b| { b.iter(|| WcWidth::from_char(black_box('\u{fbc9}'))) }); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('\u{fbc9}'))) }); group.finish(); } { let mut group = c.benchmark_group("column_width ASCII"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("a"), None)) }); group.finish(); } { let mut group = c.benchmark_group("column_width variation selector"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{00a9}\u{FE0F}"), None)) }); group.finish(); } { let mut group = c.benchmark_group("column_width variation selector unicode 14"); let version = UnicodeVersion { version: 14, ambiguous_are_wide: false, }; group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{00a9}\u{FE0F}"), Some(version))) }); group.finish(); } { let mut group = c.benchmark_group("column_width WidenedIn9"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{231a}"), None)) }); group.finish(); } { let mut group = c.benchmark_group("column_width Unassigned"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{fbc9}"), None)) }); group.finish(); } } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); termwiz-0.23.3/cliff.toml000064400000000000000000000062511046102023000133760ustar 00000000000000# git-cliff ~ default configuration file # https://git-cliff.org/docs/configuration # # Lines starting with "#" are comments. # Configuration options are organized into tables and keys. # See documentation for more information on available options. [changelog] # template for the changelog header header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} {% for commit in commits %} - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**] {% endif %}\ {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ # template for the changelog footer footer = """ """ # remove the leading and trailing s trim = true # postprocessors postprocessors = [ # { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL ] # render body even when there are no releases to process # render_always = true # output file path # output = "test.md" [git] # parse the commits based on https://www.conventionalcommits.org conventional_commits = true # filter out the commits that are not conventional filter_unconventional = true # process each line of a commit as an individual commit split_commits = false # regex for preprocessing the commit messages commit_preprocessors = [ # Replace issue numbers #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, # Check spelling of the commit with https://github.com/crate-ci/typos # If the spelling is incorrect, it will be automatically fixed. #{ pattern = '.*', replace_command = 'typos --write-changes -' }, ] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "🚀 Features" }, { message = "^fix", group = "🐛 Bug Fixes" }, { message = "^doc", group = "📚 Documentation" }, { message = "^perf", group = "⚡ Performance" }, { message = "^refactor", group = "🚜 Refactor" }, { message = "^style", group = "🎨 Styling" }, { message = "^test", group = "🧪 Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore\\(deps.*\\)", skip = true }, { message = "^chore\\(pr\\)", skip = true }, { message = "^chore\\(pull\\)", skip = true }, { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, { body = ".*security", group = "🛡️ Security" }, { message = "^revert", group = "◀️ Revert" }, { message = ".*", group = "💼 Other" }, ] # filter out the commits that are not matched by commit parsers filter_commits = false # sort the tags topologically topo_order = false # sort the commits inside sections by oldest/newest order sort_commits = "oldest" termwiz-0.23.3/data/wezterm000064400000000000000000000054351046102023000137520ustar 00000000000000 wezterm|Wez's terminal emulatorP&*.9JLPWYfjnx|#').26<@DHNTZ`fjosx}1:LOZ]_b !(/6=DKRX^elsz$+2:BJRZbjry }  [%i%p1%d;%p2%dr[%i%p1%dG[%i%p1%d;%p2%dH [?25l[?12l[?25h[?12;25h]2;\(0[?1049h[%p1%dX(B(B[?1049l[?5h$<100/>[?5l\[!p[?3;4l>[3~OBOP[21~OQOROS[15~[17~[18~[19~[20~OH[2~OD[6~[5~OCOA[?1l>[?1h=[?1034l[?1034h[%p1%dP[%p1%dM[%p1%dB[%p1%d@[%p1%dS[%p1%dL[%p1%dD[%p1%dC[%p1%dT[%p1%dA%p1%c[%p2%{1}%-%dbc]104[!p[?3;4l>8[%i%p1%dd7 M%?%p9%t(0%e(B%;[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;mH ]0;OE``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~[?7h[?7lOFOM[3;2~[2;2~[6;2~[5;2~[23~[24~[15;2~[17;2~[18;2~[19;2~[20;2~[21;2~[23;2~[24;2~[15;5~[17;5~[18;5~[19;5~[20;5~[21;5~[23;5~[24;5~[15;6~[17;6~[18;6~[19;6~[20;6~[21;6~[23;6~[24;6~[15;3~[17;3~[18;3~[19;3~[20;3~[21;3~[23;3~[24;3~[%i%d;%dR[?%[;0123456789]c]104]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\[<[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;mlm '%+jp{ !$),16]112]12;%p1%s]52;%p1%s;%p2%s[2 q[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m[4:%p1%dm[%p1%d q[?2026%?%p1%{1}%-%tl%eh[?1006;1000%?%p1%{1}%=%th%el%;[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;TcCrCsMsSeSetulcSmolSmulxSsSyncXMrmxxsmxxxmtermwiz-0.23.3/data/wezterm.terminfo000064400000000000000000000107051046102023000155700ustar 00000000000000# This is Wez's term definition for wezterm. # It was reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color # and then has some additions in the top few lines (until the line starting # with am). # Tc: true color boolean for tmux # sitm/ritm: italics # Ms modifies the selection/clipboard. Its parameters are # p1 = the storage unit (clipboard, selection or cut buffer) # p2 = the base64-encoded clipboard content. # # Ss is used to set the cursor style as described by the DECSCUSR # function to a block or underline. # Se resets the cursor style to the terminal power-on default. # Smulx defines kitty style underline escape sequence support # # hs, dsl, fsl, tsl are used by nvim to amend the "status line". # These are not normally present for xterm and have assumed values # when TERM==xterm. When using this terminfo file that assumption is not # true and that functionality is broken. # We follow the foot's terminfo settings for these, based on # https://codeberg.org/dnkl/foot/pulls/243/files # although we use OSC 0 for the title rather than OSC 2. # https://github.com/neovim/neovim/issues/20706 # https://github.com/wezterm/wezterm/issues/2635 wezterm|Wez's terminal emulator, Tc, hs, sitm=\E[3m, ritm=\E[23m, Cr=\E]112\007, Cs=\E]12;%p1%s\007, Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2\sq, Ss=\E[%p1%d\sq, Smulx=\E[4:%p1%dm, Sync=\E[?2026%?%p1%{1}%-%tl%eh%;, Setulc=\E[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m, Smol=\E[53m, am, bce, ccc, km, mc5i, mir, msgr, npc, xenl, colors#0x100, cols#80, it#8, lines#24, pairs#0x7fff, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, dsl=\E]2;\E\\, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, fsl=\E\\, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=^?, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~, kind=\E[1;2B, knp=\E[6~, kpp=\E[5~, kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em, oc=\E]104\007, op=\E[39;49m, rc=\E8, rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l, rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rmxx=\E[29m, rs1=\Ec\E]104\007, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h\E[22;0;0t, smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m, smxx=\E[9m, tbc=\E[3g, tsl=\E]0;, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd, XM=\E[?1003;1006%?%p1%{1}%=%th%el%;, kmous=\E[<, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;, termwiz-0.23.3/data/xterm-256color000064400000000000000000000050211046102023000147540ustar 00000000000000%xterm-256color|xterm with 256 colorsP&*.9JLPWYfjnx|$(,26:>DJPV\`einsw~ '0BEPSUX  '.5<CIOV]dks{#+3;CKS[cjqx nsy} [%i%p1%d;%p2%dr[%i%p1%dG[%i%p1%d;%p2%dH [?25l[?12l[?25h[?12;25h(0[?1049h[%p1%dX(B(B[?1049l[?5h$<100/>[?5l[!p[?3;4l>[3~OBOP[21~OQOROS[15~[17~[18~[19~[20~OH[2~OD[6~[5~OCOA[?1l>[?1h=[?1034l[?1034h[%p1%dP[%p1%dM[%p1%dB[%p1%d@[%p1%dS[%p1%dL[%p1%dD[%p1%dC[%p1%dT[%p1%dA%p1%c[%p2%{1}%-%dbc]104[!p[?3;4l>8[%i%p1%dd7 M%?%p9%t(0%e(B%;[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;mH OE``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~[?7h[?7lOFOM[3;2~[2;2~[6;2~[5;2~[23~[24~[15;2~[17;2~[18;2~[19;2~[20;2~[21;2~[23;2~[24;2~[15;5~[17;5~[18;5~[19;5~[20;5~[21;5~[23;5~[24;5~[15;6~[17;6~[18;6~[19;6~[20;6~[21;6~[23;6~[24;6~[15;3~[17;3~[18;3~[19;3~[20;3~[21;3~[23;3~[24;3~[%i%d;%dR[?%[;0123456789]c]104]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;mlm G%+ ]112]12;%p1%s]52;%p1%s;%p2%s[2 q[%p1%d qTcCrCsMsSeSstermwiz-0.23.3/data/xterm-256color-italic.terminfo000064400000000000000000000074051046102023000200510ustar 00000000000000# This is Wez's augmented term definition for xterm. # It was reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color # and then has some additions in the top few lines (until the line starting # with am). # Tc: true color boolean for tmux # sitm/ritm: italics # Ms modifies the selection/clipboard. Its parameters are # p1 = the storage unit (clipboard, selection or cut buffer) # p2 = the base64-encoded clipboard content. # # Ss is used to set the cursor style as described by the DECSCUSR # function to a block or underline. # Se resets the cursor style to the terminal power-on default. xterm-256color|xterm with 256 colors, Tc, sitm=\E[3m, ritm=\E[23m, Cr=\E]112\007, Cs=\E]12;%p1%s\007, Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2\sq, Ss=\E[%p1%d\sq, am, bce, ccc, km, mc5i, mir, msgr, npc, xenl, colors#0x100, cols#80, it#8, lines#24, pairs#0x7fff, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=^?, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, knp=\E[6~, kpp=\E[5~, kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em, oc=\E]104\007, op=\E[39;49m, rc=\E8, rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l, rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec\E]104\007, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h\E[22;0;0t, smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd, # A xterm-256color based TERMINFO that adds the escape sequences for italic. xterm-256color-italic|xterm with 256 colors and italic, Tc, sitm=\E[3m, ritm=\E[23m, use=xterm-256color, termwiz-0.23.3/examples/buffered_terminal.rs000064400000000000000000000020041046102023000172470ustar 00000000000000//! This example shows how to use `BufferedTerminal` to queue //! up changes and then flush them. `BufferedTerminal` enables //! optimizing the output sequence to update the screen, which is //! important on links with poor connectivity. use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::AnsiColor; use termwiz::surface::Change; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let mut terminal = new_terminal(caps)?; terminal.set_raw_mode()?; let mut buf = BufferedTerminal::new(terminal)?; buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Maroon.into(), ))); buf.add_change("Hello world\r\n"); buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Red.into(), ))); buf.add_change("and in red here\r\n"); buf.flush()?; Ok(()) } termwiz-0.23.3/examples/gennerdfonts.rs000064400000000000000000000004641046102023000162760ustar 00000000000000//! This is used to generate a table in the wezterm docs fn main() { println!("| | |"); println!("|-|-|"); for &(label, c) in termwiz::nerdfonts::NERD_FONT_GLYPHS { println!( "|&#x{:x};|{}|", c as u32, label ); } } termwiz-0.23.3/examples/hello.rs000064400000000000000000000035571046102023000147130ustar 00000000000000use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::AnsiColor; use termwiz::input::{InputEvent, KeyCode, KeyEvent}; use termwiz::surface::{Change, Position, Surface}; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let terminal = new_terminal(caps)?; let mut buf = BufferedTerminal::new(terminal)?; let mut block = Surface::new(5, 5); block.add_change(Change::ClearScreen(AnsiColor::Blue.into())); buf.draw_from_screen(&block, 10, 10); buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Maroon.into(), ))); buf.add_change("Hello world\r\n"); buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Red.into(), ))); buf.add_change("and in red here\r\n"); buf.add_change(Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(20), }); buf.flush()?; buf.terminal().set_raw_mode()?; loop { match buf.terminal().poll_input(None) { Ok(Some(input)) => match input { InputEvent::Key(KeyEvent { key: KeyCode::Escape, .. }) => { break; } InputEvent::Key(KeyEvent { key: KeyCode::Char(c), .. }) => { buf.add_change(format!("{}", c)); buf.flush()?; } _ => { print!("{:?}\r\n", input); } }, Ok(None) => {} Err(e) => { print!("{:?}\r\n", e); break; } } } Ok(()) } termwiz-0.23.3/examples/key_tester.rs000064400000000000000000000011411046102023000157510ustar 00000000000000use termwiz::caps::Capabilities; use termwiz::input::{InputEvent, KeyCode, KeyEvent, Modifiers}; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; const CTRL_C: KeyEvent = KeyEvent { key: KeyCode::Char('c'), modifiers: Modifiers::CTRL, }; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let mut terminal = new_terminal(caps)?; terminal.set_raw_mode()?; while let Some(event) = terminal.poll_input(None)? { print!("{:?}\r\n", event); if event == InputEvent::Key(CTRL_C) { break; } } Ok(()) } termwiz-0.23.3/examples/line_editor.rs000064400000000000000000000071201046102023000160730ustar 00000000000000use std::str::FromStr; use termwiz::cell::AttributeChange; use termwiz::color::{AnsiColor, ColorAttribute, SrgbaTuple}; use termwiz::lineedit::*; #[derive(Default)] struct Host { history: BasicHistory, } impl LineEditorHost for Host { // Render the prompt with a darkslateblue background color if // the terminal supports true color, otherwise render it with // a navy blue ansi color. fn render_prompt(&self, prompt: &str) -> Vec { vec![ OutputElement::Attribute(AttributeChange::Background( ColorAttribute::TrueColorWithPaletteFallback( SrgbaTuple::from_str("darkslateblue").unwrap(), AnsiColor::Navy.into(), ), )), OutputElement::Text(prompt.to_owned()), ] } fn history(&mut self) -> &mut dyn History { &mut self.history } /// Demo of the completion API for words starting with "h" or "he" fn complete(&self, line: &str, cursor_position: usize) -> Vec { let mut candidates = vec![]; if let Some((range, word)) = word_at_cursor(line, cursor_position) { let words = &["hello", "help", "he-man"]; for w in words { if w.starts_with(word) { candidates.push(CompletionCandidate { range: range.clone(), text: w.to_string(), }); } } } candidates } } /// This is a conceptually simple function that computes the bounds /// of the whitespace delimited word at the specified cursor position /// in the supplied line string. /// It returns the range and the corresponding slice out of the line. /// This function is sufficient for example purposes; in a real application /// the equivalent function would need to be aware of quoting and other /// application specific context. fn word_at_cursor(line: &str, cursor_position: usize) -> Option<(std::ops::Range, &str)> { let char_indices: Vec<(usize, char)> = line.char_indices().collect(); if char_indices.is_empty() { return None; } let char_position = char_indices .iter() .position(|(idx, _)| *idx == cursor_position) .unwrap_or(char_indices.len()); // Look back until we find whitespace let mut start_position = char_position; while start_position > 0 && start_position <= char_indices.len() && !char_indices[start_position - 1].1.is_whitespace() { start_position -= 1; } // Look forwards until we find whitespace let mut end_position = char_position; while end_position < char_indices.len() && !char_indices[end_position].1.is_whitespace() { end_position += 1; } if end_position > start_position { let range = char_indices[start_position].0 ..char_indices .get(end_position) .map(|c| c.0 + 1) .unwrap_or(line.len()); Some((range.clone(), &line[range])) } else { None } } fn main() -> termwiz::Result<()> { println!("Type `exit` to quit this example, or start a word with `h` and press Tab."); let mut terminal = line_editor_terminal()?; let mut editor = LineEditor::new(&mut terminal); let mut host = Host::default(); loop { if let Some(line) = editor.read_line(&mut host)? { println!("read line: {:?}", line); if line == "exit" { break; } host.history().add(&line); } } Ok(()) } termwiz-0.23.3/examples/strip-ansi-escapes.rs000064400000000000000000000015731046102023000173160ustar 00000000000000//! This is a little utility that strips escape sequences from //! stdin and prints the result on stdout. //! It preserves only printable characters and CR, LF and HT. use std::io::{Read, Result}; use termwiz::escape::parser::Parser; use termwiz::escape::{Action, ControlCode}; fn main() -> Result<()> { let mut buf = [0u8; 4096]; let mut parser = Parser::new(); loop { let len = std::io::stdin().read(&mut buf)?; if len == 0 { return Ok(()); } parser.parse(&buf[0..len], |action| match action { Action::Print(c) => print!("{}", c), Action::Control(c) => match c { ControlCode::HorizontalTab | ControlCode::LineFeed | ControlCode::CarriageReturn => print!("{}", c as u8 as char), _ => {} }, _ => {} }); } } termwiz-0.23.3/examples/terminal_direct.rs000064400000000000000000000017101046102023000167420ustar 00000000000000//! This example shows how to render `Change`s directly to //! an instance of `Terminal`. When used in this way, the //! library performas no optimization on the change stream. //! Consider using the `Surface` struct to enable optimization; //! the `buffered_terminal.rs` example demonstrates a simple //! way to enable optimizations. use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::AnsiColor; use termwiz::surface::Change; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let mut terminal = new_terminal(caps)?; terminal.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Text("Hello world\r\n".into()), Change::Attribute(AttributeChange::Foreground(AnsiColor::Red.into())), Change::Text("and in red here\r\n".into()), ])?; Ok(()) } termwiz-0.23.3/examples/widgets_basic.rs000064400000000000000000000124111046102023000164040ustar 00000000000000//! This example shows how to make a basic widget that accumulates //! text input and renders it to the screen #![allow(unused)] use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::{AnsiColor, ColorAttribute}; use termwiz::input::*; use termwiz::surface::Change; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; #[cfg(feature = "widgets")] use termwiz::widgets::*; use termwiz::Error; /// This is a widget for our application struct MainScreen<'a> { /// Holds the input text that we wish the widget to display text: &'a mut String, } impl<'a> MainScreen<'a> { /// Initialize the widget with the input text pub fn new(text: &'a mut String) -> Self { Self { text } } } #[cfg(feature = "widgets")] impl<'a> Widget for MainScreen<'a> { fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool { match event { WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Char(c), .. })) => self.text.push(*c), WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Enter, .. })) => { self.text.push_str("\r\n"); } WidgetEvent::Input(InputEvent::Paste(s)) => { self.text.push_str(&s); } _ => {} } true // handled it all } /// Draw ourselves into the surface provided by RenderArgs fn render(&mut self, args: &mut RenderArgs) { args.surface.add_change(Change::ClearScreen( ColorAttribute::TrueColorWithPaletteFallback( (0x31, 0x1B, 0x92).into(), AnsiColor::Black.into(), ), )); args.surface .add_change(Change::Attribute(AttributeChange::Foreground( ColorAttribute::TrueColorWithPaletteFallback( (0xB3, 0x88, 0xFF).into(), AnsiColor::Purple.into(), ), ))); let dims = args.surface.dimensions(); args.surface .add_change(format!("🤷 surface size is {:?}\r\n", dims)); args.surface.add_change(self.text.clone()); // Place the cursor at the end of the text. // A more advanced text editing widget would manage the // cursor position differently. *args.cursor = CursorShapeAndPosition { coords: args.surface.cursor_position().into(), shape: termwiz::surface::CursorShape::SteadyBar, ..Default::default() }; } fn get_size_constraints(&self) -> layout::Constraints { layout::Constraints::with_fixed_width_height(80, 24) } } #[cfg(feature = "widgets")] fn main() -> Result<(), Error> { // Start with an empty string; typing into the app will // update this string. let mut typed_text = String::new(); { // Create a terminal and put it into full screen raw mode let caps = Capabilities::new_from_env()?; let mut buf = BufferedTerminal::new(new_terminal(caps)?)?; buf.terminal().set_raw_mode()?; buf.terminal().enter_alternate_screen()?; // Set up the UI let mut ui = Ui::new(); ui.set_root(MainScreen::new(&mut typed_text)); loop { ui.process_event_queue()?; // After updating and processing all of the widgets, compose them // and render them to the screen. if ui.render_to_screen(&mut buf)? { // We have more events to process immediately; don't block waiting // for input below, but jump to the top of the loop to re-run the // updates. continue; } // Compute an optimized delta to apply to the terminal and display it buf.flush()?; // Wait for user input match buf.terminal().poll_input(None) { Ok(Some(InputEvent::Resized { rows, cols })) => { // FIXME: this is working around a bug where we don't realize // that we should redraw everything on resize in BufferedTerminal. buf.add_change(Change::ClearScreen(Default::default())); buf.resize(cols, rows); } Ok(Some(input)) => match input { InputEvent::Key(KeyEvent { key: KeyCode::Escape, .. }) => { // Quit the app when escape is pressed break; } input @ _ => { // Feed input into the Ui ui.queue_event(WidgetEvent::Input(input)); } }, Ok(None) => {} Err(e) => { print!("{:?}\r\n", e); break; } } } } // After we've stopped the full screen raw terminal, // print out the final edited value of the input text. println!("The text you entered: {}", typed_text); Ok(()) } #[cfg(not(feature = "widgets"))] fn main() { println!("recompile with --features widgets"); } termwiz-0.23.3/examples/widgets_nested.rs000064400000000000000000000164051046102023000166140ustar 00000000000000//! This example shows how to make an app that uses parent/child widgets #[cfg(feature = "widgets")] mod inner { use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::{AnsiColor, ColorAttribute}; use termwiz::input::*; use termwiz::surface::Change; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::widgets::layout::{ChildOrientation, VerticalAlignment}; use termwiz::widgets::*; use termwiz::Error; /// This is the main container widget for the app struct MainScreen {} impl MainScreen { pub fn new() -> Self { Self {} } } impl Widget for MainScreen { fn render(&mut self, _args: &mut RenderArgs) {} fn get_size_constraints(&self) -> layout::Constraints { // Switch from default horizontal layout to vertical layout let mut c = layout::Constraints::default(); c.child_orientation = ChildOrientation::Vertical; c } } /// This is the main text input area for the app struct TextInput<'a> { /// Holds the input text that we wish the widget to display text: &'a mut String, } impl<'a> TextInput<'a> { /// Initialize the widget with the input text pub fn new(text: &'a mut String) -> Self { Self { text } } } impl<'a> Widget for TextInput<'a> { fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool { match event { WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Char(c), .. })) => self.text.push(*c), WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Enter, .. })) => { self.text.push_str("\r\n"); } WidgetEvent::Input(InputEvent::Paste(s)) => { self.text.push_str(&s); } _ => {} } true // handled it all } /// Draw ourselves into the surface provided by RenderArgs fn render(&mut self, args: &mut RenderArgs) { args.surface.add_change(Change::ClearScreen( ColorAttribute::TrueColorWithPaletteFallback( (0x31, 0x1B, 0x92).into(), AnsiColor::Black.into(), ), )); args.surface .add_change(Change::Attribute(AttributeChange::Foreground( ColorAttribute::TrueColorWithPaletteFallback( (0xB3, 0x88, 0xFF).into(), AnsiColor::Purple.into(), ), ))); args.surface.add_change(self.text.clone()); // Place the cursor at the end of the text. // A more advanced text editing widget would manage the // cursor position differently. *args.cursor = CursorShapeAndPosition { coords: args.surface.cursor_position().into(), shape: termwiz::surface::CursorShape::SteadyBar, ..Default::default() }; } fn get_size_constraints(&self) -> layout::Constraints { let mut c = layout::Constraints::default(); c.set_valign(VerticalAlignment::Top); c } } // This is a little status line widget that we render at the bottom struct StatusLine {} impl StatusLine { pub fn new() -> Self { Self {} } } impl Widget for StatusLine { /// Draw ourselves into the surface provided by RenderArgs fn render(&mut self, args: &mut RenderArgs) { let dims = args.surface.dimensions(); args.surface .add_change(Change::ClearScreen(AnsiColor::Grey.into())); args.surface .add_change(format!("🤷 status surface size is {:?}", dims)); } fn get_size_constraints(&self) -> layout::Constraints { let mut c = layout::Constraints::default(); c.set_fixed_height(1); c.set_valign(VerticalAlignment::Bottom); c } } pub fn run() -> Result<(), Error> { // Start with an empty string; typing into the app will // update this string. let mut typed_text = String::new(); { // Create a terminal and put it into full screen raw mode let caps = Capabilities::new_from_env()?; let mut buf = BufferedTerminal::new(new_terminal(caps)?)?; buf.terminal().set_raw_mode()?; // Set up the UI let mut ui = Ui::new(); let root_id = ui.set_root(MainScreen::new()); let buffer_id = ui.add_child(root_id, TextInput::new(&mut typed_text)); ui.add_child(root_id, StatusLine::new()); ui.set_focus(buffer_id); loop { ui.process_event_queue()?; // After updating and processing all of the widgets, compose them // and render them to the screen. if ui.render_to_screen(&mut buf)? { // We have more events to process immediately; don't block waiting // for input below, but jump to the top of the loop to re-run the // updates. continue; } // Compute an optimized delta to apply to the terminal and display it buf.flush()?; // Wait for user input match buf.terminal().poll_input(None) { Ok(Some(InputEvent::Resized { rows, cols })) => { // FIXME: this is working around a bug where we don't realize // that we should redraw everything on resize in BufferedTerminal. buf.add_change(Change::ClearScreen(Default::default())); buf.resize(cols, rows); } Ok(Some(input)) => match input { InputEvent::Key(KeyEvent { key: KeyCode::Escape, .. }) => { // Quit the app when escape is pressed break; } input @ _ => { // Feed input into the Ui ui.queue_event(WidgetEvent::Input(input)); } }, Ok(None) => {} Err(e) => { print!("{:?}\r\n", e); break; } } } } // After we've stopped the full screen raw terminal, // print out the final edited value of the input text. println!("The text you entered: {}", typed_text); Ok(()) } } #[cfg(not(feature = "widgets"))] mod inner { pub fn run() -> termwiz::Result<()> { println!("recompile with --features widgets"); Ok(()) } } fn main() -> termwiz::Result<()> { inner::run() } termwiz-0.23.3/src/caps/mod.rs000064400000000000000000000504211046102023000142560ustar 00000000000000//! # Terminal Capabilities //! //! There are a few problems in the world of terminal capability //! detection today; the terminal is typically local to a machine //! running very up to date software, but applications may be running //! on a remote system with relatively stale system software, or //! even different operating systems. //! //! There are two well-specified standard approaches to querying terminal //! capabilities: `termcap` and `terminfo`. The databases for the //! capabilities are typically deployed with the operating system //! software and suffers from splay and freshness issues: they may //! be different on different systems and out of date. //! //! A further complication is that the terminal may be connected //! via a series of intermediaries or multiplexers (mosh, tmux, screen) //! which hides or perturbs the true capabilities of the terminal. //! //! `terminfo` and `termcap` both allow for the user to supply a local //! override. `terminfo` needs a locally available compiled database, //! and that database may have different binary representations on disk //! depending on the operating system software, making it difficult for //! users that need to login to many remote machines; the burden is on //! the user to configure a local profile on many machines or solve the //! challenge of having a `$HOME/.terminfo` directory that is NFS mountable //! and readable to all potential machines. //! //! `termcap` defines a `TERMCAP` environment variable that can contain //! overrides and be passed via SSH to the remote systems much more simply //! than the `terminfo` database, but `termcap` is the old obsolete database //! and lacks a way to express support for the newer, more interesting //! features. //! //! It's a bit of a mess. //! //! There's more: `slang` defined the concept of `COLORTERM` to workaround //! some of these concerns so that it was possible to influence the //! availability of relatively recent higher color palette extensions. //! This allows the user the ability to "know better" about their terminal //! than the local configuration allows. `COLORTERM` has the advantage of //! being able to be passed on to remote systems via SSH. //! //! Regarding environment variables: on macOS the two main terminal //! emulators export `TERM_PROGRAM` and `TERM_PROGRAM_VERSION` into the //! environment, and if this were transported via SSH and adopted by //! more terminal emulators then newer software could potentially also //! look at this information too. //! //! Is there or will there ever be an ideal solution to this stuff? //! Probably not. //! //! With all this in mind, this module presents a `Capabilities` struct //! that holds information about a terminal. The `new_from_env` method //! implements some heuristics (a fancy word for guessing) to compute //! the terminal capabilities, but also offers a `ProbeHints` //! that can be used by the embedding application to override those choices. use crate::{builder, Result}; use std::env::var; use terminfo::{self, capability as cap}; pub mod probed; /// Environment variable name indicating that color output should be disabled. /// See const NO_COLOR_ENV: &str = "NO_COLOR"; builder! { /// Use the `ProbeHints` to configure an instance of /// the `ProbeHints` struct. `ProbeHints` are passed to the `Capabilities` /// constructor to influence the effective set of terminal capabilities. #[derive(Debug, Default, Clone)] pub struct ProbeHints { /// The contents of the TERM environment variable term: Option, /// The contents of the COLORTERM environment variable. /// colorterm: Option, /// The contents of the TERM_PROGRAM environment variable term_program: Option, /// Override the choice of the number of colors color_level: Option, /// The contents of the TERM_PROGRAM_VERSION environment variable term_program_version: Option, /// Definitively set whether hyperlinks are supported. /// The default is to assume yes as this is mostly harmless. hyperlinks: Option, /// Configure whether sixel graphics are supported. sixel: Option, /// Configure whether iTerm2 style graphics embedding is supported /// See iterm2_image: Option, /// Specify whether `bce`, background color erase, is supported. bce: Option, /// The contents of the COLORTERM_BCE environment variable /// colorterm_bce: Option, /// A loaded terminfo database entry terminfo_db: Option, /// Whether bracketed paste mode is supported bracketed_paste: Option, /// Whether mouse support is present and should be used mouse_reporting: Option, /// When true, rather than using the terminfo `sgr` or `sgr0` entries, /// assume that the terminal is ANSI/ECMA-48 compliant for the /// common SGR attributes of bold, dim, reverse, underline, blink, /// invisible and reset, and directly emit those sequences. /// This can improve rendered text compatibility with pagers. force_terminfo_render_to_use_ansi_sgr: Option, } } impl ProbeHints { pub fn new_from_env() -> Self { let mut probe_hints = ProbeHints::default() .term(var("TERM").ok()) .colorterm(var("COLORTERM").ok()) .colorterm_bce(var("COLORTERM_BCE").ok()) .term_program(var("TERM_PROGRAM").ok()) .term_program_version(var("TERM_PROGRAM_VERSION").ok()); if !std::env::var(NO_COLOR_ENV) .unwrap_or("".to_string()) .is_empty() { probe_hints.color_level = Some(ColorLevel::MonoChrome); } probe_hints } } /// Describes the level of color support available #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ColorLevel { /// Basic ANSI colors; 8 colors + bright versions Sixteen, /// In addition to the ANSI 16 colors, this has 24 levels of grey /// and 216 colors typically 6x6x6 color cube with 5 bits. There /// is some variance in implementations: the precise color cube is /// different in different emulators. TwoFiftySix, /// Commonly accepted as 24-bit RGB color. The implementation may /// display these exactly as specified or it may match to an internal /// palette with fewer than the theoretical maximum 16 million colors. /// What we care about here is whether the terminal supports the escape /// sequence to specify RGB values rather than a palette index. TrueColor, /// Describes monochrome (black and white) color support. /// Enabled via NO_COLOR environment variable. MonoChrome, } /// `Capabilities` holds information about the capabilities of a terminal. /// On POSIX systems this is largely derived from an available terminfo /// database, but there are some newish capabilities that are not yet /// described by the majority of terminfo installations and thus have some /// additional handling in this struct. #[derive(Debug, Clone)] pub struct Capabilities { color_level: ColorLevel, hyperlinks: bool, sixel: bool, iterm2_image: bool, bce: bool, terminfo_db: Option, bracketed_paste: bool, mouse_reporting: bool, force_terminfo_render_to_use_ansi_sgr: bool, } impl Capabilities { /// Detect the capabilities of the terminal and return the /// Capability object holding the outcome. /// This function inspects the environment variables to build /// up configuration hints. pub fn new_from_env() -> Result { Self::new_with_hints(ProbeHints::new_from_env()) } /// Return modified capabilities with the assumption that we're /// using an xterm compatible terminal and the built-in xterm /// terminfo database. This is used on Windows when the TERM /// is set to xterm-256color and we didn't find an equivalent /// terminfo on the local filesystem. We're using this as a /// way to opt in to using terminal escapes rather than the /// legacy win32 console API. #[cfg(windows)] pub(crate) fn apply_builtin_terminfo(mut self) -> Self { let data = include_bytes!("../../data/xterm-256color"); let db = terminfo::Database::from_buffer(data.as_ref()).unwrap(); self.terminfo_db = Some(db); self.color_level = ColorLevel::TrueColor; self } /// Build a `Capabilities` object based on the provided `ProbeHints` object. pub fn new_with_hints(hints: ProbeHints) -> Result { let terminfo_db = hints.terminfo_db.as_ref().cloned(); let terminfo_db = if cfg!(test) { // Don't load from the system terminfo in tests, as it is unpredictable terminfo_db } else { terminfo_db.or_else(|| match hints.term.as_ref() { Some(t) => terminfo::Database::from_name(t).ok(), None => terminfo::Database::from_env().ok(), }) }; let color_level = hints.color_level.unwrap_or_else(|| { // If set, COLORTERM overrides any other source of information match hints.colorterm.as_ref().map(String::as_ref) { Some("truecolor") | Some("24bit") => ColorLevel::TrueColor, Some(_) => ColorLevel::TwoFiftySix, _ => { // COLORTERM isn't set, so look at the terminfo. if let Some(ref db) = terminfo_db.as_ref() { let has_true_color = db .get::() .unwrap_or(cap::TrueColor(false)) .0; if has_true_color { ColorLevel::TrueColor } else if let Some(cap::MaxColors(n)) = db.get::() { if n >= 16777216 { ColorLevel::TrueColor } else if n >= 256 { ColorLevel::TwoFiftySix } else { ColorLevel::Sixteen } } else { ColorLevel::Sixteen } } else if let Some(ref term) = hints.term { // if we don't have TERMINFO, use a somewhat awful // substring test against the TERM name. if term.contains("256color") { ColorLevel::TwoFiftySix } else { ColorLevel::Sixteen } } else { ColorLevel::Sixteen } } } }); // I don't know of a way to detect SIXEL support, so we // assume no by default. let sixel = hints.sixel.unwrap_or(false); // The use of OSC 8 for hyperlinks means that it is generally // safe to assume yes: if the terminal doesn't support it, // the text will look "OK", although some versions of VTE based // terminals had a bug where it look like garbage. let hyperlinks = hints.hyperlinks.unwrap_or(true); let bce = hints.bce.unwrap_or_else(|| { // Use the COLORTERM_BCE variable to override any terminfo match hints.colorterm_bce.as_ref().map(String::as_ref) { Some("1") => true, _ => { // Look it up from terminfo terminfo_db .as_ref() .map(|db| { db.get::() .unwrap_or(cap::BackColorErase(false)) .0 }) .unwrap_or(false) } } }); let iterm2_image = hints.iterm2_image.unwrap_or_else(|| { match hints.term_program.as_ref().map(String::as_ref) { Some("iTerm.app") => { // We're testing whether it has animated gif support // here because the iTerm2 docs don't say when the // image protocol was first implemented, but do mention // the gif version. version_ge( hints .term_program_version .as_ref() .unwrap_or(&"0.0.0".to_owned()), "2.9.20150512", ) } Some("WezTerm") => true, _ => false, } }); let bracketed_paste = hints.bracketed_paste.unwrap_or(true); let mouse_reporting = hints.mouse_reporting.unwrap_or(true); let force_terminfo_render_to_use_ansi_sgr = hints.force_terminfo_render_to_use_ansi_sgr.unwrap_or(false); Ok(Self { color_level, sixel, hyperlinks, iterm2_image, bce, terminfo_db, bracketed_paste, mouse_reporting, force_terminfo_render_to_use_ansi_sgr, }) } /// Indicates how many colors are supported pub fn color_level(&self) -> ColorLevel { self.color_level } /// Does the terminal support SIXEL graphics? pub fn sixel(&self) -> bool { self.sixel } /// Does the terminal support hyperlinks? /// See pub fn hyperlinks(&self) -> bool { self.hyperlinks } /// Does the terminal support the iTerm2 image protocol? /// See pub fn iterm2_image(&self) -> bool { self.iterm2_image } /// Is `bce`, background color erase supported? /// pub fn bce(&self) -> bool { self.bce } /// Returns a reference to the loaded terminfo, if any. pub fn terminfo_db(&self) -> Option<&terminfo::Database> { self.terminfo_db.as_ref() } /// Whether bracketed paste is supported pub fn bracketed_paste(&self) -> bool { self.bracketed_paste } /// Whether mouse reporting is supported pub fn mouse_reporting(&self) -> bool { self.mouse_reporting } /// Whether to emit standard ANSI/ECMA-48 codes, overriding any /// SGR terminfo capabilities. pub fn force_terminfo_render_to_use_ansi_sgr(&self) -> bool { self.force_terminfo_render_to_use_ansi_sgr } } /// Returns true if the version string `a` is >= `b` fn version_ge(a: &str, b: &str) -> bool { let mut a = a.split('.'); let mut b = b.split('.'); loop { match (a.next(), b.next()) { (Some(a), Some(b)) => match (a.parse::(), b.parse::()) { (Ok(a), Ok(b)) => { if a > b { return true; } if a < b { return false; } } _ => { if a > b { return true; } if a < b { return false; } } }, (Some(_), None) => { // A is greater return true; } (None, Some(_)) => { // A is smaller return false; } (None, None) => { // Equal return true; } } } } #[cfg(test)] mod test { use super::*; #[test] fn version_cmp() { assert!(version_ge("1", "0")); assert!(version_ge("1.0", "0")); assert!(!version_ge("0", "1")); assert!(version_ge("3.2", "2.9")); assert!(version_ge("3.2.0beta5", "2.9")); assert!(version_ge("3.2.0beta5", "3.2.0")); assert!(version_ge("3.2.0beta5", "3.2.0beta1")); } fn load_terminfo() -> terminfo::Database { // Load our own compiled data so that the tests have an // environment that doesn't vary machine by machine. let data = include_bytes!("../../data/xterm-256color"); terminfo::Database::from_buffer(data.as_ref()).unwrap() } #[test] fn empty_hint() { let caps = Capabilities::new_with_hints(ProbeHints::default()).unwrap(); assert_eq!(caps.color_level(), ColorLevel::Sixteen); assert_eq!(caps.sixel(), false); assert_eq!(caps.hyperlinks(), true); assert_eq!(caps.iterm2_image(), false); assert_eq!(caps.bce(), false); } #[test] fn bce() { let caps = Capabilities::new_with_hints(ProbeHints::default().colorterm_bce(Some("1".into()))) .unwrap(); assert_eq!(caps.bce(), true); } #[test] fn bce_terminfo() { let caps = Capabilities::new_with_hints(ProbeHints::default().terminfo_db(Some(load_terminfo()))) .unwrap(); assert_eq!(caps.bce(), true); } #[test] fn terminfo_color() { let caps = Capabilities::new_with_hints(ProbeHints::default().terminfo_db(Some(load_terminfo()))) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); } #[test] fn term_but_not_colorterm() { let caps = Capabilities::new_with_hints(ProbeHints::default().term(Some("xterm-256color".into()))) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TwoFiftySix); } #[test] fn colorterm_but_no_term() { let caps = Capabilities::new_with_hints(ProbeHints::default().colorterm(Some("24bit".into()))) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); } #[test] fn term_and_colorterm() { let caps = Capabilities::new_with_hints( ProbeHints::default() .term(Some("xterm-256color".into())) // bogus value .colorterm(Some("24bot".into())), ) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TwoFiftySix); let caps = Capabilities::new_with_hints( ProbeHints::default() .term(Some("xterm-256color".into())) .colorterm(Some("24bit".into())), ) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); let caps = Capabilities::new_with_hints( ProbeHints::default() .term(Some("xterm-256color".into())) .colorterm(Some("truecolor".into())), ) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); } #[test] fn iterm2_image() { let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("1.0.0".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), false); let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("2.9.0".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), false); let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("2.9.20150512".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), true); let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("3.2.0beta5".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), true); } } termwiz-0.23.3/src/caps/probed.rs000064400000000000000000000214701046102023000147540ustar 00000000000000use crate::escape::csi::{Device, Window}; use crate::escape::parser::Parser; use crate::escape::{Action, DeviceControlMode, Esc, EscCode, CSI}; use crate::terminal::ScreenSize; use crate::{bail, Result}; use std::io::{Read, Write}; const TMUX_BEGIN: &str = "\u{1b}Ptmux;\u{1b}"; const TMUX_END: &str = "\u{1b}\\"; /// Represents a terminal name and version. /// The name XtVersion is because this value is produced /// by querying the terminal using the XTVERSION escape /// sequence, which was defined by xterm. #[derive(Debug, Clone, PartialEq, Eq)] pub struct XtVersion(String); impl XtVersion { /// Split the version string into a name component and a version /// component. Currently it recognizes `Name(Version)` and /// `Name Version` forms. If a form is not recognized, returns None. pub fn name_and_version(&self) -> Option<(&str, &str)> { if self.0.ends_with(")") { let paren = self.0.find('(')?; Some((&self.0[0..paren], &self.0[paren + 1..self.0.len() - 1])) } else { let space = self.0.find(' ')?; Some((&self.0[0..space], &self.0[space + 1..])) } } /// Returns true if this represents tmux pub fn is_tmux(&self) -> bool { self.0.starts_with("tmux ") } /// Return the full underlying version string pub fn full_version(&self) -> &str { &self.0 } } #[cfg(test)] mod test { use super::*; #[test] fn test_xtversion_name() { for (input, result) in [ ("WezTerm something", Some(("WezTerm", "something"))), ("xterm(something)", Some(("xterm", "something"))), ("something-else", None), ] { let version = XtVersion(input.to_string()); assert_eq!(version.name_and_version(), result, "{input}"); } } } /// This struct is a helper that uses probing to determine specific capabilities /// of the associated Terminal instance. /// It will write and read data to and from the associated Terminal. pub struct ProbeCapabilities<'a> { read: Box<&'a mut dyn Read>, write: Box<&'a mut dyn Write>, } impl<'a> ProbeCapabilities<'a> { pub fn new(read: &'a mut R, write: &'a mut W) -> Self { Self { read: Box::new(read), write: Box::new(write), } } /// Probe for the XTVERSION response pub fn xt_version(&mut self) -> Result { self.xt_version_impl(false) } /// Assuming that we are talking to tmux, probe for the XTVERSION response /// of its outer terminal. pub fn outer_xt_version(&mut self) -> Result { self.xt_version_impl(true) } fn xt_version_impl(&mut self, tmux_escape: bool) -> Result { let xt_version = CSI::Device(Box::new(Device::RequestTerminalNameAndVersion)); let dev_attributes = CSI::Device(Box::new(Device::RequestPrimaryDeviceAttributes)); if tmux_escape { write!(self.write, "{TMUX_BEGIN}{xt_version}{TMUX_END}")?; self.write.flush()?; std::thread::sleep(std::time::Duration::from_millis(100)); write!(self.write, "{dev_attributes}")?; } else { write!(self.write, "{xt_version}{dev_attributes}")?; } self.write.flush()?; let mut term = vec![]; let mut parser = Parser::new(); let mut done = false; while !done { let mut byte = [0u8]; self.read.read(&mut byte)?; parser.parse(&byte, |action| { // print!("{action:?}\r\n"); match action { Action::Esc(Esc::Code(EscCode::StringTerminator)) => {} Action::DeviceControl(dev) => { if let DeviceControlMode::Data(b) = dev { term.push(b); } } _ => { done = true; } } }); } Ok(XtVersion(String::from_utf8_lossy(&term).into())) } /// Probe the terminal and determine the ScreenSize. pub fn screen_size(&mut self) -> Result { let xt_version = self.xt_version()?; let is_tmux = xt_version.is_tmux(); // some tmux versions have their rows/cols swapped in ReportTextAreaSizeCells let swapped_cols_rows = match xt_version.full_version() { "tmux 3.2" | "tmux 3.2a" | "tmux 3.3" | "tmux 3.3a" => true, _ => false, }; let query_cells = CSI::Window(Box::new(Window::ReportTextAreaSizeCells)); let query_pixels = CSI::Window(Box::new(Window::ReportCellSizePixels)); let dev_attributes = CSI::Device(Box::new(Device::RequestPrimaryDeviceAttributes)); write!(self.write, "{query_cells}{query_pixels}")?; // tmux refuses to directly support responding to 14t or 16t queries // for pixel dimensions, so we need to jump through to the outer // terminal and see what it says if is_tmux { write!(self.write, "{TMUX_BEGIN}{query_pixels}{TMUX_END}")?; } if is_tmux || cfg!(windows) { self.write.flush()?; // I really wanted to avoid a delay here, but tmux and conpty will // both re-order the response to dev_attributes before sending the // response for the passthru of query_pixels if we don't delay. // The delay is potentially imperfect for things like a laggy ssh // connection. The consequence of the timing being wrong is that // we won't be able to reason about the pixel dimensions, which is // "OK", but that was kinda the whole point of probing this way // vs. termios. std::thread::sleep(std::time::Duration::from_millis(100)); } write!(self.write, "{dev_attributes}")?; self.write.flush()?; let mut parser = Parser::new(); let mut done = false; let mut size = ScreenSize { rows: 0, cols: 0, xpixel: 0, ypixel: 0, }; while !done { let mut byte = [0u8]; self.read.read(&mut byte)?; parser.parse(&byte, |action| { // print!("{action:?}\r\n"); match action { // ConPTY appears to trigger 1 or more xtversion queries // to wezterm in response to this probe, so we need to // prepared to accept and discard data of that shape // here, so that we keep going until we get our reports Action::DeviceControl(_) => {} Action::Esc(Esc::Code(EscCode::StringTerminator)) => {} // and now look for the actual responses we're expecting Action::CSI(csi) => match csi { CSI::Window(win) => match *win { Window::ResizeWindowCells { width, height } => { let width = width.unwrap_or(1); let height = height.unwrap_or(1); if width > 0 && height > 0 { let width = width as usize; let height = height as usize; if swapped_cols_rows { size.rows = width; size.cols = height; } else { size.rows = height; size.cols = width; } } } Window::ReportCellSizePixelsResponse { width, height } => { let width = width.unwrap_or(1); let height = height.unwrap_or(1); if width > 0 && height > 0 { let width = width as usize; let height = height as usize; size.xpixel = width; size.ypixel = height; } } _ => { done = true; } }, _ => { done = true; } }, _ => { done = true; } } }); } if size.rows == 0 && size.cols == 0 { bail!("no size information available"); } Ok(size) } } termwiz-0.23.3/src/cell.rs000064400000000000000000001225031046102023000134710ustar 00000000000000//! Model a cell in the terminal display use crate::color::{ColorAttribute, PaletteIndex}; pub use crate::emoji::Presentation; use crate::emoji_variation::WCWIDTH_TABLE; pub use crate::escape::osc::Hyperlink; use crate::image::ImageCell; use crate::widechar_width::WcWidth; use finl_unicode::grapheme_clusters::Graphemes; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::hash::{Hash, Hasher}; use std::mem; use std::sync::Arc; use wezterm_dynamic::{FromDynamic, ToDynamic}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] enum SmallColor { Default, PaletteIndex(PaletteIndex), } impl Default for SmallColor { fn default() -> Self { Self::Default } } impl Into for SmallColor { fn into(self) -> ColorAttribute { match self { Self::Default => ColorAttribute::Default, Self::PaletteIndex(idx) => ColorAttribute::PaletteIndex(idx), } } } /// Holds the attributes for a cell. /// Most style attributes are stored internally as part of a bitfield /// to reduce per-cell overhead. /// The setter methods return a mutable self reference so that they can /// be chained together. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Clone, Eq, PartialEq)] pub struct CellAttributes { attributes: u32, /// The foreground color foreground: SmallColor, /// The background color background: SmallColor, /// Relatively rarely used attributes spill over to a heap /// allocated struct in order to keep CellAttributes /// smaller in the common case. fat: Option>, } impl std::fmt::Debug for CellAttributes { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fmt.debug_struct("CellAttributes") .field("attributes", &self.attributes) .field("intensity", &self.intensity()) .field("underline", &self.underline()) .field("blink", &self.blink()) .field("italic", &self.italic()) .field("reverse", &self.reverse()) .field("strikethrough", &self.strikethrough()) .field("invisible", &self.invisible()) .field("wrapped", &self.wrapped()) .field("overline", &self.overline()) .field("semantic_type", &self.semantic_type()) .field("foreground", &self.foreground) .field("background", &self.background) .field("fat", &self.fat) .finish() } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Default, Clone, Eq, PartialEq)] struct FatAttributes { /// The hyperlink content, if any hyperlink: Option>, /// The image data, if any image: Vec>, /// The color of the underline. If None, then /// the foreground color is to be used underline_color: ColorAttribute, foreground: ColorAttribute, background: ColorAttribute, } impl FatAttributes { pub fn compute_shape_hash(&self, hasher: &mut H) { if let Some(link) = &self.hyperlink { link.compute_shape_hash(hasher); } for cell in &self.image { cell.compute_shape_hash(hasher); } self.underline_color.hash(hasher); self.foreground.hash(hasher); self.background.hash(hasher); } } /// Define getter and setter for the attributes bitfield. /// The first form is for a simple boolean value stored in /// a single bit. The $bitnum parameter specifies which bit. /// The second form is for an integer value that occupies a range /// of bits. The $bitmask and $bitshift parameters define how /// to transform from the stored bit value to the consumable /// value. macro_rules! bitfield { ($getter:ident, $setter:ident, $bitnum:expr) => { #[inline] pub fn $getter(&self) -> bool { (self.attributes & (1 << $bitnum)) == (1 << $bitnum) } #[inline] pub fn $setter(&mut self, value: bool) -> &mut Self { let attr_value = if value { 1 << $bitnum } else { 0 }; self.attributes = (self.attributes & !(1 << $bitnum)) | attr_value; self } }; ($getter:ident, $setter:ident, $bitmask:expr, $bitshift:expr) => { #[inline] pub fn $getter(&self) -> u32 { (self.attributes >> $bitshift) & $bitmask } #[inline] pub fn $setter(&mut self, value: u32) -> &mut Self { let clear = !($bitmask << $bitshift); let attr_value = (value & $bitmask) << $bitshift; self.attributes = (self.attributes & clear) | attr_value; self } }; ($getter:ident, $setter:ident, $enum:ident, $bitmask:expr, $bitshift:expr) => { #[inline] pub fn $getter(&self) -> $enum { unsafe { mem::transmute(((self.attributes >> $bitshift) & $bitmask) as u8) } } #[inline] pub fn $setter(&mut self, value: $enum) -> &mut Self { let value = value as u32; let clear = !($bitmask << $bitshift); let attr_value = (value & $bitmask) << $bitshift; self.attributes = (self.attributes & clear) | attr_value; self } }; } /// Describes the semantic "type" of the cell. /// This categorizes cells into Output (from the actions the user is /// taking; this is the default if left unspecified), /// Input (that the user typed) and Prompt (effectively, "chrome" provided /// by the shell or application that the user is interacting with. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, FromDynamic, ToDynamic)] #[repr(u8)] pub enum SemanticType { Output = 0, Input = 1, Prompt = 2, } impl Default for SemanticType { fn default() -> Self { Self::Output } } /// The `Intensity` of a cell describes its boldness. Most terminals /// implement `Intensity::Bold` by either using a bold font or by simply /// using an alternative color. Some terminals implement `Intensity::Half` /// as a dimmer color variant. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] #[repr(u8)] pub enum Intensity { Normal = 0, Bold = 1, Half = 2, } impl Default for Intensity { fn default() -> Self { Self::Normal } } /// Specify just how underlined you want your `Cell` to be #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromDynamic, ToDynamic)] #[repr(u8)] pub enum Underline { /// The cell is not underlined None = 0, /// The cell is underlined with a single line Single = 1, /// The cell is underlined with two lines Double = 2, /// Curly underline Curly = 3, /// Dotted underline Dotted = 4, /// Dashed underline Dashed = 5, } impl Default for Underline { fn default() -> Self { Self::None } } /// Allow converting to boolean; true means some kind of /// underline, false means none. This is used in some /// generic code to determine whether to enable underline. impl Into for Underline { fn into(self) -> bool { self != Underline::None } } /// Specify whether you want to slowly or rapidly annoy your users #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] #[repr(u8)] pub enum Blink { None = 0, Slow = 1, Rapid = 2, } /// Allow converting to boolean; true means some kind of /// blink, false means none. This is used in some /// generic code to determine whether to enable blink. impl Into for Blink { fn into(self) -> bool { self != Blink::None } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] #[repr(u8)] pub enum VerticalAlign { BaseLine = 0, SuperScript = 1, SubScript = 2, } impl Default for CellAttributes { fn default() -> Self { Self::blank() } } impl CellAttributes { bitfield!(intensity, set_intensity, Intensity, 0b11, 0); bitfield!(underline, set_underline, Underline, 0b111, 2); bitfield!(blink, set_blink, Blink, 0b11, 5); bitfield!(italic, set_italic, 7); bitfield!(reverse, set_reverse, 8); bitfield!(strikethrough, set_strikethrough, 9); bitfield!(invisible, set_invisible, 10); bitfield!(wrapped, set_wrapped, 11); bitfield!(overline, set_overline, 12); bitfield!(semantic_type, set_semantic_type, SemanticType, 0b11, 13); bitfield!(vertical_align, set_vertical_align, VerticalAlign, 0b11, 15); pub const fn blank() -> Self { Self { attributes: 0, foreground: SmallColor::Default, background: SmallColor::Default, fat: None, } } /// Returns true if the attribute bits in both objects are equal. /// This can be used to cheaply test whether the styles of the two /// cells are the same, and is used by some `Renderer` implementations. pub fn attribute_bits_equal(&self, other: &Self) -> bool { self.attributes == other.attributes } pub fn compute_shape_hash(&self, hasher: &mut H) { self.attributes.hash(hasher); self.foreground.hash(hasher); self.background.hash(hasher); if let Some(fat) = &self.fat { fat.compute_shape_hash(hasher); } } /// Set the foreground color for the cell to that specified pub fn set_foreground>(&mut self, foreground: C) -> &mut Self { let foreground: ColorAttribute = foreground.into(); match foreground { ColorAttribute::Default => { self.foreground = SmallColor::Default; if let Some(fat) = self.fat.as_mut() { fat.foreground = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } ColorAttribute::PaletteIndex(idx) => { self.foreground = SmallColor::PaletteIndex(idx); if let Some(fat) = self.fat.as_mut() { fat.foreground = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } foreground => { self.foreground = SmallColor::Default; self.allocate_fat_attributes(); self.fat.as_mut().unwrap().foreground = foreground; } } self } pub fn foreground(&self) -> ColorAttribute { if let Some(fat) = self.fat.as_ref() { if fat.foreground != ColorAttribute::Default { return fat.foreground; } } self.foreground.into() } pub fn set_background>(&mut self, background: C) -> &mut Self { let background: ColorAttribute = background.into(); match background { ColorAttribute::Default => { self.background = SmallColor::Default; if let Some(fat) = self.fat.as_mut() { fat.background = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } ColorAttribute::PaletteIndex(idx) => { self.background = SmallColor::PaletteIndex(idx); if let Some(fat) = self.fat.as_mut() { fat.background = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } background => { self.background = SmallColor::Default; self.allocate_fat_attributes(); self.fat.as_mut().unwrap().background = background; } } self } pub fn background(&self) -> ColorAttribute { if let Some(fat) = self.fat.as_ref() { if fat.background != ColorAttribute::Default { return fat.background; } } self.background.into() } /// Clear all attributes from a cell pub fn clear(&mut self) { *self = Self::blank(); } fn allocate_fat_attributes(&mut self) { if self.fat.is_none() { self.fat.replace(Box::new(FatAttributes { hyperlink: None, image: vec![], underline_color: ColorAttribute::Default, foreground: ColorAttribute::Default, background: ColorAttribute::Default, })); } } fn deallocate_fat_attributes_if_none(&mut self) { let deallocate = self .fat .as_ref() .map(|fat| { fat.image.is_empty() && fat.hyperlink.is_none() && fat.underline_color == ColorAttribute::Default && fat.foreground == ColorAttribute::Default && fat.background == ColorAttribute::Default }) .unwrap_or(false); if deallocate { self.fat.take(); } } pub fn set_hyperlink(&mut self, link: Option>) -> &mut Self { if link.is_none() && self.fat.is_none() { self } else { self.allocate_fat_attributes(); self.fat.as_mut().unwrap().hyperlink = link; self.deallocate_fat_attributes_if_none(); self } } /// Assign a single image to a cell. pub fn set_image(&mut self, image: Box) -> &mut Self { self.allocate_fat_attributes(); self.fat.as_mut().unwrap().image = vec![image]; self } /// Clear all images from a cell pub fn clear_images(&mut self) -> &mut Self { if let Some(fat) = self.fat.as_mut() { fat.image.clear(); } self.deallocate_fat_attributes_if_none(); self } pub fn detach_image_with_placement(&mut self, image_id: u32, placement_id: Option) { if let Some(fat) = self.fat.as_mut() { fat.image .retain(|im| !im.matches_placement(image_id, placement_id)); } self.deallocate_fat_attributes_if_none(); } /// Add an image attachement, preserving any existing attachments. /// The list of images is maintained in z-index order pub fn attach_image(&mut self, image: Box) -> &mut Self { self.allocate_fat_attributes(); let fat = self.fat.as_mut().unwrap(); let z_index = image.z_index(); match fat .image .binary_search_by(|probe| probe.z_index().cmp(&z_index)) { Ok(idx) | Err(idx) => fat.image.insert(idx, image), } self } pub fn set_underline_color>( &mut self, underline_color: C, ) -> &mut Self { let underline_color = underline_color.into(); if underline_color == ColorAttribute::Default && self.fat.is_none() { self } else { self.allocate_fat_attributes(); self.fat.as_mut().unwrap().underline_color = underline_color; self.deallocate_fat_attributes_if_none(); self } } /// Clone the attributes, but exclude fancy extras such /// as hyperlinks or future sprite things pub fn clone_sgr_only(&self) -> Self { let mut res = Self { attributes: self.attributes, foreground: self.foreground, background: self.background, fat: None, }; if let Some(fat) = self.fat.as_ref() { if fat.background != ColorAttribute::Default || fat.foreground != ColorAttribute::Default { res.allocate_fat_attributes(); let new_fat = res.fat.as_mut().unwrap(); new_fat.foreground = fat.foreground; new_fat.background = fat.background; } } // Reset the semantic type; clone_sgr_only is used primarily // to create a "blank" cell when clearing and we want that to // be deterministically tagged as Output so that we have an // easier time in get_semantic_zones. res.set_semantic_type(SemanticType::default()); res.set_underline_color(self.underline_color()); // Turn off underline because it can have surprising results // if underline is on, then we get CRLF and then SGR reset: // If the CRLF causes a line to scroll, we'll call clone_sgr_only() // to get a blank cell for the new line and it would be filled // with underlines. // clone_sgr_only() is primarily for preserving the background // color when erasing rather than other attributes, so it should // be fine to clear out the actual underline attribute. // Let's extend this to other line attribute types as well. // res.set_underline(Underline::None); res.set_overline(false); res.set_strikethrough(false); res } pub fn hyperlink(&self) -> Option<&Arc> { self.fat.as_ref().and_then(|fat| fat.hyperlink.as_ref()) } /// Returns the list of attached images in z-index order. /// Returns None if there are no attached images; will /// never return Some(vec![]). pub fn images(&self) -> Option> { let fat = self.fat.as_ref()?; if fat.image.is_empty() { return None; } Some(fat.image.iter().map(|im| im.as_ref().clone()).collect()) } pub fn underline_color(&self) -> ColorAttribute { self.fat .as_ref() .map(|fat| fat.underline_color) .unwrap_or(ColorAttribute::Default) } pub fn apply_change(&mut self, change: &AttributeChange) { use AttributeChange::*; match change { Intensity(value) => { self.set_intensity(*value); } Underline(value) => { self.set_underline(*value); } Italic(value) => { self.set_italic(*value); } Blink(value) => { self.set_blink(*value); } Reverse(value) => { self.set_reverse(*value); } StrikeThrough(value) => { self.set_strikethrough(*value); } Invisible(value) => { self.set_invisible(*value); } Foreground(value) => { self.set_foreground(*value); } Background(value) => { self.set_background(*value); } Hyperlink(value) => { self.set_hyperlink(value.clone()); } } } } #[cfg(feature = "use_serde")] fn deserialize_teenystring<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let text = String::deserialize(deserializer)?; Ok(TeenyString::from_str(&text, None, None)) } #[cfg(feature = "use_serde")] fn serialize_teenystring(value: &TeenyString, serializer: S) -> Result where S: Serializer, { // unsafety: this is safe because the Cell constructor guarantees // that the storage is valid utf8 let s = unsafe { std::str::from_utf8_unchecked(value.as_bytes()) }; s.serialize(serializer) } /// TeenyString encodes string storage in a single u64. /// The scheme is simple but effective: strings that encode into a /// byte slice that is 1 less byte than the machine word size can /// be encoded directly into the usize bits stored in the struct. /// A marker bit (LSB for big endian, MSB for little endian) is /// set to indicate that the string is stored inline. /// If the string is longer than this then a `Vec` is allocated /// from the heap and the usize holds its raw pointer address. /// /// When the string is inlined, the next-MSB is used to short-cut /// calling grapheme_column_width; if it is set, then the TeenyString /// has length 2, otherwise, it has length 1 (we don't allow zero-length /// strings). struct TeenyString(u64); struct TeenyStringHeap { bytes: Vec, width: usize, } impl TeenyString { const fn marker_mask() -> u64 { if cfg!(target_endian = "little") { 0x80000000_00000000 } else { 0x1 } } const fn double_wide_mask() -> u64 { if cfg!(target_endian = "little") { 0xc0000000_00000000 } else { 0x3 } } const fn is_marker_bit_set(word: u64) -> bool { let mask = Self::marker_mask(); word & mask == mask } const fn is_double_width(word: u64) -> bool { let mask = Self::double_wide_mask(); word & mask == mask } const fn set_marker_bit(word: u64, width: usize) -> u64 { if width > 1 { word | Self::double_wide_mask() } else { word | Self::marker_mask() } } pub fn from_str( s: &str, width: Option, unicode_version: Option, ) -> Self { // De-fang the input text such that it has no special meaning // to a terminal. All control and movement characters are rewritten // as a space. let s = if s.is_empty() || s == "\r\n" { " " } else if s.len() == 1 { let b = s.as_bytes()[0]; if b < 0x20 || b == 0x7f { " " } else { s } } else { s }; let bytes = s.as_bytes(); let len = bytes.len(); let width = width.unwrap_or_else(|| grapheme_column_width(s, unicode_version)); if len < std::mem::size_of::() && width < 3 { let mut word = 0u64; unsafe { std::ptr::copy_nonoverlapping( bytes.as_ptr(), &mut word as *mut u64 as *mut u8, len, ); } let word = Self::set_marker_bit(word as u64, width); Self(word) } else { let vec = Box::new(TeenyStringHeap { bytes: bytes.to_vec(), width, }); let ptr = Box::into_raw(vec); Self(ptr as u64) } } pub const fn space() -> Self { Self(if cfg!(target_endian = "little") { 0x80000000_00000020 } else { 0x20000000_00000001 }) } pub fn from_char(c: char) -> Self { let mut bytes = [0u8; 8]; Self::from_str(c.encode_utf8(&mut bytes), None, None) } pub fn width(&self) -> usize { if Self::is_marker_bit_set(self.0) { if Self::is_double_width(self.0) { 2 } else { 1 } } else { let heap = self.0 as *const u64 as *const TeenyStringHeap; unsafe { (*heap).width } } } pub fn str(&self) -> &str { // unsafety: this is safe because the constructor guarantees // that the storage is valid utf8 unsafe { std::str::from_utf8_unchecked(self.as_bytes()) } } pub fn as_bytes(&self) -> &[u8] { if Self::is_marker_bit_set(self.0) { let bytes = &self.0 as *const u64 as *const u8; let bytes = unsafe { std::slice::from_raw_parts(bytes, std::mem::size_of::() - 1) }; let len = bytes .iter() .position(|&b| b == 0) .unwrap_or(std::mem::size_of::() - 1); &bytes[0..len] } else { let heap = self.0 as *const u64 as *const TeenyStringHeap; unsafe { (*heap).bytes.as_slice() } } } } impl Drop for TeenyString { fn drop(&mut self) { if !Self::is_marker_bit_set(self.0) { let vec = unsafe { Box::from_raw(self.0 as *mut usize as *mut TeenyStringHeap) }; drop(vec); } } } impl std::clone::Clone for TeenyString { fn clone(&self) -> Self { if Self::is_marker_bit_set(self.0) { Self(self.0) } else { Self::from_str(self.str(), None, None) } } } impl std::cmp::PartialEq for TeenyString { fn eq(&self, rhs: &Self) -> bool { self.as_bytes().eq(rhs.as_bytes()) } } impl std::cmp::Eq for TeenyString {} /// Models the contents of a cell on the terminal display #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Clone, Eq, PartialEq)] pub struct Cell { #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_teenystring", serialize_with = "serialize_teenystring" ) )] text: TeenyString, attrs: CellAttributes, } impl std::fmt::Debug for Cell { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fmt.debug_struct("Cell") .field("text", &self.str()) .field("width", &self.width()) .field("attrs", &self.attrs) .finish() } } impl Default for Cell { fn default() -> Self { Self::blank() } } impl Cell { /// Create a new cell holding the specified character and with the /// specified cell attributes. /// All control and movement characters are rewritten as a space. pub fn new(text: char, attrs: CellAttributes) -> Self { let storage = TeenyString::from_char(text); Self { text: storage, attrs, } } pub const fn blank() -> Self { Self { text: TeenyString::space(), attrs: CellAttributes::blank(), } } pub const fn blank_with_attrs(attrs: CellAttributes) -> Self { Self { text: TeenyString::space(), attrs, } } /// Indicates whether this cell has text or emoji presentation. /// The width already reflects that choice; this information /// is also useful when selecting an appropriate font. pub fn presentation(&self) -> Presentation { match Presentation::for_grapheme(self.str()) { (_, Some(variation)) => variation, (presentation, None) => presentation, } } /// Create a new cell holding the specified grapheme. /// The grapheme is passed as a string slice and is intended to hold /// double-width characters, or combining unicode sequences, that need /// to be treated as a single logical "character" that can be cursored /// over. This function technically allows for an arbitrary string to /// be passed but it should not be used to hold strings other than /// graphemes. pub fn new_grapheme( text: &str, attrs: CellAttributes, unicode_version: Option, ) -> Self { let storage = TeenyString::from_str(text, None, unicode_version); Self { text: storage, attrs, } } pub fn new_grapheme_with_width(text: &str, width: usize, attrs: CellAttributes) -> Self { let storage = TeenyString::from_str(text, Some(width), None); Self { text: storage, attrs, } } /// Returns the textual content of the cell pub fn str(&self) -> &str { self.text.str() } /// Returns the number of cells visually occupied by this grapheme pub fn width(&self) -> usize { self.text.width() } /// Returns the attributes of the cell pub fn attrs(&self) -> &CellAttributes { &self.attrs } pub fn attrs_mut(&mut self) -> &mut CellAttributes { &mut self.attrs } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct UnicodeVersion { pub version: u8, pub ambiguous_are_wide: bool, } impl UnicodeVersion { pub const fn new(version: u8) -> Self { Self { version, ambiguous_are_wide: false, } } #[inline] fn width(&self, c: WcWidth) -> usize { // Special case for symbol fonts that are naughtly and use // the unassigned range instead of the private use range. // if c == WcWidth::Unassigned { 1 } else if c == WcWidth::Ambiguous && self.ambiguous_are_wide { 2 } else if self.version >= 9 { c.width_unicode_9_or_later() as usize } else { c.width_unicode_8_or_earlier() as usize } } #[inline] pub fn idx(&self) -> usize { (if self.version > 9 { 2 } else { 0 }) | (if self.ambiguous_are_wide { 1 } else { 0 }) } } pub const LATEST_UNICODE_VERSION: UnicodeVersion = UnicodeVersion { version: 14, ambiguous_are_wide: false, }; /// Returns true if the char `c` has the unicode White_Space property pub fn is_white_space_char(c: char) -> bool { crate::white_space::WHITE_SPACE.contains_u32(c as u32) } /// Returns true if the grapheme string `g` consists entirely of characters /// that have the unicode White_Space property. pub fn is_white_space_grapheme(g: &str) -> bool { for c in g.chars() { if !is_white_space_char(c) { return false; } } true } /// Returns the number of cells visually occupied by a sequence /// of graphemes. /// Calls through to `grapheme_column_width` for each grapheme /// and sums up the length. pub fn unicode_column_width(s: &str, version: Option) -> usize { Graphemes::new(s) .map(|g| grapheme_column_width(g, version)) .sum() } /// Returns the number of cells visually occupied by a grapheme. /// The input string must be a single grapheme. /// /// There are some frustrating dragons in the realm of terminal cell widths: /// /// a) wcwidth and wcswidth are widely used by applications and may be /// several versions of unicode behind the current version /// b) The width of characters has and will change in the future. /// Unicode Version 8 -> 9 made some characters wider. /// Unicode 14 defines Emoji variation selectors that change the /// width depending on trailing context in the unicode sequence. /// /// Differing opinions about the width leads to visual artifacts in /// text and and line editors, especially with respect to cursor placement. /// /// There aren't any really great solutions to this problem, as a given /// terminal emulator may be fine locally but essentially breaks when /// ssh'ing into a remote system with a divergent wcwidth implementation. /// /// This means that a global understanding of the unicode version that /// is in use isn't a good solution. /// /// The approach that wezterm wants to take here is to define a /// configuration value that sets the starting level of unicode conformance, /// and to define an escape sequence that can push/pop a desired confirmance /// level onto a stack maintained by the terminal emulator. /// /// The terminal emulator can then pass the unicode version through to /// the Cell that is used to hold a grapheme, and that per-Cell version /// can then be used to calculate width. pub fn grapheme_column_width(s: &str, version: Option) -> usize { let version = version.as_ref().unwrap_or(&LATEST_UNICODE_VERSION); // Optimization: if there is a single byte we can directly cast // that byte as a char which will be in the range 0.255. // This takes ~1.5ns, and we can then look that up in the table // which is valid for chars in the range 0-0xffff. // That lookup also takes ~1.5ns, giving us a hot path latency // of ~3-4ns for a grapheme string that is comprised of a single // ASCII byte. // // Since we know this is a single ASCII char, we know that it // cannot be a sequence with a variation selector, so we don't // need to requested `Presentation` for it. if s.len() == 1 { let c = WCWIDTH_TABLE.classify(s.as_bytes()[0] as char); return version.width(c); } // Slow path: `s.chars()` will dominate and pull up the minimum // runtime to ~20ns if version.version >= 14 { // Lookup the grapheme to see if the presentation of // the grapheme forces the width. We can bypass // the WcWidth classification if that is true. match Presentation::for_grapheme(s) { (_, Some(Presentation::Emoji)) => return 2, (_, Some(Presentation::Text)) => return 1, (Presentation::Emoji, None) => return 2, (Presentation::Text, None) => {} } } // Otherwise, classify and sum up let mut width = 0; for c in s.chars() { let c = WCWIDTH_TABLE.classify(c); width += version.width(c); } width.min(2) } /// Models a change in the attributes of a cell in a stream of changes. /// Each variant specifies one of the possible attributes; the corresponding /// value holds the new value to be used for that attribute. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq, FromDynamic, ToDynamic)] pub enum AttributeChange { Intensity(Intensity), Underline(Underline), Italic(bool), Blink(Blink), Reverse(bool), StrikeThrough(bool), Invisible(bool), Foreground(ColorAttribute), Background(ColorAttribute), Hyperlink(Option>), } #[cfg(test)] mod test { use super::*; #[test] fn teeny_string() { assert!( std::mem::size_of::() <= std::mem::size_of::(), "if a pointer doesn't fit in u64 then we need to change TeenyString" ); let s = TeenyString::from_char('a'); assert_eq!(s.as_bytes(), &[b'a']); let longer = TeenyString::from_str("hellothere", None, None); assert_eq!(longer.as_bytes(), b"hellothere"); assert_eq!( TeenyString::from_char(' ').as_bytes(), TeenyString::space().as_bytes() ); } #[test] #[cfg(target_pointer_width = "64")] fn memory_usage() { assert_eq!(std::mem::size_of::(), 4); assert_eq!(std::mem::size_of::(), 20); assert_eq!(std::mem::size_of::(), 16); assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::>(), 24); assert_eq!(std::mem::size_of::(), 4); assert_eq!(std::mem::size_of::(), 8); } #[test] fn nerf_special() { for c in " \n\r\t".chars() { let cell = Cell::new(c, CellAttributes::default()); assert_eq!(cell.str(), " "); } for g in &["", " ", "\n", "\r", "\t", "\r\n"] { let cell = Cell::new_grapheme(g, CellAttributes::default(), None); assert_eq!(cell.str(), " "); } } #[test] fn test_width() { let foot = "\u{1f9b6}"; eprintln!("foot chars"); for c in foot.chars() { eprintln!("char: {:?}", c); } assert_eq!(unicode_column_width(foot, None), 2, "{} should be 2", foot); let women_holding_hands_dark_skin_tone_medium_light_skin_tone = "\u{1F469}\u{1F3FF}\u{200D}\u{1F91D}\u{200D}\u{1F469}\u{1F3FC}"; // Ensure that we can hold this longer grapheme sequence in the cell // and correctly return its string contents! let cell = Cell::new_grapheme( women_holding_hands_dark_skin_tone_medium_light_skin_tone, CellAttributes::default(), None, ); assert_eq!( cell.str(), women_holding_hands_dark_skin_tone_medium_light_skin_tone ); assert_eq!( cell.width(), 2, "width of {} should be 2", women_holding_hands_dark_skin_tone_medium_light_skin_tone ); let deaf_man = "\u{1F9CF}\u{200D}\u{2642}\u{FE0F}"; eprintln!("deaf_man chars"); for c in deaf_man.chars() { eprintln!("char: {:?}", c); } assert_eq!(unicode_column_width(deaf_man, None), 2); let man_dancing = "\u{1F57A}"; assert_eq!( unicode_column_width(man_dancing, Some(UnicodeVersion::new(9))), 2 ); assert_eq!( unicode_column_width(man_dancing, Some(UnicodeVersion::new(8))), 2 ); let raised_fist = "\u{270a}"; assert_eq!( unicode_column_width(raised_fist, Some(UnicodeVersion::new(9))), 2 ); assert_eq!( unicode_column_width(raised_fist, Some(UnicodeVersion::new(8))), 1 ); // This is a codepoint in the private use area let font_awesome_star = "\u{f005}"; eprintln!("font_awesome_star {}", font_awesome_star.escape_debug()); assert_eq!(unicode_column_width(font_awesome_star, None), 1); let england_flag = "\u{1f3f4}\u{e0067}\u{e0062}\u{e0065}\u{e006e}\u{e0067}\u{e007f}"; assert_eq!(unicode_column_width(england_flag, None), 2); } #[test] fn issue_1161() { let x_ideographic_space_x = "x\u{3000}x"; assert_eq!(unicode_column_width(x_ideographic_space_x, None), 4); assert_eq!( Graphemes::new(x_ideographic_space_x).collect::>(), vec!["x".to_string(), "\u{3000}".to_string(), "x".to_string()], ); let c = Cell::new_grapheme("\u{3000}", CellAttributes::blank(), None); assert_eq!(c.width(), 2); } #[test] fn issue_997() { let victory_hand = "\u{270c}"; let victory_hand_text_presentation = "\u{270c}\u{fe0e}"; assert_eq!( unicode_column_width(victory_hand_text_presentation, None), 1 ); assert_eq!(unicode_column_width(victory_hand, None), 1); assert_eq!( Graphemes::new(victory_hand_text_presentation).collect::>(), vec![victory_hand_text_presentation.to_string()] ); assert_eq!( Graphemes::new(victory_hand).collect::>(), vec![victory_hand.to_string()] ); let copyright_emoji_presentation = "\u{00A9}\u{FE0F}"; assert_eq!( Graphemes::new(copyright_emoji_presentation).collect::>(), vec![copyright_emoji_presentation.to_string()] ); assert_eq!(unicode_column_width(copyright_emoji_presentation, None), 2); assert_eq!( unicode_column_width(copyright_emoji_presentation, Some(UnicodeVersion::new(9))), 1 ); let copyright_text_presentation = "\u{00A9}"; assert_eq!( Graphemes::new(copyright_text_presentation).collect::>(), vec![copyright_text_presentation.to_string()] ); assert_eq!(unicode_column_width(copyright_text_presentation, None), 1); let raised_fist = "\u{270a}"; // Not valid to have explicit Text presentation for raised fist let raised_fist_text = "\u{270a}\u{fe0e}"; assert_eq!( Presentation::for_grapheme(raised_fist), (Presentation::Emoji, None) ); assert_eq!(unicode_column_width(raised_fist, None), 2); assert_eq!( Presentation::for_grapheme(raised_fist_text), (Presentation::Emoji, None) ); assert_eq!(unicode_column_width(raised_fist_text, None), 2); assert_eq!( Graphemes::new(raised_fist_text).collect::>(), vec![raised_fist_text.to_string()] ); assert_eq!( Graphemes::new(raised_fist).collect::>(), vec![raised_fist.to_string()] ); } #[test] fn issue_1573() { let sequence = "\u{1112}\u{1161}\u{11ab}"; assert_eq!(unicode_column_width(sequence, None), 2); assert_eq!(grapheme_column_width(sequence, None), 2); let sequence2 = std::str::from_utf8(b"\xe1\x84\x92\xe1\x85\xa1\xe1\x86\xab").unwrap(); assert_eq!(unicode_column_width(sequence2, None), 2); assert_eq!(grapheme_column_width(sequence2, None), 2); } // See // We're not directly "fixing" that issue here in termwiz at this time // because it isn't clear that this cell module has enough context // to eg: decide that the width of U+2028 should be returned as 1. // That decision is made over in wezterm-term when processing // a sequence of graphemes. This test case is just making assertions // about the properties of a couple of problematic zero-width // characters. #[test] fn issue_6637() { // U+2028 is the unicode line separator. It is Non-printing White_Space. let sequence = "\u{2028}"; // It has zero width assert_eq!(unicode_column_width(sequence, None), 0); assert_eq!(grapheme_column_width(sequence, None), 0); // it is white space assert!(is_white_space_grapheme(sequence)); // Just a couple of sanity checks for the white space function assert!(is_white_space_char(' ')); assert!(!is_white_space_char('x')); // U+2068 is a BIDI control character and is relevant here // due to . // It is Non-Printing, non-White_Space assert!(!is_white_space_char('\u{2068}')); } } termwiz-0.23.3/src/cellcluster.rs000064400000000000000000000261001046102023000150670ustar 00000000000000use crate::cell::CellAttributes; use crate::emoji::Presentation; use crate::surface::line::CellRef; use std::borrow::Cow; use wezterm_bidi::{BidiContext, Direction, ParagraphDirectionHint}; /// A `CellCluster` is another representation of a Line. /// A `Vec` is produced by walking through the Cells in /// a line and collecting succesive Cells with the same attributes /// together into a `CellCluster` instance. Additional metadata to /// aid in font rendering is also collected. #[derive(Debug, Clone)] pub struct CellCluster { pub attrs: CellAttributes, pub text: String, pub width: usize, pub presentation: Presentation, pub direction: Direction, byte_to_cell_idx: Vec, byte_to_cell_width: Vec, pub first_cell_idx: usize, } impl CellCluster { /// Given a byte index into `self.text`, return the corresponding /// cell index in the originating line. pub fn byte_to_cell_idx(&self, byte_idx: usize) -> usize { if self.byte_to_cell_idx.is_empty() { self.first_cell_idx + byte_idx } else { self.byte_to_cell_idx[byte_idx] } } pub fn byte_to_cell_width(&self, byte_idx: usize) -> u8 { if self.byte_to_cell_width.is_empty() { 1 } else { self.byte_to_cell_width[byte_idx] } } /// Compute the list of CellClusters from a set of visible cells. /// The input is typically the result of calling `Line::visible_cells()`. pub fn make_cluster<'a>( hint: usize, iter: impl Iterator>, bidi_hint: Option, ) -> Vec { let mut last_cluster = None; let mut clusters = Vec::new(); let mut whitespace_run = 0; let mut only_whitespace = false; for c in iter { let cell_idx = c.cell_index(); let presentation = c.presentation(); let cell_str = c.str(); let normalized_attr = if c.attrs().wrapped() { let mut attr_storage = c.attrs().clone(); attr_storage.set_wrapped(false); Cow::Owned(attr_storage) } else { Cow::Borrowed(c.attrs()) }; last_cluster = match last_cluster.take() { None => { // Start new cluster only_whitespace = cell_str == " "; whitespace_run = if only_whitespace { 1 } else { 0 }; Some(CellCluster::new( hint, presentation, normalized_attr.into_owned(), cell_str, cell_idx, c.width(), )) } Some(mut last) => { if last.attrs != *normalized_attr || last.presentation != presentation { // Flush pending cluster and start a new one clusters.push(last); only_whitespace = cell_str == " "; whitespace_run = if only_whitespace { 1 } else { 0 }; Some(CellCluster::new( hint, presentation, normalized_attr.into_owned(), cell_str, cell_idx, c.width(), )) } else { // Add to current cluster. // Force cluster to break when we get a run of 2 whitespace // characters following non-whitespace. // This reduces the amount of shaping work for scenarios where // the terminal is wide and a long series of short lines are printed; // the shaper can cache the few variations of trailing whitespace // and focus on shaping the shorter cluster sequences. // Or: // when bidi is disabled, force break on whitespace boundaries. // This reduces shaping load in the case where is a line is // updated continually, but only a portion of it changes // (eg: progress counter). let was_whitespace = whitespace_run > 0; if cell_str == " " { whitespace_run += 1; } else { whitespace_run = 0; only_whitespace = false; } let force_break = (!only_whitespace && whitespace_run > 2) || (!only_whitespace && bidi_hint.is_none() && was_whitespace); if force_break { clusters.push(last); only_whitespace = cell_str == " "; if whitespace_run > 0 { whitespace_run = 1; } Some(CellCluster::new( hint, presentation, normalized_attr.into_owned(), cell_str, cell_idx, c.width(), )) } else { last.add(cell_str, cell_idx, c.width()); Some(last) } } } }; } if let Some(cluster) = last_cluster { // Don't forget to include any pending cluster on the final step! clusters.push(cluster); } if let Some(hint) = bidi_hint { let mut resolved_clusters = vec![]; let mut context = BidiContext::new(); for cluster in clusters { Self::resolve_bidi(&mut context, hint, cluster, &mut resolved_clusters); } resolved_clusters } else { clusters } } fn resolve_bidi( context: &mut BidiContext, hint: ParagraphDirectionHint, cluster: CellCluster, resolved: &mut Vec, ) { let mut paragraph = Vec::with_capacity(cluster.text.len()); let mut codepoint_index_to_byte_idx = Vec::with_capacity(cluster.text.len()); for (byte_idx, c) in cluster.text.char_indices() { codepoint_index_to_byte_idx.push(byte_idx); paragraph.push(c); } context.resolve_paragraph(¶graph, hint); for run in context.reordered_runs(0..paragraph.len()) { let mut text = String::with_capacity(run.range.end - run.range.start); let mut byte_to_cell_idx = vec![]; let mut byte_to_cell_width = vec![]; let mut width = 0usize; let mut first_cell_idx = None; // Note: if we wanted the actual bidi-re-ordered // text we should iterate over run.indices here, // however, cluster.text will be fed into harfbuzz // and that requires the original logical order // for the text, so we look at run.range instead. for cp_idx in run.range.clone() { let cp = paragraph[cp_idx]; text.push(cp); let original_byte = codepoint_index_to_byte_idx[cp_idx]; let cell_width = cluster.byte_to_cell_width(original_byte); width += cell_width as usize; let cell_idx = cluster.byte_to_cell_idx(original_byte); if first_cell_idx.is_none() { first_cell_idx.replace(cell_idx); } if !cluster.byte_to_cell_width.is_empty() { for _ in 0..cp.len_utf8() { byte_to_cell_width.push(cell_width); } } if !cluster.byte_to_cell_idx.is_empty() { for _ in 0..cp.len_utf8() { byte_to_cell_idx.push(cell_idx); } } } resolved.push(CellCluster { attrs: cluster.attrs.clone(), text, width, direction: run.direction, presentation: cluster.presentation, byte_to_cell_width, byte_to_cell_idx, first_cell_idx: first_cell_idx.unwrap(), }); } } /// Start off a new cluster with some initial data fn new( hint: usize, presentation: Presentation, attrs: CellAttributes, text: &str, cell_idx: usize, width: usize, ) -> CellCluster { let mut idx = Vec::new(); if text.len() > 1 { // Prefer to avoid pushing any index data; this saves // allocating any storage until we have any cells that // are multibyte for _ in 0..text.len() { idx.push(cell_idx); } } let mut byte_to_cell_width = Vec::new(); if width > 1 { for _ in 0..text.len() { byte_to_cell_width.push(width as u8); } } let mut storage = String::with_capacity(hint); storage.push_str(text); CellCluster { attrs, width, text: storage, presentation, byte_to_cell_idx: idx, byte_to_cell_width, first_cell_idx: cell_idx, direction: Direction::LeftToRight, } } /// Add to this cluster fn add(&mut self, text: &str, cell_idx: usize, width: usize) { self.width += width; if !self.byte_to_cell_idx.is_empty() { // We had at least one multi-byte cell in the past for _ in 0..text.len() { self.byte_to_cell_idx.push(cell_idx); } } else if text.len() > 1 { // Extrapolate the indices so far for n in 0..self.text.len() { self.byte_to_cell_idx.push(n + self.first_cell_idx); } // Now add this new multi-byte cell text for _ in 0..text.len() { self.byte_to_cell_idx.push(cell_idx); } } if !self.byte_to_cell_width.is_empty() { // We had at least one double-wide cell in the past for _ in 0..text.len() { self.byte_to_cell_width.push(width as u8); } } else if width > 1 { // Extrapolate the widths so far; they must all be single width for _ in 0..self.text.len() { self.byte_to_cell_width.push(1); } // and add the current double width cell for _ in 0..text.len() { self.byte_to_cell_width.push(width as u8); } } self.text.push_str(text); } } termwiz-0.23.3/src/color.rs000064400000000000000000000246451046102023000137000ustar 00000000000000//! Colors for attributes // for FromPrimitive #![allow(clippy::useless_attribute)] use num_derive::*; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub use wezterm_color_types::{LinearRgba, SrgbaTuple}; use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value}; #[derive(Debug, Clone, Copy, FromPrimitive, PartialEq, Eq, FromDynamic, ToDynamic)] #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[repr(u8)] /// These correspond to the classic ANSI color indices and are /// used for convenience/readability in code pub enum AnsiColor { /// "Dark" black Black = 0, /// Dark red Maroon, /// Dark green Green, /// "Dark" yellow Olive, /// Dark blue Navy, /// Dark purple Purple, /// "Dark" cyan Teal, /// "Dark" white Silver, /// "Bright" black Grey, /// Bright red Red, /// Bright green Lime, /// Bright yellow Yellow, /// Bright blue Blue, /// Bright purple Fuchsia, /// Bright Cyan/Aqua Aqua, /// Bright white White, } impl From for u8 { fn from(col: AnsiColor) -> u8 { col as u8 } } /// Describes a color in the SRGB colorspace using red, green and blue /// components in the range 0-255. #[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash)] pub struct RgbColor { bits: u32, } impl Into for RgbColor { fn into(self) -> SrgbaTuple { self.to_tuple_rgba() } } impl RgbColor { /// Construct a color from discrete red, green, blue values /// in the range 0-255. pub const fn new_8bpc(red: u8, green: u8, blue: u8) -> Self { Self { bits: ((red as u32) << 16) | ((green as u32) << 8) | blue as u32, } } /// Construct a color from discrete red, green, blue values /// in the range 0.0-1.0 in the sRGB colorspace. pub fn new_f32(red: f32, green: f32, blue: f32) -> Self { let red = (red * 255.) as u8; let green = (green * 255.) as u8; let blue = (blue * 255.) as u8; Self::new_8bpc(red, green, blue) } /// Returns red, green, blue as 8bpc values. /// Will convert from 10bpc if that is the internal storage. pub fn to_tuple_rgb8(self) -> (u8, u8, u8) { ( (self.bits >> 16) as u8, (self.bits >> 8) as u8, self.bits as u8, ) } /// Returns red, green, blue as floating point values in the range 0.0-1.0. /// An alpha channel with the value of 1.0 is included. /// The values are in the sRGB colorspace. pub fn to_tuple_rgba(self) -> SrgbaTuple { SrgbaTuple( (self.bits >> 16) as u8 as f32 / 255.0, (self.bits >> 8) as u8 as f32 / 255.0, self.bits as u8 as f32 / 255.0, 1.0, ) } /// Returns red, green, blue as floating point values in the range 0.0-1.0. /// An alpha channel with the value of 1.0 is included. /// The values are converted from sRGB to linear colorspace. pub fn to_linear_tuple_rgba(self) -> LinearRgba { self.to_tuple_rgba().to_linear() } /// Construct a color from an X11/SVG/CSS3 color name. /// Returns None if the supplied name is not recognized. /// The list of names can be found here: /// pub fn from_named(name: &str) -> Option { Some(SrgbaTuple::from_named(name)?.into()) } /// Returns a string of the form `#RRGGBB` pub fn to_rgb_string(self) -> String { let (red, green, blue) = self.to_tuple_rgb8(); format!("#{:02x}{:02x}{:02x}", red, green, blue) } /// Returns a string of the form `rgb:RRRR/GGGG/BBBB` pub fn to_x11_16bit_rgb_string(self) -> String { let (red, green, blue) = self.to_tuple_rgb8(); format!( "rgb:{:02x}{:02x}/{:02x}{:02x}/{:02x}{:02x}", red, red, green, green, blue, blue ) } /// Construct a color from a string of the form `#RRGGBB` where /// R, G and B are all hex digits. /// `hsl:hue sat light` is also accepted, and allows specifying a color /// in the HSL color space, where `hue` is measure in degrees and has /// a range of 0-360, and both `sat` and `light` are specified in percentage /// in the range 0-100. pub fn from_rgb_str(s: &str) -> Option { let srgb: SrgbaTuple = s.parse().ok()?; Some(srgb.into()) } /// Construct a color from an SVG/CSS3 color name. /// or from a string of the form `#RRGGBB` where /// R, G and B are all hex digits. /// `hsl:hue sat light` is also accepted, and allows specifying a color /// in the HSL color space, where `hue` is measure in degrees and has /// a range of 0-360, and both `sat` and `light` are specified in percentage /// in the range 0-100. /// Returns None if the supplied name is not recognized. /// The list of names can be found here: /// pub fn from_named_or_rgb_string(s: &str) -> Option { RgbColor::from_rgb_str(&s).or_else(|| RgbColor::from_named(&s)) } } impl From for RgbColor { fn from(srgb: SrgbaTuple) -> RgbColor { let SrgbaTuple(r, g, b, _) = srgb; Self::new_f32(r, g, b) } } /// This is mildly unfortunate: in order to round trip RgbColor with serde /// we need to provide a Serialize impl equivalent to the Deserialize impl /// below. We use the impl below to allow more flexible specification of /// color strings in the config file. A side effect of doing it this way /// is that we have to serialize RgbColor as a 7-byte string when we could /// otherwise serialize it as a 3-byte array. There's probably a way /// to make this work more efficiently, but for now this will do. #[cfg(feature = "use_serde")] impl Serialize for RgbColor { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let s = self.to_rgb_string(); s.serialize(serializer) } } #[cfg(feature = "use_serde")] impl<'de> Deserialize<'de> for RgbColor { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; RgbColor::from_named_or_rgb_string(&s) .ok_or_else(|| format!("unknown color name: {}", s)) .map_err(serde::de::Error::custom) } } impl ToDynamic for RgbColor { fn to_dynamic(&self) -> Value { self.to_rgb_string().to_dynamic() } } impl FromDynamic for RgbColor { fn from_dynamic( value: &Value, options: FromDynamicOptions, ) -> Result { let s = String::from_dynamic(value, options)?; Ok(RgbColor::from_named_or_rgb_string(&s) .ok_or_else(|| format!("unknown color name: {}", s))?) } } /// An index into the fixed color palette. pub type PaletteIndex = u8; /// Specifies the color to be used when rendering a cell. /// This differs from `ColorAttribute` in that this type can only /// specify one of the possible color types at once, whereas the /// `ColorAttribute` type can specify a TrueColor value and a fallback. #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum ColorSpec { Default, /// Use either a raw number, or use values from the `AnsiColor` enum PaletteIndex(PaletteIndex), TrueColor(SrgbaTuple), } impl Default for ColorSpec { fn default() -> Self { ColorSpec::Default } } impl From for ColorSpec { fn from(col: AnsiColor) -> Self { ColorSpec::PaletteIndex(col as u8) } } impl From for ColorSpec { fn from(col: RgbColor) -> Self { ColorSpec::TrueColor(col.into()) } } impl From for ColorSpec { fn from(col: SrgbaTuple) -> Self { ColorSpec::TrueColor(col) } } /// Specifies the color to be used when rendering a cell. This is the /// type used in the `CellAttributes` struct and can specify an optional /// TrueColor value, allowing a fallback to a more traditional palette /// index if TrueColor is not available. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq, PartialEq, FromDynamic, ToDynamic, Hash)] pub enum ColorAttribute { /// Use RgbColor when supported, falling back to the specified PaletteIndex. TrueColorWithPaletteFallback(SrgbaTuple, PaletteIndex), /// Use RgbColor when supported, falling back to the default color TrueColorWithDefaultFallback(SrgbaTuple), /// Use the specified PaletteIndex PaletteIndex(PaletteIndex), /// Use the default color Default, } impl Default for ColorAttribute { fn default() -> Self { ColorAttribute::Default } } impl From for ColorAttribute { fn from(col: AnsiColor) -> Self { ColorAttribute::PaletteIndex(col as u8) } } impl From for ColorAttribute { fn from(spec: ColorSpec) -> Self { match spec { ColorSpec::Default => ColorAttribute::Default, ColorSpec::PaletteIndex(idx) => ColorAttribute::PaletteIndex(idx), ColorSpec::TrueColor(color) => ColorAttribute::TrueColorWithDefaultFallback(color), } } } #[cfg(test)] mod tests { use super::*; #[test] fn from_hsl() { let foo = RgbColor::from_rgb_str("hsl:235 100 50").unwrap(); assert_eq!(foo.to_rgb_string(), "#0015ff"); } #[test] fn from_rgb() { assert!(RgbColor::from_rgb_str("").is_none()); assert!(RgbColor::from_rgb_str("#xyxyxy").is_none()); let black = RgbColor::from_rgb_str("#FFF").unwrap(); assert_eq!(black.to_tuple_rgb8(), (0xf0, 0xf0, 0xf0)); let black = RgbColor::from_rgb_str("#000000").unwrap(); assert_eq!(black.to_tuple_rgb8(), (0, 0, 0)); let grey = RgbColor::from_rgb_str("rgb:D6/D6/D6").unwrap(); assert_eq!(grey.to_tuple_rgb8(), (0xd6, 0xd6, 0xd6)); let grey = RgbColor::from_rgb_str("rgb:f0f0/f0f0/f0f0").unwrap(); assert_eq!(grey.to_tuple_rgb8(), (0xf0, 0xf0, 0xf0)); } #[cfg(feature = "use_serde")] #[test] fn roundtrip_rgbcolor() { let data = varbincode::serialize(&RgbColor::from_named("DarkGreen").unwrap()).unwrap(); eprintln!("serialized as {:?}", data); let _decoded: RgbColor = varbincode::deserialize(data.as_slice()).unwrap(); } } termwiz-0.23.3/src/emoji.rs000064400000000000000000000024041046102023000136520ustar 00000000000000use crate::emoji_variation::VARIATION_MAP; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] pub enum Presentation { Text, Emoji, } impl Presentation { /// Returns the default presentation followed /// by the explicit presentation if specified /// by a variation selector pub fn for_grapheme(s: &str) -> (Self, Option) { if let Some((a, b)) = VARIATION_MAP.get(s) { return (*a, Some(*b)); } let mut presentation = Self::Text; for c in s.chars() { if Self::for_char(c) == Self::Emoji { presentation = Self::Emoji; break; } // Note that `c` may be some other combining // sequence that doesn't definitively indicate // that we're text, so we only positively // change presentation when we identify an // emoji char. } (presentation, None) } pub fn for_char(c: char) -> Self { if crate::emoji_presentation::EMOJI_PRESENTATION.contains_u32(c as u32) { Self::Emoji } else { Self::Text } } } termwiz-0.23.3/src/emoji_presentation.rs000064400000000000000000000141301046102023000164440ustar 00000000000000// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: // // ucd-generate property-bool . --include Emoji_Presentation --trie-set // // Unicode version: 16.0.0. // // ucd-generate 0.3.1 is available on crates.io. #[allow(unused)] pub const BY_NAME: &'static [(&'static str, &'static ::ucd_trie::TrieSet)] = &[("Emoji_Presentation", EMOJI_PRESENTATION)]; pub const EMOJI_PRESENTATION: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level2: &[ 0, 0xC000000, 0x91E0000000000, 0x6000000000000000, 0x300000, 0x80000000000FFF00, 0x60000C0200080000, 0x242C040000104030, 0x10000000C20, 0xB85000, 0x8001000000E00000, 0x18000000, 0x210000, ], tree3_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 13, 19, 13, 20, 0, 0, 0, 21, 0, 0, 0, 0, 22, 23, 13, 13, 0, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0x10, 0x8000, 0x7FE4000, 0xFFFFFFC000000000, 0x77C800004000002, 0x30000, 0xFFBFE001FFFFFFFF, 0xDFFFFFFFFFFFFFFF, 0xFFFFFFFF000FFFFF, 0xFF11FFFF000F87FF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFD, 0xFFFFFFFFFFFFFFFF, 0x9FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, 0x40000FFFFFF7800, 0x1000600000, 0xF800000000000000, 0xFFFF, 0x1FF01800F0E7103F, 0x10FFF00000000, 0xF7FFFFFFFFFFF000, 0xFFFFFFFFFFFFFFBF, 0x1FFF000000000000, 0xFFFFFFFFFFFF83FF, 0x1FF03FF9FFFC07F, ], }; termwiz-0.23.3/src/emoji_variation.rs000064400000000000000000060001471046102023000157360ustar 00000000000000//! This file was generated by running: //! cd ../codegen ; cargo run > ../emoji_variation.rs use crate::emoji::Presentation; pub static VARIATION_MAP: phf::Map<&'static str, (Presentation, Presentation)> = ::phf::Map { key: 12913932095322966823, disps: &[ (0, 226), (1, 0), (0, 488), (2, 141), (0, 1), (0, 79), (0, 45), (0, 0), (0, 88), (0, 7), (0, 69), (0, 20), (0, 12), (0, 19), (0, 14), (0, 662), (0, 9), (0, 339), (0, 197), (0, 0), (0, 4), (0, 82), (0, 82), (0, 669), (0, 208), (0, 78), (0, 146), (0, 44), (0, 264), (0, 82), (2, 210), (0, 1), (2, 281), (0, 4), (0, 112), (0, 0), (0, 1), (0, 122), (0, 139), (1, 4), (0, 6), (0, 0), (0, 36), (4, 351), (0, 95), (3, 610), (1, 523), (0, 124), (0, 5), (2, 515), (1, 252), (0, 14), (0, 15), (4, 416), (0, 42), (0, 10), (1, 204), (0, 3), (0, 92), (0, 35), (0, 425), (0, 29), (0, 4), (0, 13), (0, 342), (0, 1), (0, 0), (0, 492), (0, 7), (0, 4), (0, 10), (0, 0), (0, 22), (0, 235), (0, 105), (1, 566), (1, 257), (0, 397), (0, 57), (0, 191), (0, 101), (0, 31), (1, 427), (0, 187), (0, 228), (1, 3), (0, 249), (0, 68), (0, 422), (0, 0), (2, 136), (1, 49), (1, 573), (0, 463), (0, 4), (2, 184), (0, 1), (0, 1), (0, 10), (8, 73), (0, 312), (0, 41), (0, 522), (3, 205), (0, 707), (0, 518), (0, 113), (10, 569), (3, 634), (0, 16), (0, 18), (0, 71), (0, 126), (1, 181), (25, 615), (0, 249), (0, 138), (0, 5), (7, 292), (0, 152), (6, 310), (0, 262), (1, 0), (0, 13), (0, 54), (0, 5), (0, 0), (0, 21), (0, 26), (4, 314), (0, 48), (0, 123), (0, 13), (0, 0), (0, 0), (0, 2), (0, 19), (6, 243), (12, 409), (3, 82), (0, 601), (0, 2), ], entries: &[ ("♈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⌚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📤\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("✳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👍\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📟\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕧\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🔒\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("❤\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏭\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🖐\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☦\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("1\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♻\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("❓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌫\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕵\u{fe0e}", (Presentation::Text, Presentation::Text)), ("㊙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈷\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("❓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬅\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚽\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("❄\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("◻\u{fe0e}", (Presentation::Text, Presentation::Text)), ("❣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⌚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🅰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛑\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚇\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛓\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⏱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🅾\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⬆\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛄\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏎\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌍\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🖋\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📺\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🎟\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🈯\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛽\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☎\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏕\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🐕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🖋\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⚱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕣\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("®\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏺\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🅾\u{fe0e}", (Presentation::Text, Presentation::Text)), ("👇\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("👎\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🅱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚹\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⏹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🐦\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("✏\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♑\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏠\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✈\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("8\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚧\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✝\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("®\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗃\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈷\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚫\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗞\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✉\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("💣\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏋\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("💻\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📦\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📫\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⭐\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📷\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☢\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏳\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👆\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛏\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌍\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌤\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♑\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⏹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♍\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚫\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕉\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👽\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☺\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌏\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("➡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✝\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗃\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✔\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☄\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕣\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↘\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕵\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏞\u{fe0e}", (Presentation::Text, Presentation::Text)), ("‼\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏄\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛓\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👁\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎛\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗑\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎬\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⏱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎬\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛵\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🐕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("2\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👇\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☘\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌦\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏟\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕙\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("6\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛋\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☮\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗞\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☝\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖲\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("◀\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("〽\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏆\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏊\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌬\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖼\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("©\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕑\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("™\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⭕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕟\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚲\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛍\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬆\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("❄\u{fe0e}", (Presentation::Text, Presentation::Text)), ("◻\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕊\u{fe0e}", (Presentation::Text, Presentation::Text)), ("㊗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕢\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♟\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♒\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☁\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎧\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🎚\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚡\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏔\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖌\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕘\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌦\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📥\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛵\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛷\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚺\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🔈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("◾\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♏\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⭕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⏩\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🐿\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♠\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏚\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛤\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕗\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛏\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✒\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♉\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕒\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("8\u{fe0e}", (Presentation::Text, Presentation::Text)), ("↖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏋\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛤\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕡\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🍽\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖇\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗒\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌛\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🐟\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⭐\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏍\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("▶\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("◼\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕤\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("❗\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚍\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("😐\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕒\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("◽\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛳\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏎\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☎\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🍸\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☠\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚼\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🔍\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♦\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♏\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↘\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕐\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕑\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🔓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏳\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚒\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📷\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🐦\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏂\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("7\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↕\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚔\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏕\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♻\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛢\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕶\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☄\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("▪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕥\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🔍\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🅰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛲\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☦\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⤵\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📺\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☠\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏂\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ℹ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📹\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("💿\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☃\u{fe0e}", (Presentation::Text, Presentation::Text)), ("5\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🐿\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕛\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏄\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🖌\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✌\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🍽\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛈\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚾\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏛\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏷\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗺\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📬\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☮\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("7\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📻\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕝\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬇\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👂\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌛\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("1\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("❇\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏮\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗓\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕧\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📹\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎚\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⚠\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬛\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚲\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚍\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⁉\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏛\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("0\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕠\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛺\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♾\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛅\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏘\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("↔\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖊\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎟\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕟\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📤\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("✒\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✉\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖍\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛄\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("#\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📋\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📟\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛽\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛈\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("Ⓜ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☑\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♌\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗝\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚑\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏵\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕊\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏏\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🔒\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🈚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏔\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("*\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚕\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("◾\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚛\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏵\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕙\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("◽\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⁉\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🅱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("〰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏺\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("💳\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⏏\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("4\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖍\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📋\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("✌\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕷\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♀\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕗\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👉\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("💿\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗺\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♒\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♎\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕞\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🖥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🐈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("5\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖇\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚒\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚕\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✍\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🅿\u{fe0e}", (Presentation::Text, Presentation::Text)), ("▪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("👆\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏩\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🏠\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("💰\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏝\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕶\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🐈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("👉\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♠\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚼\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☑\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏆\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("💣\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♉\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♐\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛺\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("❣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎮\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("💳\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⚗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♋\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♊\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♿\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛢\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☀\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛏\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕥\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛏\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✍\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬛\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⤴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗄\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕖\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕖\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👽\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚘\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↕\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛷\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♐\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⚙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛠\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♍\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👎\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⤵\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📽\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🔈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕐\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♋\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏍\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ℹ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("4\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕦\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚘\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("✡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♟\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("6\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕉\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬅\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📦\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖊\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌎\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕠\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏘\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("9\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛎\u{fe0e}", (Presentation::Text, Presentation::Text)), ("◀\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♌\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♾\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖲\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕘\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✏\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏝\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📬\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⚠\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛳\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♿\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("❇\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👂\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("0\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚛\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("3\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✈\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⤴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕞\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↔\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕝\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕡\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📥\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♀\u{fe0e}", (Presentation::Text, Presentation::Text)), ("‼\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏟\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏭\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗝\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕛\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗒\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏲\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎛\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛋\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗑\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕷\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♊\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎞\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏌\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖼\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☀\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🅿\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏊\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("*\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("#\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌤\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛅\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌎\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕢\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚡\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("〽\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌶\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚺\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("😐\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏚\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⚓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗄\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("✂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("©\u{fe0e}", (Presentation::Text, Presentation::Text)), ("㊗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☃\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("➡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🀄\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🚭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("👁\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌶\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛍\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛠\u{fe0e}", (Presentation::Text, Presentation::Text)), ("💻\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📽\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("Ⓜ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚾\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♎\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚇\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⚽\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🍸\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("▶\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬇\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕤\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("3\u{fe0e}", (Presentation::Text, Presentation::Text)), ("👍\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌬\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚑\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☝\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚧\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏌\u{fe0e}", (Presentation::Text, Presentation::Text)), ("〰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌏\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☺\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("❗\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("㊙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛲\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("▫\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⏮\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("❤\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("9\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕦\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎮\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⏲\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("💰\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☁\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⚔\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗓\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🏷\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🏙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛎\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎧\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("▫\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🔓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🈂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌧\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("™\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖐\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☢\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛑\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎞\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈯\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🐟\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🏞\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📫\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📻\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌧\u{fe0e}", (Presentation::Text, Presentation::Text)), ("◼\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♦\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🀄\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚹\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("2\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☘\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✔\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌫\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ], }; use crate::widechar_width::{WcLookupTable, WcWidth}; pub const WCWIDTH_TABLE: WcLookupTable = WcLookupTable { table: [ WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::Ambiguous, WcWidth::NonCharacter, WcWidth::NonCharacter, ], }; termwiz-0.23.3/src/error.rs000064400000000000000000000120521046102023000137000ustar 00000000000000use std::fmt::Display; use thiserror::*; /// The termwiz Error type encapsulates a range of internal /// errors in an opaque manner. You can use the `source` /// method to reach the underlying errors if /// necessary, but it is not expected that most code will /// need to do so. Please file an issue if you've got a /// usecase for this! #[derive(Error, Debug)] #[error(transparent)] pub struct Error(pub(crate) InternalError); /// A Result whose error type is a termwiz Error pub type Result = std::result::Result; impl From for Error where E: Into, { fn from(err: E) -> Self { Self(err.into()) } } /// This enum encapsulates the various errors that can be /// mapped into the termwiz Error type. /// The intent is that this is effectively private to termwiz /// itself, but since Rust doesn't allow enums with private /// variants, we're dancing around with a newtype of an enum /// and hiding it from the docs. #[derive(Error, Debug)] #[non_exhaustive] #[doc(hidden)] pub enum InternalError { #[error(transparent)] Fmt(#[from] std::fmt::Error), #[error(transparent)] Io(#[from] std::io::Error), #[error(transparent)] Regex(#[from] fancy_regex::Error), #[error(transparent)] FromUtf8(#[from] std::string::FromUtf8Error), #[error(transparent)] Utf8(#[from] std::str::Utf8Error), #[error(transparent)] Base64(#[from] base64::DecodeError), #[error(transparent)] ParseFloat(#[from] std::num::ParseFloatError), #[error(transparent)] ParseInt(#[from] std::num::ParseIntError), #[error(transparent)] FloatIsNan(#[from] ordered_float::FloatIsNan), #[error("{0}")] StringErr(#[from] StringWrap), #[error(transparent)] Anyhow(#[from] anyhow::Error), #[error(transparent)] Terminfo(#[from] terminfo::Error), #[error(transparent)] FileDescriptor(#[from] filedescriptor::Error), #[error(transparent)] BlobLease(#[from] wezterm_blob_leases::Error), #[cfg(feature = "use_image")] #[error(transparent)] ImageError(#[from] image::ImageError), #[error("{}", .context)] Context { context: String, source: Box, }, } impl From for InternalError { fn from(s: String) -> Self { InternalError::StringErr(StringWrap(s)) } } #[derive(Error, Debug)] #[doc(hidden)] #[error("{0}")] pub struct StringWrap(pub String); #[macro_export] macro_rules! format_err { ($msg:literal $(,)?) => { return $crate::error::Error::from($crate::error::StringWrap($msg.to_string())) }; ($err:expr $(,)?) => { return $crate::error::Error::from($crate::error::StringWrap(format!($err))) }; ($fmt:expr, $($arg:tt)*) => { return $crate::error::Error::from($crate::error::StringWrap(format!($fmt, $($arg)*))) }; } #[macro_export] macro_rules! bail { ($msg:literal $(,)?) => { return Err($crate::error::StringWrap($msg.to_string()).into()) }; ($err:expr $(,)?) => { return Err($crate::error::StringWrap(format!($err)).into()) }; ($fmt:expr, $($arg:tt)*) => { return Err($crate::error::StringWrap(format!($fmt, $($arg)*)).into()) }; } #[macro_export] macro_rules! ensure { ($cond:expr, $msg:literal $(,)?) => { if !$cond { return Err($crate::error::StringWrap(format!($msg)).into()); } }; ($cond:expr, $err:expr $(,)?) => { if !$cond { return Err($crate::error::StringWrap(format!($err)).into()); } }; ($cond:expr, $fmt:expr, $($arg:tt)*) => { if !$cond { return Err($crate::error::StringWrap(format!($fmt, $($arg)*)).into()); } }; } /// This trait allows extending the Result type so that it can create a /// `termwiz::Error` that wraps an underlying other error and provide /// additional context on that error. pub trait Context { /// Wrap the error value with additional context. fn context(self, context: C) -> Result where C: Display + Send + Sync + 'static; /// Wrap the error value with additional context that is evaluated lazily /// only once an error does occur. fn with_context(self, f: F) -> Result where C: Display + Send + Sync + 'static, F: FnOnce() -> C; } impl Context for std::result::Result where E: std::error::Error + Send + Sync + 'static, { fn context(self, context: C) -> Result where C: Display + Send + Sync + 'static, { self.map_err(|error| { Error(InternalError::Context { context: context.to_string(), source: Box::new(error), }) }) } fn with_context(self, context: F) -> Result where C: Display + Send + Sync + 'static, F: FnOnce() -> C, { self.map_err(|error| { Error(InternalError::Context { context: context().to_string(), source: Box::new(error), }) }) } } termwiz-0.23.3/src/escape/apc.rs000064400000000000000000001155241046102023000145620ustar 00000000000000use crate::escape::osc::{base64_decode, base64_encode}; use std::collections::BTreeMap; use std::fmt::{Display, Error as FmtError, Formatter}; use std::io::{Read, Seek}; fn get<'a>(keys: &BTreeMap<&str, &'a str>, k: &str) -> Option<&'a str> { keys.get(k).map(|&s| s) } fn geti(keys: &BTreeMap<&str, &str>, k: &str) -> Option { get(keys, k).and_then(|s| s.parse().ok()) } fn set( keys: &mut BTreeMap<&'static str, String>, k: &'static str, v: &Option, ) { if let Some(v) = v { keys.insert(k, v.to_string()); } } #[derive(Clone, PartialEq, Eq)] pub enum KittyImageData { /// The data bytes, baes64-encoded fragments. /// t='d' Direct(String), DirectBin(Vec), /// The path to a file containing the data. /// t='f' File { path: String, /// the amount of data to read. /// S=... data_size: Option, /// The offset at which to read. /// O=... data_offset: Option, }, /// The path to a temporary file containing the data. /// If the path is in a known temporary location, /// it should be removed once the data has been read /// t='t' TemporaryFile { path: String, /// the amount of data to read. /// S=... data_size: Option, /// The offset at which to read. /// O=... data_offset: Option, }, /// The name of a shared memory object. /// Can be opened via shm_open() and then should be removed /// via shm_unlink(). /// On Windows, OpenFileMapping(), MapViewOfFile(), UnmapViewOfFile() /// and CloseHandle() are used to access and release the data. /// t='s' SharedMem { name: String, /// the amount of data to read. /// S=... data_size: Option, /// The offset at which to read. /// O=... data_offset: Option, }, } impl std::fmt::Debug for KittyImageData { fn fmt(&self, fmt: &mut Formatter) -> std::fmt::Result { match self { Self::Direct(data) => write!(fmt, "Direct({} bytes of data)", data.len()), Self::DirectBin(data) => write!(fmt, "DirectBin({} bytes of data)", data.len()), Self::File { path, data_offset, data_size, } => fmt .debug_struct("File") .field("path", &path) .field("data_offset", &data_offset) .field("data_size", data_size) .finish(), Self::TemporaryFile { path, data_offset, data_size, } => fmt .debug_struct("TemporaryFile") .field("path", &path) .field("data_offset", &data_offset) .field("data_size", data_size) .finish(), Self::SharedMem { name, data_offset, data_size, } => fmt .debug_struct("SharedMem") .field("name", &name) .field("data_offset", &data_offset) .field("data_size", data_size) .finish(), } } } impl KittyImageData { fn from_keys(keys: &BTreeMap<&str, &str>, payload: &[u8]) -> Option { let t = get(keys, "t").unwrap_or("d"); match t { "d" => Some(Self::Direct(String::from_utf8(payload.to_vec()).ok()?)), "f" => Some(Self::File { path: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), "t" => Some(Self::TemporaryFile { path: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), "s" => Some(Self::SharedMem { name: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::Direct(d) => { keys.insert("payload", d.to_string()); } Self::DirectBin(d) => { keys.insert("payload", base64_encode(d)); } Self::File { path, data_offset, data_size, } => { keys.insert("t", "f".to_string()); keys.insert("payload", base64_encode(&path)); set(keys, "S", data_size); set(keys, "S", data_offset); } Self::TemporaryFile { path, data_offset, data_size, } => { keys.insert("t", "t".to_string()); keys.insert("payload", base64_encode(&path)); set(keys, "S", data_size); set(keys, "S", data_offset); } Self::SharedMem { name, data_offset, data_size, } => { keys.insert("t", "s".to_string()); keys.insert("payload", base64_encode(&name)); set(keys, "S", data_size); set(keys, "S", data_offset); } } } /// Take the image data bytes. /// This operation is not repeatable as some of the sources require /// removing the underlying file or shared memory object as part /// of the read operaiton. pub fn load_data(self) -> std::io::Result> { fn read_from_file( path: &str, data_offset: Option, data_size: Option, ) -> std::io::Result> { let mut f = std::fs::File::open(path)?; if let Some(offset) = data_offset { f.seek(std::io::SeekFrom::Start(offset.into()))?; } if let Some(len) = data_size { let mut res = vec![0u8; len as usize]; f.read_exact(&mut res)?; Ok(res) } else { let mut res = vec![]; f.read_to_end(&mut res)?; Ok(res) } } match self { Self::Direct(data) => base64_decode(data).or_else(|err| { Err(std::io::Error::new( std::io::ErrorKind::InvalidInput, format!("base64 decode: {err:#}"), )) }), Self::DirectBin(bin) => Ok(bin), Self::File { path, data_offset, data_size, } => read_from_file(&path, data_offset, data_size), Self::TemporaryFile { path, data_offset, data_size, } => { let data = read_from_file(&path, data_offset, data_size)?; // need to sanity check that the path looks like a reasonable // temporary directory path before blindly unlinking it here. fn looks_like_temp_path(p: &str) -> bool { if p.starts_with("/tmp/") || p.starts_with("/var/tmp/") || p.starts_with("/dev/shm/") { return true; } if let Ok(t) = std::env::var("TMPDIR") { if p.starts_with(&t) { return true; } } false } if looks_like_temp_path(&path) { if let Err(err) = std::fs::remove_file(&path) { log::error!( "Unable to remove kitty image protocol temporary file {}: {:#}", path, err ); } } else { log::warn!( "kitty image protocol temporary file {} isn't in a known \ temporary directory; won't try to remove it", path ); } Ok(data) } Self::SharedMem { name, data_offset, data_size, } => read_shared_memory_data(&name, data_offset, data_size), } } } #[cfg(all(unix, not(target_os = "android")))] fn read_shared_memory_data( name: &str, data_offset: Option, data_size: Option, ) -> std::result::Result, std::io::Error> { use nix::sys::mman::{shm_open, shm_unlink}; use std::fs::File; let fd = shm_open( name, nix::fcntl::OFlag::O_RDONLY, nix::sys::stat::Mode::empty(), ) .map_err(|_| { let err = std::io::Error::last_os_error(); std::io::Error::new( std::io::ErrorKind::Other, format!("shm_open {} failed: {:#}", name, err), ) })?; let mut f = File::from(fd); if let Some(offset) = data_offset { f.seek(std::io::SeekFrom::Start(offset.into()))?; } let data = if let Some(len) = data_size { let mut res = vec![0u8; len as usize]; f.read_exact(&mut res)?; res } else { let mut res = vec![]; f.read_to_end(&mut res)?; res }; if let Err(err) = shm_unlink(name) { log::warn!( "Unable to unlink kitty image protocol shm file {}: {:#}", name, err ); } Ok(data) } #[cfg(all(unix, target_os = "android"))] fn read_shared_memory_data( _name: &str, _data_offset: Option, _data_size: Option, ) -> std::result::Result, std::io::Error> { Err(std::io::ErrorKind::Unsupported.into()) } #[cfg(windows)] mod win { use winapi::um::handleapi::CloseHandle; use winapi::um::memoryapi::{ MapViewOfFile, OpenFileMappingW, UnmapViewOfFile, VirtualQuery, FILE_MAP_ALL_ACCESS, }; use winapi::um::winnt::{HANDLE, MEMORY_BASIC_INFORMATION}; struct HandleWrapper { handle: HANDLE, } struct SharedMemObject { _handle: HandleWrapper, buf: *mut u8, } impl Drop for HandleWrapper { fn drop(&mut self) { unsafe { CloseHandle(self.handle); } } } impl Drop for SharedMemObject { fn drop(&mut self) { unsafe { UnmapViewOfFile(self.buf as _); } } } /// Convert a rust string to a windows wide string fn wide_string(s: &str) -> Vec { use std::os::windows::ffi::OsStrExt; std::ffi::OsStr::new(s) .encode_wide() .chain(std::iter::once(0)) .collect() } pub fn read_shared_memory_data( name: &str, data_offset: Option, data_size: Option, ) -> std::result::Result, std::io::Error> { let wide_name = wide_string(&name); let handle = unsafe { OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, wide_name.as_ptr()) }; if handle.is_null() { let err = std::io::Error::last_os_error(); return Err(std::io::Error::new( std::io::ErrorKind::Other, format!("OpenFileMappingW {} failed: {:#}", name, err), )); } let handle_wrapper = HandleWrapper { handle }; let buf = unsafe { MapViewOfFile(handle_wrapper.handle, FILE_MAP_ALL_ACCESS, 0, 0, 0) }; if buf.is_null() { let err = std::io::Error::last_os_error(); return Err(std::io::Error::new( std::io::ErrorKind::Other, format!("MapViewOfFile failed: {:#}", err), )); } let shm = SharedMemObject { _handle: handle_wrapper, buf: buf as *mut u8, }; let mut memory_info = MEMORY_BASIC_INFORMATION::default(); let res = unsafe { VirtualQuery( shm.buf as _, &mut memory_info as *mut MEMORY_BASIC_INFORMATION, std::mem::size_of::(), ) }; if res == 0 { let err = std::io::Error::last_os_error(); return Err(std::io::Error::new( std::io::ErrorKind::Other, format!( "Can't get the size of Shared Memory, VirtualQuery failed: {:#}", err ), )); } let mut size = memory_info.RegionSize; let offset = data_offset.unwrap_or(0) as usize; if offset >= size { return Err(std::io::Error::new( std::io::ErrorKind::Other, format!( "offset {} bigger than or equal to shm region size {}", offset, size ), )); } size = size.saturating_sub(offset); if let Some(val) = data_size { size = size.min(val as usize); } let buf_slice = unsafe { std::slice::from_raw_parts(shm.buf.add(offset), size) }; let data = buf_slice.to_vec(); Ok(data) } } #[cfg(windows)] use win::read_shared_memory_data; #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum KittyImageVerbosity { Verbose, OnlyErrors, Quiet, } impl KittyImageVerbosity { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { match get(keys, "q") { None | Some("0") => Some(Self::Verbose), Some("1") => Some(Self::OnlyErrors), Some("2") => Some(Self::Quiet), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::Verbose => {} Self::OnlyErrors => { keys.insert("q", "1".to_string()); } Self::Quiet => { keys.insert("q", "2".to_string()); } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImageFormat { /// f=24 Rgb, /// f=32 Rgba, /// f=100 Png, } impl KittyImageFormat { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option> { match get(keys, "f") { None => Some(None), Some("32") => Some(Some(Self::Rgba)), Some("24") => Some(Some(Self::Rgb)), Some("100") => Some(Some(Self::Png)), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::Rgb => keys.insert("f", "24".to_string()), Self::Rgba => keys.insert("f", "32".to_string()), Self::Png => keys.insert("f", "100".to_string()), }; } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImageCompression { None, /// o='z' Deflate, } impl KittyImageCompression { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { match get(keys, "o") { None => Some(Self::None), Some("z") => Some(Self::Deflate), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::None => {} Self::Deflate => { keys.insert("o", "z".to_string()); } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImageTransmit { /// f=... pub format: Option, /// combination of t=... and d=... pub data: KittyImageData, /// s=... pub width: Option, /// v=... pub height: Option, /// The image id. /// i=... pub image_id: Option, /// The image number /// I=... pub image_number: Option, /// o=... pub compression: KittyImageCompression, /// m=0 or m=1 pub more_data_follows: bool, } impl KittyImageTransmit { fn from_keys(keys: &BTreeMap<&str, &str>, payload: &[u8]) -> Option { Some(Self { format: KittyImageFormat::from_keys(keys)?, data: KittyImageData::from_keys(keys, payload)?, compression: KittyImageCompression::from_keys(keys)?, width: geti(keys, "s"), height: geti(keys, "v"), image_id: geti(keys, "i"), image_number: geti(keys, "I"), more_data_follows: match get(keys, "m") { None | Some("0") => false, Some("1") => true, _ => return None, }, }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { if let Some(f) = &self.format { f.to_keys(keys); } set(keys, "s", &self.width); set(keys, "v", &self.height); set(keys, "i", &self.image_id); set(keys, "I", &self.image_number); if self.more_data_follows { keys.insert("m", "1".to_string()); } self.compression.to_keys(keys); self.data.to_keys(keys); } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImagePlacement { /// source rectangle bounds. /// Default is whole image. /// x=... pub x: Option, pub y: Option, pub w: Option, pub h: Option, /// Place the image at an offset from the cell. /// X,Y must be <= cell metrics /// X=... pub x_offset: Option, /// Y=... pub y_offset: Option, /// Scale so that the image fits within this number of columns /// c=... pub columns: Option, /// Scale so that the image fits within this number of rows /// r=... pub rows: Option, /// By default, cursor will move to after the bottom right /// cell of the image placement. do_not_move_cursor cursor /// set to true prevents that. /// C=0, C=1 pub do_not_move_cursor: bool, /// Give an explicit placement id to this placement. /// p=... pub placement_id: Option, /// z=... pub z_index: Option, } impl KittyImagePlacement { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { Some(Self { x: geti(keys, "x"), y: geti(keys, "y"), w: geti(keys, "w"), h: geti(keys, "h"), x_offset: geti(keys, "X"), y_offset: geti(keys, "Y"), columns: geti(keys, "c"), rows: geti(keys, "r"), placement_id: geti(keys, "p"), do_not_move_cursor: match get(keys, "C") { None | Some("0") => false, Some("1") => true, _ => return None, }, z_index: geti(keys, "z"), }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { set(keys, "x", &self.x); set(keys, "y", &self.y); set(keys, "w", &self.w); set(keys, "h", &self.h); set(keys, "X", &self.x_offset); set(keys, "Y", &self.y_offset); set(keys, "c", &self.columns); set(keys, "r", &self.rows); set(keys, "p", &self.placement_id); if self.do_not_move_cursor { keys.insert("C", "1".to_string()); } set(keys, "z", &self.z_index); } } /// When the uppercase form is used, the delete: field is set to true /// which means that the underlying data is also released. Otherwise, /// the data is available to be placed again. #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImageDelete { /// d='a' or d='A'. /// Delete all placements on visible screen All { delete: bool }, /// d='i' or d='I' /// Delete all images with specified image_id. /// If placement_id is specified, then both image_id /// and placement_id must match ByImageId { image_id: u32, placement_id: Option, delete: bool, }, /// d='n' or d='N' /// Delete newest image with specified image number. /// If placement_id is specified, then placement_id /// must also match. ByImageNumber { image_number: u32, placement_id: Option, delete: bool, }, /// d='c' or d='C' /// Delete all placements that intersect with the current /// cursor position. AtCursorPosition { delete: bool }, /// d='f' or d='F' /// Delete animation frames AnimationFrames { delete: bool }, /// d='p' or d='P' /// Delete all placements that intersect the specified /// cell x and y coordinates DeleteAt { x: u32, y: u32, delete: bool }, /// d='q' or d='Q' /// Delete all placements that intersect the specified /// cell x and y coordinates, with the specified z-index DeleteAtZ { x: u32, y: u32, z: i32, delete: bool, }, /// d='x' or d='X' /// Delete all placements that intersect the specified column. DeleteColumn { x: u32, delete: bool }, /// d='y' or d='Y' /// Delete all placements that intersect the specified row. DeleteRow { y: u32, delete: bool }, /// d='z' or d='Z' /// Delete all placements that have the specified z-index. DeleteZ { z: i32, delete: bool }, } impl KittyImageDelete { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { let d = get(keys, "d").unwrap_or("a"); if d.len() != 1 { return None; } let d = d.chars().next()?; let delete = d.is_ascii_uppercase(); match d { 'a' | 'A' => Some(Self::All { delete }), 'i' | 'I' => Some(Self::ByImageId { image_id: geti(keys, "i")?, placement_id: geti(keys, "p"), delete, }), 'n' | 'N' => Some(Self::ByImageNumber { image_number: geti(keys, "I")?, placement_id: geti(keys, "p"), delete, }), 'c' | 'C' => Some(Self::AtCursorPosition { delete }), 'f' | 'F' => Some(Self::AnimationFrames { delete }), 'p' | 'P' => Some(Self::DeleteAt { x: geti(keys, "x")?, y: geti(keys, "y")?, delete, }), 'q' | 'Q' => Some(Self::DeleteAtZ { x: geti(keys, "x")?, y: geti(keys, "y")?, z: geti(keys, "z")?, delete, }), 'x' | 'X' => Some(Self::DeleteColumn { x: geti(keys, "x")?, delete, }), 'y' | 'Y' => Some(Self::DeleteRow { y: geti(keys, "y")?, delete, }), 'z' | 'Z' => Some(Self::DeleteZ { z: geti(keys, "z")?, delete, }), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { fn d(c: char, delete: &bool) -> String { if *delete { c.to_ascii_uppercase() } else { c }.to_string() } match self { Self::All { delete } => { keys.insert("d", d('a', delete)); } Self::ByImageId { image_id, placement_id, delete, } => { keys.insert("d", d('i', delete)); if let Some(p) = placement_id { keys.insert("p", p.to_string()); } keys.insert("i", image_id.to_string()); } Self::ByImageNumber { image_number, placement_id, delete, } => { keys.insert("d", d('n', delete)); if let Some(p) = placement_id { keys.insert("p", p.to_string()); } keys.insert("I", image_number.to_string()); } Self::AtCursorPosition { delete } => { keys.insert("d", d('c', delete)); } Self::AnimationFrames { delete } => { keys.insert("d", d('f', delete)); } Self::DeleteAt { x, y, delete } => { keys.insert("d", d('p', delete)); keys.insert("x", x.to_string()); keys.insert("y", y.to_string()); } Self::DeleteAtZ { x, y, z, delete } => { keys.insert("d", d('p', delete)); keys.insert("x", x.to_string()); keys.insert("y", y.to_string()); keys.insert("z", z.to_string()); } Self::DeleteColumn { x, delete } => { keys.insert("d", d('x', delete)); keys.insert("x", x.to_string()); } Self::DeleteRow { y, delete } => { keys.insert("d", d('y', delete)); keys.insert("y", y.to_string()); } Self::DeleteZ { z, delete } => { keys.insert("d", d('z', delete)); keys.insert("z", z.to_string()); } } } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum KittyFrameCompositionMode { AlphaBlending, Overwrite, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImageFrameCompose { /// i=... pub image_id: Option, /// I=... pub image_number: Option, /// 1-based number of the frame which should be the base /// data for the new frame being created. /// If omitted, use background_pixel to specify color. /// c=... pub target_frame: Option, /// 1-based number of the frame which should be edited. /// If omitted, a new frame is created. /// r=... pub source_frame: Option, /// Left edge in pixels to update /// x=... pub x: Option, /// Top edge in pixels to update /// y=... pub y: Option, /// Width (in pixels) of the source and destination rectangles. /// By default the full width is used. /// w=... pub w: Option, /// Height (in pixels) of the source and destination rectangles. /// By default the full height is used. /// h=... pub h: Option, /// Left edge in pixels of the source rectangle /// X=... pub src_x: Option, /// Top edge in pixels of the source rectangle /// Y=... pub src_y: Option, /// Composition mode. /// Default is AlphaBlending /// C=... pub composition_mode: KittyFrameCompositionMode, } impl KittyImageFrameCompose { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { Some(Self { image_id: geti(keys, "i"), image_number: geti(keys, "I"), x: geti(keys, "x"), y: geti(keys, "y"), src_x: geti(keys, "X"), src_y: geti(keys, "Y"), w: geti(keys, "w"), h: geti(keys, "h"), target_frame: match geti(keys, "c") { None | Some(0) => None, n => n, }, source_frame: match geti(keys, "r") { None | Some(0) => None, n => n, }, composition_mode: match geti(keys, "C") { None | Some(0) => KittyFrameCompositionMode::AlphaBlending, Some(1) => KittyFrameCompositionMode::Overwrite, _ => return None, }, }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { set(keys, "i", &self.image_id); set(keys, "I", &self.image_number); set(keys, "w", &self.w); set(keys, "h", &self.h); set(keys, "x", &self.x); set(keys, "y", &self.y); set(keys, "X", &self.src_x); set(keys, "Y", &self.src_y); set(keys, "c", &self.target_frame); set(keys, "r", &self.source_frame); match &self.composition_mode { KittyFrameCompositionMode::AlphaBlending => {} KittyFrameCompositionMode::Overwrite => { keys.insert("C", "1".to_string()); } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImageFrame { /// Left edge in pixels to update pub x: Option, /// Top edge in pixels to update pub y: Option, /// 1-based number of the frame which should be the base /// data for the new frame being created. /// If omitted, use background_pixel to specify color. /// c=... pub base_frame: Option, /// 1-based number of the frame which should be edited. /// If omitted, a new frame is created. /// r=... pub frame_number: Option, /// Gap in milliseconds of this frame from the next one. /// Zero or omitted values are interpreted as 40ms. /// z=... pub duration_ms: Option, /// Composition mode. /// Default is AlphaBlending /// X=... pub composition_mode: KittyFrameCompositionMode, /// Background color for pixels not specified in the frame data. /// If omitted, use a black, fully-transparent pixel (0) /// Y=... pub background_pixel: Option, } impl KittyImageFrame { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { Some(Self { x: geti(keys, "x"), y: geti(keys, "y"), base_frame: match geti(keys, "c") { None | Some(0) => None, n => n, }, frame_number: match geti(keys, "r") { None | Some(0) => None, n => n, }, duration_ms: match geti(keys, "Z") { None | Some(0) => None, n => n, }, composition_mode: match geti(keys, "X") { None | Some(0) => KittyFrameCompositionMode::AlphaBlending, Some(1) => KittyFrameCompositionMode::Overwrite, _ => return None, }, background_pixel: geti(keys, "Y"), }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { set(keys, "x", &self.x); set(keys, "y", &self.y); set(keys, "c", &self.base_frame); set(keys, "r", &self.frame_number); set(keys, "Z", &self.duration_ms); match &self.composition_mode { KittyFrameCompositionMode::AlphaBlending => {} KittyFrameCompositionMode::Overwrite => { keys.insert("X", "1".to_string()); } } set(keys, "Y", &self.background_pixel); } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImage { /// a='t' TransmitData { transmit: KittyImageTransmit, verbosity: KittyImageVerbosity, }, /// a='T' TransmitDataAndDisplay { transmit: KittyImageTransmit, placement: KittyImagePlacement, verbosity: KittyImageVerbosity, }, /// a='p' Display { image_id: Option, image_number: Option, placement: KittyImagePlacement, verbosity: KittyImageVerbosity, }, /// a='d' Delete { what: KittyImageDelete, verbosity: KittyImageVerbosity, }, /// a='q' Query { transmit: KittyImageTransmit }, /// a='f' TransmitFrame { transmit: KittyImageTransmit, frame: KittyImageFrame, verbosity: KittyImageVerbosity, }, /// a='c' ComposeFrame { frame: KittyImageFrameCompose, verbosity: KittyImageVerbosity, }, } impl KittyImage { pub fn verbosity(&self) -> KittyImageVerbosity { match self { Self::TransmitData { verbosity, .. } => *verbosity, Self::Query { .. } => KittyImageVerbosity::Verbose, Self::TransmitDataAndDisplay { verbosity, .. } => *verbosity, Self::Display { verbosity, .. } => *verbosity, Self::Delete { verbosity, .. } => *verbosity, Self::TransmitFrame { verbosity, .. } => *verbosity, Self::ComposeFrame { verbosity, .. } => *verbosity, } } pub fn parse_apc(data: &[u8]) -> Option { if data.is_empty() || data[0] != b'G' { return None; } let mut keys_payload_iter = data[1..].splitn(2, |&d| d == b';'); let keys = keys_payload_iter.next()?; let key_string = std::str::from_utf8(keys).ok()?; let mut keys: BTreeMap<&str, &str> = BTreeMap::new(); for k_v in key_string.split(',') { let mut k_v = k_v.splitn(2, '='); let k = k_v.next()?; let v = k_v.next()?; keys.insert(k, v); } let payload = keys_payload_iter.next().unwrap_or(b""); let action = get(&keys, "a").unwrap_or("t"); let verbosity = KittyImageVerbosity::from_keys(&keys)?; match action { "t" => Some(Self::TransmitData { transmit: KittyImageTransmit::from_keys(&keys, payload)?, verbosity, }), "q" => Some(Self::Query { transmit: KittyImageTransmit::from_keys(&keys, payload)?, }), "T" => Some(Self::TransmitDataAndDisplay { transmit: KittyImageTransmit::from_keys(&keys, payload)?, placement: KittyImagePlacement::from_keys(&keys)?, verbosity, }), "p" => Some(Self::Display { placement: KittyImagePlacement::from_keys(&keys)?, image_id: geti(&keys, "i"), image_number: geti(&keys, "I"), verbosity, }), "d" => Some(Self::Delete { what: KittyImageDelete::from_keys(&keys)?, verbosity, }), "f" => Some(Self::TransmitFrame { transmit: KittyImageTransmit::from_keys(&keys, payload)?, frame: KittyImageFrame::from_keys(&keys)?, verbosity, }), "c" => Some(Self::ComposeFrame { frame: KittyImageFrameCompose::from_keys(&keys)?, verbosity, }), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::TransmitData { transmit, verbosity, } => { // Implied: keys.insert("a", "t".to_string()); verbosity.to_keys(keys); transmit.to_keys(keys); } Self::Query { transmit } => { keys.insert("a", "q".to_string()); transmit.to_keys(keys); } Self::TransmitDataAndDisplay { transmit, verbosity, placement, } => { keys.insert("a", "Q".to_string()); verbosity.to_keys(keys); placement.to_keys(keys); transmit.to_keys(keys); } Self::Display { image_id, image_number, placement, verbosity, } => { keys.insert("a", "p".to_string()); verbosity.to_keys(keys); placement.to_keys(keys); if let Some(image_id) = image_id { keys.insert("i", image_id.to_string()); } if let Some(image_number) = image_number { keys.insert("I", image_number.to_string()); } } Self::Delete { what, verbosity } => { keys.insert("a", "d".to_string()); verbosity.to_keys(keys); what.to_keys(keys); } Self::TransmitFrame { transmit, verbosity, frame, } => { keys.insert("a", "f".to_string()); transmit.to_keys(keys); frame.to_keys(keys); verbosity.to_keys(keys); } Self::ComposeFrame { frame, verbosity } => { keys.insert("a", "c".to_string()); frame.to_keys(keys); verbosity.to_keys(keys); } } } } impl Display for KittyImage { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { write!(f, "\x1b_G")?; let mut keys = BTreeMap::new(); self.to_keys(&mut keys); let mut payload = None; let mut first = true; for (k, v) in keys { if k == "payload" { payload = Some(v); } else { if first { first = false; } else { write!(f, ",")?; } write!(f, "{}={}", k, v)?; } } if let Some(p) = payload { write!(f, ";{}", p)?; } Ok(()) } } #[cfg(test)] mod test { use super::*; use k9::assert_equal as assert_eq; #[test] fn kitty_payload() { assert_eq!( KittyImage::parse_apc("Gf=24,s=10,v=20;aGVsbG8=".as_bytes()).unwrap(), KittyImage::TransmitData { transmit: KittyImageTransmit { format: Some(KittyImageFormat::Rgb), data: KittyImageData::Direct("aGVsbG8=".to_string()), width: Some(10), height: Some(20), image_id: None, image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, verbosity: KittyImageVerbosity::Verbose, } ); assert_eq!( KittyImage::parse_apc("Ga=d,q=2".as_bytes()).unwrap(), KittyImage::Delete { what: KittyImageDelete::All { delete: false }, verbosity: KittyImageVerbosity::Quiet } ); assert_eq!( KittyImage::parse_apc( "Ga=f,x=119,y=384,s=17,v=32,i=7257421,X=1,r=1,q=2;AAAA=".as_bytes() ) .unwrap(), KittyImage::TransmitFrame { transmit: KittyImageTransmit { format: None, data: KittyImageData::Direct("AAAA=".to_string()), width: Some(17), height: Some(32), image_id: Some(7257421), image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, verbosity: KittyImageVerbosity::Quiet, frame: KittyImageFrame { x: Some(119), y: Some(384), base_frame: None, frame_number: Some(1), composition_mode: KittyFrameCompositionMode::Overwrite, background_pixel: None, duration_ms: None, }, } ); } } termwiz-0.23.3/src/escape/csi.rs000064400000000000000000003504641046102023000146010ustar 00000000000000use super::OneBased; use crate::cell::{Blink, Intensity, Underline, VerticalAlign}; use crate::color::{AnsiColor, ColorSpec, RgbColor, SrgbaTuple}; use crate::input::{Modifiers, MouseButtons}; use num_derive::*; use num_traits::{FromPrimitive, ToPrimitive}; use std::convert::TryInto; use std::fmt::{Display, Error as FmtError, Formatter}; pub use vtparse::CsiParam; #[derive(Debug, Clone, PartialEq, Eq)] pub enum CSI { /// SGR: Set Graphics Rendition. /// These values affect how the character is rendered. Sgr(Sgr), /// CSI codes that relate to the cursor Cursor(Cursor), Edit(Edit), Mode(Mode), Device(Box), Mouse(MouseReport), Window(Box), Keyboard(Keyboard), /// ECMA-48 SCP SelectCharacterPath(CharacterPath, i64), /// Unknown or unspecified; should be rare and is rather /// large, so it is boxed and kept outside of the enum /// body to help reduce space usage in the common cases. Unspecified(Box), } #[cfg(all(test, target_pointer_width = "64"))] #[test] fn csi_size() { assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::(), 12); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 40); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 32); } pub use wezterm_input_types::KittyKeyboardFlags; #[derive(Debug, Copy, Clone, PartialEq, Eq)] #[repr(u16)] pub enum KittyKeyboardMode { AssignAll = 1, SetSpecified = 2, ClearSpecified = 3, } #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum Keyboard { SetKittyState { flags: KittyKeyboardFlags, mode: KittyKeyboardMode, }, PushKittyState { flags: KittyKeyboardFlags, mode: KittyKeyboardMode, }, PopKittyState(u32), QueryKittySupport, ReportKittyState(KittyKeyboardFlags), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum CharacterPath { /// 0 ImplementationDefault, /// 1 LeftToRightOrTopToBottom, /// 2 RightToLeftOrBottomToTop, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Unspecified { pub params: Vec, /// if true, more than two intermediates arrived and the /// remaining data was ignored pub parameters_truncated: bool, /// The final character in the CSI sequence; this typically /// defines how to interpret the other parameters. pub control: char, } impl Display for Unspecified { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { for p in &self.params { write!(f, "{}", p)?; } write!(f, "{}", self.control) } } impl Display for CSI { // TODO: data size optimization opportunity: if we could somehow know that we // had a run of CSI instances being encoded in sequence, we could // potentially collapse them together. This is a few bytes difference in // practice so it may not be worthwhile with modern networks. fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { write!(f, "\x1b[")?; match self { CSI::Sgr(sgr) => sgr.fmt(f)?, CSI::Cursor(c) => c.fmt(f)?, CSI::Edit(e) => e.fmt(f)?, CSI::Mode(mode) => mode.fmt(f)?, CSI::Unspecified(unspec) => unspec.fmt(f)?, CSI::Mouse(mouse) => mouse.fmt(f)?, CSI::Device(dev) => dev.fmt(f)?, CSI::Window(window) => window.fmt(f)?, CSI::Keyboard(Keyboard::SetKittyState { flags, mode }) => { write!(f, "={};{}u", flags.bits(), *mode as u16)? } CSI::Keyboard(Keyboard::PushKittyState { flags, mode }) => { write!(f, ">{};{}u", flags.bits(), *mode as u16)? } CSI::Keyboard(Keyboard::PopKittyState(n)) => write!(f, "<{}u", *n)?, CSI::Keyboard(Keyboard::QueryKittySupport) => write!(f, "?u")?, CSI::Keyboard(Keyboard::ReportKittyState(flags)) => write!(f, "?{}u", flags.bits())?, CSI::SelectCharacterPath(path, n) => { let a = match path { CharacterPath::ImplementationDefault => 0, CharacterPath::LeftToRightOrTopToBottom => 1, CharacterPath::RightToLeftOrBottomToTop => 2, }; match (a, n) { (0, 0) => write!(f, " k")?, (a, 0) => write!(f, "{} k", a)?, (a, n) => write!(f, "{};{} k", a, n)?, } } }; Ok(()) } } #[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum CursorStyle { Default = 0, BlinkingBlock = 1, SteadyBlock = 2, BlinkingUnderline = 3, SteadyUnderline = 4, BlinkingBar = 5, SteadyBar = 6, } impl Default for CursorStyle { fn default() -> CursorStyle { CursorStyle::Default } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum DeviceAttributeCodes { Columns132 = 1, Printer = 2, RegisGraphics = 3, SixelGraphics = 4, SelectiveErase = 6, UserDefinedKeys = 8, NationalReplacementCharsets = 9, TechnicalCharacters = 15, UserWindows = 18, HorizontalScrolling = 21, AnsiColor = 22, AnsiTextLocator = 29, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum DeviceAttribute { Code(DeviceAttributeCodes), Unspecified(CsiParam), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct DeviceAttributeFlags { pub attributes: Vec, } impl DeviceAttributeFlags { fn emit(&self, f: &mut Formatter, leader: &str) -> Result<(), FmtError> { write!(f, "{}", leader)?; for item in &self.attributes { match item { DeviceAttribute::Code(c) => write!(f, ";{}", c.to_u16().ok_or_else(|| FmtError)?)?, DeviceAttribute::Unspecified(param) => write!(f, ";{}", param)?, } } write!(f, "c")?; Ok(()) } pub fn new(attributes: Vec) -> Self { Self { attributes } } fn from_params(params: &[CsiParam]) -> Self { let mut attributes = Vec::new(); for i in params { match i { CsiParam::Integer(p) => match FromPrimitive::from_i64(*p) { Some(c) => attributes.push(DeviceAttribute::Code(c)), None => attributes.push(DeviceAttribute::Unspecified(i.clone())), }, CsiParam::P(b';') => {} _ => attributes.push(DeviceAttribute::Unspecified(i.clone())), } } Self { attributes } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum DeviceAttributes { Vt100WithAdvancedVideoOption, Vt101WithNoOptions, Vt102, Vt220(DeviceAttributeFlags), Vt320(DeviceAttributeFlags), Vt420(DeviceAttributeFlags), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtSmGraphicsItem { NumberOfColorRegisters, SixelGraphicsGeometry, RegisGraphicsGeometry, Unspecified(i64), } impl Display for XtSmGraphicsItem { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Self::NumberOfColorRegisters => write!(f, "1"), Self::SixelGraphicsGeometry => write!(f, "2"), Self::RegisGraphicsGeometry => write!(f, "3"), Self::Unspecified(n) => write!(f, "{}", n), } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtSmGraphicsAction { ReadAttribute, ResetToDefault, SetToValue, ReadMaximumAllowedValue, } impl XtSmGraphicsAction { pub fn to_i64(&self) -> i64 { match self { Self::ReadAttribute => 1, Self::ResetToDefault => 2, Self::SetToValue => 3, Self::ReadMaximumAllowedValue => 4, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtSmGraphicsStatus { Success, InvalidItem, InvalidAction, Failure, } impl XtSmGraphicsStatus { pub fn to_i64(&self) -> i64 { match self { Self::Success => 0, Self::InvalidItem => 1, Self::InvalidAction => 2, Self::Failure => 3, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct XtSmGraphics { pub item: XtSmGraphicsItem, pub action_or_status: i64, pub value: Vec, } impl XtSmGraphics { pub fn action(&self) -> Option { match self.action_or_status { 1 => Some(XtSmGraphicsAction::ReadAttribute), 2 => Some(XtSmGraphicsAction::ResetToDefault), 3 => Some(XtSmGraphicsAction::SetToValue), 4 => Some(XtSmGraphicsAction::ReadMaximumAllowedValue), _ => None, } } pub fn status(&self) -> Option { match self.action_or_status { 0 => Some(XtSmGraphicsStatus::Success), 1 => Some(XtSmGraphicsStatus::InvalidItem), 2 => Some(XtSmGraphicsStatus::InvalidAction), 3 => Some(XtSmGraphicsStatus::Failure), _ => None, } } pub fn parse(params: &[CsiParam]) -> Result { let params = Cracked::parse(¶ms[1..])?; Ok(CSI::Device(Box::new(Device::XtSmGraphics(XtSmGraphics { item: match params.get(0).ok_or(())? { CsiParam::Integer(1) => XtSmGraphicsItem::NumberOfColorRegisters, CsiParam::Integer(2) => XtSmGraphicsItem::SixelGraphicsGeometry, CsiParam::Integer(3) => XtSmGraphicsItem::RegisGraphicsGeometry, CsiParam::Integer(n) => XtSmGraphicsItem::Unspecified(*n), _ => return Err(()), }, action_or_status: match params.get(1).ok_or(())? { CsiParam::Integer(n) => *n, _ => return Err(()), }, value: params.params[2..] .iter() .filter_map(|p| match p { Some(CsiParam::Integer(n)) => Some(*n), _ => None, }) .collect(), })))) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Device { DeviceAttributes(DeviceAttributes), /// DECSTR - https://vt100.net/docs/vt510-rm/DECSTR.html SoftReset, RequestPrimaryDeviceAttributes, RequestSecondaryDeviceAttributes, RequestTertiaryDeviceAttributes, StatusReport, /// https://github.com/mintty/mintty/issues/881 /// https://gitlab.gnome.org/GNOME/vte/-/issues/235 RequestTerminalNameAndVersion, RequestTerminalParameters(i64), XtSmGraphics(XtSmGraphics), } impl Display for Device { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Device::DeviceAttributes(DeviceAttributes::Vt100WithAdvancedVideoOption) => { write!(f, "?1;2c")? } Device::DeviceAttributes(DeviceAttributes::Vt101WithNoOptions) => write!(f, "?1;0c")?, Device::DeviceAttributes(DeviceAttributes::Vt102) => write!(f, "?6c")?, Device::DeviceAttributes(DeviceAttributes::Vt220(attr)) => attr.emit(f, "?62")?, Device::DeviceAttributes(DeviceAttributes::Vt320(attr)) => attr.emit(f, "?63")?, Device::DeviceAttributes(DeviceAttributes::Vt420(attr)) => attr.emit(f, "?64")?, Device::SoftReset => write!(f, "!p")?, Device::RequestPrimaryDeviceAttributes => write!(f, "c")?, Device::RequestSecondaryDeviceAttributes => write!(f, ">c")?, Device::RequestTertiaryDeviceAttributes => write!(f, "=c")?, Device::RequestTerminalNameAndVersion => write!(f, ">q")?, Device::RequestTerminalParameters(n) => write!(f, "{};1;1;128;128;1;0x", n + 2)?, Device::StatusReport => write!(f, "5n")?, Device::XtSmGraphics(g) => { write!(f, "?{};{}", g.item, g.action_or_status)?; for v in &g.value { write!(f, ";{}", v)?; } write!(f, "S")?; } }; Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum MouseButton { Button1Press, Button2Press, Button3Press, Button4Press, Button5Press, Button6Press, Button7Press, Button1Release, Button2Release, Button3Release, Button4Release, Button5Release, Button6Release, Button7Release, Button1Drag, Button2Drag, Button3Drag, None, } impl From for MouseButtons { fn from(button: MouseButton) -> MouseButtons { match button { MouseButton::Button1Press | MouseButton::Button1Drag => MouseButtons::LEFT, MouseButton::Button2Press | MouseButton::Button2Drag => MouseButtons::MIDDLE, MouseButton::Button3Press | MouseButton::Button3Drag => MouseButtons::RIGHT, MouseButton::Button4Press => MouseButtons::VERT_WHEEL | MouseButtons::WHEEL_POSITIVE, MouseButton::Button5Press => MouseButtons::VERT_WHEEL, MouseButton::Button6Press => MouseButtons::HORZ_WHEEL | MouseButtons::WHEEL_POSITIVE, MouseButton::Button7Press => MouseButtons::HORZ_WHEEL, _ => MouseButtons::NONE, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Window { DeIconify, Iconify, MoveWindow { x: i64, y: i64, }, ResizeWindowPixels { width: Option, height: Option, }, RaiseWindow, LowerWindow, RefreshWindow, ResizeWindowCells { width: Option, height: Option, }, RestoreMaximizedWindow, MaximizeWindow, MaximizeWindowVertically, MaximizeWindowHorizontally, UndoFullScreenMode, ChangeToFullScreenMode, ToggleFullScreen, ReportWindowState, ReportWindowPosition, ReportTextAreaPosition, ReportTextAreaSizePixels, ReportWindowSizePixels, ReportScreenSizePixels, ReportCellSizePixels, ReportCellSizePixelsResponse { width: Option, height: Option, }, ReportTextAreaSizeCells, ReportScreenSizeCells, ReportIconLabel, ReportWindowTitle, PushIconAndWindowTitle, PushIconTitle, PushWindowTitle, PopIconAndWindowTitle, PopIconTitle, PopWindowTitle, /// DECRQCRA; used by esctest ChecksumRectangularArea { request_id: i64, page_number: i64, top: OneBased, left: OneBased, bottom: OneBased, right: OneBased, }, } fn numstr_or_empty(x: &Option) -> String { match x { Some(x) => format!("{}", x), None => "".to_owned(), } } impl Display for Window { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Window::DeIconify => write!(f, "1t"), Window::Iconify => write!(f, "2t"), Window::MoveWindow { x, y } => write!(f, "3;{};{}t", x, y), Window::ResizeWindowPixels { width, height } => write!( f, "4;{};{}t", numstr_or_empty(height), numstr_or_empty(width), ), Window::RaiseWindow => write!(f, "5t"), Window::LowerWindow => write!(f, "6t"), Window::RefreshWindow => write!(f, "7t"), Window::ResizeWindowCells { width, height } => write!( f, "8;{};{}t", numstr_or_empty(height), numstr_or_empty(width), ), Window::RestoreMaximizedWindow => write!(f, "9;0t"), Window::MaximizeWindow => write!(f, "9;1t"), Window::MaximizeWindowVertically => write!(f, "9;2t"), Window::MaximizeWindowHorizontally => write!(f, "9;3t"), Window::UndoFullScreenMode => write!(f, "10;0t"), Window::ChangeToFullScreenMode => write!(f, "10;1t"), Window::ToggleFullScreen => write!(f, "10;2t"), Window::ReportWindowState => write!(f, "11t"), Window::ReportWindowPosition => write!(f, "13t"), Window::ReportTextAreaPosition => write!(f, "13;2t"), Window::ReportTextAreaSizePixels => write!(f, "14t"), Window::ReportWindowSizePixels => write!(f, "14;2t"), Window::ReportScreenSizePixels => write!(f, "15t"), Window::ReportCellSizePixels => write!(f, "16t"), Window::ReportCellSizePixelsResponse { width, height } => write!( f, "6;{};{}t", numstr_or_empty(height), numstr_or_empty(width), ), Window::ReportTextAreaSizeCells => write!(f, "18t"), Window::ReportScreenSizeCells => write!(f, "19t"), Window::ReportIconLabel => write!(f, "20t"), Window::ReportWindowTitle => write!(f, "21t"), Window::PushIconAndWindowTitle => write!(f, "22;0t"), Window::PushIconTitle => write!(f, "22;1t"), Window::PushWindowTitle => write!(f, "22;2t"), Window::PopIconAndWindowTitle => write!(f, "23;0t"), Window::PopIconTitle => write!(f, "23;1t"), Window::PopWindowTitle => write!(f, "23;2t"), Window::ChecksumRectangularArea { request_id, page_number, top, left, bottom, right, } => write!( f, "{};{};{};{};{};{}*y", request_id, page_number, top, left, bottom, right, ), } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum MouseReport { SGR1006 { x: u16, y: u16, button: MouseButton, modifiers: Modifiers, }, SGR1016 { x_pixels: u16, y_pixels: u16, button: MouseButton, modifiers: Modifiers, }, } impl Display for MouseReport { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { MouseReport::SGR1006 { x, y, button, modifiers, } => { let mut b = 0; if (*modifiers & Modifiers::SHIFT) != Modifiers::NONE { b |= 4; } if (*modifiers & Modifiers::ALT) != Modifiers::NONE { b |= 8; } if (*modifiers & Modifiers::CTRL) != Modifiers::NONE { b |= 16; } b |= match button { MouseButton::Button1Press | MouseButton::Button1Release => 0, MouseButton::Button2Press | MouseButton::Button2Release => 1, MouseButton::Button3Press | MouseButton::Button3Release => 2, MouseButton::Button4Press | MouseButton::Button4Release => 64, MouseButton::Button5Press | MouseButton::Button5Release => 65, MouseButton::Button6Press | MouseButton::Button6Release => 66, MouseButton::Button7Press | MouseButton::Button7Release => 67, MouseButton::Button1Drag => 32, MouseButton::Button2Drag => 33, MouseButton::Button3Drag => 34, MouseButton::None => 35, }; let trailer = match button { MouseButton::Button1Press | MouseButton::Button2Press | MouseButton::Button3Press | MouseButton::Button4Press | MouseButton::Button5Press | MouseButton::Button1Drag | MouseButton::Button2Drag | MouseButton::Button3Drag | MouseButton::None => 'M', _ => 'm', }; write!(f, "<{};{};{}{}", b, x, y, trailer) } MouseReport::SGR1016 { x_pixels, y_pixels, button, modifiers, } => { let mut b = 0; if (*modifiers & Modifiers::SHIFT) != Modifiers::NONE { b |= 4; } if (*modifiers & Modifiers::ALT) != Modifiers::NONE { b |= 8; } if (*modifiers & Modifiers::CTRL) != Modifiers::NONE { b |= 16; } b |= match button { MouseButton::Button1Press | MouseButton::Button1Release => 0, MouseButton::Button2Press | MouseButton::Button2Release => 1, MouseButton::Button3Press | MouseButton::Button3Release => 2, MouseButton::Button4Press | MouseButton::Button4Release => 64, MouseButton::Button5Press | MouseButton::Button5Release => 65, MouseButton::Button6Press | MouseButton::Button6Release => 66, MouseButton::Button7Press | MouseButton::Button7Release => 67, MouseButton::Button1Drag => 32, MouseButton::Button2Drag => 33, MouseButton::Button3Drag => 34, MouseButton::None => 35, }; let trailer = match button { MouseButton::Button1Press | MouseButton::Button2Press | MouseButton::Button3Press | MouseButton::Button4Press | MouseButton::Button5Press | MouseButton::Button1Drag | MouseButton::Button2Drag | MouseButton::Button3Drag | MouseButton::None => 'M', _ => 'm', }; write!(f, "<{};{};{}{}", b, x_pixels, y_pixels, trailer) } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtermKeyModifierResource { Keyboard, CursorKeys, FunctionKeys, OtherKeys, } impl XtermKeyModifierResource { pub fn parse(value: i64) -> Option { Some(match value { 0 => XtermKeyModifierResource::Keyboard, 1 => XtermKeyModifierResource::CursorKeys, 2 => XtermKeyModifierResource::FunctionKeys, 4 => XtermKeyModifierResource::OtherKeys, _ => return None, }) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Mode { SetDecPrivateMode(DecPrivateMode), ResetDecPrivateMode(DecPrivateMode), SaveDecPrivateMode(DecPrivateMode), RestoreDecPrivateMode(DecPrivateMode), QueryDecPrivateMode(DecPrivateMode), SetMode(TerminalMode), ResetMode(TerminalMode), QueryMode(TerminalMode), XtermKeyMode { resource: XtermKeyModifierResource, value: Option, }, } impl Display for Mode { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { macro_rules! emit { ($flag:expr, $mode:expr) => {{ let value = match $mode { DecPrivateMode::Code(mode) => mode.to_u16().ok_or_else(|| FmtError)?, DecPrivateMode::Unspecified(mode) => *mode, }; write!(f, "?{}{}", value, $flag) }}; } macro_rules! emit_mode { ($flag:expr, $mode:expr) => {{ let value = match $mode { TerminalMode::Code(mode) => mode.to_u16().ok_or_else(|| FmtError)?, TerminalMode::Unspecified(mode) => *mode, }; write!(f, "{}{}", value, $flag) }}; } match self { Mode::SetDecPrivateMode(mode) => emit!("h", mode), Mode::ResetDecPrivateMode(mode) => emit!("l", mode), Mode::SaveDecPrivateMode(mode) => emit!("s", mode), Mode::RestoreDecPrivateMode(mode) => emit!("r", mode), Mode::QueryDecPrivateMode(DecPrivateMode::Code(mode)) => { write!(f, "?{}$p", mode.to_u16().ok_or_else(|| FmtError)?) } Mode::QueryDecPrivateMode(DecPrivateMode::Unspecified(mode)) => { write!(f, "?{}$p", mode) } Mode::SetMode(mode) => emit_mode!("h", mode), Mode::ResetMode(mode) => emit_mode!("l", mode), Mode::QueryMode(TerminalMode::Code(mode)) => { write!(f, "?{}$p", mode.to_u16().ok_or_else(|| FmtError)?) } Mode::QueryMode(TerminalMode::Unspecified(mode)) => write!(f, "?{}$p", mode), Mode::XtermKeyMode { resource, value } => { write!( f, ">{}", match resource { XtermKeyModifierResource::Keyboard => 0, XtermKeyModifierResource::CursorKeys => 1, XtermKeyModifierResource::FunctionKeys => 2, XtermKeyModifierResource::OtherKeys => 4, } )?; if let Some(value) = value { write!(f, ";{}", value)?; } else { write!(f, ";")?; } write!(f, "m") } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum DecPrivateMode { Code(DecPrivateModeCode), Unspecified(u16), } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum DecPrivateModeCode { /// https://vt100.net/docs/vt510-rm/DECCKM.html /// This mode is only effective when the terminal is in keypad application mode (see DECKPAM) /// and the ANSI/VT52 mode (DECANM) is set (see DECANM). Under these conditions, if the cursor /// key mode is reset, the four cursor function keys will send ANSI cursor control commands. If /// cursor key mode is set, the four cursor function keys will send application functions. ApplicationCursorKeys = 1, /// https://vt100.net/docs/vt510-rm/DECANM.html /// Behave like a vt52 DecAnsiMode = 2, /// https://vt100.net/docs/vt510-rm/DECCOLM.html Select132Columns = 3, /// https://vt100.net/docs/vt510-rm/DECSCLM.html SmoothScroll = 4, /// https://vt100.net/docs/vt510-rm/DECSCNM.html ReverseVideo = 5, /// https://vt100.net/docs/vt510-rm/DECOM.html /// When OriginMode is enabled, cursor is constrained to the /// scroll region and its position is relative to the scroll /// region. OriginMode = 6, /// https://vt100.net/docs/vt510-rm/DECAWM.html /// When enabled, wrap to next line, Otherwise replace the last /// character AutoWrap = 7, /// https://vt100.net/docs/vt510-rm/DECARM.html AutoRepeat = 8, StartBlinkingCursor = 12, ShowCursor = 25, ReverseWraparound = 45, /// https://vt100.net/docs/vt510-rm/DECLRMM.html LeftRightMarginMode = 69, /// DECSDM - https://vt100.net/dec/ek-vt38t-ug-001.pdf#page=132 SixelDisplayMode = 80, /// Enable mouse button press/release reporting MouseTracking = 1000, /// Warning: this requires a cooperative and timely response from /// the application otherwise the terminal can hang HighlightMouseTracking = 1001, /// Enable mouse button press/release and drag reporting ButtonEventMouse = 1002, /// Enable mouse motion, button press/release and drag reporting AnyEventMouse = 1003, /// Enable FocusIn/FocusOut events FocusTracking = 1004, Utf8Mouse = 1005, /// Use extended coordinate system in mouse reporting. Does not /// enable mouse reporting itself, it just controls how reports /// will be encoded. SGRMouse = 1006, /// Use pixels rather than text cells in mouse reporting. Does /// not enable mouse reporting itself, it just controls how /// reports will be encoded. SGRPixelsMouse = 1016, XTermMetaSendsEscape = 1036, XTermAltSendsEscape = 1039, /// Save cursor as in DECSC SaveCursor = 1048, ClearAndEnableAlternateScreen = 1049, EnableAlternateScreen = 47, OptEnableAlternateScreen = 1047, BracketedPaste = 2004, /// /// Grapheme clustering mode GraphemeClustering = 2027, /// Applies to sixel and regis modes UsePrivateColorRegistersForEachGraphic = 1070, /// SynchronizedOutput = 2026, MinTTYApplicationEscapeKeyMode = 7727, /// xterm: adjust cursor positioning after emitting sixel SixelScrollsRight = 8452, /// Windows Terminal: win32-input-mode /// Win32InputMode = 9001, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum TerminalMode { Code(TerminalModeCode), Unspecified(u16), } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum TerminalModeCode { /// https://vt100.net/docs/vt510-rm/KAM.html KeyboardAction = 2, /// https://vt100.net/docs/vt510-rm/IRM.html Insert = 4, /// BiDirectionalSupportMode = 8, /// https://vt100.net/docs/vt510-rm/SRM.html /// But in the MS terminal this is cursor blinking. SendReceive = 12, /// https://vt100.net/docs/vt510-rm/LNM.html AutomaticNewline = 20, /// MS terminal cursor visibility ShowCursor = 25, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Cursor { /// CBT Moves cursor to the Ps tabs backward. The default value of Ps is 1. BackwardTabulation(u32), /// TBC - TABULATION CLEAR TabulationClear(TabulationClear), /// CHA: Moves cursor to the Ps-th column of the active line. The default /// value of Ps is 1. CharacterAbsolute(OneBased), /// HPA CHARACTER POSITION ABSOLUTE /// HPA Moves cursor to the Ps-th column of the active line. The default /// value of Ps is 1. CharacterPositionAbsolute(OneBased), /// HPB - CHARACTER POSITION BACKWARD /// HPB Moves cursor to the left Ps columns. The default value of Ps is 1. CharacterPositionBackward(u32), /// HPR - CHARACTER POSITION FORWARD /// HPR Moves cursor to the right Ps columns. The default value of Ps is 1. CharacterPositionForward(u32), /// HVP - CHARACTER AND LINE POSITION /// HVP Moves cursor to the Ps1-th line and to the Ps2-th column. The /// default value of Ps1 and Ps2 is 1. CharacterAndLinePosition { line: OneBased, col: OneBased, }, /// VPA - LINE POSITION ABSOLUTE /// Move to the corresponding vertical position (line Ps) of the current /// column. The default value of Ps is 1. LinePositionAbsolute(u32), /// VPB - LINE POSITION BACKWARD /// Moves cursor up Ps lines in the same column. The default value of Ps is /// 1. LinePositionBackward(u32), /// VPR - LINE POSITION FORWARD /// Moves cursor down Ps lines in the same column. The default value of Ps /// is 1. LinePositionForward(u32), /// CHT /// Moves cursor to the Ps tabs forward. The default value of Ps is 1. ForwardTabulation(u32), /// CNL Moves cursor to the first column of Ps-th following line. The /// default value of Ps is 1. NextLine(u32), /// CPL Moves cursor to the first column of Ps-th preceding line. The /// default value of Ps is 1. PrecedingLine(u32), /// CPR - ACTIVE POSITION REPORT /// If the DEVICE COMPONENT SELECT MODE (DCSM) /// is set to PRESENTATION, CPR is used to report the active presentation /// position of the sending device as residing in the presentation /// component at the n-th line position according to the line progression /// and at the m-th character position according to the character path, /// where n equals the value of Pn1 and m equal s the value of Pn2. /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to DATA, CPR is used /// to report the active data position of the sending device as /// residing in the data component at the n-th line position according /// to the line progression and at the m-th character position /// according to the character progression, where n equals the value of /// Pn1 and m equals the value of Pn2. CPR may be solicited by a DEVICE /// STATUS REPORT (DSR) or be sent unsolicited . ActivePositionReport { line: OneBased, col: OneBased, }, /// CPR: this is the request from the client. /// The terminal will respond with ActivePositionReport. RequestActivePositionReport, /// SCP - Save Cursor Position. /// Only works when DECLRMM is disabled SaveCursor, RestoreCursor, /// CTC - CURSOR TABULATION CONTROL /// CTC causes one or more tabulation stops to be set or cleared in the /// presentation component, depending on the parameter values. /// In the case of parameter values 0, 2 or 4 the number of lines affected /// depends on the setting of the TABULATION STOP MODE (TSM). TabulationControl(CursorTabulationControl), /// CUB - Cursor Left /// Moves cursor to the left Ps columns. The default value of Ps is 1. Left(u32), /// CUD - Cursor Down Down(u32), /// CUF - Cursor Right Right(u32), /// CUP - Cursor Position /// Moves cursor to the Ps1-th line and to the Ps2-th column. The default /// value of Ps1 and Ps2 is 1. Position { line: OneBased, col: OneBased, }, /// CUU - Cursor Up Up(u32), /// CVT - Cursor Line Tabulation /// CVT causes the active presentation position to be moved to the /// corresponding character position of the line corresponding to the n-th /// following line tabulation stop in the presentation component, where n /// equals the value of Pn. LineTabulation(u32), /// DECSTBM - Set top and bottom margins. SetTopAndBottomMargins { top: OneBased, bottom: OneBased, }, /// https://vt100.net/docs/vt510-rm/DECSLRM.html SetLeftAndRightMargins { left: OneBased, right: OneBased, }, CursorStyle(CursorStyle), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Edit { /// DCH - DELETE CHARACTER /// Deletes Ps characters from the cursor position to the right. The /// default value of Ps is 1. If the DEVICE COMPONENT SELECT MODE /// (DCSM) is set to PRESENTATION, DCH causes the contents of the /// active presentation position and, depending on the setting of the /// CHARACTER EDITING MODE (HEM), the contents of the n-1 preceding or /// following character positions to be removed from the presentation /// component, where n equals the value of Pn. The resulting gap is /// closed by shifting the contents of the adjacent character positions /// towards the active presentation position. At the other end of the /// shifted part, n character positions are put into the erased state. DeleteCharacter(u32), /// DL - DELETE LINE /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, DL /// causes the contents of the active line (the line that contains the /// active presentation position) and, depending on the setting of the /// LINE EDITING MODE (VEM), the contents of the n-1 preceding or /// following lines to be removed from the presentation component, where n /// equals the value of Pn. The resulting gap is closed by shifting the /// contents of a number of adjacent lines towards the active line. At /// the other end of the shifted part, n lines are put into the /// erased state. The active presentation position is moved to the line /// home position in the active line. The line home position is /// established by the parameter value of SET LINE HOME (SLH). If the /// TABULATION STOP MODE (TSM) is set to SINGLE, character tabulation stops /// are cleared in the lines that are put into the erased state. The /// extent of the shifted part is established by SELECT EDITING EXTENT /// (SEE). Any occurrences of the start or end of a selected area, the /// start or end of a qualified area, or a tabulation stop in the shifted /// part, are also shifted. DeleteLine(u32), /// ECH - ERASE CHARACTER /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, ECH /// causes the active presentation position and the n-1 following /// character positions in the presentation component to be put into /// the erased state, where n equals the value of Pn. EraseCharacter(u32), /// EL - ERASE IN LINE /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, EL /// causes some or all character positions of the active line (the line /// which contains the active presentation position in the presentation /// component) to be put into the erased state, depending on the /// parameter values EraseInLine(EraseInLine), /// ICH - INSERT CHARACTER /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, ICH /// is used to prepare the insertion of n characters, by putting into the /// erased state the active presentation position and, depending on the /// setting of the CHARACTER EDITING MODE (HEM), the n-1 preceding or /// following character positions in the presentation component, where n /// equals the value of Pn. The previous contents of the active /// presentation position and an adjacent string of character positions are /// shifted away from the active presentation position. The contents of n /// character positions at the other end of the shifted part are removed. /// The active presentation position is moved to the line home position in /// the active line. The line home position is established by the parameter /// value of SET LINE HOME (SLH). InsertCharacter(u32), /// IL - INSERT LINE /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, IL /// is used to prepare the insertion of n lines, by putting into the /// erased state in the presentation component the active line (the /// line that contains the active presentation position) and, depending on /// the setting of the LINE EDITING MODE (VEM), the n-1 preceding or /// following lines, where n equals the value of Pn. The previous /// contents of the active line and of adjacent lines are shifted away /// from the active line. The contents of n lines at the other end of the /// shifted part are removed. The active presentation position is moved /// to the line home position in the active line. The line home /// position is established by the parameter value of SET LINE /// HOME (SLH). InsertLine(u32), /// SD - SCROLL DOWN /// SD causes the data in the presentation component to be moved by n line /// positions if the line orientation is horizontal, or by n character /// positions if the line orientation is vertical, such that the data /// appear to move down; where n equals the value of Pn. The active /// presentation position is not affected by this control function. /// /// Also known as Pan Up in DEC: /// https://vt100.net/docs/vt510-rm/SD.html ScrollDown(u32), /// SU - SCROLL UP /// SU causes the data in the presentation component to be moved by n line /// positions if the line orientation is horizontal, or by n character /// positions if the line orientation is vertical, such that the data /// appear to move up; where n equals the value of Pn. The active /// presentation position is not affected by this control function. ScrollUp(u32), /// ED - ERASE IN PAGE (XTerm calls this Erase in Display) EraseInDisplay(EraseInDisplay), /// REP - Repeat the preceding character n times Repeat(u32), } trait EncodeCSIParam { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError>; } impl EncodeCSIParam for T { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError> { if *self == ParamEnum::default() { write!(f, "{}", control) } else { let value = self.to_i64().ok_or_else(|| FmtError)?; write!(f, "{}{}", value, control) } } } impl EncodeCSIParam for u32 { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError> { if *self == 1 { write!(f, "{}", control) } else { write!(f, "{}{}", *self, control) } } } impl EncodeCSIParam for OneBased { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError> { if self.as_one_based() == 1 { write!(f, "{}", control) } else { write!(f, "{}{}", *self, control) } } } impl Display for Edit { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Edit::DeleteCharacter(n) => n.write_csi(f, "P")?, Edit::DeleteLine(n) => n.write_csi(f, "M")?, Edit::EraseCharacter(n) => n.write_csi(f, "X")?, Edit::EraseInLine(n) => n.write_csi(f, "K")?, Edit::InsertCharacter(n) => n.write_csi(f, "@")?, Edit::InsertLine(n) => n.write_csi(f, "L")?, Edit::ScrollDown(n) => n.write_csi(f, "T")?, Edit::ScrollUp(n) => n.write_csi(f, "S")?, Edit::EraseInDisplay(n) => n.write_csi(f, "J")?, Edit::Repeat(n) => n.write_csi(f, "b")?, } Ok(()) } } impl Display for Cursor { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Cursor::BackwardTabulation(n) => n.write_csi(f, "Z")?, Cursor::CharacterAbsolute(col) => col.write_csi(f, "G")?, Cursor::ForwardTabulation(n) => n.write_csi(f, "I")?, Cursor::NextLine(n) => n.write_csi(f, "E")?, Cursor::PrecedingLine(n) => n.write_csi(f, "F")?, Cursor::ActivePositionReport { line, col } => write!(f, "{};{}R", line, col)?, Cursor::Left(n) => n.write_csi(f, "D")?, Cursor::Down(n) => n.write_csi(f, "B")?, Cursor::Right(n) => n.write_csi(f, "C")?, Cursor::Up(n) => n.write_csi(f, "A")?, Cursor::Position { line, col } => write!(f, "{};{}H", line, col)?, Cursor::LineTabulation(n) => n.write_csi(f, "Y")?, Cursor::TabulationControl(n) => n.write_csi(f, "W")?, Cursor::TabulationClear(n) => n.write_csi(f, "g")?, Cursor::CharacterPositionAbsolute(n) => n.write_csi(f, "`")?, Cursor::CharacterPositionBackward(n) => n.write_csi(f, "j")?, Cursor::CharacterPositionForward(n) => n.write_csi(f, "a")?, Cursor::CharacterAndLinePosition { line, col } => write!(f, "{};{}f", line, col)?, Cursor::LinePositionAbsolute(n) => n.write_csi(f, "d")?, Cursor::LinePositionBackward(n) => n.write_csi(f, "k")?, Cursor::LinePositionForward(n) => n.write_csi(f, "e")?, Cursor::SetTopAndBottomMargins { top, bottom } => { if top.as_one_based() == 1 && bottom.as_one_based() == u32::max_value() { write!(f, "r")?; } else { write!(f, "{};{}r", top, bottom)?; } } Cursor::SetLeftAndRightMargins { left, right } => { if left.as_one_based() == 1 && right.as_one_based() == u32::max_value() { write!(f, "s")?; } else { write!(f, "{};{}s", left, right)?; } } Cursor::RequestActivePositionReport => write!(f, "6n")?, Cursor::SaveCursor => write!(f, "s")?, Cursor::RestoreCursor => write!(f, "u")?, Cursor::CursorStyle(style) => write!(f, "{} q", *style as u8)?, } Ok(()) } } /// This trait aids in parsing escape sequences. /// In many cases we simply want to collect integral values >= 1, /// but in some we build out an enum. The trait helps to generalize /// the parser code while keeping it relatively terse. trait ParseParams: Sized { fn parse_params(params: &[CsiParam]) -> Result; } /// Parse an input parameter into a 1-based unsigned value impl ParseParams for u32 { fn parse_params(params: &[CsiParam]) -> Result { match params { [] => Ok(1), [p] => to_1b_u32(p), _ => Err(()), } } } /// Parse an input parameter into a 1-based unsigned value impl ParseParams for OneBased { fn parse_params(params: &[CsiParam]) -> Result { match params { [] => Ok(OneBased::new(1)), [p] => OneBased::from_esc_param(p), _ => Err(()), } } } /// Parse a pair of 1-based unsigned values into a tuple. /// This is typically used to build a struct comprised of /// the pair of values. impl ParseParams for (OneBased, OneBased) { fn parse_params(params: &[CsiParam]) -> Result<(OneBased, OneBased), ()> { match params { [] => Ok((OneBased::new(1), OneBased::new(1))), [p] => Ok((OneBased::from_esc_param(p)?, OneBased::new(1))), [a, CsiParam::P(b';'), b] => { Ok((OneBased::from_esc_param(a)?, OneBased::from_esc_param(b)?)) } [CsiParam::P(b';'), b] => Ok((OneBased::new(1), OneBased::from_esc_param(b)?)), _ => Err(()), } } } /// This is ostensibly a marker trait that is used within this module /// to denote an enum. It does double duty as a stand-in for Default. /// We need separate traits for this to disambiguate from a regular /// primitive integer. trait ParamEnum: FromPrimitive { fn default() -> Self; } /// implement ParseParams for the enums that also implement ParamEnum. impl ParseParams for T { fn parse_params(params: &[CsiParam]) -> Result { match params { [] => Ok(ParamEnum::default()), [CsiParam::Integer(i)] => FromPrimitive::from_i64(*i).ok_or(()), _ => Err(()), } } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum CursorTabulationControl { SetCharacterTabStopAtActivePosition = 0, SetLineTabStopAtActiveLine = 1, ClearCharacterTabStopAtActivePosition = 2, ClearLineTabstopAtActiveLine = 3, ClearAllCharacterTabStopsAtActiveLine = 4, ClearAllCharacterTabStops = 5, ClearAllLineTabStops = 6, } impl ParamEnum for CursorTabulationControl { fn default() -> Self { CursorTabulationControl::SetCharacterTabStopAtActivePosition } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum TabulationClear { ClearCharacterTabStopAtActivePosition = 0, ClearLineTabStopAtActiveLine = 1, ClearCharacterTabStopsAtActiveLine = 2, ClearAllCharacterTabStops = 3, ClearAllLineTabStops = 4, ClearAllTabStops = 5, } impl ParamEnum for TabulationClear { fn default() -> Self { TabulationClear::ClearCharacterTabStopAtActivePosition } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum EraseInLine { EraseToEndOfLine = 0, EraseToStartOfLine = 1, EraseLine = 2, } impl ParamEnum for EraseInLine { fn default() -> Self { EraseInLine::EraseToEndOfLine } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum EraseInDisplay { /// the active presentation position and the character positions up to the /// end of the page are put into the erased state EraseToEndOfDisplay = 0, /// the character positions from the beginning of the page up to and /// including the active presentation position are put into the erased /// state EraseToStartOfDisplay = 1, /// all character positions of the page are put into the erased state EraseDisplay = 2, /// Clears the scrollback. This is an Xterm extension to ECMA-48. EraseScrollback = 3, } impl ParamEnum for EraseInDisplay { fn default() -> Self { EraseInDisplay::EraseToEndOfDisplay } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Sgr { /// Resets rendition to defaults. Typically switches off /// all other Sgr options, but may have greater or lesser impact. Reset, /// Set the intensity/bold level Intensity(Intensity), Underline(Underline), UnderlineColor(ColorSpec), Blink(Blink), Italic(bool), Inverse(bool), Invisible(bool), StrikeThrough(bool), Font(Font), Foreground(ColorSpec), Background(ColorSpec), Overline(bool), VerticalAlign(VerticalAlign), } #[cfg(all(test, target_pointer_width = "64"))] #[test] fn sgr_size() { assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 20); assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 2); } impl Display for Sgr { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { macro_rules! code { ($t:ident) => { write!(f, "{}m", SgrCode::$t as i64)? }; } macro_rules! ansi_color { ($idx:expr, $eightbit:ident, $( ($Ansi:ident, $code:ident) ),*) => { if let Some(ansi) = FromPrimitive::from_u8($idx) { match ansi { $(AnsiColor::$Ansi => code!($code) ,)* } } else { write!(f, "{}:5:{}m", SgrCode::$eightbit as i64, $idx)? } } } match self { Sgr::Reset => code!(Reset), Sgr::Intensity(Intensity::Bold) => code!(IntensityBold), Sgr::Intensity(Intensity::Half) => code!(IntensityDim), Sgr::Intensity(Intensity::Normal) => code!(NormalIntensity), Sgr::Underline(Underline::Single) => code!(UnderlineOn), Sgr::Underline(Underline::Double) => code!(UnderlineDouble), Sgr::Underline(Underline::Curly) => write!(f, "4:3m")?, Sgr::Underline(Underline::Dotted) => write!(f, "4:4m")?, Sgr::Underline(Underline::Dashed) => write!(f, "4:5m")?, Sgr::Underline(Underline::None) => code!(UnderlineOff), Sgr::Blink(Blink::Slow) => code!(BlinkOn), Sgr::Blink(Blink::Rapid) => code!(RapidBlinkOn), Sgr::Blink(Blink::None) => code!(BlinkOff), Sgr::Italic(true) => code!(ItalicOn), Sgr::Italic(false) => code!(ItalicOff), Sgr::Inverse(true) => code!(InverseOn), Sgr::Inverse(false) => code!(InverseOff), Sgr::Invisible(true) => code!(InvisibleOn), Sgr::Invisible(false) => code!(InvisibleOff), Sgr::StrikeThrough(true) => code!(StrikeThroughOn), Sgr::StrikeThrough(false) => code!(StrikeThroughOff), Sgr::Overline(true) => code!(OverlineOn), Sgr::Overline(false) => code!(OverlineOff), Sgr::VerticalAlign(VerticalAlign::BaseLine) => code!(VerticalAlignBaseLine), Sgr::VerticalAlign(VerticalAlign::SuperScript) => code!(VerticalAlignSuperScript), Sgr::VerticalAlign(VerticalAlign::SubScript) => code!(VerticalAlignSubScript), Sgr::Font(Font::Default) => code!(DefaultFont), Sgr::Font(Font::Alternate(1)) => code!(AltFont1), Sgr::Font(Font::Alternate(2)) => code!(AltFont2), Sgr::Font(Font::Alternate(3)) => code!(AltFont3), Sgr::Font(Font::Alternate(4)) => code!(AltFont4), Sgr::Font(Font::Alternate(5)) => code!(AltFont5), Sgr::Font(Font::Alternate(6)) => code!(AltFont6), Sgr::Font(Font::Alternate(7)) => code!(AltFont7), Sgr::Font(Font::Alternate(8)) => code!(AltFont8), Sgr::Font(Font::Alternate(9)) => code!(AltFont9), Sgr::Font(_) => { /* there are no other possible font values */ } Sgr::Foreground(ColorSpec::Default) => code!(ForegroundDefault), Sgr::Background(ColorSpec::Default) => code!(BackgroundDefault), Sgr::Foreground(ColorSpec::PaletteIndex(idx)) => ansi_color!( *idx, ForegroundColor, (Black, ForegroundBlack), (Maroon, ForegroundRed), (Green, ForegroundGreen), (Olive, ForegroundYellow), (Navy, ForegroundBlue), (Purple, ForegroundMagenta), (Teal, ForegroundCyan), (Silver, ForegroundWhite), // Note: these brights are emitted using codes in the 100 range. // I don't know how portable this is vs. the 256 color sequences, // so we may need to make an adjustment here later. (Grey, ForegroundBrightBlack), (Red, ForegroundBrightRed), (Lime, ForegroundBrightGreen), (Yellow, ForegroundBrightYellow), (Blue, ForegroundBrightBlue), (Fuchsia, ForegroundBrightMagenta), (Aqua, ForegroundBrightCyan), (White, ForegroundBrightWhite) ), Sgr::Foreground(ColorSpec::TrueColor(c)) => { let (red, green, blue, alpha) = c.to_srgb_u8(); if alpha == 255 { write!( f, "{}:2::{}:{}:{}m", SgrCode::ForegroundColor as i64, red, green, blue )? } else { write!( f, "{}:6::{}:{}:{}:{}m", SgrCode::ForegroundColor as i64, red, green, blue, alpha )? } } Sgr::Background(ColorSpec::PaletteIndex(idx)) => ansi_color!( *idx, BackgroundColor, (Black, BackgroundBlack), (Maroon, BackgroundRed), (Green, BackgroundGreen), (Olive, BackgroundYellow), (Navy, BackgroundBlue), (Purple, BackgroundMagenta), (Teal, BackgroundCyan), (Silver, BackgroundWhite), // Note: these brights are emitted using codes in the 100 range. // I don't know how portable this is vs. the 256 color sequences, // so we may need to make an adjustment here later. (Grey, BackgroundBrightBlack), (Red, BackgroundBrightRed), (Lime, BackgroundBrightGreen), (Yellow, BackgroundBrightYellow), (Blue, BackgroundBrightBlue), (Fuchsia, BackgroundBrightMagenta), (Aqua, BackgroundBrightCyan), (White, BackgroundBrightWhite) ), Sgr::Background(ColorSpec::TrueColor(c)) => { let (red, green, blue, alpha) = c.to_srgb_u8(); if alpha == 255 { write!( f, "{}:2::{}:{}:{}m", SgrCode::BackgroundColor as i64, red, green, blue )? } else { write!( f, "{}:6::{}:{}:{}:{}m", SgrCode::BackgroundColor as i64, red, green, blue, alpha )? } } Sgr::UnderlineColor(ColorSpec::Default) => code!(ResetUnderlineColor), Sgr::UnderlineColor(ColorSpec::TrueColor(c)) => { let (red, green, blue, alpha) = c.to_srgb_u8(); if alpha == 255 { write!( f, "{}:2::{}:{}:{}m", SgrCode::UnderlineColor as i64, red, green, blue )? } else { write!( f, "{}:6::{}:{}:{}:{}m", SgrCode::UnderlineColor as i64, red, green, blue, alpha )? } } Sgr::UnderlineColor(ColorSpec::PaletteIndex(idx)) => { write!(f, "{}:5:{}m", SgrCode::UnderlineColor as i64, *idx)? } } Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Font { Default, Alternate(u8), } /// Constrol Sequence Initiator (CSI) Parser. /// Since many sequences allow for composition of actions by separating /// `;` character, we need to be able to iterate over /// the set of parsed actions from a given CSI sequence. /// `CSIParser` implements an Iterator that yields `CSI` instances as /// it parses them out from the input sequence. struct CSIParser<'a> { /// this flag is set when more than two intermediates /// arrived and subsequent characters were ignored. parameters_truncated: bool, control: char, /// While params is_some we have more data to consume. The advance_by /// method updates the slice as we consume data. /// In a number of cases an empty params list is used to indicate /// default values, especially for SGR, so we need to be careful not /// to update params to an empty slice. params: Option<&'a [CsiParam]>, orig_params: &'a [CsiParam], } impl CSI { /// Parse a CSI sequence. /// Returns an iterator that yields individual CSI actions. /// Why not a single? Because sequences like `CSI [ 1 ; 3 m` /// embed two separate actions but are sent as a single unit. /// If no semantic meaning is known for a subsequence, the remainder /// of the sequence is returned wrapped in a `CSI::Unspecified` container. pub fn parse<'a>( params: &'a [CsiParam], parameters_truncated: bool, control: char, ) -> impl Iterator + 'a { CSIParser { parameters_truncated, control, params: Some(params), orig_params: params, } } } /// A little helper to convert i64 -> u8 if safe fn to_u8(v: &CsiParam) -> Result { match v { CsiParam::P(_) => Err(()), CsiParam::Integer(v) => { if *v <= i64::from(u8::max_value()) { Ok(*v as u8) } else { Err(()) } } } } /// Convert the input value to 1-based u32. /// The intent is to protect consumers from out of range values /// when operating on the data, while balancing strictness with /// practical implementation bugs. For example, it is common /// to see 0 values being emitted from existing libraries, and /// we desire to see the intended output. /// Ensures that the value is in the range 1..=max_value. /// If the input is 0 it is treated as 1. If the value is /// otherwise outside that range, an error is propagated and /// that will typically case the sequence to be reported via /// the Unspecified placeholder. fn to_1b_u32(v: &CsiParam) -> Result { match v { CsiParam::Integer(v) if *v == 0 => Ok(1), CsiParam::Integer(v) if *v > 0 && *v <= i64::from(u32::max_value()) => Ok(*v as u32), _ => Err(()), } } struct Cracked { params: Vec>, } impl Cracked { pub fn parse(params: &[CsiParam]) -> Result { let mut res = vec![]; let mut iter = params.iter().peekable(); while let Some(p) = iter.next() { match p { CsiParam::P(b';') => { res.push(None); } CsiParam::Integer(_) => { res.push(Some(p.clone())); if let Some(CsiParam::P(b';')) = iter.peek() { iter.next(); } } _ => return Err(()), } } Ok(Self { params: res }) } pub fn get(&self, idx: usize) -> Option<&CsiParam> { self.params.get(idx)?.as_ref() } pub fn opt_int(&self, idx: usize) -> Option { self.get(idx).and_then(CsiParam::as_integer) } pub fn int(&self, idx: usize) -> Result { self.get(idx).and_then(CsiParam::as_integer).ok_or(()) } pub fn len(&self) -> usize { self.params.len() } } macro_rules! noparams { ($ns:ident, $variant:ident, $params:expr) => {{ if $params.len() != 0 { Err(()) } else { Ok(CSI::$ns($ns::$variant)) } }}; } macro_rules! parse { ($ns:ident, $variant:ident, $params:expr) => {{ let value = ParseParams::parse_params($params)?; Ok(CSI::$ns($ns::$variant(value))) }}; ($ns:ident, $variant:ident, $first:ident, $second:ident, $params:expr) => {{ let (p1, p2): (OneBased, OneBased) = ParseParams::parse_params($params)?; Ok(CSI::$ns($ns::$variant { $first: p1, $second: p2, })) }}; } impl<'a> CSIParser<'a> { fn parse_next(&mut self, params: &'a [CsiParam]) -> Result { match (self.control, self.orig_params) { ('k', [.., CsiParam::P(b' ')]) => self.select_character_path(params), ('q', [.., CsiParam::P(b' ')]) => self.cursor_style(params), ('y', [.., CsiParam::P(b'*')]) => self.checksum_area(params), ('c', [CsiParam::P(b'='), ..]) => self .req_tertiary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), ('c', [CsiParam::P(b'>'), ..]) => self .req_secondary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), ('m', [CsiParam::P(b'<'), ..]) | ('M', [CsiParam::P(b'<'), ..]) => { self.mouse_sgr1006(params).map(CSI::Mouse) } ('c', [CsiParam::P(b'?'), ..]) => self .secondary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), ('S', [CsiParam::P(b'?'), ..]) => XtSmGraphics::parse(params), ('p', [CsiParam::Integer(_), CsiParam::P(b'$')]) | ('p', [CsiParam::P(b'?'), CsiParam::Integer(_), CsiParam::P(b'$')]) => { self.decrqm(params) } ('h', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::SetDecPrivateMode(mode))), ('l', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::ResetDecPrivateMode(mode))), ('r', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::RestoreDecPrivateMode(mode))), ('q', [CsiParam::P(b'>'), ..]) => self .req_terminal_name_and_version(params) .map(|dev| CSI::Device(Box::new(dev))), ('s', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::SaveDecPrivateMode(mode))), ('m', [CsiParam::P(b'>'), ..]) => self.xterm_key_modifier(params), ('p', [CsiParam::P(b'!')]) => Ok(CSI::Device(Box::new(Device::SoftReset))), ('u', [CsiParam::P(b'='), CsiParam::Integer(flags)]) => { Ok(CSI::Keyboard(Keyboard::SetKittyState { flags: KittyKeyboardFlags::from_bits_truncate( (*flags).try_into().map_err(|_| ())?, ), mode: KittyKeyboardMode::AssignAll, })) } ( 'u', [CsiParam::P(b'='), CsiParam::Integer(flags), CsiParam::P(b';'), CsiParam::Integer(mode)], ) => Ok(CSI::Keyboard(Keyboard::SetKittyState { flags: KittyKeyboardFlags::from_bits_truncate((*flags).try_into().map_err(|_| ())?), mode: match *mode { 1 => KittyKeyboardMode::AssignAll, 2 => KittyKeyboardMode::SetSpecified, 3 => KittyKeyboardMode::ClearSpecified, _ => return Err(()), }, })), ('u', [CsiParam::P(b'>')]) => Ok(CSI::Keyboard(Keyboard::PushKittyState { flags: KittyKeyboardFlags::NONE, mode: KittyKeyboardMode::AssignAll, })), ('u', [CsiParam::P(b'>'), CsiParam::Integer(flags)]) => { Ok(CSI::Keyboard(Keyboard::PushKittyState { flags: KittyKeyboardFlags::from_bits_truncate( (*flags).try_into().map_err(|_| ())?, ), mode: KittyKeyboardMode::AssignAll, })) } ( 'u', [CsiParam::P(b'>'), CsiParam::Integer(flags), CsiParam::P(b';'), CsiParam::Integer(mode)], ) => Ok(CSI::Keyboard(Keyboard::PushKittyState { flags: KittyKeyboardFlags::from_bits_truncate((*flags).try_into().map_err(|_| ())?), mode: match *mode { 1 => KittyKeyboardMode::AssignAll, 2 => KittyKeyboardMode::SetSpecified, 3 => KittyKeyboardMode::ClearSpecified, _ => return Err(()), }, })), ('u', [CsiParam::P(b'?')]) => Ok(CSI::Keyboard(Keyboard::QueryKittySupport)), ('u', [CsiParam::P(b'?'), CsiParam::Integer(flags)]) => { Ok(CSI::Keyboard(Keyboard::ReportKittyState( KittyKeyboardFlags::from_bits_truncate((*flags).try_into().map_err(|_| ())?), ))) } ('u', [CsiParam::P(b'<'), CsiParam::Integer(how_many)]) => Ok(CSI::Keyboard( Keyboard::PopKittyState((*how_many).try_into().map_err(|_| ())?), )), ('u', [CsiParam::P(b'<')]) => Ok(CSI::Keyboard(Keyboard::PopKittyState(1))), _ => match self.control { 'c' => self .req_primary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), '@' => parse!(Edit, InsertCharacter, params), '`' => parse!(Cursor, CharacterPositionAbsolute, params), 'A' => parse!(Cursor, Up, params), 'B' => parse!(Cursor, Down, params), 'C' => parse!(Cursor, Right, params), 'D' => parse!(Cursor, Left, params), 'E' => parse!(Cursor, NextLine, params), 'F' => parse!(Cursor, PrecedingLine, params), 'G' => parse!(Cursor, CharacterAbsolute, params), 'H' => parse!(Cursor, Position, line, col, params), 'I' => parse!(Cursor, ForwardTabulation, params), 'J' => parse!(Edit, EraseInDisplay, params), 'K' => parse!(Edit, EraseInLine, params), 'L' => parse!(Edit, InsertLine, params), 'M' => parse!(Edit, DeleteLine, params), 'P' => parse!(Edit, DeleteCharacter, params), 'R' => parse!(Cursor, ActivePositionReport, line, col, params), 'S' => parse!(Edit, ScrollUp, params), 'T' => parse!(Edit, ScrollDown, params), 'W' => parse!(Cursor, TabulationControl, params), 'X' => parse!(Edit, EraseCharacter, params), 'Y' => parse!(Cursor, LineTabulation, params), 'Z' => parse!(Cursor, BackwardTabulation, params), 'a' => parse!(Cursor, CharacterPositionForward, params), 'b' => parse!(Edit, Repeat, params), 'd' => parse!(Cursor, LinePositionAbsolute, params), 'e' => parse!(Cursor, LinePositionForward, params), 'f' => parse!(Cursor, CharacterAndLinePosition, line, col, params), 'g' => parse!(Cursor, TabulationClear, params), 'h' => self .terminal_mode(params) .map(|mode| CSI::Mode(Mode::SetMode(mode))), 'j' => parse!(Cursor, CharacterPositionBackward, params), 'k' => parse!(Cursor, LinePositionBackward, params), 'l' => self .terminal_mode(params) .map(|mode| CSI::Mode(Mode::ResetMode(mode))), 'm' => self.sgr(params).map(CSI::Sgr), 'n' => self.dsr(params), 'r' => self.decstbm(params), 's' => self.decslrm(params), 't' => self.window(params).map(|p| CSI::Window(Box::new(p))), 'u' => noparams!(Cursor, RestoreCursor, params), 'x' => self .req_terminal_parameters(params) .map(|dev| CSI::Device(Box::new(dev))), _ => Err(()), }, } } /// Consume some number of elements from params and update it. /// Take care to avoid setting params back to an empty slice /// as this would trigger returning a default value and/or /// an unterminated parse loop. fn advance_by(&mut self, n: usize, params: &'a [CsiParam], result: T) -> T { let n = if matches!(params.get(n), Some(CsiParam::P(b';'))) { n + 1 } else { n }; let (_, next) = params.split_at(n); if !next.is_empty() { self.params = Some(next); } result } fn focus(&self, params: &'a [CsiParam], from_start: usize, from_end: usize) -> &'a [CsiParam] { if params == self.orig_params { let len = params.len(); ¶ms[from_start..len - from_end] } else { params } } fn select_character_path(&mut self, params: &'a [CsiParam]) -> Result { fn path(n: i64) -> Result { Ok(match n { 0 => CharacterPath::ImplementationDefault, 1 => CharacterPath::LeftToRightOrTopToBottom, 2 => CharacterPath::RightToLeftOrBottomToTop, _ => return Err(()), }) } match params { [CsiParam::P(b' ')] => Ok(self.advance_by( 1, params, CSI::SelectCharacterPath(CharacterPath::ImplementationDefault, 0), )), [CsiParam::Integer(a), CsiParam::P(b' ')] => { Ok(self.advance_by(2, params, CSI::SelectCharacterPath(path(*a)?, 0))) } [CsiParam::Integer(a), CsiParam::P(b';'), CsiParam::Integer(b), CsiParam::P(b' ')] => { Ok(self.advance_by(4, params, CSI::SelectCharacterPath(path(*a)?, *b))) } _ => Err(()), } } fn cursor_style(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::Integer(p), CsiParam::P(b' ')] => match FromPrimitive::from_i64(*p) { None => Err(()), Some(style) => { Ok(self.advance_by(2, params, CSI::Cursor(Cursor::CursorStyle(style)))) } }, _ => Err(()), } } fn checksum_area(&mut self, params: &'a [CsiParam]) -> Result { let params = Cracked::parse(¶ms[..params.len() - 1])?; let request_id = params.int(0)?; let page_number = params.int(1)?; let top = OneBased::from_optional_esc_param(params.get(2))?; let left = OneBased::from_optional_esc_param(params.get(3))?; let bottom = OneBased::from_optional_esc_param(params.get(4))?; let right = OneBased::from_optional_esc_param(params.get(5))?; Ok(CSI::Window(Box::new(Window::ChecksumRectangularArea { request_id, page_number, top, left, bottom, right, }))) } fn dsr(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::Integer(5)] => { Ok(self.advance_by(1, params, CSI::Device(Box::new(Device::StatusReport)))) } [CsiParam::Integer(6)] => { Ok(self.advance_by(1, params, CSI::Cursor(Cursor::RequestActivePositionReport))) } _ => Err(()), } } fn decstbm(&mut self, params: &'a [CsiParam]) -> Result { match params { [] => Ok(CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::new(1), bottom: OneBased::new(u32::max_value()), })), [p] => Ok(self.advance_by( 1, params, CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::from_esc_param(p)?, bottom: OneBased::new(u32::max_value()), }), )), [a, CsiParam::P(b';'), b] => Ok(self.advance_by( 3, params, CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::from_esc_param(a)?, bottom: OneBased::from_esc_param_with_big_default(b)?, }), )), [CsiParam::P(b';'), b] => Ok(self.advance_by( 2, params, CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::new(1), bottom: OneBased::from_esc_param_with_big_default(b)?, }), )), _ => Err(()), } } fn xterm_key_modifier(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::P(b'>'), a, CsiParam::P(b';'), b] => { let resource = XtermKeyModifierResource::parse(a.as_integer().ok_or_else(|| ())?) .ok_or_else(|| ())?; Ok(self.advance_by( 4, params, CSI::Mode(Mode::XtermKeyMode { resource, value: Some(b.as_integer().ok_or_else(|| ())?), }), )) } [CsiParam::P(b'>'), a, CsiParam::P(b';')] => { let resource = XtermKeyModifierResource::parse(a.as_integer().ok_or_else(|| ())?) .ok_or_else(|| ())?; Ok(self.advance_by( 3, params, CSI::Mode(Mode::XtermKeyMode { resource, value: None, }), )) } [CsiParam::P(b'>'), p] => { let resource = XtermKeyModifierResource::parse(p.as_integer().ok_or_else(|| ())?) .ok_or_else(|| ())?; Ok(self.advance_by( 2, params, CSI::Mode(Mode::XtermKeyMode { resource, value: None, }), )) } _ => Err(()), } } fn decslrm(&mut self, params: &'a [CsiParam]) -> Result { match params { [] => { // with no params this is a request to save the cursor // and is technically in conflict with SetLeftAndRightMargins. // The emulator needs to decide based on DECSLRM mode // whether this saves the cursor or is SetLeftAndRightMargins // with default parameters! Ok(CSI::Cursor(Cursor::SaveCursor)) } [p] => Ok(self.advance_by( 1, params, CSI::Cursor(Cursor::SetLeftAndRightMargins { left: OneBased::from_esc_param(p)?, right: OneBased::new(u32::max_value()), }), )), [a, CsiParam::P(b';'), b] => Ok(self.advance_by( 3, params, CSI::Cursor(Cursor::SetLeftAndRightMargins { left: OneBased::from_esc_param(a)?, right: OneBased::from_esc_param(b)?, }), )), [CsiParam::P(b';'), b] => Ok(self.advance_by( 2, params, CSI::Cursor(Cursor::SetLeftAndRightMargins { left: OneBased::new(1), right: OneBased::from_esc_param(b)?, }), )), _ => Err(()), } } fn req_primary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [] => Ok(Device::RequestPrimaryDeviceAttributes), [CsiParam::Integer(0)] => { Ok(self.advance_by(1, params, Device::RequestPrimaryDeviceAttributes)) } _ => Err(()), } } fn req_terminal_name_and_version(&mut self, params: &'a [CsiParam]) -> Result { match params { [_] => Ok(Device::RequestTerminalNameAndVersion), [_, CsiParam::Integer(0)] => { Ok(self.advance_by(2, params, Device::RequestTerminalNameAndVersion)) } _ => Err(()), } } fn req_secondary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::P(b'>')] => Ok(Device::RequestSecondaryDeviceAttributes), [CsiParam::P(b'>'), CsiParam::Integer(0)] => { Ok(self.advance_by(2, params, Device::RequestSecondaryDeviceAttributes)) } _ => Err(()), } } fn req_tertiary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::P(b'=')] => Ok(Device::RequestTertiaryDeviceAttributes), [CsiParam::P(b'='), CsiParam::Integer(0)] => { Ok(self.advance_by(2, params, Device::RequestTertiaryDeviceAttributes)) } _ => Err(()), } } fn secondary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [_, CsiParam::Integer(1), CsiParam::P(b';'), CsiParam::Integer(0)] => Ok(self .advance_by( 4, params, Device::DeviceAttributes(DeviceAttributes::Vt101WithNoOptions), )), [_, CsiParam::Integer(6)] => { Ok(self.advance_by(2, params, Device::DeviceAttributes(DeviceAttributes::Vt102))) } [_, CsiParam::Integer(1), CsiParam::P(b';'), CsiParam::Integer(2)] => Ok(self .advance_by( 4, params, Device::DeviceAttributes(DeviceAttributes::Vt100WithAdvancedVideoOption), )), [_, CsiParam::Integer(62), ..] => Ok(self.advance_by( params.len(), params, Device::DeviceAttributes(DeviceAttributes::Vt220( DeviceAttributeFlags::from_params(¶ms[2..]), )), )), [_, CsiParam::Integer(63), ..] => Ok(self.advance_by( params.len(), params, Device::DeviceAttributes(DeviceAttributes::Vt320( DeviceAttributeFlags::from_params(¶ms[2..]), )), )), [_, CsiParam::Integer(64), ..] => Ok(self.advance_by( params.len(), params, Device::DeviceAttributes(DeviceAttributes::Vt420( DeviceAttributeFlags::from_params(¶ms[2..]), )), )), _ => Err(()), } } fn req_terminal_parameters(&mut self, params: &'a [CsiParam]) -> Result { match params { [] | [CsiParam::Integer(0)] => Ok(Device::RequestTerminalParameters(0)), [CsiParam::Integer(1)] => Ok(Device::RequestTerminalParameters(1)), _ => Err(()), } } /// Parse extended mouse reports known as SGR 1006 mode fn mouse_sgr1006(&mut self, params: &'a [CsiParam]) -> Result { let (p0, p1, p2) = match params { [CsiParam::P(b'<'), CsiParam::Integer(p0), CsiParam::P(b';'), CsiParam::Integer(p1), CsiParam::P(b';'), CsiParam::Integer(p2)] => { (*p0, *p1, *p2) } _ => return Err(()), }; // 'M' encodes a press, 'm' a release. let button = match (self.control, p0 & 0b110_0011) { ('M', 0) => MouseButton::Button1Press, ('m', 0) => MouseButton::Button1Release, ('M', 1) => MouseButton::Button2Press, ('m', 1) => MouseButton::Button2Release, ('M', 2) => MouseButton::Button3Press, ('m', 2) => MouseButton::Button3Release, ('M', 64) => MouseButton::Button4Press, ('m', 64) => MouseButton::Button4Release, ('M', 65) => MouseButton::Button5Press, ('m', 65) => MouseButton::Button5Release, ('M', 66) => MouseButton::Button6Press, ('m', 66) => MouseButton::Button6Release, ('M', 67) => MouseButton::Button7Press, ('m', 67) => MouseButton::Button7Release, ('M', 32) => MouseButton::Button1Drag, ('M', 33) => MouseButton::Button2Drag, ('M', 34) => MouseButton::Button3Drag, // Note that there is some theoretical ambiguity with these None values. // The ambiguity stems from alternative encodings of the mouse protocol; // when set to SGR1006 mode the variants with the `3` parameter do not // occur. They included here as a reminder for when support for those // other encodings is added and this block is likely copied and pasted // or refactored for re-use with them. ('M', 35) => MouseButton::None, // mouse motion with no buttons ('m', 35) => MouseButton::None, // mouse motion with no buttons (in Windows Terminal) ('M', 3) => MouseButton::None, // legacy notification about button release ('m', 3) => MouseButton::None, // release+press doesn't make sense _ => { return Err(()); } }; let mut modifiers = Modifiers::NONE; if p0 & 4 != 0 { modifiers |= Modifiers::SHIFT; } if p0 & 8 != 0 { modifiers |= Modifiers::ALT; } if p0 & 16 != 0 { modifiers |= Modifiers::CTRL; } Ok(self.advance_by( 6, params, MouseReport::SGR1006 { x: p1 as u16, y: p2 as u16, button, modifiers, }, )) } fn decrqm(&mut self, params: &'a [CsiParam]) -> Result { Ok(CSI::Mode(match params { [CsiParam::Integer(p), CsiParam::P(b'$')] => { Mode::QueryMode(match FromPrimitive::from_i64(*p) { None => TerminalMode::Unspecified(p.to_u16().ok_or(())?), Some(mode) => TerminalMode::Code(mode), }) } [CsiParam::P(b'?'), CsiParam::Integer(p), CsiParam::P(b'$')] => { Mode::QueryDecPrivateMode(match FromPrimitive::from_i64(*p) { None => DecPrivateMode::Unspecified(p.to_u16().ok_or(())?), Some(mode) => DecPrivateMode::Code(mode), }) } _ => return Err(()), })) } fn dec(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::Integer(p0), ..] => match FromPrimitive::from_i64(*p0) { None => Ok(self.advance_by( 1, params, DecPrivateMode::Unspecified(p0.to_u16().ok_or(())?), )), Some(mode) => Ok(self.advance_by(1, params, DecPrivateMode::Code(mode))), }, _ => Err(()), } } fn terminal_mode(&mut self, params: &'a [CsiParam]) -> Result { let p0 = params .get(0) .and_then(CsiParam::as_integer) .ok_or_else(|| ())?; match FromPrimitive::from_i64(p0) { None => { Ok(self.advance_by(1, params, TerminalMode::Unspecified(p0.to_u16().ok_or(())?))) } Some(mode) => Ok(self.advance_by(1, params, TerminalMode::Code(mode))), } } fn parse_sgr_color(&mut self, params: &'a [CsiParam]) -> Result { match params { // wezterm extension to support an optional alpha channel in the `:` form only [_, CsiParam::P(b':'), CsiParam::Integer(6), CsiParam::P(b':'), CsiParam::Integer(_colorspace), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, CsiParam::P(b':'), alpha, ..] => { let res: SrgbaTuple = (to_u8(red)?, to_u8(green)?, to_u8(blue)?, to_u8(alpha)?).into(); Ok(self.advance_by(13, params, res.into())) } [_, CsiParam::P(b':'), CsiParam::Integer(6), CsiParam::P(b':'), /* empty colorspace */ CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, CsiParam::P(b':'), alpha, ..] => { let res: SrgbaTuple = (to_u8(red)?, to_u8(green)?, to_u8(blue)?, to_u8(alpha)?).into(); Ok(self.advance_by(12, params, res.into())) } [_, CsiParam::P(b':'), CsiParam::Integer(6), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, CsiParam::P(b':'), alpha, ..] => { let res: SrgbaTuple = (to_u8(red)?, to_u8(green)?, to_u8(blue)?, to_u8(alpha)?).into(); Ok(self.advance_by(11, params, res.into())) } // standard sgr colors [_, CsiParam::P(b':'), CsiParam::Integer(2), CsiParam::P(b':'), CsiParam::Integer(_colorspace), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, ..] => { let res = RgbColor::new_8bpc(to_u8(red)?, to_u8(green)?, to_u8(blue)?).into(); Ok(self.advance_by(11, params, res)) } [_, CsiParam::P(b':'), CsiParam::Integer(2), CsiParam::P(b':'), /* empty colorspace */ CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, ..] => { let res = RgbColor::new_8bpc(to_u8(red)?, to_u8(green)?, to_u8(blue)?).into(); Ok(self.advance_by(10, params, res)) } [_, CsiParam::P(b';'), CsiParam::Integer(2), CsiParam::P(b';'), red, CsiParam::P(b';'), green, CsiParam::P(b';'), blue, ..] | [_, CsiParam::P(b':'), CsiParam::Integer(2), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, ..] => { let res = RgbColor::new_8bpc(to_u8(red)?, to_u8(green)?, to_u8(blue)?).into(); Ok(self.advance_by(9, params, res)) } [_, CsiParam::P(b';'), CsiParam::Integer(5), CsiParam::P(b';'), idx, ..] | [_, CsiParam::P(b':'), CsiParam::Integer(5), CsiParam::P(b':'), idx, ..] => { Ok(self.advance_by(5, params, ColorSpec::PaletteIndex(to_u8(idx)?))) } _ => Err(()), } } fn window(&mut self, params: &'a [CsiParam]) -> Result { let params = Cracked::parse(params)?; let p = params.int(0)?; let arg1 = params.opt_int(1); let arg2 = params.opt_int(2); match p { 1 => Ok(Window::DeIconify), 2 => Ok(Window::Iconify), 3 => Ok(Window::MoveWindow { x: arg1.unwrap_or(0), y: arg2.unwrap_or(0), }), 4 => Ok(Window::ResizeWindowPixels { height: arg1, width: arg2, }), 5 => Ok(Window::RaiseWindow), 6 => match params.len() { 1 => Ok(Window::LowerWindow), _ => Ok(Window::ReportCellSizePixelsResponse { height: arg1, width: arg2, }), }, 7 => Ok(Window::RefreshWindow), 8 => Ok(Window::ResizeWindowCells { height: arg1, width: arg2, }), 9 => match arg1 { Some(0) => Ok(Window::RestoreMaximizedWindow), Some(1) => Ok(Window::MaximizeWindow), Some(2) => Ok(Window::MaximizeWindowVertically), Some(3) => Ok(Window::MaximizeWindowHorizontally), _ => Err(()), }, 10 => match arg1 { Some(0) => Ok(Window::UndoFullScreenMode), Some(1) => Ok(Window::ChangeToFullScreenMode), Some(2) => Ok(Window::ToggleFullScreen), _ => Err(()), }, 11 => Ok(Window::ReportWindowState), 13 => match arg1 { None => Ok(Window::ReportWindowPosition), Some(2) => Ok(Window::ReportTextAreaPosition), _ => Err(()), }, 14 => match arg1 { None => Ok(Window::ReportTextAreaSizePixels), Some(2) => Ok(Window::ReportWindowSizePixels), _ => Err(()), }, 15 => Ok(Window::ReportScreenSizePixels), 16 => Ok(Window::ReportCellSizePixels), 18 => Ok(Window::ReportTextAreaSizeCells), 19 => Ok(Window::ReportScreenSizeCells), 20 => Ok(Window::ReportIconLabel), 21 => Ok(Window::ReportWindowTitle), 22 => match arg1 { Some(0) => Ok(Window::PushIconAndWindowTitle), Some(1) => Ok(Window::PushIconTitle), Some(2) => Ok(Window::PushWindowTitle), _ => Err(()), }, 23 => match arg1 { Some(0) => Ok(Window::PopIconAndWindowTitle), Some(1) => Ok(Window::PopIconTitle), Some(2) => Ok(Window::PopWindowTitle), _ => Err(()), }, _ => Err(()), } } fn underline(&mut self, params: &'a [CsiParam]) -> Result { let (sgr, n) = match params { [_, CsiParam::P(b':'), CsiParam::Integer(0), ..] => { (Sgr::Underline(Underline::None), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(1), ..] => { (Sgr::Underline(Underline::Single), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(2), ..] => { (Sgr::Underline(Underline::Double), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(3), ..] => { (Sgr::Underline(Underline::Curly), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(4), ..] => { (Sgr::Underline(Underline::Dotted), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(5), ..] => { (Sgr::Underline(Underline::Dashed), 3) } _ => (Sgr::Underline(Underline::Single), 1), }; Ok(self.advance_by(n, params, sgr)) } fn sgr(&mut self, params: &'a [CsiParam]) -> Result { if params.is_empty() { // With no parameters, treat as equivalent to Reset. Ok(Sgr::Reset) } else { for p in params { match p { CsiParam::P(b';') | CsiParam::P(b':') | CsiParam::P(b'?') | CsiParam::Integer(_) => {} _ => return Err(()), } } // Consume a single parameter and return the parsed result macro_rules! one { ($t:expr) => { Ok(self.advance_by(1, params, $t)) }; } match ¶ms[0] { CsiParam::P(b';') => { // Starting with an empty item is equivalent to a reset self.advance_by(1, params, Ok(Sgr::Reset)) } // There are a small number of DEC private SGR parameters that // have equivalents in the normal SGR space. // We're simply inlining recognizing them here, and mapping them // to those SGR equivalents. That makes parsing "lossy" in the // sense that the original sequence is lost, but semantically, // the result is the same. // These codes are taken from the "SGR" section of // "Digital ANSI-Compliant Printing Protocol // Level 2 Programming Reference Manual" // on page 7-78. // /* Withdrawn because xterm introduced a conflict: * * CsiParam::P(b'?') if params.len() > 1 => match ¶ms[1] { // Consume two parameters and return the parsed result macro_rules! two { ($t:expr) => { Ok(self.advance_by(2, params, $t)) }; } CsiParam::Integer(i) => match FromPrimitive::from_i64(*i) { None => Err(()), Some(code) => match code { 0 => two!(Sgr::Reset), 4 => two!(Sgr::VerticalAlign(VerticalAlign::SuperScript)), 5 => two!(Sgr::VerticalAlign(VerticalAlign::SubScript)), 6 => two!(Sgr::Overline(true)), 24 => two!(Sgr::VerticalAlign(VerticalAlign::BaseLine)), 26 => two!(Sgr::Overline(false)), _ => Err(()), }, }, _ => Err(()), }, */ CsiParam::P(_) => Err(()), CsiParam::Integer(i) => match FromPrimitive::from_i64(*i) { None => Err(()), Some(sgr) => match sgr { SgrCode::Reset => one!(Sgr::Reset), SgrCode::IntensityBold => one!(Sgr::Intensity(Intensity::Bold)), SgrCode::IntensityDim => one!(Sgr::Intensity(Intensity::Half)), SgrCode::NormalIntensity => one!(Sgr::Intensity(Intensity::Normal)), SgrCode::UnderlineOn => { self.underline(params) //.map(Sgr::Underline) } SgrCode::UnderlineDouble => one!(Sgr::Underline(Underline::Double)), SgrCode::UnderlineOff => one!(Sgr::Underline(Underline::None)), SgrCode::UnderlineColor => { self.parse_sgr_color(params).map(Sgr::UnderlineColor) } SgrCode::ResetUnderlineColor => { one!(Sgr::UnderlineColor(ColorSpec::default())) } SgrCode::BlinkOn => one!(Sgr::Blink(Blink::Slow)), SgrCode::RapidBlinkOn => one!(Sgr::Blink(Blink::Rapid)), SgrCode::BlinkOff => one!(Sgr::Blink(Blink::None)), SgrCode::ItalicOn => one!(Sgr::Italic(true)), SgrCode::ItalicOff => one!(Sgr::Italic(false)), SgrCode::VerticalAlignSuperScript => { one!(Sgr::VerticalAlign(VerticalAlign::SuperScript)) } SgrCode::VerticalAlignSubScript => { one!(Sgr::VerticalAlign(VerticalAlign::SubScript)) } SgrCode::VerticalAlignBaseLine => { one!(Sgr::VerticalAlign(VerticalAlign::BaseLine)) } SgrCode::ForegroundColor => { self.parse_sgr_color(params).map(Sgr::Foreground) } SgrCode::ForegroundBlack => one!(Sgr::Foreground(AnsiColor::Black.into())), SgrCode::ForegroundRed => one!(Sgr::Foreground(AnsiColor::Maroon.into())), SgrCode::ForegroundGreen => one!(Sgr::Foreground(AnsiColor::Green.into())), SgrCode::ForegroundYellow => one!(Sgr::Foreground(AnsiColor::Olive.into())), SgrCode::ForegroundBlue => one!(Sgr::Foreground(AnsiColor::Navy.into())), SgrCode::ForegroundMagenta => { one!(Sgr::Foreground(AnsiColor::Purple.into())) } SgrCode::ForegroundCyan => one!(Sgr::Foreground(AnsiColor::Teal.into())), SgrCode::ForegroundWhite => one!(Sgr::Foreground(AnsiColor::Silver.into())), SgrCode::ForegroundDefault => one!(Sgr::Foreground(ColorSpec::Default)), SgrCode::ForegroundBrightBlack => { one!(Sgr::Foreground(AnsiColor::Grey.into())) } SgrCode::ForegroundBrightRed => { one!(Sgr::Foreground(AnsiColor::Red.into())) } SgrCode::ForegroundBrightGreen => { one!(Sgr::Foreground(AnsiColor::Lime.into())) } SgrCode::ForegroundBrightYellow => { one!(Sgr::Foreground(AnsiColor::Yellow.into())) } SgrCode::ForegroundBrightBlue => { one!(Sgr::Foreground(AnsiColor::Blue.into())) } SgrCode::ForegroundBrightMagenta => { one!(Sgr::Foreground(AnsiColor::Fuchsia.into())) } SgrCode::ForegroundBrightCyan => { one!(Sgr::Foreground(AnsiColor::Aqua.into())) } SgrCode::ForegroundBrightWhite => { one!(Sgr::Foreground(AnsiColor::White.into())) } SgrCode::BackgroundColor => { self.parse_sgr_color(params).map(Sgr::Background) } SgrCode::BackgroundBlack => one!(Sgr::Background(AnsiColor::Black.into())), SgrCode::BackgroundRed => one!(Sgr::Background(AnsiColor::Maroon.into())), SgrCode::BackgroundGreen => one!(Sgr::Background(AnsiColor::Green.into())), SgrCode::BackgroundYellow => one!(Sgr::Background(AnsiColor::Olive.into())), SgrCode::BackgroundBlue => one!(Sgr::Background(AnsiColor::Navy.into())), SgrCode::BackgroundMagenta => { one!(Sgr::Background(AnsiColor::Purple.into())) } SgrCode::BackgroundCyan => one!(Sgr::Background(AnsiColor::Teal.into())), SgrCode::BackgroundWhite => one!(Sgr::Background(AnsiColor::Silver.into())), SgrCode::BackgroundDefault => one!(Sgr::Background(ColorSpec::Default)), SgrCode::BackgroundBrightBlack => { one!(Sgr::Background(AnsiColor::Grey.into())) } SgrCode::BackgroundBrightRed => { one!(Sgr::Background(AnsiColor::Red.into())) } SgrCode::BackgroundBrightGreen => { one!(Sgr::Background(AnsiColor::Lime.into())) } SgrCode::BackgroundBrightYellow => { one!(Sgr::Background(AnsiColor::Yellow.into())) } SgrCode::BackgroundBrightBlue => { one!(Sgr::Background(AnsiColor::Blue.into())) } SgrCode::BackgroundBrightMagenta => { one!(Sgr::Background(AnsiColor::Fuchsia.into())) } SgrCode::BackgroundBrightCyan => { one!(Sgr::Background(AnsiColor::Aqua.into())) } SgrCode::BackgroundBrightWhite => { one!(Sgr::Background(AnsiColor::White.into())) } SgrCode::InverseOn => one!(Sgr::Inverse(true)), SgrCode::InverseOff => one!(Sgr::Inverse(false)), SgrCode::InvisibleOn => one!(Sgr::Invisible(true)), SgrCode::InvisibleOff => one!(Sgr::Invisible(false)), SgrCode::StrikeThroughOn => one!(Sgr::StrikeThrough(true)), SgrCode::StrikeThroughOff => one!(Sgr::StrikeThrough(false)), SgrCode::OverlineOn => one!(Sgr::Overline(true)), SgrCode::OverlineOff => one!(Sgr::Overline(false)), SgrCode::DefaultFont => one!(Sgr::Font(Font::Default)), SgrCode::AltFont1 => one!(Sgr::Font(Font::Alternate(1))), SgrCode::AltFont2 => one!(Sgr::Font(Font::Alternate(2))), SgrCode::AltFont3 => one!(Sgr::Font(Font::Alternate(3))), SgrCode::AltFont4 => one!(Sgr::Font(Font::Alternate(4))), SgrCode::AltFont5 => one!(Sgr::Font(Font::Alternate(5))), SgrCode::AltFont6 => one!(Sgr::Font(Font::Alternate(6))), SgrCode::AltFont7 => one!(Sgr::Font(Font::Alternate(7))), SgrCode::AltFont8 => one!(Sgr::Font(Font::Alternate(8))), SgrCode::AltFont9 => one!(Sgr::Font(Font::Alternate(9))), }, }, } } } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive)] pub enum SgrCode { Reset = 0, IntensityBold = 1, IntensityDim = 2, ItalicOn = 3, UnderlineOn = 4, /// Blinks < 150 times per minute BlinkOn = 5, /// Blinks > 150 times per minute RapidBlinkOn = 6, InverseOn = 7, InvisibleOn = 8, StrikeThroughOn = 9, DefaultFont = 10, AltFont1 = 11, AltFont2 = 12, AltFont3 = 13, AltFont4 = 14, AltFont5 = 15, AltFont6 = 16, AltFont7 = 17, AltFont8 = 18, AltFont9 = 19, // Fraktur = 20, UnderlineDouble = 21, NormalIntensity = 22, ItalicOff = 23, UnderlineOff = 24, BlinkOff = 25, InverseOff = 27, InvisibleOff = 28, StrikeThroughOff = 29, ForegroundBlack = 30, ForegroundRed = 31, ForegroundGreen = 32, ForegroundYellow = 33, ForegroundBlue = 34, ForegroundMagenta = 35, ForegroundCyan = 36, ForegroundWhite = 37, ForegroundDefault = 39, BackgroundBlack = 40, BackgroundRed = 41, BackgroundGreen = 42, BackgroundYellow = 43, BackgroundBlue = 44, BackgroundMagenta = 45, BackgroundCyan = 46, BackgroundWhite = 47, BackgroundDefault = 49, OverlineOn = 53, OverlineOff = 55, UnderlineColor = 58, ResetUnderlineColor = 59, VerticalAlignSuperScript = 73, VerticalAlignSubScript = 74, VerticalAlignBaseLine = 75, ForegroundBrightBlack = 90, ForegroundBrightRed = 91, ForegroundBrightGreen = 92, ForegroundBrightYellow = 93, ForegroundBrightBlue = 94, ForegroundBrightMagenta = 95, ForegroundBrightCyan = 96, ForegroundBrightWhite = 97, BackgroundBrightBlack = 100, BackgroundBrightRed = 101, BackgroundBrightGreen = 102, BackgroundBrightYellow = 103, BackgroundBrightBlue = 104, BackgroundBrightMagenta = 105, BackgroundBrightCyan = 106, BackgroundBrightWhite = 107, /// Maybe followed either either a 256 color palette index or /// a sequence describing a true color rgb value ForegroundColor = 38, BackgroundColor = 48, } impl<'a> Iterator for CSIParser<'a> { type Item = CSI; fn next(&mut self) -> Option { let params = match self.params.take() { None => return None, Some(params) => params, }; match self.parse_next(¶ms) { Ok(csi) => Some(csi), Err(()) => Some(CSI::Unspecified(Box::new(Unspecified { params: params.to_vec(), parameters_truncated: self.parameters_truncated, control: self.control, }))), } } } #[cfg(test)] mod test { use super::*; use std::io::Write; fn parse(control: char, params: &[i64], expected: &str) -> Vec { let mut cparams = vec![]; for &p in params { if !cparams.is_empty() { cparams.push(CsiParam::P(b';')); } cparams.push(CsiParam::Integer(p)); } let res = CSI::parse(&cparams, false, control).collect(); println!("parsed -> {:#?}", res); assert_eq!(encode(&res), expected); res } fn encode(seq: &Vec) -> String { let mut res = Vec::new(); for s in seq { write!(res, "{}", s).unwrap(); } String::from_utf8(res).unwrap() } #[test] fn basic() { assert_eq!(parse('m', &[], "\x1b[0m"), vec![CSI::Sgr(Sgr::Reset)]); assert_eq!(parse('m', &[0], "\x1b[0m"), vec![CSI::Sgr(Sgr::Reset)]); assert_eq!( parse('m', &[1], "\x1b[1m"), vec![CSI::Sgr(Sgr::Intensity(Intensity::Bold))] ); assert_eq!( parse('m', &[1, 3], "\x1b[1m\x1b[3m"), vec![ CSI::Sgr(Sgr::Intensity(Intensity::Bold)), CSI::Sgr(Sgr::Italic(true)), ] ); // Verify that we propagate Unspecified for codes // that we don't recognize. assert_eq!( parse('m', &[1, 3, 1231231], "\x1b[1m\x1b[3m\x1b[1231231m"), vec![ CSI::Sgr(Sgr::Intensity(Intensity::Bold)), CSI::Sgr(Sgr::Italic(true)), CSI::Unspecified(Box::new(Unspecified { params: [CsiParam::Integer(1231231)].to_vec(), parameters_truncated: false, control: 'm', })), ] ); assert_eq!( parse('m', &[1, 1231231, 3], "\x1b[1m\x1b[1231231;3m"), vec![ CSI::Sgr(Sgr::Intensity(Intensity::Bold)), CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(1231231), CsiParam::P(b';'), CsiParam::Integer(3) ] .to_vec(), parameters_truncated: false, control: 'm', })), ] ); assert_eq!( parse('m', &[1231231, 3], "\x1b[1231231;3m"), vec![CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(1231231), CsiParam::P(b';'), CsiParam::Integer(3) ] .to_vec(), parameters_truncated: false, control: 'm', }))] ); } #[test] fn blinks() { assert_eq!( parse('m', &[5], "\x1b[5m"), vec![CSI::Sgr(Sgr::Blink(Blink::Slow))] ); assert_eq!( parse('m', &[6], "\x1b[6m"), vec![CSI::Sgr(Sgr::Blink(Blink::Rapid))] ); assert_eq!( parse('m', &[25], "\x1b[25m"), vec![CSI::Sgr(Sgr::Blink(Blink::None))] ); } #[test] fn underlines() { assert_eq!( parse('m', &[21], "\x1b[21m"), vec![CSI::Sgr(Sgr::Underline(Underline::Double))] ); assert_eq!( parse('m', &[4], "\x1b[4m"), vec![CSI::Sgr(Sgr::Underline(Underline::Single))] ); } #[test] fn underline_color() { assert_eq!( parse('m', &[58, 2], "\x1b[58;2m"), vec![CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(58), CsiParam::P(b';'), CsiParam::Integer(2) ] .to_vec(), parameters_truncated: false, control: 'm', }))] ); assert_eq!( parse('m', &[58, 2, 255, 255, 255], "\x1b[58:2::255:255:255m"), vec![CSI::Sgr(Sgr::UnderlineColor(ColorSpec::TrueColor( (255, 255, 255).into(), )))] ); assert_eq!( parse('m', &[58, 5, 220, 255, 255], "\x1b[58:5:220m\x1b[255;255m"), vec![ CSI::Sgr(Sgr::UnderlineColor(ColorSpec::PaletteIndex(220))), CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(255), CsiParam::P(b';'), CsiParam::Integer(255) ] .to_vec(), parameters_truncated: false, control: 'm', })), ] ); } #[test] fn color() { assert_eq!( parse('m', &[38, 2], "\x1b[38;2m"), vec![CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(38), CsiParam::P(b';'), CsiParam::Integer(2) ] .to_vec(), parameters_truncated: false, control: 'm', }))] ); assert_eq!( parse('m', &[38, 2, 255, 255, 255], "\x1b[38:2::255:255:255m"), vec![CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (255, 255, 255).into(), )))] ); assert_eq!( parse('m', &[38, 5, 220, 255, 255], "\x1b[38:5:220m\x1b[255;255m"), vec![ CSI::Sgr(Sgr::Foreground(ColorSpec::PaletteIndex(220))), CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(255), CsiParam::P(b';'), CsiParam::Integer(255) ] .to_vec(), parameters_truncated: false, control: 'm', })), ] ); } #[test] fn edit() { assert_eq!( parse('J', &[], "\x1b[J"), vec![CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseToEndOfDisplay, ))] ); assert_eq!( parse('J', &[0], "\x1b[J"), vec![CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseToEndOfDisplay, ))] ); assert_eq!( parse('J', &[1], "\x1b[1J"), vec![CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseToStartOfDisplay, ))] ); } #[test] fn window() { assert_eq!( parse('t', &[6], "\x1b[6t"), vec![CSI::Window(Box::new(Window::LowerWindow))] ); assert_eq!( parse('t', &[6, 15, 7], "\x1b[6;15;7t"), vec![CSI::Window(Box::new( Window::ReportCellSizePixelsResponse { width: Some(7), height: Some(15) } ))] ); } #[test] fn cursor() { assert_eq!( parse('C', &[], "\x1b[C"), vec![CSI::Cursor(Cursor::Right(1))] ); // check that 0 is treated as 1 assert_eq!( parse('C', &[0], "\x1b[C"), vec![CSI::Cursor(Cursor::Right(1))] ); assert_eq!( parse('C', &[1], "\x1b[C"), vec![CSI::Cursor(Cursor::Right(1))] ); assert_eq!( parse('C', &[4], "\x1b[4C"), vec![CSI::Cursor(Cursor::Right(4))] ); // Check that we default the second parameter of two // when only one is provided assert_eq!( parse('H', &[2], "\x1b[2;1H"), vec![CSI::Cursor(Cursor::Position { line: OneBased::new(2), col: OneBased::new(1) })] ); } #[test] fn ansiset() { assert_eq!( parse('h', &[20], "\x1b[20h"), vec![CSI::Mode(Mode::SetMode(TerminalMode::Code( TerminalModeCode::AutomaticNewline )))] ); assert_eq!( parse('l', &[20], "\x1b[20l"), vec![CSI::Mode(Mode::ResetMode(TerminalMode::Code( TerminalModeCode::AutomaticNewline )))] ); } #[test] fn bidi_modes() { assert_eq!( parse('h', &[8], "\x1b[8h"), vec![CSI::Mode(Mode::SetMode(TerminalMode::Code( TerminalModeCode::BiDirectionalSupportMode )))] ); assert_eq!( parse('l', &[8], "\x1b[8l"), vec![CSI::Mode(Mode::ResetMode(TerminalMode::Code( TerminalModeCode::BiDirectionalSupportMode )))] ); } #[test] fn mouse() { let res: Vec<_> = CSI::parse( &[ CsiParam::P(b'<'), CsiParam::Integer(0), CsiParam::P(b';'), CsiParam::Integer(12), CsiParam::P(b';'), CsiParam::Integer(300), ], false, 'M', ) .collect(); assert_eq!(encode(&res), "\x1b[<0;12;300M"); assert_eq!( res, vec![CSI::Mouse(MouseReport::SGR1006 { x: 12, y: 300, button: MouseButton::Button1Press, modifiers: Modifiers::NONE, })] ); } #[test] fn soft_reset() { let res: Vec<_> = CSI::parse(&[CsiParam::P(b'!')], false, 'p').collect(); assert_eq!(encode(&res), "\x1b[!p"); assert_eq!(res, vec![CSI::Device(Box::new(Device::SoftReset))],); } #[test] fn device_attr() { let res: Vec<_> = CSI::parse( &[ CsiParam::P(b'?'), CsiParam::Integer(63), CsiParam::P(b';'), CsiParam::Integer(1), CsiParam::P(b';'), CsiParam::Integer(2), CsiParam::P(b';'), CsiParam::Integer(4), CsiParam::P(b';'), CsiParam::Integer(6), CsiParam::P(b';'), CsiParam::Integer(9), CsiParam::P(b';'), CsiParam::Integer(15), CsiParam::P(b';'), CsiParam::Integer(22), ], false, 'c', ) .collect(); assert_eq!( res, vec![CSI::Device(Box::new(Device::DeviceAttributes( DeviceAttributes::Vt320(DeviceAttributeFlags::new(vec![ DeviceAttribute::Code(DeviceAttributeCodes::Columns132), DeviceAttribute::Code(DeviceAttributeCodes::Printer), DeviceAttribute::Code(DeviceAttributeCodes::SixelGraphics), DeviceAttribute::Code(DeviceAttributeCodes::SelectiveErase), DeviceAttribute::Code(DeviceAttributeCodes::NationalReplacementCharsets), DeviceAttribute::Code(DeviceAttributeCodes::TechnicalCharacters), DeviceAttribute::Code(DeviceAttributeCodes::AnsiColor), ])), )))] ); assert_eq!(encode(&res), "\x1b[?63;1;2;4;6;9;15;22c"); } } termwiz-0.23.3/src/escape/esc.rs000064400000000000000000000155301046102023000145650ustar 00000000000000use num_derive::*; use num_traits::{FromPrimitive, ToPrimitive}; use std::fmt::{Display, Error as FmtError, Formatter, Write as FmtWrite}; #[derive(Debug, Clone, PartialEq, Eq)] pub enum Esc { Unspecified { intermediate: Option, /// The final character in the Escape sequence; this typically /// defines how to interpret the other parameters. control: u8, }, Code(EscCode), } macro_rules! esc { ($low:expr) => { ($low as isize) }; ($high:expr, $low:expr) => { ((($high as isize) << 8) | ($low as isize)) }; } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive, Copy)] pub enum EscCode { /// RIS - Full Reset FullReset = esc!('c'), /// IND - Index. Note that for Vt52 and Windows 10 ANSI consoles, /// this is interpreted as CursorUp Index = esc!('D'), /// NEL - Next Line NextLine = esc!('E'), /// Move the cursor to the bottom left corner of the screen CursorPositionLowerLeft = esc!('F'), /// HTS - Horizontal Tab Set HorizontalTabSet = esc!('H'), /// RI - Reverse Index – Performs the reverse operation of \n, moves cursor up one line, /// maintains horizontal position, scrolls buffer if necessary ReverseIndex = esc!('M'), /// SS2 Single shift of G2 character set affects next character only SingleShiftG2 = esc!('N'), /// SS3 Single shift of G3 character set affects next character only SingleShiftG3 = esc!('O'), /// SPA - Start of Guarded Area StartOfGuardedArea = esc!('V'), /// EPA - End of Guarded Area EndOfGuardedArea = esc!('W'), /// SOS - Start of String StartOfString = esc!('X'), /// DECID - Return Terminal ID (obsolete form of CSI c - aka DA) ReturnTerminalId = esc!('Z'), /// ST - String Terminator StringTerminator = esc!('\\'), /// PM - Privacy Message PrivacyMessage = esc!('^'), /// APC - Application Program Command ApplicationProgramCommand = esc!('_'), /// Used by tmux for setting the window title TmuxTitle = esc!('k'), /// DECBI - Back Index DecBackIndex = esc!('6'), /// DECSC - Save cursor position DecSaveCursorPosition = esc!('7'), /// DECRC - Restore saved cursor position DecRestoreCursorPosition = esc!('8'), /// DECPAM - Application Keypad DecApplicationKeyPad = esc!('='), /// DECPNM - Normal Keypad DecNormalKeyPad = esc!('>'), /// Designate G0 Character Set – DEC Line Drawing DecLineDrawingG0 = esc!('(', '0'), /// Designate G0 Character Set - UK UkCharacterSetG0 = esc!('(', 'A'), /// Designate G0 Character Set – US ASCII AsciiCharacterSetG0 = esc!('(', 'B'), /// Designate G1 Character Set – DEC Line Drawing DecLineDrawingG1 = esc!(')', '0'), /// Designate G1 Character Set - UK UkCharacterSetG1 = esc!(')', 'A'), /// Designate G1 Character Set – US ASCII AsciiCharacterSetG1 = esc!(')', 'B'), /// https://vt100.net/docs/vt510-rm/DECALN.html DecScreenAlignmentDisplay = esc!('#', '8'), /// DECDHL - DEC double-height line, top half DecDoubleHeightTopHalfLine = esc!('#', '3'), /// DECDHL - DEC double-height line, bottom half DecDoubleHeightBottomHalfLine = esc!('#', '4'), /// DECSWL - DEC single-width line DecSingleWidthLine = esc!('#', '5'), /// DECDWL - DEC double-width line DecDoubleWidthLine = esc!('#', '6'), /// These are typically sent by the terminal when keys are pressed ApplicationModeArrowUpPress = esc!('O', 'A'), ApplicationModeArrowDownPress = esc!('O', 'B'), ApplicationModeArrowRightPress = esc!('O', 'C'), ApplicationModeArrowLeftPress = esc!('O', 'D'), ApplicationModeHomePress = esc!('O', 'H'), ApplicationModeEndPress = esc!('O', 'F'), F1Press = esc!('O', 'P'), F2Press = esc!('O', 'Q'), F3Press = esc!('O', 'R'), F4Press = esc!('O', 'S'), } impl Esc { pub fn parse(intermediate: Option, control: u8) -> Self { Self::internal_parse(intermediate, control).unwrap_or_else(|_| Esc::Unspecified { intermediate, control, }) } fn internal_parse(intermediate: Option, control: u8) -> Result { let packed = match intermediate { Some(high) => ((u16::from(high)) << 8) | u16::from(control), None => u16::from(control), }; let code = FromPrimitive::from_u16(packed).ok_or(())?; Ok(Esc::Code(code)) } } impl Display for Esc { // TODO: data size optimization opportunity: if we could somehow know that we // had a run of CSI instances being encoded in sequence, we could // potentially collapse them together. This is a few bytes difference in // practice so it may not be worthwhile with modern networks. fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { f.write_char(0x1b as char)?; use self::Esc::*; match self { Code(code) => { let packed = code .to_u16() .expect("num-derive failed to implement ToPrimitive"); if packed > u16::from(u8::max_value()) { write!( f, "{}{}", (packed >> 8) as u8 as char, (packed & 0xff) as u8 as char )?; } else { f.write_char((packed & 0xff) as u8 as char)?; } } Unspecified { intermediate, control, } => { if let Some(i) = intermediate { write!(f, "{}{}", *i as char, *control as char)?; } else { f.write_char(*control as char)?; } } }; Ok(()) } } #[cfg(test)] mod test { use super::*; fn encode(osc: &Esc) -> String { format!("{}", osc) } fn parse(esc: &str) -> Esc { let result = if esc.len() == 1 { Esc::parse(None, esc.as_bytes()[0]) } else { Esc::parse(Some(esc.as_bytes()[0]), esc.as_bytes()[1]) }; assert_eq!(encode(&result), format!("\x1b{}", esc)); result } #[test] fn test() { assert_eq!(parse("(0"), Esc::Code(EscCode::DecLineDrawingG0)); assert_eq!(parse("(B"), Esc::Code(EscCode::AsciiCharacterSetG0)); assert_eq!(parse(")0"), Esc::Code(EscCode::DecLineDrawingG1)); assert_eq!(parse(")B"), Esc::Code(EscCode::AsciiCharacterSetG1)); assert_eq!(parse("#3"), Esc::Code(EscCode::DecDoubleHeightTopHalfLine)); assert_eq!( parse("#4"), Esc::Code(EscCode::DecDoubleHeightBottomHalfLine) ); assert_eq!(parse("#5"), Esc::Code(EscCode::DecSingleWidthLine)); assert_eq!(parse("#6"), Esc::Code(EscCode::DecDoubleWidthLine)); } } termwiz-0.23.3/src/escape/mod.rs000064400000000000000000000433441046102023000145760ustar 00000000000000// suppress inscrutable useless_attribute clippy that shows up when // using derive(FromPrimitive) #![allow(clippy::useless_attribute)] #![allow(clippy::upper_case_acronyms)] //! This module provides the ability to parse escape sequences and attach //! semantic meaning to them. It can also encode the semantic values as //! escape sequences. It provides encoding and decoding functionality //! only; it does not provide terminal emulation facilities itself. use crate::tmux_cc::Event; use num_derive::*; use std::fmt::{Display, Error as FmtError, Formatter, Write as FmtWrite}; use wezterm_color_types::LinearRgba; pub mod apc; pub mod csi; pub mod esc; pub mod osc; pub mod parser; pub use self::apc::KittyImage; pub use self::csi::CSI; pub use self::esc::{Esc, EscCode}; pub use self::osc::OperatingSystemCommand; use vtparse::CsiParam; #[derive(Debug, Clone, PartialEq)] pub enum Action { /// Send a single printable character to the display Print(char), /// Send a string of printable characters to the display. PrintString(String), /// A C0 or C1 control code Control(ControlCode), /// Device control. This is uncommon wrt. terminal emulation. DeviceControl(DeviceControlMode), /// A command that typically doesn't change the contents of the /// terminal, but rather influences how it displays or otherwise /// interacts with the rest of the system OperatingSystemCommand(Box), CSI(CSI), Esc(Esc), Sixel(Box), /// A list of termcap, terminfo names for which the application /// wants information XtGetTcap(Vec), KittyImage(Box), } impl Action { /// Append this `Action` to a `Vec`. /// If this `Action` is `Print` and the last element is `Print` or /// `PrintString` then the elements are combined into `PrintString` /// to reduce heap utilization. pub fn append_to(self, dest: &mut Vec) { if let Action::Print(c) = &self { match dest.last_mut() { Some(Action::PrintString(s)) => { s.push(*c); return; } Some(Action::Print(prior)) => { let mut s = prior.to_string(); dest.pop(); s.push(*c); dest.push(Action::PrintString(s)); return; } _ => {} } } dest.push(self); } } #[cfg(all(test, target_pointer_width = "64"))] #[test] fn action_size() { assert_eq!(std::mem::size_of::(), 32); assert_eq!(std::mem::size_of::(), 16); assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 32); assert_eq!(std::mem::size_of::(), 4); } /// Encode self as an escape sequence. The escape sequence may potentially /// be clear text with no actual escape sequences. impl Display for Action { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Action::Print(c) => write!(f, "{}", c), Action::PrintString(s) => write!(f, "{}", s), Action::Control(c) => f.write_char(*c as u8 as char), Action::DeviceControl(c) => c.fmt(f), Action::OperatingSystemCommand(osc) => osc.fmt(f), Action::CSI(csi) => csi.fmt(f), Action::Esc(esc) => esc.fmt(f), Action::Sixel(sixel) => sixel.fmt(f), Action::XtGetTcap(names) => { write!(f, "\x1bP+q")?; for (i, name) in names.iter().enumerate() { if i > 0 { write!(f, ";")?; } for &b in name.as_bytes() { write!(f, "{:x}", b)?; } } Ok(()) } Action::KittyImage(img) => img.fmt(f), } } } /// A fully parsed DCS sequence. /// The parser emits these for byte/intermediate sequences that are /// known to be relatively short and self contained (eg: DECRQSS) /// as opposed to larger ones like Sixel (which is parsed separately), /// or long lived terminal modes such as the TMUX CC protocol. #[derive(Clone, PartialEq, Eq)] pub struct ShortDeviceControl { /// Integer parameter values pub params: Vec, /// Intermediate bytes to refine the control pub intermediates: Vec, /// The final byte pub byte: u8, /// The data prior to the string terminator pub data: Vec, } impl std::fmt::Debug for ShortDeviceControl { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { write!( fmt, "ShortDeviceControl(params: {:?}, intermediates: [", &self.params )?; for b in &self.intermediates { write!(fmt, "{:?} 0x{:x}, ", *b as char, *b)?; } write!( fmt, "], byte: {:?} 0x{:x}, data=[", self.byte as char, self.byte )?; for b in &self.data { write!(fmt, "{:?} 0x{:x}, ", *b as char, *b)?; } write!(fmt, ")") } } impl Display for ShortDeviceControl { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { write!(f, "\x1bP")?; for (idx, p) in self.params.iter().enumerate() { if idx > 0 { write!(f, ";")?; } write!(f, "{}", p)?; } for b in &self.intermediates { f.write_char(*b as char)?; } f.write_char(self.byte as char)?; for b in &self.data { f.write_char(*b as char)?; } write!(f, "\x1b\\") } } #[derive(Clone, PartialEq, Eq)] pub struct EnterDeviceControlMode { /// The final byte in the DCS mode pub byte: u8, pub params: Vec, pub intermediates: Vec, /// if true, more than two intermediates arrived and the /// remaining data was ignored pub ignored_extra_intermediates: bool, } impl std::fmt::Debug for EnterDeviceControlMode { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { write!( fmt, "EnterDeviceControlMode(params: {:?}, intermediates: [", &self.params )?; for b in &self.intermediates { write!(fmt, "{:?} 0x{:x}, ", *b as char, *b)?; } write!( fmt, "], byte: {:?} 0x{:x}, ignored_extra_intermediates={})", self.byte as char, self.byte, self.ignored_extra_intermediates ) } } #[derive(Clone, PartialEq, Eq)] pub enum DeviceControlMode { /// Identify device control mode from the encoded parameters. /// This mode is activated and must remain active until /// `Exit` is observed. While the mode is /// active, data is made available to the device mode via /// the `Data` variant. Enter(Box), /// Exit the current device control mode Exit, /// Data for the device mode to consume Data(u8), /// A self contained (Enter, Data*, Exit) sequence ShortDeviceControl(Box), /// Tmux parsed events TmuxEvents(Box>), } impl Display for DeviceControlMode { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Self::Enter(mode) => { write!(f, "\x1bP")?; for (idx, p) in mode.params.iter().enumerate() { if idx > 0 { write!(f, ";")?; } write!(f, "{}", p)?; } for b in &mode.intermediates { f.write_char(*b as char)?; } f.write_char(mode.byte as char) } // We don't need to emit a sequence for the Exit, as we're // followed by eg: StringTerminator Self::Exit => Ok(()), Self::Data(c) => f.write_char(*c as char), Self::ShortDeviceControl(s) => s.fmt(f), Self::TmuxEvents(_) => write!(f, "tmux event"), } } } impl std::fmt::Debug for DeviceControlMode { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { match self { Self::Enter(mode) => write!(fmt, "Enter({:?})", mode), Self::Exit => write!(fmt, "Exit"), Self::Data(b) => write!(fmt, "Data({:?} 0x{:x})", *b as char, *b), Self::ShortDeviceControl(s) => write!(fmt, "ShortDeviceControl({:?})", s), Self::TmuxEvents(_) => write!(fmt, "tmux event"), } } } /// See #[derive(Debug, Clone, PartialEq, Eq)] pub struct Sixel { /// Specifies the numerator for the pixel aspect ratio pub pan: i64, /// Specifies the denominator for the pixel aspect ratio pub pad: i64, /// How wide the image is, in pixels pub pixel_width: Option, /// How tall the image is, in pixels, pub pixel_height: Option, /// When true, pixels with 0 value are left at their /// present color, otherwise, they are set to the background /// color. pub background_is_transparent: bool, /// The horizontal spacing between pixels pub horizontal_grid_size: Option, /// The sixel data pub data: Vec, } impl Sixel { /// Returns the width, height of the image pub fn dimensions(&self) -> (u32, u32) { if let (Some(w), Some(h)) = (self.pixel_width, self.pixel_height) { return (w, h); } // Compute it by evaluating the sixel data let mut max_x = 0; let mut max_y = 0; let mut x: u32 = 0; let mut rows: u32 = 1; for d in &self.data { match d { SixelData::Data(_) => { max_y = max_y.max(rows * 6); x = x.saturating_add(1); max_x = max_x.max(x); } SixelData::Repeat { repeat_count, .. } => { max_y = max_y.max(rows * 6); x = x.saturating_add(*repeat_count); max_x = max_x.max(x); } SixelData::SelectColorMapEntry(_) | SixelData::DefineColorMapRGB { .. } | SixelData::DefineColorMapHSL { .. } => {} SixelData::NewLine => { max_x = max_x.max(x); x = 0; rows = rows.saturating_add(1); } SixelData::CarriageReturn => { max_x = max_x.max(x); x = 0; } } } (max_x, max_y) } } impl Display for Sixel { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { if self.pixel_width.is_some() { write!( f, "\x1bP;{}{}q\"{};{};{};{}", if self.background_is_transparent { 1 } else { 0 }, match self.horizontal_grid_size { Some(h) => format!(";{}", h), None => "".to_string(), }, self.pan, self.pad, self.pixel_width.unwrap_or(0), self.pixel_height.unwrap_or(0) )?; } else { write!( f, "\x1bP{};{}{}q", match (self.pan, self.pad) { (2, 1) => 0, (5, 1) => 2, (3, 1) => 3, (1, 1) => 7, _ => { eprintln!("bad pad/pan combo: {:?}", self); return Err(std::fmt::Error); } }, if self.background_is_transparent { 1 } else { 0 }, match self.horizontal_grid_size { Some(h) => format!(";{}", h), None => "".to_string(), }, )?; } for d in &self.data { d.fmt(f)?; } // The sixel data itself doesn't contain the ST // write!(f, "\x1b\\")?; Ok(()) } } /// A decoded 6-bit sixel value. /// Each sixel represents a six-pixel tall bitmap where /// the least significant bit is the topmost bit. pub type SixelValue = u8; #[derive(Debug, Clone, PartialEq, Eq)] pub enum SixelData { /// A single sixel value Data(SixelValue), /// Run-length encoding; allows repeating a sixel value /// the specified number of times Repeat { repeat_count: u32, data: SixelValue }, /// Set the specified color map entry to the specified /// linear RGB color value DefineColorMapRGB { color_number: u16, rgb: crate::color::RgbColor, }, DefineColorMapHSL { color_number: u16, /// 0 to 360 degrees hue_angle: u16, /// 0 to 100 lightness: u8, /// 0 to 100 saturation: u8, }, /// Select the numbered color from the color map entry SelectColorMapEntry(u16), /// Move the x position to the left page border of the /// current sixel line. CarriageReturn, /// Move the x position to the left page border and /// the y position down to the next sixel line. NewLine, } impl Display for SixelData { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Self::Data(value) => write!(f, "{}", (value + 0x3f) as char), Self::Repeat { repeat_count, data } => { write!(f, "!{}{}", repeat_count, (data + 0x3f) as char) } Self::DefineColorMapRGB { color_number, rgb } => { let LinearRgba(r, g, b, _) = rgb.to_linear_tuple_rgba(); write!( f, "#{};2;{};{};{}", color_number, (r * 100.) as u8, (g * 100.) as u8, (b * 100.0) as u8 ) } Self::DefineColorMapHSL { color_number, hue_angle, lightness, saturation, } => write!( f, "#{};1;{};{};{}", color_number, hue_angle, lightness, saturation ), Self::SelectColorMapEntry(n) => write!(f, "#{}", n), Self::CarriageReturn => write!(f, "$"), Self::NewLine => write!(f, "-"), } } } /// C0 or C1 control codes #[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive)] #[repr(u8)] pub enum ControlCode { Null = 0, StartOfHeading = 1, StartOfText = 2, EndOfText = 3, EndOfTransmission = 4, Enquiry = 5, Acknowledge = 6, Bell = 7, Backspace = 8, HorizontalTab = b'\t', LineFeed = b'\n', VerticalTab = 0xb, FormFeed = 0xc, CarriageReturn = b'\r', ShiftOut = 0xe, ShiftIn = 0xf, DataLinkEscape = 0x10, DeviceControlOne = 0x11, DeviceControlTwo = 0x12, DeviceControlThree = 0x13, DeviceControlFour = 0x14, NegativeAcknowledge = 0x15, SynchronousIdle = 0x16, EndOfTransmissionBlock = 0x17, Cancel = 0x18, EndOfMedium = 0x19, Substitute = 0x1a, Escape = 0x1b, FileSeparator = 0x1c, GroupSeparator = 0x1d, RecordSeparator = 0x1e, UnitSeparator = 0x1f, // C1 8-bit values BPH = 0x82, NBH = 0x83, IND = 0x84, NEL = 0x85, SSA = 0x86, ESA = 0x87, HTS = 0x88, HTJ = 0x89, VTS = 0x8a, PLD = 0x8b, PLU = 0x8c, RI = 0x8d, SS2 = 0x8e, SS3 = 0x8f, DCS = 0x90, PU1 = 0x91, PU2 = 0x92, STS = 0x93, CCH = 0x94, MW = 0x95, SPA = 0x96, EPA = 0x97, SOS = 0x98, SCI = 0x9a, CSI = 0x9b, ST = 0x9c, OSC = 0x9d, PM = 0x9e, APC = 0x9f, } /// A helper type to avoid accidentally tripping over problems with /// 1-based values in escape sequences. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct OneBased { value: u32, } impl OneBased { pub fn new(value: u32) -> Self { debug_assert!( value != 0, "programmer error: deliberately assigning zero to a OneBased" ); Self { value } } pub fn from_zero_based(value: u32) -> Self { Self { value: value + 1 } } /// Map a value from an escape sequence parameter. /// 0 is equivalent to 1 pub fn from_esc_param(v: &CsiParam) -> Result { match v { CsiParam::Integer(v) if *v == 0 => Ok(Self { value: num_traits::one(), }), CsiParam::Integer(v) if *v > 0 && *v <= i64::from(u32::max_value()) => { Ok(Self { value: *v as u32 }) } _ => Err(()), } } /// Map a value from an escape sequence parameter. /// 0 is equivalent to max_value. pub fn from_esc_param_with_big_default(v: &CsiParam) -> Result { match v { CsiParam::Integer(v) if *v == 0 => Ok(Self { value: u32::max_value(), }), CsiParam::Integer(v) if *v > 0 && *v <= i64::from(u32::max_value()) => { Ok(Self { value: *v as u32 }) } _ => Err(()), } } /// Map a value from an optional escape sequence parameter pub fn from_optional_esc_param(o: Option<&CsiParam>) -> Result { Self::from_esc_param(o.unwrap_or(&CsiParam::Integer(1))) } /// Return the underlying value as a 0-based value pub fn as_zero_based(self) -> u32 { self.value.saturating_sub(1) } pub fn as_one_based(self) -> u32 { self.value } } impl Display for OneBased { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { self.value.fmt(f) } } termwiz-0.23.3/src/escape/osc.rs000064400000000000000000002031211046102023000145720ustar 00000000000000use crate::color::SrgbaTuple; pub use crate::hyperlink::Hyperlink; use crate::{bail, ensure, Result}; use base64::Engine; use bitflags::bitflags; use num_derive::*; use num_traits::FromPrimitive; use ordered_float::NotNan; use std::collections::HashMap; use std::fmt::{Display, Error as FmtError, Formatter, Result as FmtResult}; use std::str; use std::str::FromStr; #[derive(Debug, Clone, PartialEq)] pub enum ColorOrQuery { Color(SrgbaTuple), Query, } impl Display for ColorOrQuery { fn fmt(&self, f: &mut Formatter) -> FmtResult { match self { ColorOrQuery::Query => write!(f, "?"), ColorOrQuery::Color(c) => write!(f, "{}", c.to_x11_16bit_rgb_string()), } } } #[derive(Debug, Clone, PartialEq)] pub enum OperatingSystemCommand { SetIconNameAndWindowTitle(String), SetWindowTitle(String), SetWindowTitleSun(String), SetIconName(String), SetIconNameSun(String), SetHyperlink(Option), ClearSelection(Selection), QuerySelection(Selection), SetSelection(Selection, String), SystemNotification(String), ITermProprietary(ITermProprietary), FinalTermSemanticPrompt(FinalTermSemanticPrompt), ChangeColorNumber(Vec), ChangeDynamicColors(DynamicColorNumber, Vec), ResetDynamicColor(DynamicColorNumber), CurrentWorkingDirectory(String), ResetColors(Vec), RxvtExtension(Vec), ConEmuProgress(Progress), Unspecified(Vec>), } #[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive)] #[repr(u8)] pub enum DynamicColorNumber { TextForegroundColor = 10, TextBackgroundColor = 11, TextCursorColor = 12, MouseForegroundColor = 13, MouseBackgroundColor = 14, TektronixForegroundColor = 15, TektronixBackgroundColor = 16, HighlightBackgroundColor = 17, TektronixCursorColor = 18, HighlightForegroundColor = 19, } #[derive(Debug, Clone, PartialEq)] pub struct ChangeColorPair { pub palette_index: u8, pub color: ColorOrQuery, } bitflags! { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Selection :u16{ const NONE = 0; const CLIPBOARD = 1<<1; const PRIMARY=1<<2; const SELECT=1<<3; const CUT0=1<<4; const CUT1=1<<5; const CUT2=1<<6; const CUT3=1<<7; const CUT4=1<<8; const CUT5=1<<9; const CUT6=1<<10; const CUT7=1<<11; const CUT8=1<<12; const CUT9=1<<13; } } impl Selection { fn try_parse(buf: &[u8]) -> Result { if buf == b"" { Ok(Selection::SELECT | Selection::CUT0) } else { let mut s = Selection::NONE; for c in buf { s |= match c { b'c' => Selection::CLIPBOARD, b'p' => Selection::PRIMARY, b's' => Selection::SELECT, b'0' => Selection::CUT0, b'1' => Selection::CUT1, b'2' => Selection::CUT2, b'3' => Selection::CUT3, b'4' => Selection::CUT4, b'5' => Selection::CUT5, b'6' => Selection::CUT6, b'7' => Selection::CUT7, b'8' => Selection::CUT8, b'9' => Selection::CUT9, _ => bail!("invalid selection {:?}", buf), } } Ok(s) } } } impl Display for Selection { fn fmt(&self, f: &mut Formatter) -> FmtResult { macro_rules! item { ($variant:ident, $s:expr) => { if (*self & Selection::$variant) != Selection::NONE { write!(f, $s)?; } }; } item!(CLIPBOARD, "c"); item!(PRIMARY, "p"); item!(SELECT, "s"); item!(CUT0, "0"); item!(CUT1, "1"); item!(CUT2, "2"); item!(CUT3, "3"); item!(CUT4, "4"); item!(CUT5, "5"); item!(CUT6, "6"); item!(CUT7, "7"); item!(CUT8, "8"); item!(CUT9, "9"); Ok(()) } } impl OperatingSystemCommand { pub fn parse(osc: &[&[u8]]) -> Self { Self::internal_parse(osc).unwrap_or_else(|err| { let mut vec = Vec::new(); for slice in osc { vec.push(slice.to_vec()); } log::trace!( "OSC internal parse err: {}, track as Unspecified {:?}", err, vec ); OperatingSystemCommand::Unspecified(vec) }) } fn parse_selection(osc: &[&[u8]]) -> Result { if osc.len() == 2 { Selection::try_parse(osc[1]).map(OperatingSystemCommand::ClearSelection) } else if osc.len() == 3 && osc[2] == b"?" { Selection::try_parse(osc[1]).map(OperatingSystemCommand::QuerySelection) } else if osc.len() == 3 { let sel = Selection::try_parse(osc[1])?; let bytes = base64_decode(osc[2])?; let s = String::from_utf8(bytes)?; Ok(OperatingSystemCommand::SetSelection(sel, s)) } else { bail!("unhandled OSC 52: {:?}", osc); } } fn parse_reset_colors(osc: &[&[u8]]) -> Result { let mut colors = vec![]; let mut iter = osc.iter(); iter.next(); // skip the command word that we already know is present while let Some(index) = iter.next() { if index.is_empty() { continue; } let index: u8 = str::from_utf8(index)?.parse()?; colors.push(index); } Ok(OperatingSystemCommand::ResetColors(colors)) } fn parse_change_color_number(osc: &[&[u8]]) -> Result { let mut pairs = vec![]; let mut iter = osc.iter(); iter.next(); // skip the command word that we already know is present while let (Some(index), Some(spec)) = (iter.next(), iter.next()) { let index: u8 = str::from_utf8(index)?.parse()?; let spec = str::from_utf8(spec)?; let spec = if spec == "?" { ColorOrQuery::Query } else { ColorOrQuery::Color( SrgbaTuple::from_str(spec) .map_err(|()| format!("invalid color spec {:?}", spec))?, ) }; pairs.push(ChangeColorPair { palette_index: index, color: spec, }); } Ok(OperatingSystemCommand::ChangeColorNumber(pairs)) } fn parse_reset_dynamic_color_number(idx: u8) -> Result { let which_color: DynamicColorNumber = FromPrimitive::from_u8(idx) .ok_or_else(|| format!("osc code is not a valid DynamicColorNumber!?"))?; Ok(OperatingSystemCommand::ResetDynamicColor(which_color)) } fn parse_change_dynamic_color_number(idx: u8, osc: &[&[u8]]) -> Result { let which_color: DynamicColorNumber = FromPrimitive::from_u8(idx) .ok_or_else(|| format!("osc code is not a valid DynamicColorNumber!?"))?; let mut colors = vec![]; for spec in osc.iter().skip(1) { if spec == b"?" { colors.push(ColorOrQuery::Query); } else { let spec = str::from_utf8(spec)?; colors.push(ColorOrQuery::Color( SrgbaTuple::from_str(spec) .map_err(|()| format!("invalid color spec {:?}", spec))?, )); } } Ok(OperatingSystemCommand::ChangeDynamicColors( which_color, colors, )) } fn internal_parse(osc: &[&[u8]]) -> Result { ensure!(!osc.is_empty(), "no params"); let p1str = String::from_utf8_lossy(osc[0]); if p1str.is_empty() { bail!("zero length osc"); } // Ugh, this is to handle "OSC ltitle" which is a legacyish // OSC for encoding a window title change request. These days // OSC 2 is preferred for this purpose, but we need to support // generating and parsing the legacy form because it is the // response for the CSI ReportWindowTitle. // So, for non-numeric OSCs, we look up the prefix and use that. // This only works if the non-numeric OSC code has length == 1. let osc_code = if !p1str.chars().nth(0).unwrap().is_ascii_digit() && osc.len() == 1 { let mut p1 = String::new(); p1.push(p1str.chars().nth(0).unwrap()); OperatingSystemCommandCode::from_code(&p1) } else { OperatingSystemCommandCode::from_code(&p1str) } .ok_or_else(|| format!("unknown code"))?; macro_rules! single_string { ($variant:ident) => {{ if osc.len() != 2 { bail!("wrong param count"); } let s = String::from_utf8(osc[1].to_vec())?; Ok(OperatingSystemCommand::$variant(s)) }}; } macro_rules! single_title_string { ($variant:ident) => {{ if osc.len() < 2 { bail!("wrong param count"); } let mut s = String::from_utf8(osc[1].to_vec())?; for i in 2..osc.len() { s = [s, String::from_utf8(osc[i].to_vec())?].join(";"); } Ok(OperatingSystemCommand::$variant(s)) }}; } use self::OperatingSystemCommandCode::*; match osc_code { SetIconNameAndWindowTitle => single_title_string!(SetIconNameAndWindowTitle), SetWindowTitle => single_title_string!(SetWindowTitle), SetWindowTitleSun => Ok(OperatingSystemCommand::SetWindowTitleSun( p1str[1..].to_owned(), )), SetIconName => single_title_string!(SetIconName), SetIconNameSun => Ok(OperatingSystemCommand::SetIconNameSun( p1str[1..].to_owned(), )), SetHyperlink => Ok(OperatingSystemCommand::SetHyperlink(Hyperlink::parse(osc)?)), ManipulateSelectionData => Self::parse_selection(osc), SystemNotification => { if osc.len() >= 3 && osc[1] == b"4" { fn get_pct(v: &&[u8]) -> u8 { let number = str::from_utf8(v).unwrap_or("0"); number.parse::().unwrap_or(0).max(0).min(100) } match osc[2] { b"0" => return Ok(OperatingSystemCommand::ConEmuProgress(Progress::None)), b"1" => { let pct = osc.get(3).map(get_pct).unwrap_or(0); return Ok(OperatingSystemCommand::ConEmuProgress( Progress::SetPercentage(pct), )); } b"2" => { let pct = osc.get(3).map(get_pct).unwrap_or(0); return Ok(OperatingSystemCommand::ConEmuProgress(Progress::SetError( pct, ))); } b"3" => { return Ok(OperatingSystemCommand::ConEmuProgress( Progress::SetIndeterminate, )) } b"4" => { return Ok(OperatingSystemCommand::ConEmuProgress(Progress::Paused)) } _ => {} } } single_string!(SystemNotification) } SetCurrentWorkingDirectory => single_string!(CurrentWorkingDirectory), ITermProprietary => { self::ITermProprietary::parse(osc).map(OperatingSystemCommand::ITermProprietary) } RxvtProprietary => { let mut vec = vec![]; for slice in osc.iter().skip(1) { vec.push(String::from_utf8_lossy(slice).to_string()); } Ok(OperatingSystemCommand::RxvtExtension(vec)) } FinalTermSemanticPrompt => self::FinalTermSemanticPrompt::parse(osc) .map(OperatingSystemCommand::FinalTermSemanticPrompt), ChangeColorNumber => Self::parse_change_color_number(osc), ResetColors => Self::parse_reset_colors(osc), ResetSpecialColor | ResetTextForegroundColor | ResetTextBackgroundColor | ResetTextCursorColor | ResetMouseForegroundColor | ResetMouseBackgroundColor | ResetTektronixForegroundColor | ResetTektronixBackgroundColor | ResetHighlightColor | ResetTektronixCursorColor | ResetHighlightForegroundColor => Self::parse_reset_dynamic_color_number( p1str.parse::().unwrap().saturating_sub(100), ), SetTextForegroundColor | SetTextBackgroundColor | SetTextCursorColor | SetMouseForegroundColor | SetMouseBackgroundColor | SetTektronixForegroundColor | SetTektronixBackgroundColor | SetHighlightBackgroundColor | SetTektronixCursorColor | SetHighlightForegroundColor => { Self::parse_change_dynamic_color_number(p1str.parse::().unwrap(), osc) } osc_code => bail!("{:?} not impl", osc_code), } } } macro_rules! osc_entries { ($( $( #[doc=$doc:expr] )* $label:ident = $value:expr ),* $(,)?) => { #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Hash, Copy)] pub enum OperatingSystemCommandCode { $( $( #[doc=$doc] )* $label, )* } impl OscMap { fn new() -> Self { let mut code_to_variant = HashMap::new(); let mut variant_to_code = HashMap::new(); use OperatingSystemCommandCode::*; $( code_to_variant.insert($value, $label); variant_to_code.insert($label, $value); )* Self { code_to_variant, variant_to_code, } } } }; } osc_entries!( SetIconNameAndWindowTitle = "0", SetIconName = "1", SetWindowTitle = "2", SetXWindowProperty = "3", ChangeColorNumber = "4", ChangeSpecialColorNumber = "5", /// iTerm2 ChangeTitleTabColor = "6", SetCurrentWorkingDirectory = "7", /// See https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda SetHyperlink = "8", /// iTerm2 SystemNotification = "9", SetTextForegroundColor = "10", SetTextBackgroundColor = "11", SetTextCursorColor = "12", SetMouseForegroundColor = "13", SetMouseBackgroundColor = "14", SetTektronixForegroundColor = "15", SetTektronixBackgroundColor = "16", SetHighlightBackgroundColor = "17", SetTektronixCursorColor = "18", SetHighlightForegroundColor = "19", SetLogFileName = "46", SetFont = "50", EmacsShell = "51", ManipulateSelectionData = "52", ResetColors = "104", ResetSpecialColor = "105", ResetTextForegroundColor = "110", ResetTextBackgroundColor = "111", ResetTextCursorColor = "112", ResetMouseForegroundColor = "113", ResetMouseBackgroundColor = "114", ResetTektronixForegroundColor = "115", ResetTektronixBackgroundColor = "116", ResetHighlightColor = "117", ResetTektronixCursorColor = "118", ResetHighlightForegroundColor = "119", RxvtProprietary = "777", FinalTermSemanticPrompt = "133", ITermProprietary = "1337", /// Here the "Sun" suffix comes from the table in /// /// that lays out various window related escape sequences. SetWindowTitleSun = "l", SetIconNameSun = "L", ); struct OscMap { code_to_variant: HashMap<&'static str, OperatingSystemCommandCode>, variant_to_code: HashMap, } lazy_static::lazy_static! { static ref OSC_MAP: OscMap = OscMap::new(); } impl OperatingSystemCommandCode { fn from_code(code: &str) -> Option { OSC_MAP.code_to_variant.get(code).copied() } fn as_code(self) -> &'static str { OSC_MAP.variant_to_code.get(&self).unwrap() } } impl Display for OperatingSystemCommand { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "\x1b]")?; macro_rules! single_string { ($variant:ident, $s:expr) => {{ let code = OperatingSystemCommandCode::$variant.as_code(); match OperatingSystemCommandCode::$variant { OperatingSystemCommandCode::SetWindowTitleSun | OperatingSystemCommandCode::SetIconNameSun => { // For the legacy sun terminals, the `l` and `L` OSCs are // not separated by `;`. write!(f, "{}{}", code, $s)?; } _ => { // In the common case, the OSC is numeric and is separated // from the rest of the string write!(f, "{};{}", code, $s)?; } } }}; } use self::OperatingSystemCommand::*; match self { SetIconNameAndWindowTitle(title) => single_string!(SetIconNameAndWindowTitle, title), SetWindowTitle(title) => single_string!(SetWindowTitle, title), SetWindowTitleSun(title) => single_string!(SetWindowTitleSun, title), SetIconName(title) => single_string!(SetIconName, title), SetIconNameSun(title) => single_string!(SetIconNameSun, title), SetHyperlink(Some(link)) => link.fmt(f)?, SetHyperlink(None) => write!(f, "8;;")?, RxvtExtension(params) => write!(f, "777;{}", params.join(";"))?, Unspecified(v) => { for (idx, item) in v.iter().enumerate() { if idx > 0 { write!(f, ";")?; } f.write_str(&String::from_utf8_lossy(item))?; } } ClearSelection(s) => write!(f, "52;{}", s)?, QuerySelection(s) => write!(f, "52;{};?", s)?, SetSelection(s, val) => write!(f, "52;{};{}", s, base64_encode(val))?, SystemNotification(s) => write!(f, "9;{}", s)?, ITermProprietary(i) => i.fmt(f)?, FinalTermSemanticPrompt(i) => i.fmt(f)?, ResetColors(colors) => { write!(f, "104")?; for c in colors { write!(f, ";{}", c)?; } } ChangeColorNumber(specs) => { write!(f, "4;")?; for pair in specs { write!(f, "{};{}", pair.palette_index, pair.color)? } } ChangeDynamicColors(first_color, colors) => { write!(f, "{}", *first_color as u8)?; for color in colors { write!(f, ";{}", color)? } } ResetDynamicColor(color) => { write!(f, "{}", 100 + *color as u8)?; } CurrentWorkingDirectory(s) => write!(f, "7;{}", s)?, ConEmuProgress(Progress::None) => write!(f, "9;4;0")?, ConEmuProgress(Progress::SetPercentage(pct)) => write!(f, "9;4;1;{pct}")?, ConEmuProgress(Progress::SetError(pct)) => write!(f, "9;4;2;{pct}")?, ConEmuProgress(Progress::SetIndeterminate) => write!(f, "9;4;3")?, ConEmuProgress(Progress::Paused) => write!(f, "9;4;4")?, }; // Use the longer form ST as neovim doesn't like the BEL version write!(f, "\x1b\\")?; Ok(()) } } /// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md #[derive(Debug, Clone, PartialEq, Eq)] pub enum FinalTermClick { /// Allow motion only within the single input line using left/right arrow keys Line, /// Allow moving between multiple lines of input using left/right arrow keys MultipleLine, /// Allow left/right and conservative up/down arrow motion ConservativeVertical, /// Allow left/right and up/down motion, and the line editor ensures that /// there are no spurious trailing spaces at ends of lines and that vertical /// motion across shorter lines causes some horizontal cursor motion. SmartVertical, } impl std::convert::TryFrom<&str> for FinalTermClick { type Error = crate::Error; fn try_from(s: &str) -> Result { match s { "line" => Ok(Self::Line), "m" => Ok(Self::MultipleLine), "v" => Ok(Self::ConservativeVertical), "w" => Ok(Self::SmartVertical), _ => bail!("invalid FinalTermClick {}", s), } } } impl Display for FinalTermClick { fn fmt(&self, f: &mut Formatter) -> FmtResult { match self { Self::Line => write!(f, "line"), Self::MultipleLine => write!(f, "m"), Self::ConservativeVertical => write!(f, "v"), Self::SmartVertical => write!(f, "w"), } } } /// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md #[derive(Debug, Clone, PartialEq, Eq)] pub enum FinalTermPromptKind { /// A normal left side primary prompt Initial, /// A right-aligned prompt RightSide, /// A continuation prompt for an input that can be edited Continuation, /// A continuation prompt where the input cannot be edited Secondary, } impl Default for FinalTermPromptKind { fn default() -> Self { Self::Initial } } impl std::convert::TryFrom<&str> for FinalTermPromptKind { type Error = crate::Error; fn try_from(s: &str) -> Result { match s { "i" => Ok(Self::Initial), "r" => Ok(Self::RightSide), "c" => Ok(Self::Continuation), "s" => Ok(Self::Secondary), _ => bail!("invalid FinalTermPromptKind {}", s), } } } impl Display for FinalTermPromptKind { fn fmt(&self, f: &mut Formatter) -> FmtResult { match self { Self::Initial => write!(f, "i"), Self::RightSide => write!(f, "r"), Self::Continuation => write!(f, "c"), Self::Secondary => write!(f, "s"), } } } /// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md #[derive(Debug, Clone, PartialEq, Eq)] pub enum FinalTermSemanticPrompt { /// Do a "fresh line"; if the cursor is at the left margin then /// do nothing, otherwise perform the equivalent of "\r\n" FreshLine, /// Do a "fresh line" as above and then place the terminal into /// prompt mode; the output between now and the next marker is /// considered part of the prompt. FreshLineAndStartPrompt { aid: Option, cl: Option, }, /// Denote the end of a command output and then perform FreshLine MarkEndOfCommandWithFreshLine { aid: Option, cl: Option, }, /// Start a prompt StartPrompt(FinalTermPromptKind), /// Mark the end of a prompt and the start of the user input. /// The terminal considers all subsequent output to be "user input" /// until the next semantic marker. MarkEndOfPromptAndStartOfInputUntilNextMarker, /// Mark the end of a prompt and the start of the user input. /// The terminal considers all subsequent output to be "user input" /// until the end of the line. MarkEndOfPromptAndStartOfInputUntilEndOfLine, MarkEndOfInputAndStartOfOutput { aid: Option, }, /// Indicates the result of the command CommandStatus { status: i32, aid: Option, }, } impl FinalTermSemanticPrompt { fn parse(osc: &[&[u8]]) -> Result { ensure!(osc.len() > 1, "not enough args"); let param = String::from_utf8_lossy(osc[1]); macro_rules! single { ($variant:ident, $text:expr) => { if osc.len() == 2 && param == $text { return Ok(FinalTermSemanticPrompt::$variant); } }; } single!(FreshLine, "L"); single!(MarkEndOfPromptAndStartOfInputUntilNextMarker, "B"); single!(MarkEndOfPromptAndStartOfInputUntilEndOfLine, "I"); let mut params = HashMap::new(); use std::convert::TryInto; for s in osc.iter().skip(if param == "D" { 3 } else { 2 }) { if let Some(equal) = s.iter().position(|c| *c == b'=') { let key = &s[..equal]; let value = &s[equal + 1..]; params.insert(str::from_utf8(key)?, str::from_utf8(value)?); } else if !s.is_empty() { bail!("malformed FinalTermSemanticPrompt"); } } if param == "A" { return Ok(Self::FreshLineAndStartPrompt { aid: params.get("aid").map(|&s| s.to_owned()), cl: match params.get("cl") { Some(&cl) => Some(cl.try_into()?), None => None, }, }); } if param == "C" { return Ok(Self::MarkEndOfInputAndStartOfOutput { aid: params.get("aid").map(|&s| s.to_owned()), }); } if param == "D" { let status = match osc.get(2).map(|&p| p) { Some(s) => match str::from_utf8(s) { Ok(s) => s.parse().unwrap_or(0), _ => 0, }, _ => 0, }; return Ok(Self::CommandStatus { status, aid: params.get("aid").map(|&s| s.to_owned()), }); } if param == "N" { return Ok(Self::MarkEndOfCommandWithFreshLine { aid: params.get("aid").map(|&s| s.to_owned()), cl: match params.get("cl") { Some(&cl) => Some(cl.try_into()?), None => None, }, }); } if param == "P" { return Ok(Self::StartPrompt(match params.get("k") { Some(&cl) => cl.try_into()?, None => FinalTermPromptKind::default(), })); } bail!( "invalid FinalTermSemanticPrompt p1:{:?}, params:{:?}", param, params ); } } impl Display for FinalTermSemanticPrompt { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "133;")?; match self { Self::FreshLine => write!(f, "L")?, Self::FreshLineAndStartPrompt { aid, cl } => { write!(f, "A")?; if let Some(aid) = aid { write!(f, ";aid={}", aid)?; } if let Some(cl) = cl { write!(f, ";cl={}", cl)?; } } Self::MarkEndOfCommandWithFreshLine { aid, cl } => { write!(f, "N")?; if let Some(aid) = aid { write!(f, ";aid={}", aid)?; } if let Some(cl) = cl { write!(f, ";cl={}", cl)?; } } Self::StartPrompt(kind) => { write!(f, "P;k={}", kind)?; } Self::MarkEndOfPromptAndStartOfInputUntilNextMarker => write!(f, "B")?, Self::MarkEndOfPromptAndStartOfInputUntilEndOfLine => write!(f, "I")?, Self::MarkEndOfInputAndStartOfOutput { aid } => { write!(f, "C")?; if let Some(aid) = aid { write!(f, ";aid={}", aid)?; } } Self::CommandStatus { status, aid: Some(aid), } => { write!(f, "D;{};err={};aid={}", status, status, aid)?; } Self::CommandStatus { status, aid: None } => { write!(f, "D;{}", status)?; } } Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Progress { None, SetPercentage(u8), SetError(u8), SetIndeterminate, Paused, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum ITermProprietary { /// The "Set Mark" command allows you to record a location and then jump back to it later SetMark, /// To bring iTerm2 to the foreground StealFocus, /// To erase the scrollback history ClearScrollback, /// To inform iTerm2 of the current directory to help semantic history CurrentDir(String), /// To change the session's profile on the fly SetProfile(String), /// Currently defined values for the string parameter are "rule", "find", "font" /// or an empty string. iTerm2 will go into paste mode until EndCopy is received. CopyToClipboard(String), /// Ends CopyToClipboard mode in iTerm2. EndCopy, /// The boolean should be yes or no. This shows or hides the cursor guide HighlightCursorLine(bool), /// Request that the terminal send a ReportCellSize response RequestCellSize, /// The response to RequestCellSize. The height and width are the dimensions /// of a cell measured in points according to the docs, but in practice, they /// are actually pixels. /// If scale is_some(), the width and height will be multiplied by scale to /// get the true device dimensions ReportCellSize { height_pixels: NotNan, width_pixels: NotNan, scale: Option>, }, /// Place a string in the systems pasteboard Copy(String), /// Each iTerm2 session has internal variables (as described in /// ). This escape sequence reports /// a variable's value. The response is another ReportVariable. ReportVariable(String), /// User-defined variables may be set with the following escape sequence SetUserVar { name: String, value: String, }, SetBadgeFormat(String), /// Download file data from the application. File(Box), /// Configure unicode version UnicodeVersion(ITermUnicodeVersionOp), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum ITermUnicodeVersionOp { Set(u8), Push(Option), Pop(Option), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ITermFileData { /// file name pub name: Option, /// size of the data in bytes; this is used by iterm to show progress /// while waiting for the rest of the payload pub size: Option, /// width to render pub width: ITermDimension, /// height to render pub height: ITermDimension, /// if true, preserve aspect ratio when fitting to width/height pub preserve_aspect_ratio: bool, /// if true, attempt to display in the terminal rather than downloading to /// the users download directory pub inline: bool, /// if true, do not move the cursor pub do_not_move_cursor: bool, /// The data to transfer pub data: Vec, } impl ITermFileData { fn parse(osc: &[&[u8]]) -> Result { let mut params = HashMap::new(); // Unfortunately, the encoding for the file download data is // awkward to fit in the conventional OSC data that our parser // expects at a higher level. // We have a mix of '=', ';' and ':' separated keys and values, // and a number of them are optional. // ESC ] 1337 ; File = [optional arguments] : base-64 encoded file contents ^G let mut data = None; let last = osc.len() - 1; for (idx, s) in osc.iter().enumerate().skip(1) { let param = if idx == 1 { if s.len() >= 5 { // skip over File= &s[5..] } else { bail!("failed to parse file data; File= not found"); } } else { s }; let param = if idx == last { // The final argument contains `:base64`, so look for that if let Some(colon) = param.iter().position(|c| *c == b':') { data = Some(base64_decode(¶m[colon + 1..])?); ¶m[..colon] } else { // If we don't find the colon in the last piece, we've // got nothing useful bail!("failed to parse file data; no colon found"); } } else { param }; // eg: `File=;size=1234` case. if param.is_empty() { continue; } // look for k=v in param if let Some(equal) = param.iter().position(|c| *c == b'=') { let key = ¶m[..equal]; let value = ¶m[equal + 1..]; params.insert(str::from_utf8(key)?, str::from_utf8(value)?); } else if idx != last { bail!("failed to parse file data; no equals found"); } } let name = params .get("name") .and_then(|s| base64_decode(s).ok()) .and_then(|b| String::from_utf8(b).ok()); let size = params.get("size").and_then(|s| s.parse().ok()); let width = params .get("width") .and_then(|s| ITermDimension::parse(s).ok()) .unwrap_or(ITermDimension::Automatic); let height = params .get("height") .and_then(|s| ITermDimension::parse(s).ok()) .unwrap_or(ITermDimension::Automatic); let preserve_aspect_ratio = params .get("preserveAspectRatio") .map(|s| *s != "0") .unwrap_or(true); let inline = params.get("inline").map(|s| *s != "0").unwrap_or(false); let do_not_move_cursor = params .get("doNotMoveCursor") .map(|s| *s != "0") .unwrap_or(false); let data = data.ok_or_else(|| format!("didn't set data"))?; Ok(Self { name, size, width, height, preserve_aspect_ratio, inline, do_not_move_cursor, data, }) } } impl Display for ITermFileData { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "File")?; let mut sep = "="; let emit_sep = |sep, f: &mut Formatter| -> std::result::Result<&str, FmtError> { write!(f, "{}", sep)?; Ok(";") }; if let Some(size) = self.size { sep = emit_sep(sep, f)?; write!(f, "size={}", size)?; } if let Some(ref name) = self.name { sep = emit_sep(sep, f)?; write!(f, "name={}", base64_encode(name))?; } if self.width != ITermDimension::Automatic { sep = emit_sep(sep, f)?; write!(f, "width={}", self.width)?; } if self.height != ITermDimension::Automatic { sep = emit_sep(sep, f)?; write!(f, "height={}", self.height)?; } if !self.preserve_aspect_ratio { sep = emit_sep(sep, f)?; write!(f, "preserveAspectRatio=0")?; } if self.inline { sep = emit_sep(sep, f)?; write!(f, "inline=1")?; } if self.do_not_move_cursor { sep = emit_sep(sep, f)?; write!(f, "doNotMoveCursor=1")?; } // Ensure that we emit a sep if we didn't already. // It will still be set to '=' in that case. if sep == "=" { write!(f, "=")?; } write!(f, ":{}", base64_encode(&self.data))?; Ok(()) } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ITermDimension { Automatic, Cells(i64), Pixels(i64), Percent(i64), } impl Default for ITermDimension { fn default() -> Self { Self::Automatic } } impl Display for ITermDimension { fn fmt(&self, f: &mut Formatter) -> FmtResult { use self::ITermDimension::*; match self { Automatic => write!(f, "auto"), Cells(n) => write!(f, "{}", n), Pixels(n) => write!(f, "{}px", n), Percent(n) => write!(f, "{}%", n), } } } impl std::str::FromStr for ITermDimension { type Err = crate::Error; fn from_str(s: &str) -> Result { ITermDimension::parse(s) } } impl ITermDimension { fn parse(s: &str) -> Result { if s == "auto" { Ok(ITermDimension::Automatic) } else if s.ends_with("px") { let s = &s[..s.len() - 2]; let num = s.parse()?; Ok(ITermDimension::Pixels(num)) } else if s.ends_with('%') { let s = &s[..s.len() - 1]; let num = s.parse()?; Ok(ITermDimension::Percent(num)) } else { let num = s.parse()?; Ok(ITermDimension::Cells(num)) } } /// Convert the dimension into a number of pixels based on the provided /// size of a cell and number of cells in that dimension. /// Returns None for the Automatic variant. pub fn to_pixels(&self, cell_size: usize, num_cells: usize) -> Option { match self { ITermDimension::Automatic => None, ITermDimension::Cells(n) => Some((*n).max(0) as usize * cell_size), ITermDimension::Pixels(n) => Some((*n).max(0) as usize), ITermDimension::Percent(n) => Some( (((*n).max(0).min(100) as f32 / 100.0) * num_cells as f32 * cell_size as f32) as usize, ), } } } impl ITermProprietary { #[allow(clippy::cyclomatic_complexity, clippy::cognitive_complexity)] fn parse(osc: &[&[u8]]) -> Result { // iTerm has a number of different styles of OSC parameter // encodings, which makes this section of code a bit gnarly. ensure!(osc.len() > 1, "not enough args"); let param = String::from_utf8_lossy(osc[1]); let mut iter = param.splitn(2, '='); let keyword = iter.next().ok_or_else(|| format!("bad params"))?; let p1 = iter.next(); macro_rules! single { ($variant:ident, $text:expr) => { if osc.len() == 2 && keyword == $text && p1.is_none() { return Ok(ITermProprietary::$variant); } }; } macro_rules! one_str { ($variant:ident, $text:expr) => { if osc.len() == 2 && keyword == $text { if let Some(p1) = p1 { return Ok(ITermProprietary::$variant(p1.into())); } } }; } macro_rules! const_arg { ($variant:ident, $text:expr, $value:expr, $res:expr) => { if osc.len() == 2 && keyword == $text { if let Some(p1) = p1 { if p1 == $value { return Ok(ITermProprietary::$variant($res)); } } } }; } single!(SetMark, "SetMark"); single!(StealFocus, "StealFocus"); single!(ClearScrollback, "ClearScrollback"); single!(EndCopy, "EndCopy"); single!(RequestCellSize, "ReportCellSize"); const_arg!(HighlightCursorLine, "HighlightCursorLine", "yes", true); const_arg!(HighlightCursorLine, "HighlightCursorLine", "no", false); one_str!(CurrentDir, "CurrentDir"); one_str!(SetProfile, "SetProfile"); one_str!(CopyToClipboard, "CopyToClipboard"); let p1_empty = match p1 { Some(p1) if p1 == "" => true, None => true, _ => false, }; if osc.len() == 3 && keyword == "Copy" && p1_empty { return Ok(ITermProprietary::Copy(String::from_utf8(base64_decode( osc[2], )?)?)); } if osc.len() == 3 && keyword == "SetBadgeFormat" && p1_empty { return Ok(ITermProprietary::SetBadgeFormat(String::from_utf8( base64_decode(osc[2])?, )?)); } if osc.len() == 3 && keyword == "ReportCellSize" && p1.is_some() { if let Some(p1) = p1 { return Ok(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(p1.parse()?)?, width_pixels: NotNan::new(String::from_utf8_lossy(osc[2]).parse()?)?, scale: None, }); } } if osc.len() == 4 && keyword == "ReportCellSize" && p1.is_some() { if let Some(p1) = p1 { return Ok(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(p1.parse()?)?, width_pixels: NotNan::new(String::from_utf8_lossy(osc[2]).parse()?)?, scale: Some(NotNan::new(String::from_utf8_lossy(osc[3]).parse()?)?), }); } } if osc.len() == 2 && keyword == "SetUserVar" { if let Some(p1) = p1 { let mut iter = p1.splitn(2, '='); let p1 = iter.next(); let p2 = iter.next(); if let (Some(k), Some(v)) = (p1, p2) { return Ok(ITermProprietary::SetUserVar { name: k.to_string(), value: String::from_utf8(base64_decode(v)?)?, }); } } } if osc.len() == 2 && keyword == "UnicodeVersion" { if let Some(p1) = p1 { let mut iter = p1.splitn(2, ' '); let keyword = iter.next(); let label = iter.next(); if let Some("push") = keyword { return Ok(ITermProprietary::UnicodeVersion( ITermUnicodeVersionOp::Push(label.map(|s| s.to_string())), )); } if let Some("pop") = keyword { return Ok(ITermProprietary::UnicodeVersion( ITermUnicodeVersionOp::Pop(label.map(|s| s.to_string())), )); } if let Ok(n) = p1.parse::() { return Ok(ITermProprietary::UnicodeVersion( ITermUnicodeVersionOp::Set(n), )); } } } if keyword == "File" { return Ok(ITermProprietary::File(Box::new(ITermFileData::parse(osc)?))); } bail!("ITermProprietary {:?}", osc); } } /// base64::encode is deprecated, so make a less frustrating helper pub(crate) fn base64_encode>(s: T) -> String { base64::engine::general_purpose::STANDARD.encode(s) } /// base64::decode is deprecated, so make a less frustrating helper pub(crate) fn base64_decode>( s: T, ) -> std::result::Result, base64::DecodeError> { use base64::engine::{GeneralPurpose, GeneralPurposeConfig}; GeneralPurpose::new( &base64::alphabet::STANDARD, GeneralPurposeConfig::new().with_decode_allow_trailing_bits(true), ) .decode(s) } impl Display for ITermProprietary { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "1337;")?; use self::ITermProprietary::*; match self { SetMark => write!(f, "SetMark")?, StealFocus => write!(f, "StealFocus")?, ClearScrollback => write!(f, "ClearScrollback")?, CurrentDir(s) => write!(f, "CurrentDir={}", s)?, SetProfile(s) => write!(f, "SetProfile={}", s)?, CopyToClipboard(s) => write!(f, "CopyToClipboard={}", s)?, EndCopy => write!(f, "EndCopy")?, HighlightCursorLine(yes) => { write!(f, "HighlightCursorLine={}", if *yes { "yes" } else { "no" })? } RequestCellSize => write!(f, "ReportCellSize")?, ReportCellSize { height_pixels, width_pixels, scale: None, } => write!(f, "ReportCellSize={height_pixels:.1};{width_pixels:.1}")?, ReportCellSize { height_pixels, width_pixels, scale: Some(scale), } => write!( f, "ReportCellSize={height_pixels:.1};{width_pixels:.1};{scale:.1}", )?, Copy(s) => write!(f, "Copy=;{}", base64_encode(s))?, ReportVariable(s) => write!(f, "ReportVariable={}", base64_encode(s))?, SetUserVar { name, value } => { write!(f, "SetUserVar={}={}", name, base64_encode(value))? } SetBadgeFormat(s) => write!(f, "SetBadgeFormat={}", base64_encode(s))?, File(file) => file.fmt(f)?, UnicodeVersion(ITermUnicodeVersionOp::Set(n)) => write!(f, "UnicodeVersion={}", n)?, UnicodeVersion(ITermUnicodeVersionOp::Push(Some(label))) => { write!(f, "UnicodeVersion=push {}", label)? } UnicodeVersion(ITermUnicodeVersionOp::Push(None)) => write!(f, "UnicodeVersion=push")?, UnicodeVersion(ITermUnicodeVersionOp::Pop(Some(label))) => { write!(f, "UnicodeVersion=pop {}", label)? } UnicodeVersion(ITermUnicodeVersionOp::Pop(None)) => write!(f, "UnicodeVersion=pop")?, } Ok(()) } } #[cfg(test)] mod test { use super::*; fn encode(osc: &OperatingSystemCommand) -> String { format!("{}", osc) } fn parse(osc: &[&str], expected: &str) -> OperatingSystemCommand { let mut v = Vec::new(); for s in osc { v.push(s.as_bytes()); } let result = OperatingSystemCommand::parse(&v); assert_eq!(encode(&result), expected); result } #[test] fn reset_colors() { assert_eq!( parse(&["104"], "\x1b]104\x1b\\"), OperatingSystemCommand::ResetColors(vec![]) ); assert_eq!( parse(&["104", ""], "\x1b]104\x1b\\"), OperatingSystemCommand::ResetColors(vec![]) ); assert_eq!( parse(&["104", "1"], "\x1b]104;1\x1b\\"), OperatingSystemCommand::ResetColors(vec![1]) ); assert_eq!( parse(&["112"], "\x1b]112\x1b\\"), OperatingSystemCommand::ResetDynamicColor(DynamicColorNumber::TextCursorColor) ); } #[test] fn title() { assert_eq!( parse(&["0", "hello"], "\x1b]0;hello\x1b\\"), OperatingSystemCommand::SetIconNameAndWindowTitle("hello".into()) ); assert_eq!( parse(&["0", "hello \u{1f915}"], "\x1b]0;hello \u{1f915}\x1b\\"), OperatingSystemCommand::SetIconNameAndWindowTitle("hello \u{1f915}".into()) ); assert_eq!( parse( &["0", "hello \u{1f915}", " world"], "\x1b]0;hello \u{1f915}; world\x1b\\" ), OperatingSystemCommand::SetIconNameAndWindowTitle("hello \u{1f915}; world".into()) ); // Missing title parameter assert_eq!( parse(&["0"], "\x1b]0\x1b\\"), OperatingSystemCommand::Unspecified(vec![b"0".to_vec()]) ); // parsing legacy sun OSC; why bother? This format is used in response // to the CSI ReportWindowTitle sequence assert_eq!( parse(&["lhello"], "\x1b]lhello\x1b\\"), OperatingSystemCommand::SetWindowTitleSun("hello".into()) ); } #[test] fn hyperlink() { assert_eq!( parse( &["8", "id=foo", "http://example.com"], "\x1b]8;id=foo;http://example.com\x1b\\" ), OperatingSystemCommand::SetHyperlink(Some(Hyperlink::new_with_id( "http://example.com", "foo" ))) ); assert_eq!( parse(&["8", "", ""], "\x1b]8;;\x1b\\"), OperatingSystemCommand::SetHyperlink(None) ); // too many params assert_eq!( parse(&["8", "1", "2"], "\x1b]8;1;2\x1b\\"), OperatingSystemCommand::Unspecified(vec![b"8".to_vec(), b"1".to_vec(), b"2".to_vec()]) ); assert_eq!( Hyperlink::parse(&[b"8", b"", b"x"]).unwrap(), Some(Hyperlink::new("x")) ); } #[test] fn finalterm() { assert_eq!( parse(&["133", "L"], "\x1b]133;L\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::FreshLine) ); assert_eq!( parse(&["133", "C"], "\x1b]133;C\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfInputAndStartOfOutput { aid: None } ) ); assert_eq!( parse(&["133", "C", "aid=123"], "\x1b]133;C;aid=123\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfInputAndStartOfOutput { aid: Some("123".to_string()) } ) ); assert_eq!( parse(&["133", "D", "1"], "\x1b]133;D;1\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 1, aid: None } ) ); assert_eq!( parse(&["133", "D", "0"], "\x1b]133;D;0\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 0, aid: None } ) ); assert_eq!( parse( &["133", "D", "0", "aid=23"], "\x1b]133;D;0;err=0;aid=23\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 0, aid: Some("23".to_owned()) } ) ); assert_eq!( parse( &["133", "D", "1", "aid=23"], "\x1b]133;D;1;err=1;aid=23\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 1, aid: Some("23".to_owned()) } ) ); assert_eq!( parse(&["133", "P"], "\x1b]133;P;k=i\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Initial )) ); assert_eq!( parse(&["133", "P", "k=i"], "\x1b]133;P;k=i\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Initial )) ); assert_eq!( parse(&["133", "P", "k=r"], "\x1b]133;P;k=r\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::RightSide )) ); assert_eq!( parse(&["133", "P", "k=c"], "\x1b]133;P;k=c\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Continuation )) ); assert_eq!( parse(&["133", "P", "k=s"], "\x1b]133;P;k=s\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Secondary )) ); assert_eq!( parse(&["133", "B"], "\x1b]133;B\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfPromptAndStartOfInputUntilNextMarker ), ); assert_eq!( parse(&["133", "I"], "\x1b]133;I\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfPromptAndStartOfInputUntilEndOfLine ), ); assert_eq!( parse(&["133", "N"], "\x1b]133;N\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: None, cl: None, } ), ); assert_eq!( parse(&["133", "N", "aid=12"], "\x1b]133;N;aid=12\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: None, } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=line"], "\x1b]133;N;aid=12;cl=line\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::Line), } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=m"], "\x1b]133;N;aid=12;cl=m\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::MultipleLine), } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=v"], "\x1b]133;N;aid=12;cl=v\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::ConservativeVertical), } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=w"], "\x1b]133;N;aid=12;cl=w\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::SmartVertical), } ), ); assert_eq!( parse( &["133", "A", "aid=12", "cl=w"], "\x1b]133;A;aid=12;cl=w\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::FreshLineAndStartPrompt { aid: Some("12".to_owned()), cl: Some(FinalTermClick::SmartVertical), } ), ); } #[test] fn rxvt() { assert_eq!( parse( &["777", "notify", "alert user", "the tea is ready"], "\x1b]777;notify;alert user;the tea is ready\x1b\\" ), OperatingSystemCommand::RxvtExtension(vec![ "notify".into(), "alert user".into(), "the tea is ready".into() ]), ) } #[test] fn conemu() { assert_eq!( parse(&["9", "4", "1", "42"], "\x1b]9;4;1;42\x1b\\"), OperatingSystemCommand::ConEmuProgress(Progress::SetPercentage(42)) ); assert_eq!( parse(&["9", "4", "2", "64"], "\x1b]9;4;2;64\x1b\\"), OperatingSystemCommand::ConEmuProgress(Progress::SetError(64)) ); assert_eq!( parse(&["9", "4", "3"], "\x1b]9;4;3\x1b\\"), OperatingSystemCommand::ConEmuProgress(Progress::SetIndeterminate) ); assert_eq!( parse(&["9", "4", "4"], "\x1b]9;4;4\x1b\\"), OperatingSystemCommand::ConEmuProgress(Progress::Paused) ); } #[test] fn iterm() { assert_eq!( parse(&["1337", "SetMark"], "\x1b]1337;SetMark\x1b\\"), OperatingSystemCommand::ITermProprietary(ITermProprietary::SetMark) ); assert_eq!( parse( &["1337", "CurrentDir=woot"], "\x1b]1337;CurrentDir=woot\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::CurrentDir("woot".into())) ); assert_eq!( parse( &["1337", "HighlightCursorLine=yes"], "\x1b]1337;HighlightCursorLine=yes\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::HighlightCursorLine(true)) ); assert_eq!( parse( &["1337", "Copy=", "aGVsbG8="], "\x1b]1337;Copy=;aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::Copy("hello".into())) ); assert_eq!( parse( &["1337", "SetUserVar=foo=aGVsbG8="], "\x1b]1337;SetUserVar=foo=aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::SetUserVar { name: "foo".into(), value: "hello".into() }) ); assert_eq!( parse( &["1337", "SetBadgeFormat=", "aGVsbG8="], "\x1b]1337;SetBadgeFormat=aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::SetBadgeFormat( "hello".into() )) ); assert_eq!( parse( &["1337", "ReportCellSize=12.0", "15.5"], "\x1b]1337;ReportCellSize=12.0;15.5\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(12.0).unwrap(), width_pixels: NotNan::new(15.5).unwrap(), scale: None, }) ); assert_eq!( parse( &["1337", "ReportCellSize=12.0", "15.5", "2.0"], "\x1b]1337;ReportCellSize=12.0;15.5;2.0\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(12.0).unwrap(), width_pixels: NotNan::new(15.5).unwrap(), scale: Some(NotNan::new(2.0).unwrap()), }) ); assert_eq!( parse( &["1337", "File=:aGVsbG8="], "\x1b]1337;File=:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: None, size: None, width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l:aGVsbG8="], "\x1b]1337;File=name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: None, width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=size=123", "name=bXluYW1l:aGVsbG8="], "\x1b]1337;File=size=123;name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(123), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &[ "1337", "File=name=bXluYW1l", "width=auto", "size=234:aGVsbG8=" ], "\x1b]1337;File=size=234;name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "width=5", "size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l;width=5:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &[ "1337", "File=name=bXluYW1l", "width=5", "height=10%", "size=234:aGVsbG8=" ], "\x1b]1337;File=size=234;name=bXluYW1l;width=5;height=10%:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Percent(10), preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "preserveAspectRatio=0", "width=5", "inline=1", "height=10px","size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l;width=5;height=10px;preserveAspectRatio=0;inline=1:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Pixels(10), preserve_aspect_ratio: false, inline: true, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "preserveAspectRatio=0", "width=5", "inline=1", "doNotMoveCursor=1", "height=10px","size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l;width=5;height=10px;preserveAspectRatio=0;inline=1;doNotMoveCursor=1:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Pixels(10), preserve_aspect_ratio: false, inline: true, do_not_move_cursor: true, data: b"hello".to_vec(), } ))) ); } } termwiz-0.23.3/src/escape/parser/mod.rs000064400000000000000000001156111046102023000160670ustar 00000000000000#![allow(clippy::many_single_char_names)] use crate::escape::{ Action, DeviceControlMode, EnterDeviceControlMode, Esc, OperatingSystemCommand, ShortDeviceControl, CSI, }; use crate::tmux_cc::Event; use log::error; use num_traits::FromPrimitive; use std::borrow::BorrowMut; use std::cell::RefCell; use vtparse::{CsiParam, VTActor, VTParser}; mod sixel; use sixel::SixelBuilder; #[derive(Default)] struct GetTcapBuilder { current: Vec, names: Vec, } impl GetTcapBuilder { fn flush(&mut self) { let decoded = hex::decode(&self.current) .map(|s| String::from_utf8_lossy(&s).to_string()) .unwrap_or_else(|_| String::from_utf8_lossy(&self.current).to_string()); self.names.push(decoded); self.current.clear(); } pub fn push(&mut self, data: u8) { if data == b';' { self.flush(); } else { self.current.push(data); } } pub fn finish(mut self) -> Vec { self.flush(); self.names } } #[derive(Default)] struct ParseState { sixel: Option, dcs: Option, get_tcap: Option, tmux_state: Option>, } /// The `Parser` struct holds the state machine that is used to decode /// a sequence of bytes. The byte sequence can be streaming into the /// state machine. /// You can either have the parser trigger a callback as `Action`s are /// decoded, or have it return a `Vec` holding zero-or-more /// decoded actions. pub struct Parser { state_machine: VTParser, state: RefCell, } impl Default for Parser { fn default() -> Self { Self::new() } } impl Parser { pub fn new() -> Self { Self { state_machine: VTParser::new(), state: RefCell::new(Default::default()), } } /// advance with tmux parser, bypass VTParse fn advance_tmux_bytes(&mut self, bytes: &[u8]) -> anyhow::Result> { let parser_state = self.state.borrow(); let tmux_state = parser_state.tmux_state.as_ref().unwrap(); let mut tmux_parser = tmux_state.borrow_mut(); return tmux_parser.advance_bytes(bytes); } pub fn parse(&mut self, bytes: &[u8], mut callback: F) { let is_tmux_mode: bool = self.state.borrow().tmux_state.is_some(); if is_tmux_mode { match self.advance_tmux_bytes(bytes) { Ok(tmux_events) => { callback(Action::DeviceControl(DeviceControlMode::TmuxEvents( Box::new(tmux_events), ))); } Err(err_buf) => { // capture bytes cannot be parsed let unparsed_str = err_buf.to_string().to_owned(); let mut parser_state = self.state.borrow_mut(); parser_state.tmux_state = None; let mut perform = Performer { callback: &mut callback, state: &mut parser_state, }; self.state_machine .parse(unparsed_str.as_bytes(), &mut perform); } } } else { let mut perform = Performer { callback: &mut callback, state: &mut self.state.borrow_mut(), }; self.state_machine.parse(bytes, &mut perform); } } /// A specialized version of the parser that halts after recognizing the /// first action from the stream of bytes. The return value is the action /// that was recognized and the length of the byte stream that was fed in /// to the parser to yield it. pub fn parse_first(&mut self, bytes: &[u8]) -> Option<(Action, usize)> { // holds the first action. We need to use RefCell to deal with // the Performer holding a reference to this via the closure we set up. let first = RefCell::new(None); // will hold the iterator index when we emit an action let mut first_idx = None; { let mut perform = Performer { callback: &mut |action| { // capture the action, but only if it is the first one // we've seen. Preserve an existing one if any. if first.borrow().is_some() { return; } *first.borrow_mut() = Some(action); }, state: &mut self.state.borrow_mut(), }; for (idx, b) in bytes.iter().enumerate() { self.state_machine.parse_byte(*b, &mut perform); if first.borrow().is_some() { // if we recognized an action, record the iterator index first_idx = Some(idx); break; } } } match (first.into_inner(), first_idx) { // if we matched an action, transform the iterator index to // the length of the string that was consumed (+1) (Some(action), Some(idx)) => Some((action, idx + 1)), _ => None, } } pub fn parse_as_vec(&mut self, bytes: &[u8]) -> Vec { let mut result = Vec::new(); self.parse(bytes, |action| result.push(action)); result } /// Similar to `parse_first` but collects all actions from the first sequence, /// and guarantees the state machine is in the ground state at the end of this /// sequence. pub fn parse_first_as_vec(&mut self, bytes: &[u8]) -> Option<(Vec, usize)> { let mut actions = Vec::new(); let mut first_idx = None; for (idx, b) in bytes.iter().enumerate() { self.state_machine.parse_byte( *b, &mut Performer { callback: &mut |action| actions.push(action), state: &mut self.state.borrow_mut(), }, ); if !actions.is_empty() && self.state_machine.is_ground() { // if we recognized any actions, record the iterator index first_idx = Some(idx); break; } } first_idx.map(|idx| (actions, idx + 1)) } } struct Performer<'a, F: FnMut(Action) + 'a> { callback: &'a mut F, state: &'a mut ParseState, } fn is_short_dcs(intermediates: &[u8], byte: u8) -> bool { if intermediates == &[b'$'] && byte == b'q' { // DECRQSS true } else { false } } impl<'a, F: FnMut(Action)> VTActor for Performer<'a, F> { fn print(&mut self, c: char) { (self.callback)(Action::Print(c)); } fn execute_c0_or_c1(&mut self, byte: u8) { match FromPrimitive::from_u8(byte) { Some(code) => (self.callback)(Action::Control(code)), None => error!( "impossible C0/C1 control code {:?} 0x{:x} was dropped", byte as char, byte ), } } fn apc_dispatch(&mut self, data: Vec) { if let Some(img) = super::KittyImage::parse_apc(&data) { (self.callback)(Action::KittyImage(Box::new(img))) } else { log::trace!("Ignoring APC data: {:?}", String::from_utf8_lossy(&data)); } } fn dcs_hook( &mut self, byte: u8, params: &[i64], intermediates: &[u8], ignored_extra_intermediates: bool, ) { self.state.sixel.take(); self.state.get_tcap.take(); self.state.dcs.take(); if byte == b'q' && intermediates.is_empty() && !ignored_extra_intermediates { self.state.sixel.replace(SixelBuilder::new(params)); } else if byte == b'q' && intermediates == [b'+'] { self.state.get_tcap.replace(GetTcapBuilder::default()); } else if !ignored_extra_intermediates && is_short_dcs(intermediates, byte) { self.state.dcs.replace(ShortDeviceControl { params: params.to_vec(), intermediates: intermediates.to_vec(), byte, data: vec![], }); } else { if byte == b'p' && params == [1000] { // into tmux_cc mode self.state.borrow_mut().tmux_state = Some(RefCell::new(crate::tmux_cc::Parser::new())); } (self.callback)(Action::DeviceControl(DeviceControlMode::Enter(Box::new( EnterDeviceControlMode { byte, params: params.to_vec(), intermediates: intermediates.to_vec(), ignored_extra_intermediates, }, )))); } } fn dcs_put(&mut self, data: u8) { if let Some(dcs) = self.state.dcs.as_mut() { dcs.data.push(data); } else if let Some(sixel) = self.state.sixel.as_mut() { sixel.push(data); } else if let Some(tcap) = self.state.get_tcap.as_mut() { tcap.push(data); } else { if let Some(tmux_state) = &self.state.tmux_state { let mut tmux_parser = tmux_state.borrow_mut(); match tmux_parser.advance_byte(data) { Ok(optional_events) => { if let Some(tmux_event) = optional_events { (self.callback)(Action::DeviceControl(DeviceControlMode::TmuxEvents( Box::new(vec![tmux_event]), ))); } } Err(_) => { drop(tmux_parser); self.state.tmux_state = None; // drop tmux state } } } else { (self.callback)(Action::DeviceControl(DeviceControlMode::Data(data))); } } } fn dcs_unhook(&mut self) { if let Some(dcs) = self.state.dcs.take() { (self.callback)(Action::DeviceControl( DeviceControlMode::ShortDeviceControl(Box::new(dcs)), )); } else if let Some(mut sixel) = self.state.sixel.take() { sixel.finish(); (self.callback)(Action::Sixel(Box::new(sixel.sixel))); } else if let Some(tcap) = self.state.get_tcap.take() { (self.callback)(Action::XtGetTcap(tcap.finish())); } else { (self.callback)(Action::DeviceControl(DeviceControlMode::Exit)); } } fn osc_dispatch(&mut self, osc: &[&[u8]]) { let osc = OperatingSystemCommand::parse(osc); (self.callback)(Action::OperatingSystemCommand(Box::new(osc))); } fn csi_dispatch(&mut self, params: &[CsiParam], parameters_truncated: bool, control: u8) { for action in CSI::parse(params, parameters_truncated, control as char) { (self.callback)(Action::CSI(action)); } } fn esc_dispatch( &mut self, _params: &[i64], intermediates: &[u8], _ignored_extra_intermediates: bool, control: u8, ) { // It doesn't appear to be possible for params.len() > 1 due to the way // that the state machine in vte functions. As such, it also seems to // be impossible for ignored_extra_intermediates to be true too. (self.callback)(Action::Esc(Esc::parse( if intermediates.len() == 1 { Some(intermediates[0]) } else { None }, control, ))); } } #[cfg(test)] mod test { use super::*; use crate::cell::{Intensity, Underline}; use crate::color::ColorSpec; use crate::escape::csi::{ CharacterPath, DecPrivateMode, DecPrivateModeCode, Device, Mode, Sgr, Window, XtSmGraphics, XtSmGraphicsItem, XtermKeyModifierResource, }; use crate::escape::{EscCode, OneBased}; use k9::assert_equal as assert_eq; use std::io::Write; fn encode(seq: &Vec) -> String { let mut res = Vec::new(); for s in seq { write!(res, "{}", s).unwrap(); } String::from_utf8(res).unwrap() } // #[test] fn osc_bel_parse_first_as_vec() { let data = b"\x1b]8;;http://example.com\x07example\x1b]8;;\x07"; let mut p = Parser::new(); let mut offset = 0; let mut actions = vec![]; while let Some((mut act, off)) = p.parse_first_as_vec(&data[offset..]) { actions.append(&mut act); offset += off; } k9::snapshot!( actions, r#" [ OperatingSystemCommand( SetHyperlink( Some( Hyperlink { params: {}, uri: "http://example.com", implicit: false, }, ), ), ), Print( 'e', ), Print( 'x', ), Print( 'a', ), Print( 'm', ), Print( 'p', ), Print( 'l', ), Print( 'e', ), OperatingSystemCommand( SetHyperlink( None, ), ), ] "# ); } // #[test] fn osc_st_parse_first_as_vec() { // This string includes an assitional trailing ST sequence which should // be parsed separately. let data = b"\x1b]8;;http://example.com\x1b\\example\x1b]8;;\x1b\\\x1b\\"; let mut p = Parser::new(); let mut offset = 0; let mut actions = vec![]; let mut slices = vec![]; while let Some((act, off)) = p.parse_first_as_vec(&data[offset..]) { // Store each vec of actions so we can confirm that the ST sequence is bundled with the // OSC SetHyperlink command. actions.push(act); // Additionally store all non-single-character slices so we can confirm these are split // correctly. if off > 1 { slices.push(&data[offset..offset + off]); } offset += off; } assert_eq!( slices, vec![ b"\x1b]8;;http://example.com\x1b\\".as_slice(), b"\x1b]8;;\x1b\\".as_slice(), b"\x1b\\".as_slice() ] ); k9::snapshot!( actions, r#" [ [ OperatingSystemCommand( SetHyperlink( Some( Hyperlink { params: {}, uri: "http://example.com", implicit: false, }, ), ), ), Esc( Code( StringTerminator, ), ), ], [ Print( 'e', ), ], [ Print( 'x', ), ], [ Print( 'a', ), ], [ Print( 'm', ), ], [ Print( 'p', ), ], [ Print( 'l', ), ], [ Print( 'e', ), ], [ OperatingSystemCommand( SetHyperlink( None, ), ), Esc( Code( StringTerminator, ), ), ], [ Esc( Code( StringTerminator, ), ), ], ] "# ); } #[test] fn basic_parse() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"hello"); assert_eq!( vec![ Action::Print('h'), Action::Print('e'), Action::Print('l'), Action::Print('l'), Action::Print('o'), ], actions ); assert_eq!(encode(&actions), "hello"); } #[test] fn basic_bold() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[1mb"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('b'), ], actions ); assert_eq!(encode(&actions), "\x1b[1mb"); } #[test] fn basic_bold_italic() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[1;3mb"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Italic(true))), Action::Print('b'), ], actions ); assert_eq!(encode(&actions), "\x1b[1m\x1b[3mb"); } #[test] fn fancy_underline() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[4:0;4:1;4:2;4:3;4:4;4:5mb"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Underline(Underline::None))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Single))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Double))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Curly))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Dotted))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Dashed))), Action::Print('b'), ], actions ); assert_eq!( encode(&actions), "\x1b[24m\x1b[4m\x1b[21m\x1b[4:3m\x1b[4:4m\x1b[4:5mb" ); } #[test] fn true_color() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[38:2::128:64:192mw"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (128, 64, 192).into() )))), Action::Print('w'), ], actions ); assert_eq!(encode(&actions), "\u{1b}[38:2::128:64:192mw"); let actions = p.parse_as_vec(b"\x1b[38:2:0:255:0mw"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (0, 255, 0).into() )))), Action::Print('w'), ], actions ); let actions = p.parse_as_vec(b"\x1b[38:6:0:255:0:127mw"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (0, 255, 0, 127).into() )))), Action::Print('w'), ], actions ); } #[test] fn basic_osc() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b]0;hello\x07"); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::SetIconNameAndWindowTitle("hello".to_owned()), ))], actions ); assert_eq!(encode(&actions), "\x1b]0;hello\x1b\\"); let actions = p.parse_as_vec(b"\x1b]532534523;hello\x07"); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::Unspecified(vec![b"532534523".to_vec(), b"hello".to_vec()]), ))], actions ); assert_eq!(encode(&actions), "\x1b]532534523;hello\x1b\\"); } #[test] fn test_emoji_title_osc() { let input = "\x1b]0;\u{1f915}\x07"; let mut p = Parser::new(); let actions = p.parse_as_vec(input.as_bytes()); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::SetIconNameAndWindowTitle("\u{1f915}".to_owned()), ))], actions ); assert_eq!(encode(&actions), "\x1b]0;\u{1f915}\x1b\\"); } #[test] fn basic_esc() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1bH"); assert_eq!( vec![Action::Esc(Esc::Code(EscCode::HorizontalTabSet))], actions ); assert_eq!(encode(&actions), "\x1bH"); let actions = p.parse_as_vec(b"\x1b%H"); assert_eq!( vec![Action::Esc(Esc::Unspecified { intermediate: Some(b'%'), control: b'H', })], actions ); assert_eq!(encode(&actions), "\x1b%H"); } #[test] fn soft_reset() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[!p"); assert_eq!( vec![Action::CSI(CSI::Device(Box::new( crate::escape::csi::Device::SoftReset )))], actions ); assert_eq!(encode(&actions), "\x1b[!p"); } #[test] fn tmux_title_escape() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1bktitle\x1b\\"); assert_eq!( vec![ Action::Esc(Esc::Code(EscCode::TmuxTitle)), Action::Print('t'), Action::Print('i'), Action::Print('t'), Action::Print('l'), Action::Print('e'), Action::Esc(Esc::Code(EscCode::StringTerminator)), ], actions ); } fn round_trip_parse(s: &str) -> Vec { let mut p = Parser::new(); let actions = p.parse_as_vec(s.as_bytes()); println!("actions: {:?}", actions); assert_eq!(s, encode(&actions)); actions } fn parse_as(s: &str, expected: &str) -> Vec { let mut p = Parser::new(); let actions = p.parse_as_vec(s.as_bytes()); println!("actions: {:?}", actions); assert_eq!(expected, encode(&actions)); actions } #[test] fn xtgettcap() { assert_eq!( round_trip_parse("\x1bP+q544e\x1b\\"), vec![ Action::XtGetTcap(vec!["TN".to_string()]), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); } #[test] fn bidi_modes() { assert_eq!( round_trip_parse("\x1b[1 k"), vec![Action::CSI(CSI::SelectCharacterPath( CharacterPath::LeftToRightOrTopToBottom, 0 ))] ); assert_eq!( round_trip_parse("\x1b[2;1 k"), vec![Action::CSI(CSI::SelectCharacterPath( CharacterPath::RightToLeftOrBottomToTop, 1 ))] ); } #[test] fn xterm_key() { assert_eq!( round_trip_parse("\x1b[>4;2m"), vec![Action::CSI(CSI::Mode(Mode::XtermKeyMode { resource: XtermKeyModifierResource::OtherKeys, value: Some(2), }))] ); assert_eq!( round_trip_parse("\x1b[>4;m"), vec![Action::CSI(CSI::Mode(Mode::XtermKeyMode { resource: XtermKeyModifierResource::OtherKeys, value: None, }))] ); } #[test] fn window() { assert_eq!( round_trip_parse("\x1b[22;2t"), vec![Action::CSI(CSI::Window(Box::new(Window::PushWindowTitle)))] ); } #[test] fn checksum_area() { assert_eq!( round_trip_parse("\x1b[1;2;3;4;5;6*y"), vec![Action::CSI(CSI::Window(Box::new( Window::ChecksumRectangularArea { request_id: 1, page_number: 2, top: OneBased::new(3), left: OneBased::new(4), bottom: OneBased::new(5), right: OneBased::new(6), } )))] ); } #[test] fn dec_private_modes() { assert_eq!( parse_as("\x1b[?1;1006h", "\x1b[?1h\x1b[?1006h"), vec![ Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ApplicationCursorKeys ),))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::SGRMouse ),))), ] ); } #[test] fn xtsmgraphics() { assert_eq!( round_trip_parse("\x1b[?1;3;256S"), vec![Action::CSI(CSI::Device(Box::new(Device::XtSmGraphics( XtSmGraphics { item: XtSmGraphicsItem::NumberOfColorRegisters, action_or_status: 3, value: vec![256] } ))))] ); } #[test] fn req_attr() { assert_eq!( round_trip_parse("\x1b[=c"), vec![Action::CSI(CSI::Device(Box::new( Device::RequestTertiaryDeviceAttributes )))] ); assert_eq!( round_trip_parse("\x1b[>c"), vec![Action::CSI(CSI::Device(Box::new( Device::RequestSecondaryDeviceAttributes )))] ); } #[test] fn sgr() { assert_eq!( parse_as("\x1b[;4m", "\x1b[0m\x1b[4m"), vec![ Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Single))), ] ); } #[test] fn kitty_img() { use crate::escape::apc::*; assert_eq!( round_trip_parse("\x1b_Gf=24,s=10,v=20;aGVsbG8=\x1b\\"), vec![ Action::KittyImage(Box::new(KittyImage::TransmitData { transmit: KittyImageTransmit { format: Some(KittyImageFormat::Rgb), data: KittyImageData::Direct("aGVsbG8=".to_string()), width: Some(10), height: Some(20), image_id: None, image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, verbosity: KittyImageVerbosity::Verbose, })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); assert_eq!( parse_as( "\x1b_Ga=q,s=1,v=1,i=1;YWJjZA==\x1b\\", "\x1b_Ga=q,i=1,s=1,v=1;YWJjZA==\x1b\\" ), vec![ Action::KittyImage(Box::new(KittyImage::Query { transmit: KittyImageTransmit { format: None, data: KittyImageData::Direct("YWJjZA==".to_string()), width: Some(1), height: Some(1), image_id: Some(1), image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); assert_eq!( parse_as( "\x1b_Ga=q,t=f,s=1,v=1,i=2;L3Zhci90bXAvdG1wdGYxd3E4Ym4=\x1b\\", "\x1b_Ga=q,i=2,s=1,t=f,v=1;L3Zhci90bXAvdG1wdGYxd3E4Ym4=\x1b\\" ), vec![ Action::KittyImage(Box::new(KittyImage::Query { transmit: KittyImageTransmit { format: None, data: KittyImageData::File { path: "/var/tmp/tmptf1wq8bn".to_string(), data_offset: None, data_size: None, }, width: Some(1), height: Some(1), image_id: Some(2), image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); } /* Withdrawn because xterm introduced a conflict: * * #[test] fn dec_private_sgr() { use crate::cell::{VerticalAlign}; assert_eq!( parse_as("\x1b[?0m", "\x1b[0m"), vec![Action::CSI(CSI::Sgr(Sgr::Reset))] ); assert_eq!( parse_as("\x1b[?4m", "\x1b[73m"), vec![Action::CSI(CSI::Sgr(Sgr::VerticalAlign( VerticalAlign::SuperScript )))] ); assert_eq!( parse_as("\x1b[?5m", "\x1b[74m"), vec![Action::CSI(CSI::Sgr(Sgr::VerticalAlign( VerticalAlign::SubScript )))] ); assert_eq!( parse_as("\x1b[?24m", "\x1b[75m"), vec![Action::CSI(CSI::Sgr(Sgr::VerticalAlign( VerticalAlign::BaseLine )))] ); assert_eq!( parse_as("\x1b[?6m", "\x1b[53m"), vec![Action::CSI(CSI::Sgr(Sgr::Overline(true)))] ); assert_eq!( parse_as("\x1b[?26m", "\x1b[55m"), vec![Action::CSI(CSI::Sgr(Sgr::Overline(false)))] ); } */ #[test] fn decset() { assert_eq!( round_trip_parse("\x1b[?23434h"), vec![Action::CSI(CSI::Mode(Mode::SetDecPrivateMode( DecPrivateMode::Unspecified(23434), )))] ); /* { let res = CSI::parse(&[CsiParam::Integer(2026)], &[b'?', b'$'], false, 'p').collect(); assert_eq!(encode(&res), "\x1b[?2026$p"); } */ assert_eq!( round_trip_parse("\x1b[?1l"), vec![Action::CSI(CSI::Mode(Mode::ResetDecPrivateMode( DecPrivateMode::Code(DecPrivateModeCode::ApplicationCursorKeys,) )))] ); assert_eq!( round_trip_parse("\x1b[?25s"), vec![Action::CSI(CSI::Mode(Mode::SaveDecPrivateMode( DecPrivateMode::Code(DecPrivateModeCode::ShowCursor,) )))] ); assert_eq!( round_trip_parse("\x1b[?2004r"), vec![Action::CSI(CSI::Mode(Mode::RestoreDecPrivateMode( DecPrivateMode::Code(DecPrivateModeCode::BracketedPaste), )))] ); assert_eq!( round_trip_parse("\x1b[?12h\x1b[?25h"), vec![ Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::StartBlinkingCursor, )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ShowCursor, )))), ] ); assert_eq!( round_trip_parse("\x1b[?1002h\x1b[?1003h\x1b[?1005h\x1b[?1006h"), vec![ Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ButtonEventMouse, )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::AnyEventMouse, )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::Utf8Mouse )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::SGRMouse, )))), ] ); } #[test] fn issue_1291() { use crate::escape::osc::{ITermDimension, ITermFileData, ITermProprietary}; let mut p = Parser::new(); // Note the empty k=v pair immediately following `File=` let actions = p.parse_as_vec(b"\x1b]1337;File=;size=234:aGVsbG8=\x07"); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: None, size: Some(234), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ))], actions ); } #[test] fn itermfiledata_oob() { let mut p = Parser::new(); p.parse_as_vec(b"\x9d1337\xff;File\x1b"); } /// vtparse's MAX_OSC was set too low to fully parse this escape sequence. /// This test verifies that the correct number of actions comes back. #[test] fn dynamic_colors() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b]4;0;#000000;1;#aa3731;2;#448c27;3;#cb9000;4;#325cc0;5;#7a3e9d;6;#0083b2;7;#f7f7f7;8;#777777;9;#f05050;10;#60cb00;11;#ffbc5d;12;#007acc;13;#e64ce6;14;#00aacb;15;#f7f7f7\x07"); k9::snapshot!( actions, " [ OperatingSystemCommand( ChangeColorNumber( [ ChangeColorPair { palette_index: 0, color: Color( SrgbaTuple( 0.0, 0.0, 0.0, 1.0, ), ), }, ChangeColorPair { palette_index: 1, color: Color( SrgbaTuple( 0.6666667, 0.21568628, 0.19215687, 1.0, ), ), }, ChangeColorPair { palette_index: 2, color: Color( SrgbaTuple( 0.26666668, 0.54901963, 0.15294118, 1.0, ), ), }, ChangeColorPair { palette_index: 3, color: Color( SrgbaTuple( 0.79607844, 0.5647059, 0.0, 1.0, ), ), }, ChangeColorPair { palette_index: 4, color: Color( SrgbaTuple( 0.19607843, 0.36078432, 0.7529412, 1.0, ), ), }, ChangeColorPair { palette_index: 5, color: Color( SrgbaTuple( 0.47843137, 0.24313726, 0.6156863, 1.0, ), ), }, ChangeColorPair { palette_index: 6, color: Color( SrgbaTuple( 0.0, 0.5137255, 0.69803923, 1.0, ), ), }, ChangeColorPair { palette_index: 7, color: Color( SrgbaTuple( 0.96862745, 0.96862745, 0.96862745, 1.0, ), ), }, ChangeColorPair { palette_index: 8, color: Color( SrgbaTuple( 0.46666667, 0.46666667, 0.46666667, 1.0, ), ), }, ChangeColorPair { palette_index: 9, color: Color( SrgbaTuple( 0.9411765, 0.3137255, 0.3137255, 1.0, ), ), }, ChangeColorPair { palette_index: 10, color: Color( SrgbaTuple( 0.3764706, 0.79607844, 0.0, 1.0, ), ), }, ChangeColorPair { palette_index: 11, color: Color( SrgbaTuple( 1.0, 0.7372549, 0.3647059, 1.0, ), ), }, ChangeColorPair { palette_index: 12, color: Color( SrgbaTuple( 0.0, 0.47843137, 0.8, 1.0, ), ), }, ChangeColorPair { palette_index: 13, color: Color( SrgbaTuple( 0.9019608, 0.29803923, 0.9019608, 1.0, ), ), }, ChangeColorPair { palette_index: 14, color: Color( SrgbaTuple( 0.0, 0.6666667, 0.79607844, 1.0, ), ), }, ChangeColorPair { palette_index: 15, color: Color( SrgbaTuple( 0.96862745, 0.96862745, 0.96862745, 1.0, ), ), }, ], ), ), ] " ); } } termwiz-0.23.3/src/escape/parser/sixel.rs000064400000000000000000000234411046102023000164330ustar 00000000000000use crate::color::RgbColor; use crate::escape::{Sixel, SixelData}; const MAX_PARAMS: usize = 5; const MAX_SIXEL_SIZE: usize = 100_000_000; pub struct SixelBuilder { pub sixel: Sixel, params: [i64; MAX_PARAMS], param_no: usize, current_command: u8, } impl SixelBuilder { pub fn new(params: &[i64]) -> Self { let pan = match params.get(0).unwrap_or(&0) { 7 | 8 | 9 => 1, 0 | 1 | 5 | 6 => 2, 3 | 4 => 3, 2 => 5, _ => 2, }; let background_is_transparent = match params.get(1).unwrap_or(&0) { 1 => true, _ => false, }; let horizontal_grid_size = params.get(2).map(|&x| x); Self { sixel: Sixel { pan, pad: 1, pixel_width: None, pixel_height: None, background_is_transparent, horizontal_grid_size, data: vec![], }, param_no: 0, params: [-1; MAX_PARAMS], current_command: 0, } } pub fn push(&mut self, data: u8) { match data { b'$' => { self.finish_command(); self.sixel.data.push(SixelData::CarriageReturn); } b'-' => { self.finish_command(); self.sixel.data.push(SixelData::NewLine); } 0x3f..=0x7e if self.current_command == b'!' => { self.sixel.data.push(SixelData::Repeat { repeat_count: self.params[0] as u32, data: data - 0x3f, }); self.finish_command(); } 0x3f..=0x7e => { self.finish_command(); self.sixel.data.push(SixelData::Data(data - 0x3f)); } b'#' | b'!' | b'"' => { self.finish_command(); self.current_command = data; } b'0'..=b'9' if self.current_command != 0 => { let pos = self.param_no; if pos >= MAX_PARAMS { return; } if self.params[pos] == -1 { self.params[pos] = 0; } self.params[pos] = self.params[pos] .saturating_mul(10) .saturating_add((data - b'0') as i64); } b';' if self.current_command != 0 => { let pos = self.param_no; if pos >= MAX_PARAMS { return; } self.param_no += 1; } _ => { // Invalid; break out of current command self.finish_command(); } } } fn finish_command(&mut self) { match self.current_command { b'#' if self.param_no >= 4 => { // Define a color let color_number = self.params[0] as u16; let system = self.params[1] as u16; let a = self.params[2] as u16; let b = self.params[3] as u8; let c = self.params[4] as u8; if system == 1 { self.sixel.data.push(SixelData::DefineColorMapHSL { color_number, hue_angle: a, lightness: b, saturation: c, }); } else { let r = a as f32 * 255.0 / 100.; let g = b as f32 * 255.0 / 100.; let b = c as f32 * 255.0 / 100.; let rgb = RgbColor::new_8bpc(r as u8, g as u8, b as u8); // FIXME: from linear self.sixel .data .push(SixelData::DefineColorMapRGB { color_number, rgb }); } } b'#' => { // Use a color let color_number = self.params[0] as u16; self.sixel .data .push(SixelData::SelectColorMapEntry(color_number)); } b'"' => { // Set raster attributes let pan = if self.params[0] == -1 { 2 } else { self.params[0] }; let pad = if self.params[1] == -1 { 1 } else { self.params[1] }; let pixel_width = self.params[2]; let pixel_height = self.params[3]; self.sixel.pan = pan; self.sixel.pad = pad; if self.param_no >= 3 { self.sixel.pixel_width.replace(pixel_width as u32); self.sixel.pixel_height.replace(pixel_height as u32); let (size, overflow) = (pixel_width as usize).overflowing_mul(pixel_height as usize); // Ideally we'd just use `try_reserve` here, but that is // nightly Rust only at the time of writing this comment: // if size > MAX_SIXEL_SIZE || overflow { log::error!( "Ignoring sixel data {}x{} because {} bytes \ either overflows or exceeds the max allowed {}", pixel_width, pixel_height, size, MAX_SIXEL_SIZE ); self.sixel.pixel_width = None; self.sixel.pixel_height = None; self.sixel.data.clear(); return; } self.sixel.data.reserve(size); } } _ => {} } self.param_no = 0; self.params = [-1; MAX_PARAMS]; self.current_command = 0; } pub fn finish(&mut self) { self.finish_command(); } } #[cfg(test)] mod test { use super::*; use crate::escape::parser::Parser; use crate::escape::{Action, Esc, EscCode}; use k9::assert_equal as assert_eq; #[test] fn sixel() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1bP1;2;3;q@\x1b\\"); assert_eq!( vec![ Action::Sixel(Box::new(Sixel { pan: 2, pad: 1, pixel_width: None, pixel_height: None, background_is_transparent: false, horizontal_grid_size: Some(3), data: vec![SixelData::Data(1)] })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ], actions ); assert_eq!(format!("{}", actions[0]), "\x1bP0;0;3q@"); // This is the "HI" example from wikipedia let mut p = Parser::new(); let actions = p.parse_as_vec( b"\x1bPq\ #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0\ #1~~@@vv@@~~@@~~$\ #2??}}GG}}??}}??-\ #1!14@\ \x1b\\", ); assert_eq!( format!("{}", actions[0]), "\x1bP0;0q\ #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0\ #1~~@@vv@@~~@@~~$\ #2??}}GG}}??}}??-\ #1!14@" ); use SixelData::*; assert_eq!( vec![ Action::Sixel(Box::new(Sixel { pan: 2, pad: 1, pixel_width: None, pixel_height: None, background_is_transparent: false, horizontal_grid_size: None, data: vec![ DefineColorMapRGB { color_number: 0, rgb: RgbColor::new_8bpc(0, 0, 0) }, DefineColorMapRGB { color_number: 1, rgb: RgbColor::new_8bpc(255, 255, 0) }, DefineColorMapRGB { color_number: 2, rgb: RgbColor::new_8bpc(0, 255, 0) }, SelectColorMapEntry(1), Data(63), Data(63), Data(1), Data(1), Data(55), Data(55), Data(1), Data(1), Data(63), Data(63), Data(1), Data(1), Data(63), Data(63), CarriageReturn, SelectColorMapEntry(2), Data(0), Data(0), Data(62), Data(62), Data(8), Data(8), Data(62), Data(62), Data(0), Data(0), Data(62), Data(62), Data(0), Data(0), NewLine, SelectColorMapEntry(1), Repeat { repeat_count: 14, data: 1 } ] })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ], actions ); } } termwiz-0.23.3/src/hyperlink.rs000064400000000000000000000315051046102023000145600ustar 00000000000000//! Handling hyperlinks. //! This gist describes an escape sequence for explicitly managing hyperlinks: //! //! We use that as the foundation of our hyperlink support, and the game //! plan is to then implicitly enable the hyperlink attribute for a cell //! as we recognize linkable input text during print() processing. use crate::{ensure, format_err, Result}; use fancy_regex::{Captures, Regex}; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::collections::HashMap; use std::fmt::{Display, Error as FmtError, Formatter}; use std::hash::{Hash, Hasher}; use std::ops::Range; use std::sync::Arc; use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq, FromDynamic, ToDynamic)] pub struct Hyperlink { params: HashMap, uri: String, /// If the link was produced by an implicit or matching rule, /// this field will be set to true. implicit: bool, } impl Hyperlink { pub fn uri(&self) -> &str { &self.uri } pub fn compute_shape_hash(&self, hasher: &mut H) { self.uri.hash(hasher); for (k, v) in &self.params { k.hash(hasher); v.hash(hasher); } self.implicit.hash(hasher); } pub fn params(&self) -> &HashMap { &self.params } pub fn new>(uri: S) -> Self { Self { uri: uri.into(), params: HashMap::new(), implicit: false, } } #[inline] pub fn is_implicit(&self) -> bool { self.implicit } pub fn new_implicit>(uri: S) -> Self { Self { uri: uri.into(), params: HashMap::new(), implicit: true, } } pub fn new_with_id, S2: Into>(uri: S, id: S2) -> Self { let mut params = HashMap::new(); params.insert("id".into(), id.into()); Self { uri: uri.into(), params, implicit: false, } } pub fn new_with_params>(uri: S, params: HashMap) -> Self { Self { uri: uri.into(), params, implicit: false, } } pub fn parse(osc: &[&[u8]]) -> Result> { ensure!(osc.len() == 3, "wrong param count"); if osc[1].is_empty() && osc[2].is_empty() { // Clearing current hyperlink Ok(None) } else { let param_str = String::from_utf8(osc[1].to_vec())?; let uri = String::from_utf8(osc[2].to_vec())?; let mut params = HashMap::new(); if !param_str.is_empty() { for pair in param_str.split(':') { let mut iter = pair.splitn(2, '='); let key = iter.next().ok_or_else(|| format_err!("bad params"))?; let value = iter.next().ok_or_else(|| format_err!("bad params"))?; params.insert(key.to_owned(), value.to_owned()); } } Ok(Some(Hyperlink::new_with_params(uri, params))) } } } impl Display for Hyperlink { fn fmt(&self, f: &mut Formatter) -> std::result::Result<(), FmtError> { write!(f, "8;")?; for (idx, (k, v)) in self.params.iter().enumerate() { // TODO: protect against k, v containing : or = if idx > 0 { write!(f, ":")?; } write!(f, "{}={}", k, v)?; } // TODO: ensure that link.uri doesn't contain characters // outside the range 32-126. Need to pull in a URI/URL // crate to help with this. write!(f, ";{}", self.uri)?; Ok(()) } } /// In addition to handling explicit escape sequences to enable /// hyperlinks, we also support defining rules that match text /// from screen lines and generate implicit hyperlinks. This /// can be used both for making http URLs clickable and also to /// make other text clickable. For example, you might define /// a rule that makes bug or issue numbers expand to the corresponding /// URL to view the details for that issue. /// The Rule struct is configuration that is passed to the terminal /// and is evaluated when processing mouse hover events. #[cfg_attr(feature = "use_serde", derive(Deserialize, Serialize))] #[derive(Debug, Clone, FromDynamic, ToDynamic)] pub struct Rule { /// The compiled regex for the rule. This is used to match /// against a line of text from the screen (typically the line /// over which the mouse is hovering). #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_regex", serialize_with = "serialize_regex" ) )] #[dynamic(into = "RegexWrap", try_from = "RegexWrap")] pub regex: Regex, /// The format string that defines how to transform the matched /// text into a URL. For example, a format string of `$0` expands /// to the entire matched text, whereas `mailto:$0` expands to /// the matched text with a `mailto:` prefix. More formally, /// each instance of `$N` (where N is a number) in the `format` /// string is replaced by the capture number N from the regex. /// The replacements are carried out in reverse order, starting /// with the highest numbered capture first. This avoids issues /// with ambiguous replacement of `$11` vs `$1` in the case of /// more complex regexes. pub format: String, /// Which capture to highlight #[dynamic(default)] pub highlight: usize, } struct RegexWrap(Regex); impl FromDynamic for RegexWrap { fn from_dynamic( value: &Value, options: FromDynamicOptions, ) -> std::result::Result { let s = String::from_dynamic(value, options)?; Ok(RegexWrap(Regex::new(&s).map_err(|e| e.to_string())?)) } } impl From<&Regex> for RegexWrap { fn from(regex: &Regex) -> RegexWrap { RegexWrap(regex.clone()) } } impl Into for RegexWrap { fn into(self) -> Regex { self.0 } } impl ToDynamic for RegexWrap { fn to_dynamic(&self) -> Value { self.0.to_string().to_dynamic() } } #[cfg(feature = "use_serde")] fn deserialize_regex<'de, D>(deserializer: D) -> std::result::Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; Regex::new(&s).map_err(|e| serde::de::Error::custom(format!("{:?}", e))) } #[cfg(feature = "use_serde")] fn serialize_regex(regex: &Regex, serializer: S) -> std::result::Result where S: Serializer, { let s = regex.to_string(); s.serialize(serializer) } /// Holds a resolved rule match. #[derive(Debug, PartialEq)] pub struct RuleMatch { /// Holds the span (measured in bytes) of the matched text pub range: Range, /// Holds the created Hyperlink object that should be associated /// the cells that correspond to the span. pub link: Arc, } /// An internal intermediate match result #[derive(Debug)] struct Match<'t> { rule: &'t Rule, captures: Captures<'t>, } impl<'t> Match<'t> { /// Returns the length of the matched text in bytes (not cells!) fn len(&self) -> usize { let c0 = self.highlight().unwrap(); c0.end() - c0.start() } /// Returns the span of the matched text, measured in bytes (not cells!) fn range(&self) -> Range { let c0 = self.highlight().unwrap(); c0.start()..c0.end() } fn highlight(&self) -> Option { self.captures.get(self.rule.highlight) } /// Expand replacements in the format string to yield the URL /// The replacement is as described on Rule::format. fn expand(&self) -> String { let mut result = self.rule.format.clone(); // Start with the highest numbered capture and decrement. // This avoids ambiguity when replacing $11 vs $1. for n in (0..self.captures.len()).rev() { let search = format!("${}", n); if let Some(rep) = self.captures.get(n) { result = result.replace(&search, rep.as_str()); } else { result = result.replace(&search, ""); } } result } } pub const CLOSING_PARENTHESIS_HYPERLINK_PATTERN: &str = r"\b\w+://[^\s()]*\(\S*\)(?=\s|$|[^_/a-zA-Z0-9-])"; pub const GENERIC_HYPERLINK_PATTERN: &str = r"\b\w+://\S+[_/a-zA-Z0-9-]"; impl Rule { /// Construct a new rule. It may fail if the regex is invalid. pub fn new(regex: &str, format: &str) -> Result { Self::with_highlight(regex, format, 0) } pub fn with_highlight(regex: &str, format: &str, highlight: usize) -> Result { Ok(Self { regex: Regex::new(regex)?, format: format.to_owned(), highlight, }) } /// Given a line of text from the terminal screen, and a set of /// rules, return the set of RuleMatches. pub fn match_hyperlinks(line: &str, rules: &[Rule]) -> Vec { let mut matches = Vec::new(); for rule in rules.iter() { for capture_result in rule.regex.captures_iter(line) { if let Ok(captures) = capture_result { let m = Match { rule, captures }; if m.highlight().is_some() { matches.push(m); } } } } // Sort the matches by descending match length. // This is to avoid confusion if multiple rules match the // same sections of text. matches.sort_by(|a, b| b.len().cmp(&a.len())); matches .into_iter() .map(|m| { let url = m.expand(); let link = Arc::new(Hyperlink::new_implicit(url)); RuleMatch { link, range: m.range(), } }) .collect() } } #[cfg(test)] mod test { use super::*; #[test] fn parse_implicit() { let rules = vec![ Rule::new(r"\b\w+://(?:[\w.-]+)\.[a-z]{2,15}\S*\b", "$0").unwrap(), Rule::new(r"\b\w+@[\w-]+(\.[\w-]+)+\b", "mailto:$0").unwrap(), ]; assert_eq!( Rule::match_hyperlinks(" http://example.com", &rules), vec![RuleMatch { range: 2..20, link: Arc::new(Hyperlink::new_implicit("http://example.com")), }] ); assert_eq!( Rule::match_hyperlinks(" foo@example.com woot@example.com", &rules), vec![ // Longest match first RuleMatch { range: 18..34, link: Arc::new(Hyperlink::new_implicit("mailto:woot@example.com")), }, RuleMatch { range: 2..17, link: Arc::new(Hyperlink::new_implicit("mailto:foo@example.com")), }, ] ); } #[test] fn parse_with_parentheses() { fn assert_helper(test_uri: &str, expected_uri: &str, msg: &str) { let rules = vec![ Rule::new(CLOSING_PARENTHESIS_HYPERLINK_PATTERN, "$0").unwrap(), Rule::new(GENERIC_HYPERLINK_PATTERN, "$0").unwrap(), ]; assert_eq!( Rule::match_hyperlinks(test_uri, &rules)[0].link.uri, expected_uri, "{}", msg, ); } assert_helper( " http://example.com)", "http://example.com", "Unblanced terminating parenthesis should not be captured.", ); assert_helper( "http://example.com/(complete_parentheses)", "http://example.com/(complete_parentheses)", "Balanced terminating parenthesis should be captureed.", ); assert_helper( "http://example.com/(complete_parentheses)>", "http://example.com/(complete_parentheses)", "Non-URL characters after a balanced terminating parenthesis should be dropped.", ); assert_helper( "http://example.com/(complete_parentheses))", "http://example.com/(complete_parentheses))", "Non-terminating parentheses should not impact matching the entire URL - Terminated with )", ); assert_helper( "http://example.com/(complete_parentheses)-((-)-()-_-", "http://example.com/(complete_parentheses)-((-)-()-_-", "Non-terminating parentheses should not impact matching the entire URL - Terminated with a valid character", ); } } termwiz-0.23.3/src/image.rs000064400000000000000000000443461046102023000136440ustar 00000000000000//! Images. //! This module has some helpers for modeling terminal cells that are filled //! with image data. //! We're targeting the iTerm image protocol initially, with sixel as an obvious //! follow up. //! Kitty has an extensive and complex graphics protocol //! whose docs are here: //! //! Both iTerm2 and Sixel appear to have semantics that allow replacing the //! contents of a single chararcter cell with image data, whereas the kitty //! protocol appears to track the images out of band as attachments with //! z-order. use crate::error::InternalError; use ordered_float::NotNan; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::hash::{Hash, Hasher}; use std::sync::{Arc, Mutex, MutexGuard}; use std::time::Duration; use wezterm_blob_leases::{BlobLease, BlobManager}; #[cfg(feature = "use_serde")] fn deserialize_notnan<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let value = f32::deserialize(deserializer)?; NotNan::new(value).map_err(|e| serde::de::Error::custom(format!("{:?}", e))) } #[cfg(feature = "use_serde")] #[allow(clippy::trivially_copy_pass_by_ref)] fn serialize_notnan(value: &NotNan, serializer: S) -> Result where S: Serializer, { value.into_inner().serialize(serializer) } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct TextureCoordinate { #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_notnan", serialize_with = "serialize_notnan" ) )] pub x: NotNan, #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_notnan", serialize_with = "serialize_notnan" ) )] pub y: NotNan, } impl TextureCoordinate { pub fn new(x: NotNan, y: NotNan) -> Self { Self { x, y } } pub fn new_f32(x: f32, y: f32) -> Self { let x = NotNan::new(x).unwrap(); let y = NotNan::new(y).unwrap(); Self::new(x, y) } } /// Tracks data for displaying an image in the place of the normal cell /// character data. Since an Image can span multiple cells, we need to logically /// carve up the image and track each slice of it. Each cell needs to know /// its "texture coordinates" within that image so that we can render the /// right slice. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct ImageCell { /// Texture coordinate for the top left of this cell. /// (0,0) is the top left of the ImageData. (1, 1) is /// the bottom right. top_left: TextureCoordinate, /// Texture coordinates for the bottom right of this cell. bottom_right: TextureCoordinate, /// References the underlying image data data: Arc, z_index: i32, /// When rendering in the cell, use this offset from the top left /// of the cell padding_left: u16, padding_top: u16, padding_right: u16, padding_bottom: u16, image_id: Option, placement_id: Option, } impl ImageCell { pub fn new( top_left: TextureCoordinate, bottom_right: TextureCoordinate, data: Arc, ) -> Self { Self::with_z_index(top_left, bottom_right, data, 0, 0, 0, 0, 0, None, None) } pub fn compute_shape_hash(&self, hasher: &mut H) { self.top_left.hash(hasher); self.bottom_right.hash(hasher); self.data.hash.hash(hasher); self.z_index.hash(hasher); self.padding_left.hash(hasher); self.padding_top.hash(hasher); self.padding_right.hash(hasher); self.padding_bottom.hash(hasher); self.image_id.hash(hasher); self.placement_id.hash(hasher); } pub fn with_z_index( top_left: TextureCoordinate, bottom_right: TextureCoordinate, data: Arc, z_index: i32, padding_left: u16, padding_top: u16, padding_right: u16, padding_bottom: u16, image_id: Option, placement_id: Option, ) -> Self { Self { top_left, bottom_right, data, z_index, padding_left, padding_top, padding_right, padding_bottom, image_id, placement_id, } } pub fn matches_placement(&self, image_id: u32, placement_id: Option) -> bool { self.image_id == Some(image_id) && self.placement_id == placement_id } pub fn has_placement_id(&self) -> bool { self.placement_id.is_some() } pub fn image_id(&self) -> Option { self.image_id } pub fn placement_id(&self) -> Option { self.placement_id } pub fn top_left(&self) -> TextureCoordinate { self.top_left } pub fn bottom_right(&self) -> TextureCoordinate { self.bottom_right } pub fn image_data(&self) -> &Arc { &self.data } /// negative z_index is rendered beneath the text layer. /// >= 0 is rendered above the text. /// negative z_index < INT32_MIN/2 will be drawn under cells /// with non-default background colors pub fn z_index(&self) -> i32 { self.z_index } /// Returns padding (left, top, right, bottom) pub fn padding(&self) -> (u16, u16, u16, u16) { ( self.padding_left, self.padding_top, self.padding_right, self.padding_bottom, ) } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Clone, PartialEq, Eq)] pub enum ImageDataType { /// Data is in the native image file format /// (best for file formats that have animated content) EncodedFile(Vec), /// Data is in the native image file format, /// (best for file formats that have animated content) /// and is stored as a blob via the blob manager. EncodedLease( #[cfg_attr( feature = "use_serde", serde(with = "wezterm_blob_leases::lease_bytes") )] BlobLease, ), /// Data is RGBA u8 data Rgba8 { data: Vec, width: u32, height: u32, hash: [u8; 32], }, /// Data is an animated sequence AnimRgba8 { width: u32, height: u32, durations: Vec, frames: Vec>, hashes: Vec<[u8; 32]>, }, } impl std::fmt::Debug for ImageDataType { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { match self { Self::EncodedFile(data) => fmt .debug_struct("EncodedFile") .field("data_of_len", &data.len()) .finish(), Self::EncodedLease(lease) => lease.fmt(fmt), Self::Rgba8 { data, width, height, hash, } => fmt .debug_struct("Rgba8") .field("data_of_len", &data.len()) .field("width", &width) .field("height", &height) .field("hash", &hash) .finish(), Self::AnimRgba8 { frames, width, height, durations, hashes, } => fmt .debug_struct("AnimRgba8") .field("frames_of_len", &frames.len()) .field("width", &width) .field("height", &height) .field("durations", durations) .field("hashes", hashes) .finish(), } } } impl ImageDataType { pub fn new_single_frame(width: u32, height: u32, data: Vec) -> Self { let hash = Self::hash_bytes(&data); assert_eq!( width * height * 4, data.len() as u32, "invalid dimensions {}x{} for pixel data of length {}", width, height, data.len() ); Self::Rgba8 { width, height, data, hash, } } /// Black pixels pub fn placeholder() -> Self { let mut data = vec![]; let size = 8; for _ in 0..size * size { data.extend_from_slice(&[0, 0, 0, 0xff]); } ImageDataType::new_single_frame(size, size, data) } pub fn hash_bytes(bytes: &[u8]) -> [u8; 32] { use sha2::Digest; let mut hasher = sha2::Sha256::new(); hasher.update(bytes); hasher.finalize().into() } pub fn compute_hash(&self) -> [u8; 32] { use sha2::Digest; let mut hasher = sha2::Sha256::new(); match self { ImageDataType::EncodedFile(data) => hasher.update(data), ImageDataType::EncodedLease(lease) => return lease.content_id().as_hash_bytes(), ImageDataType::Rgba8 { data, .. } => hasher.update(data), ImageDataType::AnimRgba8 { frames, durations, .. } => { for data in frames { hasher.update(data); } for d in durations { let d = d.as_secs_f32(); let b = d.to_ne_bytes(); hasher.update(b); } } }; hasher.finalize().into() } /// Divides the animation frame durations by the provided /// speed_factor, so a factor of 2 will halve the duration. /// # Panics /// if the speed_factor is negative, non-finite or the result /// overflows the allow Duration range. pub fn adjust_speed(&mut self, speed_factor: f32) { match self { Self::AnimRgba8 { durations, .. } => { for d in durations { *d = d.mul_f32(1. / speed_factor); } } _ => {} } } #[cfg(feature = "use_image")] pub fn dimensions(&self) -> Result<(u32, u32), InternalError> { fn dimensions_for_data(data: &[u8]) -> image::ImageResult<(u32, u32)> { let reader = image::ImageReader::new(std::io::Cursor::new(data)).with_guessed_format()?; let (width, height) = reader.into_dimensions()?; Ok((width, height)) } match self { ImageDataType::EncodedFile(data) => Ok(dimensions_for_data(data)?), ImageDataType::EncodedLease(lease) => Ok(dimensions_for_data(&lease.get_data()?)?), ImageDataType::AnimRgba8 { width, height, .. } | ImageDataType::Rgba8 { width, height, .. } => Ok((*width, *height)), } } /// Migrate an in-memory encoded image blob to on-disk to reduce /// the memory footprint pub fn swap_out(self) -> Result { match self { Self::EncodedFile(data) => match BlobManager::store(&data) { Ok(lease) => Ok(Self::EncodedLease(lease)), Err(wezterm_blob_leases::Error::StorageNotInit) => Ok(Self::EncodedFile(data)), Err(err) => Err(err.into()), }, other => Ok(other), } } /// Decode an encoded file into either an Rgba8 or AnimRgba8 variant /// if we recognize the file format, otherwise the EncodedFile data /// is preserved as is. #[cfg(feature = "use_image")] pub fn decode(self) -> Self { use image::{AnimationDecoder, ImageFormat}; match self { Self::EncodedFile(data) => { let format = match image::guess_format(&data) { Ok(format) => format, Err(err) => { log::warn!("Unable to decode raw image data: {:#}", err); return Self::EncodedFile(data); } }; let cursor = std::io::Cursor::new(&*data); match format { ImageFormat::Gif => image::codecs::gif::GifDecoder::new(cursor) .and_then(|decoder| decoder.into_frames().collect_frames()) .and_then(|frames| { if frames.is_empty() { log::error!("decoded image has 0 frames, using placeholder"); Ok(Self::placeholder()) } else { Ok(Self::decode_frames(frames)) } }) .unwrap_or_else(|err| { log::error!( "Unable to parse animated gif: {:#}, trying as single frame", err ); Self::decode_single(data) }), ImageFormat::Png => { let decoder = match image::codecs::png::PngDecoder::new(cursor) { Ok(d) => d, _ => return Self::EncodedFile(data), }; if decoder.is_apng().unwrap_or(false) { match decoder .apng() .and_then(|d| d.into_frames().collect_frames()) { Ok(frames) if frames.is_empty() => { log::error!("decoded image has 0 frames, using placeholder"); Self::placeholder() } Ok(frames) => Self::decode_frames(frames), _ => Self::EncodedFile(data), } } else { Self::decode_single(data) } } ImageFormat::WebP => { let decoder = match image::codecs::webp::WebPDecoder::new(cursor) { Ok(d) => d, _ => return Self::EncodedFile(data), }; match decoder.into_frames().collect_frames() { Ok(frames) if frames.is_empty() => { log::error!("decoded image has 0 frames, using placeholder"); Self::placeholder() } Ok(frames) => Self::decode_frames(frames), _ => Self::EncodedFile(data), } } _ => Self::decode_single(data), } } data => data, } } #[cfg(not(feature = "use_image"))] pub fn decode(self) -> Self { self } #[cfg(feature = "use_image")] fn decode_frames(img_frames: Vec) -> Self { let mut width = 0; let mut height = 0; let mut frames = vec![]; let mut durations = vec![]; let mut hashes = vec![]; for frame in img_frames.into_iter() { let duration: Duration = frame.delay().into(); durations.push(duration); let image = image::DynamicImage::ImageRgba8(frame.into_buffer()).to_rgba8(); let (w, h) = image.dimensions(); width = w; height = h; let data = image.into_vec(); hashes.push(Self::hash_bytes(&data)); frames.push(data); } Self::AnimRgba8 { width, height, frames, durations, hashes, } } #[cfg(feature = "use_image")] fn decode_single(data: Vec) -> Self { match image::load_from_memory(&data) { Ok(image) => { let image = image.to_rgba8(); let (width, height) = image.dimensions(); let data = image.into_vec(); let hash = Self::hash_bytes(&data); Self::Rgba8 { width, height, data, hash, } } _ => Self::EncodedFile(data), } } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] pub struct ImageData { data: Mutex, hash: [u8; 32], } struct HexSlice<'a>(&'a [u8]); impl<'a> std::fmt::Display for HexSlice<'a> { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { for byte in self.0 { write!(fmt, "{byte:x}")?; } Ok(()) } } impl std::fmt::Debug for ImageData { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { fmt.debug_struct("ImageData") .field("data", &self.data) .field("hash", &format_args!("{}", HexSlice(&self.hash))) .finish() } } impl Eq for ImageData {} impl PartialEq for ImageData { fn eq(&self, rhs: &Self) -> bool { self.hash == rhs.hash } } impl ImageData { /// Create a new ImageData struct with the provided raw data. pub fn with_raw_data(data: Vec) -> Self { let hash = ImageDataType::hash_bytes(&data); Self::with_data_and_hash(ImageDataType::EncodedFile(data).decode(), hash) } fn with_data_and_hash(data: ImageDataType, hash: [u8; 32]) -> Self { Self { data: Mutex::new(data), hash, } } pub fn with_data(data: ImageDataType) -> Self { let hash = data.compute_hash(); Self { data: Mutex::new(data), hash, } } /// Returns the in-memory footprint pub fn len(&self) -> usize { match &*self.data() { ImageDataType::EncodedFile(d) => d.len(), ImageDataType::EncodedLease(_) => 0, ImageDataType::Rgba8 { data, .. } => data.len(), ImageDataType::AnimRgba8 { frames, .. } => frames.len() * frames[0].len(), } } pub fn data(&self) -> MutexGuard { self.data.lock().unwrap() } pub fn hash(&self) -> [u8; 32] { self.hash } } termwiz-0.23.3/src/input.rs000064400000000000000000002061111046102023000137070ustar 00000000000000//! This module provides an InputParser struct to help with parsing //! input received from a terminal. use crate::bail; use crate::error::Result; use crate::escape::csi::{KittyKeyboardFlags, MouseReport}; use crate::escape::parser::Parser; use crate::escape::{Action, CSI}; use crate::keymap::{Found, KeyMap}; use crate::readbuf::ReadBuffer; use bitflags::bitflags; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::fmt::Write; use wezterm_input_types::ctrl_mapping; pub use wezterm_input_types::Modifiers; pub const CSI: &str = "\x1b["; pub const SS3: &str = "\x1bO"; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum KeyboardEncoding { Xterm, /// CsiU, /// Win32, /// Kitty(KittyKeyboardFlags), } /// Specifies terminal modes/configuration that can influence how a KeyCode /// is encoded when being sent to and application via the pty. #[derive(Debug, Clone, Copy)] pub struct KeyCodeEncodeModes { pub encoding: KeyboardEncoding, pub application_cursor_keys: bool, pub newline_mode: bool, pub modify_other_keys: Option, } #[cfg(windows)] use winapi::um::wincon::{ INPUT_RECORD, KEY_EVENT, KEY_EVENT_RECORD, MOUSE_EVENT, MOUSE_EVENT_RECORD, WINDOW_BUFFER_SIZE_EVENT, WINDOW_BUFFER_SIZE_RECORD, }; bitflags! { #[cfg_attr(feature="use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Default, Clone, PartialEq, Eq)] pub struct MouseButtons: u8 { const NONE = 0; const LEFT = 1<<1; const RIGHT = 1<<2; const MIDDLE = 1<<3; const VERT_WHEEL = 1<<4; const HORZ_WHEEL = 1<<5; /// if set then the wheel movement was in the positive /// direction, else the negative direction const WHEEL_POSITIVE = 1<<6; } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum InputEvent { Key(KeyEvent), Mouse(MouseEvent), PixelMouse(PixelMouseEvent), /// Detected that the user has resized the terminal Resized { cols: usize, rows: usize, }, /// For terminals that support Bracketed Paste mode, /// pastes are collected and reported as this variant. Paste(String), /// The program has woken the input thread. Wake, } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct MouseEvent { pub x: u16, pub y: u16, pub mouse_buttons: MouseButtons, pub modifiers: Modifiers, } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct PixelMouseEvent { pub x_pixels: u16, pub y_pixels: u16, pub mouse_buttons: MouseButtons, pub modifiers: Modifiers, } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct KeyEvent { /// Which key was pressed pub key: KeyCode, /// Which modifiers are down pub modifiers: Modifiers, } /// Which key is pressed. Not all of these are probable to appear /// on most systems. A lot of this list is @wez trawling docs and /// making an entry for things that might be possible in this first pass. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum KeyCode { /// The decoded unicode character Char(char), Hyper, Super, Meta, /// Ctrl-break on windows Cancel, Backspace, Tab, Clear, Enter, Shift, Escape, LeftShift, RightShift, Control, LeftControl, RightControl, Alt, LeftAlt, RightAlt, Menu, LeftMenu, RightMenu, Pause, CapsLock, PageUp, PageDown, End, Home, LeftArrow, RightArrow, UpArrow, DownArrow, Select, Print, Execute, PrintScreen, Insert, Delete, Help, LeftWindows, RightWindows, Applications, Sleep, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, Multiply, Add, Separator, Subtract, Decimal, Divide, /// F1-F24 are possible Function(u8), NumLock, ScrollLock, Copy, Cut, Paste, BrowserBack, BrowserForward, BrowserRefresh, BrowserStop, BrowserSearch, BrowserFavorites, BrowserHome, VolumeMute, VolumeDown, VolumeUp, MediaNextTrack, MediaPrevTrack, MediaStop, MediaPlayPause, ApplicationLeftArrow, ApplicationRightArrow, ApplicationUpArrow, ApplicationDownArrow, KeyPadHome, KeyPadEnd, KeyPadPageUp, KeyPadPageDown, KeyPadBegin, #[doc(hidden)] InternalPasteStart, #[doc(hidden)] InternalPasteEnd, } impl KeyCode { /// if SHIFT is held and we have KeyCode::Char('c') we want to normalize /// that keycode to KeyCode::Char('C'); that is what this function does. /// In theory we should give the same treatment to keys like `[` -> `{` /// but that assumes something about the keyboard layout and is probably /// better done in the gui frontend rather than this layer. /// In fact, this function might be better off if it lived elsewhere. pub fn normalize_shift_to_upper_case(self, modifiers: Modifiers) -> KeyCode { if modifiers.contains(Modifiers::SHIFT) { match self { KeyCode::Char(c) if c.is_ascii_lowercase() => KeyCode::Char(c.to_ascii_uppercase()), _ => self, } } else { self } } /// Return true if the key represents a modifier key. pub fn is_modifier(self) -> bool { matches!( self, Self::Hyper | Self::Super | Self::Meta | Self::Shift | Self::LeftShift | Self::RightShift | Self::Control | Self::LeftControl | Self::RightControl | Self::Alt | Self::LeftAlt | Self::RightAlt | Self::LeftWindows | Self::RightWindows ) } /// Returns the byte sequence that represents this KeyCode and Modifier combination, pub fn encode( &self, mods: Modifiers, modes: KeyCodeEncodeModes, is_down: bool, ) -> Result { if !is_down { // We only want down events return Ok(String::new()); } // We are encoding the key as an xterm-compatible sequence, which does not support // positional modifiers. let mods = mods.remove_positional_mods(); use KeyCode::*; let key = self.normalize_shift_to_upper_case(mods); // Normalize the modifier state for Char's that are uppercase; remove // the SHIFT modifier so that reduce ambiguity below let mods = match key { Char(c) if (c.is_ascii_punctuation() || c.is_ascii_uppercase()) && mods.contains(Modifiers::SHIFT) => { mods & !Modifiers::SHIFT } _ => mods, }; // Normalize Backspace and Delete let key = match key { Char('\x7f') => Delete, Char('\x08') => Backspace, c => c, }; let mut buf = String::new(); // TODO: also respect self.application_keypad match key { Char(c) if is_ambiguous_ascii_ctrl(c) && mods.contains(Modifiers::CTRL) && modes.encoding == KeyboardEncoding::CsiU => { csi_u_encode(&mut buf, c, mods, &modes)?; } Char(c) if c.is_ascii_uppercase() && mods.contains(Modifiers::CTRL) => { csi_u_encode(&mut buf, c, mods, &modes)?; } Char(c) if mods.contains(Modifiers::CTRL) && modes.modify_other_keys == Some(2) => { csi_u_encode(&mut buf, c, mods, &modes)?; } Char(c) if mods.contains(Modifiers::CTRL) && ctrl_mapping(c).is_some() => { let c = ctrl_mapping(c).unwrap(); if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } buf.push(c); } // When alt is pressed, send escape first to indicate to the peer that // ALT is pressed. We do this only for ascii alnum characters because // eg: on macOS generates altgr style glyphs and keeps the ALT key // in the modifier set. This confuses eg: zsh which then just displays // as the input, so we want to avoid that. Char(c) if (c.is_ascii_alphanumeric() || c.is_ascii_punctuation()) && mods.contains(Modifiers::ALT) => { buf.push(0x1b as char); buf.push(c); } Backspace => { // Backspace sends the default VERASE which is confusingly // the DEL ascii codepoint rather than BS. // We only send BS when CTRL is held. if mods.contains(Modifiers::CTRL) { csi_u_encode(&mut buf, '\x08', mods, &modes)?; } else if mods.contains(Modifiers::SHIFT) { csi_u_encode(&mut buf, '\x7f', mods, &modes)?; } else { if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } buf.push('\x7f'); } } Enter | Escape => { let c = match key { Enter => '\r', Escape => '\x1b', _ => unreachable!(), }; if mods.contains(Modifiers::SHIFT) || mods.contains(Modifiers::CTRL) { csi_u_encode(&mut buf, c, mods, &modes)?; } else { if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } buf.push(c); if modes.newline_mode && key == Enter { buf.push(0x0a as char); } } } Tab if !mods.is_empty() && modes.modify_other_keys.is_some() => { csi_u_encode(&mut buf, '\t', mods, &modes)?; } Tab => { if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } let mods = mods & !Modifiers::ALT; if mods == Modifiers::CTRL { buf.push_str("\x1b[9;5u"); } else if mods == Modifiers::CTRL | Modifiers::SHIFT { buf.push_str("\x1b[1;5Z"); } else if mods == Modifiers::SHIFT { buf.push_str("\x1b[Z"); } else { buf.push('\t'); } } Char(c) => { if mods.is_empty() { buf.push(c); } else { csi_u_encode(&mut buf, c, mods, &modes)?; } } Home | KeyPadHome | End | KeyPadEnd | UpArrow | DownArrow | RightArrow | LeftArrow | ApplicationUpArrow | ApplicationDownArrow | ApplicationRightArrow | ApplicationLeftArrow => { let (force_app, c) = match key { UpArrow => (false, 'A'), DownArrow => (false, 'B'), RightArrow => (false, 'C'), LeftArrow => (false, 'D'), KeyPadHome | Home => (false, 'H'), End | KeyPadEnd => (false, 'F'), ApplicationUpArrow => (true, 'A'), ApplicationDownArrow => (true, 'B'), ApplicationRightArrow => (true, 'C'), ApplicationLeftArrow => (true, 'D'), _ => unreachable!(), }; let csi_or_ss3 = if force_app || ( modes.application_cursor_keys // Strict reading of DECCKM suggests that application_cursor_keys // only applies when DECANM and DECKPAM are active, but that seems // to break unmodified cursor keys in vim /* && self.dec_ansi_mode && self.application_keypad */ ) { // Use SS3 in application mode SS3 } else { // otherwise use regular CSI CSI }; if mods.contains(Modifiers::ALT) || mods.contains(Modifiers::SHIFT) || mods.contains(Modifiers::CTRL) { write!(buf, "{}1;{}{}", CSI, 1 + mods.encode_xterm(), c)?; } else { write!(buf, "{}{}", csi_or_ss3, c)?; } } PageUp | PageDown | KeyPadPageUp | KeyPadPageDown | Insert | Delete => { let c = match key { Insert => 2, Delete => 3, KeyPadPageUp | PageUp => 5, KeyPadPageDown | PageDown => 6, _ => unreachable!(), }; if mods.contains(Modifiers::ALT) || mods.contains(Modifiers::SHIFT) || mods.contains(Modifiers::CTRL) { write!(buf, "\x1b[{};{}~", c, 1 + mods.encode_xterm())?; } else { write!(buf, "\x1b[{}~", c)?; } } Function(n) => { if mods.is_empty() && n < 5 { // F1-F4 are encoded using SS3 if there are no modifiers write!( buf, "{}", match n { 1 => "\x1bOP", 2 => "\x1bOQ", 3 => "\x1bOR", 4 => "\x1bOS", _ => unreachable!("wat?"), } )?; } else if n < 5 { // Special case for F1-F4 with modifiers let code = match n { 1 => 'P', 2 => 'Q', 3 => 'R', 4 => 'S', _ => unreachable!("wat?"), }; write!(buf, "\x1b[1;{}{code}", 1 + mods.encode_xterm())?; } else { // Higher numbered F-keys using CSI instead of SS3. let intro = match n { 1 => "\x1b[11", 2 => "\x1b[12", 3 => "\x1b[13", 4 => "\x1b[14", 5 => "\x1b[15", 6 => "\x1b[17", 7 => "\x1b[18", 8 => "\x1b[19", 9 => "\x1b[20", 10 => "\x1b[21", 11 => "\x1b[23", 12 => "\x1b[24", 13 => "\x1b[25", 14 => "\x1b[26", 15 => "\x1b[28", 16 => "\x1b[29", 17 => "\x1b[31", 18 => "\x1b[32", 19 => "\x1b[33", 20 => "\x1b[34", 21 => "\x1b[42", 22 => "\x1b[43", 23 => "\x1b[44", 24 => "\x1b[45", _ => bail!("unhandled fkey number {}", n), }; let encoded_mods = mods.encode_xterm(); if encoded_mods == 0 { // If no modifiers are held, don't send the modifier // sequence, as the modifier encoding is a CSI-u extension. write!(buf, "{}~", intro)?; } else { write!(buf, "{};{}~", intro, 1 + encoded_mods)?; } } } Numpad0 | Numpad3 | Numpad9 | Decimal => { let intro = match key { Numpad0 => "\x1b[2", Numpad3 => "\x1b[6", Numpad9 => "\x1b[6", Decimal => "\x1b[3", _ => unreachable!(), }; let encoded_mods = mods.encode_xterm(); if encoded_mods == 0 { // If no modifiers are held, don't send the modifier // sequence, as the modifier encoding is a CSI-u extension. write!(buf, "{}~", intro)?; } else { write!(buf, "{};{}~", intro, 1 + encoded_mods)?; } } Numpad1 | Numpad2 | Numpad4 | Numpad5 | KeyPadBegin | Numpad6 | Numpad7 | Numpad8 => { let c = match key { Numpad1 => "F", Numpad2 => "B", Numpad4 => "D", KeyPadBegin | Numpad5 => "E", Numpad6 => "C", Numpad7 => "H", Numpad8 => "A", _ => unreachable!(), }; let encoded_mods = mods.encode_xterm(); if encoded_mods == 0 { // If no modifiers are held, don't send the modifier write!(buf, "{}{}", CSI, c)?; } else { write!(buf, "{}1;{}{}", CSI, 1 + encoded_mods, c)?; } } Multiply | Add | Separator | Subtract | Divide => {} // Modifier keys pressed on their own don't expand to anything Control | LeftControl | RightControl | Alt | LeftAlt | RightAlt | Menu | LeftMenu | RightMenu | Super | Hyper | Shift | LeftShift | RightShift | Meta | LeftWindows | RightWindows | NumLock | ScrollLock | Cancel | Clear | Pause | CapsLock | Select | Print | PrintScreen | Execute | Help | Applications | Sleep | Copy | Cut | Paste | BrowserBack | BrowserForward | BrowserRefresh | BrowserStop | BrowserSearch | BrowserFavorites | BrowserHome | VolumeMute | VolumeDown | VolumeUp | MediaNextTrack | MediaPrevTrack | MediaStop | MediaPlayPause | InternalPasteStart | InternalPasteEnd => {} }; Ok(buf) } } /// characters that when masked for CTRL could be an ascii control character /// or could be a key that a user legitimately wants to process in their /// terminal application fn is_ambiguous_ascii_ctrl(c: char) -> bool { match c { 'i' | 'I' | 'm' | 'M' | '[' | '{' | '@' => true, _ => false, } } fn is_ascii(c: char) -> bool { (c as u32) < 0x80 } fn csi_u_encode( buf: &mut String, c: char, mods: Modifiers, modes: &KeyCodeEncodeModes, ) -> Result<()> { if modes.encoding == KeyboardEncoding::CsiU && is_ascii(c) { write!(buf, "\x1b[{};{}u", c as u32, 1 + mods.encode_xterm())?; return Ok(()); } // match (c, modes.modify_other_keys) { ('c' | 'd' | '\x1b' | '\x7f' | '\x08', Some(1)) => { // Exclude well-known keys from modifyOtherKeys mode 1 } (c, Some(_)) => { write!(buf, "\x1b[27;{};{}~", 1 + mods.encode_xterm(), c as u32)?; return Ok(()); } _ => {} } let c = if mods.contains(Modifiers::CTRL) && ctrl_mapping(c).is_some() { ctrl_mapping(c).unwrap() } else { c }; if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } write!(buf, "{}", c)?; Ok(()) } #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum InputState { Normal, EscapeMaybeAlt, Pasting(usize), } #[derive(Debug)] pub struct InputParser { key_map: KeyMap, buf: ReadBuffer, state: InputState, } #[cfg(windows)] mod windows { use super::*; use std; use winapi::um::winuser; fn modifiers_from_ctrl_key_state(state: u32) -> Modifiers { use winapi::um::wincon::*; let mut mods = Modifiers::NONE; if (state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) != 0 { mods |= Modifiers::ALT; } if (state & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0 { mods |= Modifiers::CTRL; } if (state & SHIFT_PRESSED) != 0 { mods |= Modifiers::SHIFT; } // TODO: we could report caps lock, numlock and scrolllock mods } impl InputParser { fn decode_key_record( &mut self, event: &KEY_EVENT_RECORD, callback: &mut F, ) { // TODO: do we want downs instead of ups? if event.bKeyDown == 0 { return; } let key_code = match std::char::from_u32(*unsafe { event.uChar.UnicodeChar() } as u32) { Some(unicode) if unicode > '\x00' => { let mut buf = [0u8; 4]; self.buf .extend_with(unicode.encode_utf8(&mut buf).as_bytes()); self.process_bytes(callback, true); return; } _ => match event.wVirtualKeyCode as i32 { winuser::VK_CANCEL => KeyCode::Cancel, winuser::VK_BACK => KeyCode::Backspace, winuser::VK_TAB => KeyCode::Tab, winuser::VK_CLEAR => KeyCode::Clear, winuser::VK_RETURN => KeyCode::Enter, winuser::VK_SHIFT => KeyCode::Shift, winuser::VK_CONTROL => KeyCode::Control, winuser::VK_MENU => KeyCode::Menu, winuser::VK_PAUSE => KeyCode::Pause, winuser::VK_CAPITAL => KeyCode::CapsLock, winuser::VK_ESCAPE => KeyCode::Escape, winuser::VK_PRIOR => KeyCode::PageUp, winuser::VK_NEXT => KeyCode::PageDown, winuser::VK_END => KeyCode::End, winuser::VK_HOME => KeyCode::Home, winuser::VK_LEFT => KeyCode::LeftArrow, winuser::VK_RIGHT => KeyCode::RightArrow, winuser::VK_UP => KeyCode::UpArrow, winuser::VK_DOWN => KeyCode::DownArrow, winuser::VK_SELECT => KeyCode::Select, winuser::VK_PRINT => KeyCode::Print, winuser::VK_EXECUTE => KeyCode::Execute, winuser::VK_SNAPSHOT => KeyCode::PrintScreen, winuser::VK_INSERT => KeyCode::Insert, winuser::VK_DELETE => KeyCode::Delete, winuser::VK_HELP => KeyCode::Help, winuser::VK_LWIN => KeyCode::LeftWindows, winuser::VK_RWIN => KeyCode::RightWindows, winuser::VK_APPS => KeyCode::Applications, winuser::VK_SLEEP => KeyCode::Sleep, winuser::VK_NUMPAD0 => KeyCode::Numpad0, winuser::VK_NUMPAD1 => KeyCode::Numpad1, winuser::VK_NUMPAD2 => KeyCode::Numpad2, winuser::VK_NUMPAD3 => KeyCode::Numpad3, winuser::VK_NUMPAD4 => KeyCode::Numpad4, winuser::VK_NUMPAD5 => KeyCode::Numpad5, winuser::VK_NUMPAD6 => KeyCode::Numpad6, winuser::VK_NUMPAD7 => KeyCode::Numpad7, winuser::VK_NUMPAD8 => KeyCode::Numpad8, winuser::VK_NUMPAD9 => KeyCode::Numpad9, winuser::VK_MULTIPLY => KeyCode::Multiply, winuser::VK_ADD => KeyCode::Add, winuser::VK_SEPARATOR => KeyCode::Separator, winuser::VK_SUBTRACT => KeyCode::Subtract, winuser::VK_DECIMAL => KeyCode::Decimal, winuser::VK_DIVIDE => KeyCode::Divide, winuser::VK_F1 => KeyCode::Function(1), winuser::VK_F2 => KeyCode::Function(2), winuser::VK_F3 => KeyCode::Function(3), winuser::VK_F4 => KeyCode::Function(4), winuser::VK_F5 => KeyCode::Function(5), winuser::VK_F6 => KeyCode::Function(6), winuser::VK_F7 => KeyCode::Function(7), winuser::VK_F8 => KeyCode::Function(8), winuser::VK_F9 => KeyCode::Function(9), winuser::VK_F10 => KeyCode::Function(10), winuser::VK_F11 => KeyCode::Function(11), winuser::VK_F12 => KeyCode::Function(12), winuser::VK_F13 => KeyCode::Function(13), winuser::VK_F14 => KeyCode::Function(14), winuser::VK_F15 => KeyCode::Function(15), winuser::VK_F16 => KeyCode::Function(16), winuser::VK_F17 => KeyCode::Function(17), winuser::VK_F18 => KeyCode::Function(18), winuser::VK_F19 => KeyCode::Function(19), winuser::VK_F20 => KeyCode::Function(20), winuser::VK_F21 => KeyCode::Function(21), winuser::VK_F22 => KeyCode::Function(22), winuser::VK_F23 => KeyCode::Function(23), winuser::VK_F24 => KeyCode::Function(24), winuser::VK_NUMLOCK => KeyCode::NumLock, winuser::VK_SCROLL => KeyCode::ScrollLock, winuser::VK_LSHIFT => KeyCode::LeftShift, winuser::VK_RSHIFT => KeyCode::RightShift, winuser::VK_LCONTROL => KeyCode::LeftControl, winuser::VK_RCONTROL => KeyCode::RightControl, winuser::VK_LMENU => KeyCode::LeftMenu, winuser::VK_RMENU => KeyCode::RightMenu, winuser::VK_BROWSER_BACK => KeyCode::BrowserBack, winuser::VK_BROWSER_FORWARD => KeyCode::BrowserForward, winuser::VK_BROWSER_REFRESH => KeyCode::BrowserRefresh, winuser::VK_BROWSER_STOP => KeyCode::BrowserStop, winuser::VK_BROWSER_SEARCH => KeyCode::BrowserSearch, winuser::VK_BROWSER_FAVORITES => KeyCode::BrowserFavorites, winuser::VK_BROWSER_HOME => KeyCode::BrowserHome, winuser::VK_VOLUME_MUTE => KeyCode::VolumeMute, winuser::VK_VOLUME_DOWN => KeyCode::VolumeDown, winuser::VK_VOLUME_UP => KeyCode::VolumeUp, winuser::VK_MEDIA_NEXT_TRACK => KeyCode::MediaNextTrack, winuser::VK_MEDIA_PREV_TRACK => KeyCode::MediaPrevTrack, winuser::VK_MEDIA_STOP => KeyCode::MediaStop, winuser::VK_MEDIA_PLAY_PAUSE => KeyCode::MediaPlayPause, _ => return, }, }; let mut modifiers = modifiers_from_ctrl_key_state(event.dwControlKeyState); let key_code = key_code.normalize_shift_to_upper_case(modifiers); if let KeyCode::Char(c) = key_code { if c.is_ascii_uppercase() { modifiers.remove(Modifiers::SHIFT); } } let input_event = InputEvent::Key(KeyEvent { key: key_code, modifiers, }); for _ in 0..event.wRepeatCount { callback(input_event.clone()); } } fn decode_mouse_record( &self, event: &MOUSE_EVENT_RECORD, callback: &mut F, ) { use winapi::um::wincon::*; let mut buttons = MouseButtons::NONE; if (event.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) != 0 { buttons |= MouseButtons::LEFT; } if (event.dwButtonState & RIGHTMOST_BUTTON_PRESSED) != 0 { buttons |= MouseButtons::RIGHT; } if (event.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) != 0 { buttons |= MouseButtons::MIDDLE; } let modifiers = modifiers_from_ctrl_key_state(event.dwControlKeyState); if (event.dwEventFlags & MOUSE_WHEELED) != 0 { buttons |= MouseButtons::VERT_WHEEL; if (event.dwButtonState >> 8) != 0 { buttons |= MouseButtons::WHEEL_POSITIVE; } } else if (event.dwEventFlags & MOUSE_HWHEELED) != 0 { buttons |= MouseButtons::HORZ_WHEEL; if (event.dwButtonState >> 8) != 0 { buttons |= MouseButtons::WHEEL_POSITIVE; } } let mouse = InputEvent::Mouse(MouseEvent { x: event.dwMousePosition.X as u16, y: event.dwMousePosition.Y as u16, mouse_buttons: buttons, modifiers, }); if (event.dwEventFlags & DOUBLE_CLICK) != 0 { callback(mouse.clone()); } callback(mouse); } fn decode_resize_record( &self, event: &WINDOW_BUFFER_SIZE_RECORD, callback: &mut F, ) { callback(InputEvent::Resized { rows: event.dwSize.Y as usize, cols: event.dwSize.X as usize, }); } pub fn decode_input_records( &mut self, records: &[INPUT_RECORD], callback: &mut F, ) { for record in records { match record.EventType { KEY_EVENT => { self.decode_key_record(unsafe { record.Event.KeyEvent() }, callback) } MOUSE_EVENT => { self.decode_mouse_record(unsafe { record.Event.MouseEvent() }, callback) } WINDOW_BUFFER_SIZE_EVENT => self.decode_resize_record( unsafe { record.Event.WindowBufferSizeEvent() }, callback, ), _ => {} } } self.process_bytes(callback, false); } } } impl Default for InputParser { fn default() -> Self { Self::new() } } impl InputParser { pub fn new() -> Self { Self { key_map: Self::build_basic_key_map(), buf: ReadBuffer::new(), state: InputState::Normal, } } fn build_basic_key_map() -> KeyMap { let mut map = KeyMap::new(); let modifier_combos = &[ ("", Modifiers::NONE), (";1", Modifiers::NONE), (";2", Modifiers::SHIFT), (";3", Modifiers::ALT), (";4", Modifiers::ALT | Modifiers::SHIFT), (";5", Modifiers::CTRL), (";6", Modifiers::CTRL | Modifiers::SHIFT), (";7", Modifiers::CTRL | Modifiers::ALT), (";8", Modifiers::CTRL | Modifiers::ALT | Modifiers::SHIFT), ]; // Meta is theoretically a distinct modifier of its own, but modern systems don't // have a dedicated Meta key and use the Alt/Option key instead. The mapping // below is reproduced from the xterm documentation from a time where it was // possible to hold both Alt and Meta down as modifiers. Since we define meta to // ALT, the use of `meta | ALT` in the table below appears to be redundant, // but makes it easier to see that the mapping matches xterm when viewing // its documentation. let meta = Modifiers::ALT; let meta_modifier_combos = &[ (";9", meta), (";10", meta | Modifiers::SHIFT), (";11", meta | Modifiers::ALT), (";12", meta | Modifiers::ALT | Modifiers::SHIFT), (";13", meta | Modifiers::CTRL), (";14", meta | Modifiers::CTRL | Modifiers::SHIFT), (";15", meta | Modifiers::CTRL | Modifiers::ALT), ( ";16", meta | Modifiers::CTRL | Modifiers::ALT | Modifiers::SHIFT, ), ]; let modifier_combos_including_meta = || modifier_combos.iter().chain(meta_modifier_combos.iter()); for alpha in b'A'..=b'Z' { // Ctrl-[A..=Z] are sent as 1..=26 let ctrl = [alpha & 0x1f]; map.insert( &ctrl, InputEvent::Key(KeyEvent { key: KeyCode::Char((alpha as char).to_ascii_lowercase()), modifiers: Modifiers::CTRL, }), ); // ALT A-Z is often sent with a leading ESC let alt = [0x1b, alpha]; map.insert( &alt, InputEvent::Key(KeyEvent { key: KeyCode::Char(alpha as char), modifiers: Modifiers::ALT, }), ); } for c in 0..=0x7fu8 { for (suffix, modifiers) in modifier_combos { // `CSI u` encodings for the ascii range; // see http://www.leonerd.org.uk/hacks/fixterms/ let key = format!("\x1b[{}{}u", c, suffix); map.insert( key, InputEvent::Key(KeyEvent { key: KeyCode::Char(c as char), modifiers: *modifiers, }), ); if !suffix.is_empty() { // xterm modifyOtherKeys sequences let key = format!("\x1b[27{};{}~", suffix, c); map.insert( key, InputEvent::Key(KeyEvent { key: match c { 8 | 0x7f => KeyCode::Backspace, 0x1b => KeyCode::Escape, 9 => KeyCode::Tab, 10 | 13 => KeyCode::Enter, _ => KeyCode::Char(c as char), }, modifiers: *modifiers, }), ); } } } // Common arrow keys for (keycode, dir) in &[ (KeyCode::UpArrow, b'A'), (KeyCode::DownArrow, b'B'), (KeyCode::RightArrow, b'C'), (KeyCode::LeftArrow, b'D'), (KeyCode::Home, b'H'), (KeyCode::End, b'F'), ] { // Arrow keys in normal mode encoded using CSI let arrow = [0x1b, b'[', *dir]; map.insert( &arrow, InputEvent::Key(KeyEvent { key: *keycode, modifiers: Modifiers::NONE, }), ); for (suffix, modifiers) in modifier_combos_including_meta() { let key = format!("\x1b[1{}{}", suffix, *dir as char); map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } for &(keycode, dir) in &[ (KeyCode::UpArrow, b'a'), (KeyCode::DownArrow, b'b'), (KeyCode::RightArrow, b'c'), (KeyCode::LeftArrow, b'd'), ] { // rxvt-specific modified arrows. for &(seq, mods) in &[ ([0x1b, b'[', dir], Modifiers::SHIFT), ([0x1b, b'O', dir], Modifiers::CTRL), ] { map.insert( &seq, InputEvent::Key(KeyEvent { key: keycode, modifiers: mods, }), ); } } for (keycode, dir) in &[ (KeyCode::ApplicationUpArrow, b'A'), (KeyCode::ApplicationDownArrow, b'B'), (KeyCode::ApplicationRightArrow, b'C'), (KeyCode::ApplicationLeftArrow, b'D'), ] { // Arrow keys in application cursor mode encoded using SS3 let app = [0x1b, b'O', *dir]; map.insert( &app, InputEvent::Key(KeyEvent { key: *keycode, modifiers: Modifiers::NONE, }), ); for (suffix, modifiers) in modifier_combos { let key = format!("\x1bO1{}{}", suffix, *dir as char); map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } // Function keys 1-4 with no modifiers encoded using SS3 for (keycode, c) in &[ (KeyCode::Function(1), b'P'), (KeyCode::Function(2), b'Q'), (KeyCode::Function(3), b'R'), (KeyCode::Function(4), b'S'), ] { let key = [0x1b, b'O', *c]; map.insert( &key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: Modifiers::NONE, }), ); } // Function keys 1-4 with modifiers for (keycode, c) in &[ (KeyCode::Function(1), b'P'), (KeyCode::Function(2), b'Q'), (KeyCode::Function(3), b'R'), (KeyCode::Function(4), b'S'), ] { for (suffix, modifiers) in modifier_combos_including_meta() { let key = format!("\x1b[1{suffix}{code}", code = *c as char, suffix = suffix); map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } // Function keys with modifiers encoded using CSI. // http://aperiodic.net/phil/archives/Geekery/term-function-keys.html for (range, offset) in &[ // F1-F5 encoded as 11-15 (1..=5, 10), // F6-F10 encoded as 17-21 (6..=10, 11), // F11-F14 encoded as 23-26 (11..=14, 12), // F15-F16 encoded as 28-29 (15..=16, 13), // F17-F20 encoded as 31-34 (17..=20, 14), ] { for n in range.clone() { for (suffix, modifiers) in modifier_combos_including_meta() { let key = format!("\x1b[{code}{suffix}~", code = n + offset, suffix = suffix); map.insert( key, InputEvent::Key(KeyEvent { key: KeyCode::Function(n), modifiers: *modifiers, }), ); } } } for (keycode, c) in &[ (KeyCode::Insert, b'2'), (KeyCode::Delete, b'3'), (KeyCode::Home, b'1'), (KeyCode::End, b'4'), (KeyCode::PageUp, b'5'), (KeyCode::PageDown, b'6'), // rxvt (KeyCode::Home, b'7'), (KeyCode::End, b'8'), ] { for (suffix, modifiers) in &[ (b'~', Modifiers::NONE), (b'$', Modifiers::SHIFT), (b'^', Modifiers::CTRL), (b'@', Modifiers::SHIFT | Modifiers::CTRL), ] { let key = [0x1b, b'[', *c, *suffix]; map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } map.insert( &[0x7f], InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::NONE, }), ); map.insert( &[0x8], InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::NONE, }), ); map.insert( &[0x1b], InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, }), ); map.insert( &[b'\t'], InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[Z", InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::SHIFT, }), ); map.insert( &[b'\r'], InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::NONE, }), ); map.insert( &[b'\n'], InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[200~", InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteStart, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[201~", InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteEnd, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[", InputEvent::Key(KeyEvent { key: KeyCode::Char('['), modifiers: Modifiers::ALT, }), ); map } /// Returns the first char from a str and the length of that char /// in *bytes*. fn first_char_and_len(s: &str) -> (char, usize) { let mut iter = s.chars(); let c = iter.next().unwrap(); (c, c.len_utf8()) } /// This is a horrible function to pull off the first unicode character /// from the sequence of bytes and return it and the remaining slice. fn decode_one_char(bytes: &[u8]) -> Option<(char, usize)> { // This has the potential to be an ugly hotspot since the complexity // is a function of the length of the entire buffer rather than the length // of the first char component. A simple mitigation might be to slice off // the first 4 bytes. We pick 4 bytes because the docs for str::len_utf8() // state that the maximum expansion for a `char` is 4 bytes. let bytes = &bytes[..bytes.len().min(4)]; match std::str::from_utf8(bytes) { Ok(s) => { let (c, len) = Self::first_char_and_len(s); Some((c, len)) } Err(err) => { let (valid, _after_valid) = bytes.split_at(err.valid_up_to()); if !valid.is_empty() { let s = unsafe { std::str::from_utf8_unchecked(valid) }; let (c, len) = Self::first_char_and_len(s); Some((c, len)) } else { None } } } } fn dispatch_callback(&mut self, mut callback: F, event: InputEvent) { match (self.state, event) { ( InputState::Normal, InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteStart, .. }), ) => { self.state = InputState::Pasting(0); } ( InputState::EscapeMaybeAlt, InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteStart, .. }), ) => { // The prior ESC was not part of an ALT sequence, so emit // it before we start collecting for paste. callback(InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, })); self.state = InputState::Pasting(0); } (InputState::EscapeMaybeAlt, InputEvent::Key(KeyEvent { key, modifiers })) => { // Treat this as ALT-key self.state = InputState::Normal; callback(InputEvent::Key(KeyEvent { key, modifiers: modifiers | Modifiers::ALT, })); } (InputState::EscapeMaybeAlt, event) => { // The prior ESC was not part of an ALT sequence, so emit // both it and the current event callback(InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, })); callback(event); } (_, event) => callback(event), } } fn process_bytes(&mut self, mut callback: F, maybe_more: bool) { while !self.buf.is_empty() { match self.state { InputState::Pasting(offset) => { let end_paste = b"\x1b[201~"; if let Some(idx) = self.buf.find_subsequence(offset, end_paste) { let pasted = String::from_utf8_lossy(&self.buf.as_slice()[0..idx]).to_string(); self.buf.advance(pasted.len() + end_paste.len()); callback(InputEvent::Paste(pasted)); self.state = InputState::Normal; } else { // Advance our offset so that in the case where we receive a paste that // is spread across N reads of size 8K, we don't need to search for the // end marker in 8K, 16K, 24K etc. of text until the final buffer is received. // Ensure that we use saturating math here for the case where the amount // of buffered data after the begin paste is smaller than the end paste marker // self.state = InputState::Pasting(self.buf.len().saturating_sub(end_paste.len())); return; } } InputState::EscapeMaybeAlt | InputState::Normal => { if self.state == InputState::Normal && self.buf.as_slice()[0] == b'\x1b' { // This feels a bit gross because we have two different parsers at play // here. We want to re-use the escape sequence parser to crack the // parameters out from things like mouse reports. The keymap tree doesn't // know how to grok this. let mut parser = Parser::new(); if let Some((Action::CSI(CSI::Mouse(mouse)), len)) = parser.parse_first(self.buf.as_slice()) { self.buf.advance(len); match mouse { MouseReport::SGR1006 { x, y, button, modifiers, } => { callback(InputEvent::Mouse(MouseEvent { x, y, mouse_buttons: button.into(), modifiers, })); } MouseReport::SGR1016 { x_pixels, y_pixels, button, modifiers, } => { callback(InputEvent::PixelMouse(PixelMouseEvent { x_pixels: x_pixels, y_pixels: y_pixels, mouse_buttons: button.into(), modifiers, })); } } continue; } } match ( self.key_map.lookup(self.buf.as_slice(), maybe_more), maybe_more, ) { // If we got an unambiguous ESC and we have more data to // follow, then this is likely the Meta version of the // following keypress. Buffer up the escape key and // consume it from the input. dispatch_callback() will // emit either the ESC or the ALT modified following key. ( Found::Exact( len, InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, }), ), _, ) if self.state == InputState::Normal && self.buf.len() > len => { self.state = InputState::EscapeMaybeAlt; self.buf.advance(len); } (Found::Exact(len, event), _) | (Found::Ambiguous(len, event), false) => { self.dispatch_callback(&mut callback, event.clone()); self.buf.advance(len); } (Found::Ambiguous(_, _), true) | (Found::NeedData, true) => { return; } (Found::None, _) | (Found::NeedData, false) => { // No pre-defined key, so pull out a unicode character if let Some((c, len)) = Self::decode_one_char(self.buf.as_slice()) { self.buf.advance(len); self.dispatch_callback( &mut callback, InputEvent::Key(KeyEvent { key: KeyCode::Char(c), modifiers: Modifiers::NONE, }), ); } else { // We need more data to recognize the input, so // yield the remainder of the slice return; } } } } } } } /// Push a sequence of bytes into the parser. /// Each time input is recognized, the provided `callback` will be passed /// the decoded `InputEvent`. /// If not enough data are available to fully decode a sequence, the /// remaining data will be buffered until the next call. /// The `maybe_more` flag controls how ambiguous partial sequences are /// handled. The intent is that `maybe_more` should be set to true if /// you believe that you will be able to provide more data momentarily. /// This will cause the parser to defer judgement on partial prefix /// matches. You should attempt to read and pass the new data in /// immediately afterwards. If you have attempted a read and no data is /// immediately available, you should follow up with a call to parse /// with an empty slice and `maybe_more=false` to allow the partial /// data to be recognized and processed. pub fn parse(&mut self, bytes: &[u8], callback: F, maybe_more: bool) { self.buf.extend_with(bytes); self.process_bytes(callback, maybe_more); } pub fn parse_as_vec(&mut self, bytes: &[u8], maybe_more: bool) -> Vec { let mut result = Vec::new(); self.parse(bytes, |event| result.push(event), maybe_more); result } #[cfg(windows)] pub fn decode_input_records_as_vec(&mut self, records: &[INPUT_RECORD]) -> Vec { let mut result = Vec::new(); self.decode_input_records(records, &mut |event| result.push(event)); result } } #[cfg(test)] mod test { use super::*; const NO_MORE: bool = false; const MAYBE_MORE: bool = true; #[test] fn simple() { let mut p = InputParser::new(); let inputs = p.parse_as_vec(b"hello", NO_MORE); assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('h'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('e'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('l'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('l'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('o'), }), ], inputs ); } #[test] fn control_characters() { let mut p = InputParser::new(); let inputs = p.parse_as_vec(b"\x03\x1bJ\x7f", NO_MORE); assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::CTRL, key: KeyCode::Char('c'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::ALT, key: KeyCode::Char('J'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Backspace, }), ], inputs ); } #[test] fn arrow_keys() { let mut p = InputParser::new(); let inputs = p.parse_as_vec(b"\x1bOA\x1bOB\x1bOC\x1bOD", NO_MORE); assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationUpArrow, }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationDownArrow, }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationRightArrow, }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationLeftArrow, }), ], inputs ); } #[test] fn partial() { let mut p = InputParser::new(); let mut inputs = Vec::new(); // Fragment this F-key sequence across two different pushes p.parse(b"\x1b[11", |evt| inputs.push(evt), true); p.parse(b"~", |evt| inputs.push(evt), true); // make sure we recognize it as just the F-key assert_eq!( vec![InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Function(1), })], inputs ); } #[test] fn partial_ambig() { let mut p = InputParser::new(); assert_eq!( vec![InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, })], p.parse_as_vec(b"\x1b", false) ); let mut inputs = Vec::new(); // An incomplete F-key sequence fragmented across two different pushes p.parse(b"\x1b[11", |evt| inputs.push(evt), MAYBE_MORE); p.parse(b"", |evt| inputs.push(evt), NO_MORE); // since we finish with maybe_more false (NO_MORE), the results should be the longest matching // parts of said f-key sequence assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::ALT, key: KeyCode::Char('['), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('1'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('1'), }), ], inputs ); } #[test] fn alt_left_bracket() { // tests that `Alt` + `[` is recognized as a single // event rather than two events (one `Esc` the second `Char('[')`) let mut p = InputParser::new(); let mut inputs = Vec::new(); p.parse(b"\x1b[", |evt| inputs.push(evt), false); assert_eq!( vec![InputEvent::Key(KeyEvent { modifiers: Modifiers::ALT, key: KeyCode::Char('['), }),], inputs ); } #[test] fn modify_other_keys_parse() { let mut p = InputParser::new(); let inputs = p.parse_as_vec( b"\x1b[27;5;13~\x1b[27;5;9~\x1b[27;6;8~\x1b[27;2;127~\x1b[27;6;27~", NO_MORE, ); assert_eq!( vec![ InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::CTRL, }), InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::CTRL, }), InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::CTRL | Modifiers::SHIFT, }), InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::SHIFT, }), InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::CTRL | Modifiers::SHIFT, }), ], inputs ); } #[test] fn modify_other_keys_encode() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; let mode_1 = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: Some(1), }; let mode_2 = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: Some(2), }; assert_eq!( KeyCode::Enter.encode(Modifiers::CTRL, mode, true).unwrap(), "\r".to_string() ); assert_eq!( KeyCode::Enter .encode(Modifiers::CTRL, mode_1, true) .unwrap(), "\x1b[27;5;13~".to_string() ); assert_eq!( KeyCode::Enter .encode(Modifiers::CTRL | Modifiers::SHIFT, mode_1, true) .unwrap(), "\x1b[27;6;13~".to_string() ); // This case is not conformant with xterm! // xterm just returns tab for CTRL-Tab when modify_other_keys // is not set. assert_eq!( KeyCode::Tab.encode(Modifiers::CTRL, mode, true).unwrap(), "\x1b[9;5u".to_string() ); assert_eq!( KeyCode::Tab.encode(Modifiers::CTRL, mode_1, true).unwrap(), "\x1b[27;5;9~".to_string() ); assert_eq!( KeyCode::Tab .encode(Modifiers::CTRL | Modifiers::SHIFT, mode_1, true) .unwrap(), "\x1b[27;6;9~".to_string() ); assert_eq!( KeyCode::Char('c') .encode(Modifiers::CTRL, mode, true) .unwrap(), "\x03".to_string() ); assert_eq!( KeyCode::Char('c') .encode(Modifiers::CTRL, mode_1, true) .unwrap(), "\x03".to_string() ); assert_eq!( KeyCode::Char('c') .encode(Modifiers::CTRL, mode_2, true) .unwrap(), "\x1b[27;5;99~".to_string() ); assert_eq!( KeyCode::Char('1') .encode(Modifiers::CTRL, mode, true) .unwrap(), "1".to_string() ); assert_eq!( KeyCode::Char('1') .encode(Modifiers::CTRL, mode_2, true) .unwrap(), "\x1b[27;5;49~".to_string() ); assert_eq!( KeyCode::Char(',') .encode(Modifiers::CTRL, mode, true) .unwrap(), ",".to_string() ); assert_eq!( KeyCode::Char(',') .encode(Modifiers::CTRL, mode_2, true) .unwrap(), "\x1b[27;5;44~".to_string() ); } #[test] fn encode_issue_892() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; assert_eq!( KeyCode::LeftArrow .encode(Modifiers::NONE, mode, true) .unwrap(), "\x1b[D".to_string() ); assert_eq!( KeyCode::LeftArrow .encode(Modifiers::ALT, mode, true) .unwrap(), "\x1b[1;3D".to_string() ); assert_eq!( KeyCode::Home.encode(Modifiers::NONE, mode, true).unwrap(), "\x1b[H".to_string() ); assert_eq!( KeyCode::Home.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b[1;3H".to_string() ); assert_eq!( KeyCode::End.encode(Modifiers::NONE, mode, true).unwrap(), "\x1b[F".to_string() ); assert_eq!( KeyCode::End.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b[1;3F".to_string() ); assert_eq!( KeyCode::Tab.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b\t".to_string() ); assert_eq!( KeyCode::PageUp.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b[5;3~".to_string() ); assert_eq!( KeyCode::Function(1) .encode(Modifiers::NONE, mode, true) .unwrap(), "\x1bOP".to_string() ); } #[test] fn partial_bracketed_paste() { let mut p = InputParser::new(); let input = b"\x1b[200~1234"; let input2 = b"5678\x1b[201~"; let mut inputs = vec![]; p.parse(input, |e| inputs.push(e), false); p.parse(input2, |e| inputs.push(e), false); assert_eq!(vec![InputEvent::Paste("12345678".to_owned())], inputs) } #[test] fn mouse_horizontal_scroll() { let mut p = InputParser::new(); let input = b"\x1b[<66;42;12M\x1b[<67;42;12M"; let res = p.parse_as_vec(input, MAYBE_MORE); assert_eq!( vec![ InputEvent::Mouse(MouseEvent { x: 42, y: 12, mouse_buttons: MouseButtons::HORZ_WHEEL | MouseButtons::WHEEL_POSITIVE, modifiers: Modifiers::NONE, }), InputEvent::Mouse(MouseEvent { x: 42, y: 12, mouse_buttons: MouseButtons::HORZ_WHEEL, modifiers: Modifiers::NONE, }) ], res ); } #[test] fn encode_issue_3478_xterm() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; assert_eq!( KeyCode::Numpad0 .encode(Modifiers::NONE, mode, true) .unwrap(), "\u{1b}[2~".to_string() ); assert_eq!( KeyCode::Numpad0 .encode(Modifiers::SHIFT, mode, true) .unwrap(), "\u{1b}[2;2~".to_string() ); assert_eq!( KeyCode::Numpad1 .encode(Modifiers::NONE, mode, true) .unwrap(), "\u{1b}[F".to_string() ); assert_eq!( KeyCode::Numpad1 .encode(Modifiers::NONE | Modifiers::SHIFT, mode, true) .unwrap(), "\u{1b}[1;2F".to_string() ); } #[test] fn encode_tab_with_modifiers() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; let mods_to_result = [ (Modifiers::SHIFT, "\u{1b}[Z"), (Modifiers::SHIFT | Modifiers::LEFT_SHIFT, "\u{1b}[Z"), (Modifiers::SHIFT | Modifiers::RIGHT_SHIFT, "\u{1b}[Z"), (Modifiers::CTRL, "\u{1b}[9;5u"), (Modifiers::CTRL | Modifiers::LEFT_CTRL, "\u{1b}[9;5u"), (Modifiers::CTRL | Modifiers::RIGHT_CTRL, "\u{1b}[9;5u"), ( Modifiers::SHIFT | Modifiers::CTRL | Modifiers::LEFT_CTRL | Modifiers::LEFT_SHIFT, "\u{1b}[1;5Z", ), ]; for (mods, result) in mods_to_result { assert_eq!( KeyCode::Tab.encode(mods, mode, true).unwrap(), result, "{:?}", mods ); } } } termwiz-0.23.3/src/istty.rs000064400000000000000000000022031046102023000137200ustar 00000000000000//! Making it a little more convenient and safe to query whether //! something is a terminal teletype or not. //! This module defines the IsTty trait and the is_tty method to //! return true if the item represents a terminal. #[cfg(unix)] use std::os::unix::io::AsRawFd; #[cfg(windows)] use std::os::windows::io::AsRawHandle; #[cfg(windows)] use winapi::um::consoleapi::GetConsoleMode; /// Adds the is_tty method to types that might represent a terminal pub trait IsTty { /// Returns true if the instance is a terminal teletype, false /// otherwise. fn is_tty(&self) -> bool; } /// On unix, the `isatty()` library function returns true if a file /// descriptor is a terminal. Let's implement `IsTty` for anything /// that has an associated raw file descriptor. #[cfg(unix)] impl IsTty for S { fn is_tty(&self) -> bool { let fd = self.as_raw_fd(); unsafe { libc::isatty(fd) == 1 } } } #[cfg(windows)] impl IsTty for S { fn is_tty(&self) -> bool { let mut mode = 0; let ok = unsafe { GetConsoleMode(self.as_raw_handle() as *mut _, &mut mode) }; ok == 1 } } termwiz-0.23.3/src/keymap.rs000064400000000000000000000225411046102023000140410ustar 00000000000000//! A datastructure for holding key map entries use std::fmt::Debug; #[derive(Debug, Clone)] struct Node { label: u8, children: Vec>, value: Option, } impl Node { fn new(label: u8) -> Self { Self { label, children: Vec::new(), value: None, } } fn insert(&mut self, key: &[u8], value: Value) { if key.is_empty() { // We've reached the leaf self.value = Some(value); return; } match self .children .binary_search_by(|node| node.label.cmp(&key[0])) { Ok(idx) => { self.children[idx].insert(&key[1..], value); } Err(idx) => { self.children.insert(idx, Node::new(key[0])); self.children[idx].insert(&key[1..], value); } } } fn lookup(&self, key: &[u8], depth: usize, maybe_more: bool) -> NodeFind<&Value> { if key.is_empty() { // We've matched the maximum extent of the input key. if self.children.is_empty() { match self.value.as_ref() { Some(value) => { // An unambiguous match for the entire input return NodeFind::Exact(depth, value); } None => panic!("Node has no children and no value!?"), } } return match self.value.as_ref() { Some(value) => { if maybe_more { NodeFind::AmbiguousMatch(depth, value) } else { NodeFind::Exact(depth, value) } } None => NodeFind::AmbiguousBackTrack, }; } match self .children .binary_search_by(|node| node.label.cmp(&key[0])) { Ok(idx) => { match self.children[idx].lookup(&key[1..], depth + 1, maybe_more) { NodeFind::AmbiguousBackTrack => { // The child didn't have an exact match, so check // whether we do match self.value.as_ref() { Some(value) => { // We do! If we're expecting more, let's return an AmbiguousMatch, // otherwise, let's treat this as an Exact match // // see the "lookup_with_multiple_ambiguous_matches_" // test cases in this file for an example if maybe_more { NodeFind::AmbiguousMatch(depth, value) } else { NodeFind::Exact(depth, value) } } None => NodeFind::AmbiguousBackTrack, } } result => result, } } Err(_) => { if depth == 0 { NodeFind::None } else { match self.value.as_ref() { Some(value) => NodeFind::Exact(depth, value), None => NodeFind::AmbiguousBackTrack, } } } } } } /// Internal lookup disposition enum NodeFind { /// No possible matches None, /// Found an exact match. (match-len, value) Exact(usize, Value), /// Didn't find an exact match at the full extent of the key, /// so ask the upper layer to back track to find a partial. AmbiguousBackTrack, /// After backtracking, found a prefix match, but we know that /// there might be a more specific match given more data. (match-len, /// value). AmbiguousMatch(usize, Value), } /// Holds the result of a lookup operation #[derive(Debug, Clone, PartialEq, Eq)] pub enum Found { /// There are definitively no possible matches None, /// We found an unambiguous match. /// The data is (length-of-match, value) Exact(usize, Value), /// We found a match, but there are other longer matches /// that are possible. Ideally we'd accumulate more data /// to know for sure. /// The data is (length-of-shortest-match, value) Ambiguous(usize, Value), /// If we had more data, we might match something NeedData, } /// The `KeyMap` struct is intended to hold the text sequences /// generated by unix terminal programs. Those sequences have /// overlapping/ambiguous meaning which requires having more /// data to correctly interpret the sequence. /// The `lookup` operation returns an enum describing the /// confidence of a match rather than a simple map lookup. #[derive(Debug, Clone)] pub struct KeyMap { root: Node, } impl Default for KeyMap { fn default() -> Self { Self::new() } } impl KeyMap { pub fn new() -> Self { Self { root: Node::new(0) } } /// Insert a value into the keymap pub fn insert>(&mut self, key: K, value: Value) { self.root.insert(key.as_ref(), value) } /// Perform a lookup for `key`. /// `key` can be a string consisting of a sequence of bytes. /// The `lookup` operation considers the prefix of `key` and searches /// for a match. /// /// If `Found::None` is returned then the prefix for key has no matching /// keymap entry. /// /// If `Found::Exact` is returned then the returned value informs the caller /// of the length of the key that was matched; the remainder of the key /// was not considered and is something that should be considered again /// in a subsequent lookup operation. /// /// If `Found::Ambiguous` is returned then the key matched a valid /// entry (which is returned as the value), but there is at least one /// other entry that could match if more data were available. If the caller /// knows that no more data is available immediately then it may be valid /// to treat this result as equivalent to `Found::Exact`. The intended /// use for this variant is to handle the case where a sequence straddles /// a buffer boundary (eg: fixed size buffer receives a partial sequence, /// and the remainder is immediately available on the next read) without /// misinterpreting the read data. /// /// If `Found::NeedData` is returned it indicates that `key` is too short /// to determine a match. The purpose is similar to the `Found::Ambiguous` /// case; if the caller knows that no more data is available this can be /// treated as `Found::None`, but otherwise it would be best to read more /// data from the stream and retry with a longer input. pub fn lookup>(&self, key: S, maybe_more: bool) -> Found { match self.root.lookup(key.as_ref(), 0, maybe_more) { NodeFind::None => Found::None, NodeFind::AmbiguousBackTrack => Found::NeedData, NodeFind::Exact(depth, value) => Found::Exact(depth, value.clone()), NodeFind::AmbiguousMatch(depth, value) => Found::Ambiguous(depth, value.clone()), } } } #[cfg(test)] mod test { use super::*; const NO_MORE: bool = false; const MAYBE_MORE: bool = true; #[test] fn lookup_empty() { let km: KeyMap = KeyMap::new(); assert_eq!(km.lookup("boo", true), Found::None); } #[test] fn lookup() { let mut km = KeyMap::new(); km.insert("boa", true); km.insert("boo", true); km.insert("boom", false); assert_eq!(km.lookup("b", MAYBE_MORE), Found::NeedData); assert_eq!(km.lookup("bo", MAYBE_MORE), Found::NeedData); assert_eq!(km.lookup("boa", MAYBE_MORE), Found::Exact(3, true),); assert_eq!(km.lookup("boo", MAYBE_MORE), Found::Ambiguous(3, true),); assert_eq!(km.lookup("boom", MAYBE_MORE), Found::Exact(4, false),); assert_eq!(km.lookup("boom!", MAYBE_MORE), Found::Exact(4, false),); } #[test] fn lookup_with_multiple_ambiguous_matches_without_additional_input() { let mut km = KeyMap::new(); km.insert("boa", false); km.insert("boo", false); km.insert("boom", true); km.insert("boom!!", false); assert_eq!(km.lookup("boom!", NO_MORE), Found::Exact(4, true)); } #[test] fn lookup_with_multiple_ambiguous_matches_with_potential_additional_input() { let mut km = KeyMap::new(); km.insert("boa", false); km.insert("boo", false); km.insert("boom", true); km.insert("boom!!", false); assert_eq!(km.lookup("boom!", MAYBE_MORE), Found::Ambiguous(4, true)); } #[test] fn sequence() { let mut km = KeyMap::new(); km.insert("\x03", true); km.insert("\x27", true); km.insert("\x03XYZ", true); assert_eq!(km.lookup("\x03", MAYBE_MORE), Found::Ambiguous(1, true),); assert_eq!(km.lookup("\x03foo", MAYBE_MORE), Found::Exact(1, true),); assert_eq!(km.lookup("\x03X", MAYBE_MORE), Found::Ambiguous(1, true),); } } termwiz-0.23.3/src/lib.rs000064400000000000000000000046301046102023000133200ustar 00000000000000//! # Terminal Wizardry //! //! This is a rust crate that provides a number of support functions //! for applications interested in either displaying data to a terminal //! or in building a terminal emulator. //! //! It is currently in active development and subject to fairly wild //! sweeping changes. //! //! Included functionality: //! //! * `Surface` models a terminal display and its component `Cell`s //! * Terminal attributes are aware of modern features such as //! True Color, [Hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda) //! and will also support sixel and iterm style terminal graphics display. //! * `Surface`s include a log of `Change`s and an API for consuming //! and applying deltas. This is a powerful building block for //! synchronizing screen instances. //! * Escape sequence parser decodes inscrutable escape sequences //! and gives them semantic meaning, making the code that uses //! them clearer. The decoded escapes can be re-encoded, allowing //! applications to start with the semantic meaning and emit //! the appropriate escape sequence without embedding obscure //! binary bytes. //! * `Capabilities` allows probing for terminal capabilities //! that may not be included in the system terminfo database, //! and overriding them in an embedding application. //! * `Terminal` trait provides an abstraction over unix style ttys //! and Windows style console APIs. `Change`s from `Surface` //! can be rendered to `Terminal`s. `Terminal`s allow decoding //! mouse and keyboard inputs in both blocking or non-blocking //! mode. //! * `Widget` trait allows composition of UI elements at a higher //! level. //! * `LineEditor` provides line editing facilities similar to those //! in the unix shell. //! //! ## Features //! //! * `widgets` - enables the widget layout and related traits //! * `use_serde` - makes a number of structs serde serializable mod emoji; mod emoji_presentation; mod emoji_variation; mod white_space; mod widechar_width; pub mod caps; pub mod cell; pub mod cellcluster; pub mod color; pub mod error; pub mod escape; pub mod hyperlink; pub mod image; pub mod input; pub mod istty; pub mod keymap; pub mod lineedit; mod macros; pub mod nerdfonts; mod nerdfonts_data; mod readbuf; pub mod render; pub mod surface; pub mod terminal; pub mod tmux_cc; #[cfg(feature = "widgets")] pub mod widgets; pub use error::{Context, Error, Result}; termwiz-0.23.3/src/lineedit/actions.rs000064400000000000000000000011601046102023000160020ustar 00000000000000pub type RepeatCount = usize; #[derive(Debug, Clone, Copy)] pub enum Movement { BackwardChar(RepeatCount), BackwardWord(RepeatCount), ForwardChar(RepeatCount), ForwardWord(RepeatCount), StartOfLine, EndOfLine, None, } #[derive(Debug, Clone)] pub enum Action { AcceptLine, Cancel, EndOfFile, InsertChar(RepeatCount, char), InsertText(RepeatCount, String), Repaint, Move(Movement), Kill(Movement), KillAndMove(Movement, Movement), HistoryPrevious, HistoryNext, Complete, NoAction, HistoryIncSearchBackwards, HistoryIncSearchForwards, } termwiz-0.23.3/src/lineedit/buffer.rs000064400000000000000000000143771046102023000156310ustar 00000000000000use unicode_segmentation::GraphemeCursor; use super::actions::Movement; pub struct LineEditBuffer { line: String, /// byte index into the UTF-8 string data of the insertion /// point. This is NOT the number of graphemes! cursor: usize, } impl Default for LineEditBuffer { fn default() -> Self { Self { line: String::new(), cursor: 0, } } } impl LineEditBuffer { pub fn new(line: &str, cursor: usize) -> Self { let mut buffer = Self::default(); buffer.set_line_and_cursor(line, cursor); return buffer; } pub fn get_line(&self) -> &str { return &self.line; } pub fn get_cursor(&self) -> usize { return self.cursor; } pub fn insert_char(&mut self, c: char) { self.line.insert(self.cursor, c); let mut cursor = GraphemeCursor::new(self.cursor, self.line.len(), false); if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) { self.cursor = pos; } } pub fn insert_text(&mut self, text: &str) { self.line.insert_str(self.cursor, text); self.cursor += text.len(); } /// The cursor position is the byte index into the line UTF-8 bytes. /// Panics: the cursor must be the first byte in a UTF-8 code point /// sequence or the end of the provided line. pub fn set_line_and_cursor(&mut self, line: &str, cursor: usize) { assert!( line.is_char_boundary(cursor), "cursor {} is not a char boundary of the new line {}", cursor, line ); self.line = line.to_string(); self.cursor = cursor; } pub fn kill_text(&mut self, kill_movement: Movement, move_movement: Movement) { let kill_pos = self.eval_movement(kill_movement); let new_cursor = self.eval_movement(move_movement); let (lower, upper) = if kill_pos < self.cursor { (kill_pos, self.cursor) } else { (self.cursor, kill_pos) }; self.line.replace_range(lower..upper, ""); // Clamp to the line length, otherwise a kill to end of line // command will leave the cursor way off beyond the end of // the line. self.cursor = new_cursor.min(self.line.len()); } pub fn clear(&mut self) { self.line.clear(); self.cursor = 0; } pub fn exec_movement(&mut self, movement: Movement) { self.cursor = self.eval_movement(movement); } /// Compute the cursor position after applying movement fn eval_movement(&self, movement: Movement) -> usize { match movement { Movement::BackwardChar(rep) => { let mut position = self.cursor; for _ in 0..rep { let mut cursor = GraphemeCursor::new(position, self.line.len(), false); if let Ok(Some(pos)) = cursor.prev_boundary(&self.line, 0) { position = pos; } else { break; } } position } Movement::BackwardWord(rep) => { let char_indices: Vec<(usize, char)> = self.line.char_indices().collect(); if char_indices.is_empty() { return self.cursor; } let mut char_position = char_indices .iter() .position(|(idx, _)| *idx == self.cursor) .unwrap_or(char_indices.len() - 1); for _ in 0..rep { if char_position == 0 { break; } let mut found = None; for prev in (0..char_position - 1).rev() { if char_indices[prev].1.is_whitespace() { found = Some(prev + 1); break; } } char_position = found.unwrap_or(0); } char_indices[char_position].0 } Movement::ForwardWord(rep) => { let char_indices: Vec<(usize, char)> = self.line.char_indices().collect(); if char_indices.is_empty() { return self.cursor; } let mut char_position = char_indices .iter() .position(|(idx, _)| *idx == self.cursor) .unwrap_or_else(|| char_indices.len()); for _ in 0..rep { // Skip any non-whitespace characters while char_position < char_indices.len() && !char_indices[char_position].1.is_whitespace() { char_position += 1; } // Skip any whitespace characters while char_position < char_indices.len() && char_indices[char_position].1.is_whitespace() { char_position += 1; } // We are now on the start of the next word } char_indices .get(char_position) .map(|(i, _)| *i) .unwrap_or_else(|| self.line.len()) } Movement::ForwardChar(rep) => { let mut position = self.cursor; for _ in 0..rep { let mut cursor = GraphemeCursor::new(position, self.line.len(), false); if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) { position = pos; } else { break; } } position } Movement::StartOfLine => 0, Movement::EndOfLine => { let mut cursor = GraphemeCursor::new(self.line.len().saturating_sub(1), self.line.len(), false); if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) { pos } else { self.cursor } } Movement::None => self.cursor, } } } termwiz-0.23.3/src/lineedit/history.rs000064400000000000000000000074011046102023000160470ustar 00000000000000use std::borrow::Cow; use std::collections::VecDeque; /// Represents a position within the history. /// Smaller numbers are assumed to be before larger numbers, /// and the indices are assumed to be contiguous. pub type HistoryIndex = usize; /// Defines the history interface for the line editor. pub trait History { /// Lookup the line corresponding to an index. fn get(&self, idx: HistoryIndex) -> Option>; /// Return the index for the most recently added entry. fn last(&self) -> Option; /// Add an entry. /// Note that the LineEditor will not automatically call /// the add method. fn add(&mut self, line: &str); /// Search for a matching entry relative to the specified history index. fn search( &self, idx: HistoryIndex, style: SearchStyle, direction: SearchDirection, pattern: &str, ) -> Option; } #[derive(Debug, Clone, Eq, PartialEq)] pub struct SearchResult<'a> { pub line: Cow<'a, str>, pub idx: HistoryIndex, pub cursor: usize, } #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum SearchStyle { Substring, } impl SearchStyle { /// Matches pattern against line, returning the byte index of the /// first matching character pub fn match_against(&self, pattern: &str, line: &str) -> Option { match self { Self::Substring => line.find(pattern), } } } /// Encodes the direction the search should take, relative to the /// current HistoryIndex. #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum SearchDirection { /// The search goes backwards towards the smaller HistoryIndex values /// at the beginning of history. Backwards, /// The search goes forwards towarrds the larger HistoryIndex values /// at the end of history. Forwards, } impl SearchDirection { /// Given a history index, compute the next value in the /// encoded search directory. /// Returns `None` if the search would overflow. pub fn next(self, idx: HistoryIndex) -> Option { let (next, overflow) = match self { Self::Backwards => idx.overflowing_sub(1), Self::Forwards => idx.overflowing_add(1), }; if overflow { None } else { Some(next) } } } /// A simple history implementation that holds entries in memory. #[derive(Default)] pub struct BasicHistory { entries: VecDeque, } impl History for BasicHistory { fn get(&self, idx: HistoryIndex) -> Option> { self.entries.get(idx).map(|s| Cow::Borrowed(s.as_str())) } fn last(&self) -> Option { if self.entries.is_empty() { None } else { Some(self.entries.len() - 1) } } fn add(&mut self, line: &str) { if self.entries.back().map(String::as_str) == Some(line) { // Ignore duplicates return; } self.entries.push_back(line.to_owned()); } fn search( &self, idx: HistoryIndex, style: SearchStyle, direction: SearchDirection, pattern: &str, ) -> Option { let mut idx = idx; loop { let line = match self.entries.get(idx) { Some(line) => line, None => return None, }; if let Some(cursor) = style.match_against(pattern, line) { return Some(SearchResult { line: Cow::Borrowed(line.as_str()), idx, cursor, }); } idx = match direction.next(idx) { None => return None, Some(idx) => idx, }; } } } termwiz-0.23.3/src/lineedit/host.rs000064400000000000000000000123051046102023000153220ustar 00000000000000use crate::cell::{AttributeChange, CellAttributes}; use crate::input::InputEvent; use crate::lineedit::actions::Action; use crate::lineedit::{BasicHistory, History, LineEditor}; use crate::surface::Change; /// The `OutputElement` type allows returning graphic attribute changes /// as well as textual output. pub enum OutputElement { /// Change a single attribute Attribute(AttributeChange), /// Change all possible attributes to the given set of values AllAttributes(CellAttributes), /// Printable text. /// Control characters are rendered inert by transforming them /// to space. CR and LF characters are interpreted by moving /// the cursor position. CR moves the cursor to the start of /// the line and LF moves the cursor down to the next line. /// You typically want to use both together when sending in /// a line break. Text(String), } impl Into for OutputElement { fn into(self) -> Change { match self { OutputElement::Attribute(a) => Change::Attribute(a), OutputElement::AllAttributes(a) => Change::AllAttributes(a), OutputElement::Text(t) => Change::Text(t), } } } /// The `LineEditorHost` trait allows an embedding application to influence /// how the line editor functions. /// A concrete implementation of the host with neutral defaults is provided /// as `NopLineEditorHost`. pub trait LineEditorHost { /// Given a prompt string, return the rendered form of the prompt as /// a sequence of `OutputElement` instances. /// The implementation is free to interpret the prompt string however /// it chooses; for instance, the application can opt to expand its own /// application specific escape sequences as it sees fit. /// The `OutputElement` type allows returning graphic attribute changes /// as well as textual output. /// The default implementation returns the prompt as-is with no coloring /// and no textual transformation. fn render_prompt(&self, prompt: &str) -> Vec { vec![OutputElement::Text(prompt.to_owned())] } /// Given a reference to the current line being edited, render a preview /// of its outcome. The preview is cleared when the input is accepted, /// or canceled. fn render_preview(&self, _line: &str) -> Vec { Vec::new() } /// Given a reference to the current line being edited and the position /// of the cursor, return the rendered form of the line as a sequence /// of `OutputElement` instances. /// While this interface technically allows returning arbitrary Text sequences, /// the application should preserve the column positions of the graphemes, /// otherwise the terminal cursor position won't match up to the correct /// location. /// The `OutputElement` type allows returning graphic attribute changes /// as well as textual output. /// The default implementation returns the line as-is with no coloring. fn highlight_line(&self, line: &str, cursor_position: usize) -> (Vec, usize) { let cursor_x_pos = crate::cell::unicode_column_width(&line[0..cursor_position], None); (vec![OutputElement::Text(line.to_owned())], cursor_x_pos) } /// Returns the history implementation fn history(&mut self) -> &mut dyn History; /// Tab completion support. /// The line and current cursor position are provided and it is up to the /// embedding application to produce a list of completion candidates. /// The default implementation is an empty list. fn complete(&self, _line: &str, _cursor_position: usize) -> Vec { vec![] } /// Allows the embedding application an opportunity to override or /// remap keys to alternative actions. /// Return `None` to indicate that the default keymap processing /// should occur. /// Otherwise return an `Action` enum variant indicating the action /// that should be taken. /// Use `Some(Action::NoAction)` to indicate that no action should be taken. /// `editor` is provided so that your application can implement custom /// actions and apply them to the editor buffer. Use `LineEditor::get_line_and_cursor` /// and `LineEditor::set_line_and_cursor` for that and return `Some(Action::NoAction)` /// to prevent any default action from being taken. fn resolve_action(&mut self, _event: &InputEvent, _editor: &mut LineEditor) -> Option { None } } /// A candidate for tab completion. /// If the line and cursor look like "why he" and if "hello" is a valid /// completion of "he" in that context, then the corresponding CompletionCandidate /// would have its range set to [4..6] (the "he" slice range) and its text /// set to "hello". pub struct CompletionCandidate { /// The section of the input line to be replaced pub range: std::ops::Range, /// The replacement text pub text: String, } /// A concrete implementation of `LineEditorHost` that uses the default behaviors. #[derive(Default)] pub struct NopLineEditorHost { history: BasicHistory, } impl LineEditorHost for NopLineEditorHost { fn history(&mut self) -> &mut dyn History { &mut self.history } } termwiz-0.23.3/src/lineedit/mod.rs000064400000000000000000000746271046102023000151430ustar 00000000000000//! The `LineEditor` struct provides line editing facilities similar //! to those in the unix shell. //! //! ```no_run //! use termwiz::lineedit::{line_editor_terminal, NopLineEditorHost, LineEditor}; //! //! fn main() -> termwiz::Result<()> { //! let mut terminal = line_editor_terminal()?; //! let mut editor = LineEditor::new(&mut terminal); //! let mut host = NopLineEditorHost::default(); //! //! let line = editor.read_line(&mut host)?; //! println!("read line: {:?}", line); //! //! Ok(()) //! } //! ``` //! //! ## Key Bindings //! //! The following key bindings are supported: //! //! Keystroke | Action //! --------- | ------ //! Ctrl-A, Home | Move cursor to the beginning of the line //! Ctrl-E, End | Move cursor to the end of the line //! Ctrl-B, Left | Move cursor one grapheme to the left //! Ctrl-C | Cancel the line editor //! Ctrl-D | Cancel the line editor with an End-of-File result //! Ctrl-F, Right | Move cursor one grapheme to the right //! Ctrl-H, Backspace | Delete the grapheme to the left of the cursor //! Delete | Delete the grapheme to the right of the cursor //! Ctrl-J, Ctrl-M, Enter | Finish line editing and accept the current line //! Ctrl-K | Delete from cursor to end of line //! Ctrl-L | Move the cursor to the top left, clear screen and repaint //! Ctrl-R | Incremental history search mode //! Ctrl-W | Delete word leading up to cursor //! Alt-b, Alt-Left | Move the cursor backwards one word //! Alt-f, Alt-Right | Move the cursor forwards one word use crate::caps::{Capabilities, ProbeHints}; use crate::input::{InputEvent, KeyCode, KeyEvent, Modifiers}; use crate::surface::change::ChangeSequence; use crate::surface::{Change, Position}; use crate::terminal::{new_terminal, Terminal}; use crate::{bail, ensure, Result}; mod actions; mod buffer; mod history; mod host; pub use actions::{Action, Movement, RepeatCount}; pub use buffer::LineEditBuffer; pub use history::*; pub use host::*; /// The `LineEditor` struct provides line editing facilities similar /// to those in the unix shell. /// ```no_run /// use termwiz::lineedit::{line_editor_terminal, NopLineEditorHost, LineEditor}; /// /// fn main() -> termwiz::Result<()> { /// let mut terminal = line_editor_terminal()?; /// let mut editor = LineEditor::new(&mut terminal); /// let mut host = NopLineEditorHost::default(); /// /// let line = editor.read_line(&mut host)?; /// println!("read line: {:?}", line); /// /// Ok(()) /// } /// ``` pub struct LineEditor<'term> { terminal: &'term mut dyn Terminal, prompt: String, line: LineEditBuffer, history_pos: Option, bottom_line: Option, completion: Option, move_to_editor_start: Option, move_to_editor_end: Option, state: EditorState, } #[derive(Clone, Eq, PartialEq, Debug)] enum EditorState { Inactive, Editing, Cancelled, Accepted, Searching { style: SearchStyle, direction: SearchDirection, matching_line: String, cursor: usize, }, } struct CompletionState { candidates: Vec, index: usize, original_line: String, original_cursor: usize, } impl CompletionState { fn next(&mut self) { self.index += 1; if self.index >= self.candidates.len() { self.index = 0; } } fn current(&self) -> (usize, String) { let mut line = self.original_line.clone(); let candidate = &self.candidates[self.index]; line.replace_range(candidate.range.clone(), &candidate.text); // To figure the new cursor position do a little math: // "he" when the completion is "hello" will set the completion // candidate to replace "he" with "hello", so the difference in the // lengths of these two is how far the cursor needs to move. let range_len = candidate.range.end - candidate.range.start; let new_cursor = self.original_cursor + candidate.text.len() - range_len; (new_cursor, line) } } impl<'term> LineEditor<'term> { /// Create a new line editor. /// In most cases, you'll want to use the `line_editor` function, /// because it creates a `Terminal` instance with the recommended /// settings, but if you need to decompose that for some reason, /// this snippet shows the recommended way to create a line /// editor: /// /// ```no_run /// use termwiz::caps::{Capabilities, ProbeHints}; /// use termwiz::terminal::new_terminal; /// use termwiz::Error; /// // Disable mouse input in the line editor /// let hints = ProbeHints::new_from_env() /// .mouse_reporting(Some(false)); /// let caps = Capabilities::new_with_hints(hints)?; /// let terminal = new_terminal(caps)?; /// # Ok::<(), Error>(()) /// ``` pub fn new(terminal: &'term mut dyn Terminal) -> Self { Self { terminal, prompt: "> ".to_owned(), line: LineEditBuffer::default(), history_pos: None, bottom_line: None, completion: None, move_to_editor_start: None, move_to_editor_end: None, state: EditorState::Inactive, } } fn render(&mut self, host: &mut dyn LineEditorHost) -> Result<()> { let screen_size = self.terminal.get_screen_size()?; let mut changes = ChangeSequence::new(screen_size.rows, screen_size.cols); changes.add(Change::ClearToEndOfScreen(Default::default())); changes.add(Change::AllAttributes(Default::default())); for ele in host.render_prompt(&self.prompt) { changes.add(ele); } changes.add(Change::AllAttributes(Default::default())); // If we're searching, the input area shows the match rather than the input, // and the cursor moves to the first matching character let (line_to_display, cursor) = match &self.state { EditorState::Searching { matching_line, cursor, .. } => (matching_line.as_str(), *cursor), _ => (self.line.get_line(), self.line.get_cursor()), }; let cursor_position_after_printing_prompt = changes.current_cursor_position(); let (elements, cursor_x_pos) = host.highlight_line(line_to_display, cursor); // Calculate what the cursor position would be after printing X columns // of text from the specified location. // Returns (x, y) of the resultant cursor position. fn compute_cursor_after_printing_x_columns( cursor_x: usize, cursor_y: isize, delta: usize, screen_cols: usize, ) -> (usize, isize) { let y = (cursor_x + delta) / screen_cols; let x = (cursor_x + delta) % screen_cols; let row = cursor_y + y as isize; let col = x.max(0) as usize; (col, row) } let cursor_position = compute_cursor_after_printing_x_columns( cursor_position_after_printing_prompt.0, cursor_position_after_printing_prompt.1, cursor_x_pos, screen_size.cols, ); for ele in elements { changes.add(ele); } let cursor_after_line_render = changes.current_cursor_position(); if cursor_after_line_render.0 == screen_size.cols { // If the cursor position remains in the first column // then the renderer may still consider itself to be on // the prior line; force out an additional character to force // it to apply wrapping/flush. changes.add(" "); } if let EditorState::Editing = &self.state { let preview_elements = host.render_preview(line_to_display); if !preview_elements.is_empty() { // Preview starts from a new line. changes.add("\r\n"); // Do not be affected by attributes set by highlight_line. changes.add(Change::AllAttributes(Default::default())); for ele in preview_elements { changes.add(ele); } } } if let EditorState::Searching { style, direction, .. } = &self.state { // We want to draw the search state below the input area let label = match (style, direction) { (SearchStyle::Substring, SearchDirection::Backwards) => "bck-i-search", (SearchStyle::Substring, SearchDirection::Forwards) => "fwd-i-search", }; // Do not be affected by attributes set by previous lines. changes.add(Change::AllAttributes(Default::default())); // We position the actual cursor on the matching portion of // the text in the line editing area, but since the input // is drawn here, we render an `_` to indicate where the input // position really is. changes.add(format!("\r\n{}: {}_", label, self.line.get_line())); } // Add some debugging status at the bottom /* changes.add(format!( "\r\n{:?} {:?}", cursor_position, (changes.cursor_x, changes.cursor_y) )); */ let render_height = changes.render_height(); changes.move_to(cursor_position); let mut changes = changes.consume(); if let Some(start) = self.move_to_editor_start.take() { changes.insert(0, start); } self.terminal.render(&changes)?; self.move_to_editor_start.replace(Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(-1 * cursor_position.1), }); self.move_to_editor_end.replace(Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1 + render_height as isize - cursor_position.1), }); Ok(()) } pub fn set_prompt(&mut self, prompt: &str) { self.prompt = prompt.to_owned(); } /// Enter line editing mode. /// Control is not returned to the caller until a line has been /// accepted, or until an error is detected. /// Returns Ok(None) if the editor was cancelled eg: via CTRL-C. pub fn read_line(&mut self, host: &mut dyn LineEditorHost) -> Result> { self.read_line_with_optional_initial_value(host, None) } pub fn read_line_with_optional_initial_value( &mut self, host: &mut dyn LineEditorHost, initial_value: Option<&str>, ) -> Result> { ensure!( self.state == EditorState::Inactive, "recursive call to read_line!" ); // Clear out the last render info so that we don't over-compensate // on the first call to render(). self.move_to_editor_end.take(); self.move_to_editor_start.take(); self.terminal.set_raw_mode()?; self.state = EditorState::Editing; let res = self.read_line_impl(host, initial_value); self.state = EditorState::Inactive; if let Some(move_end) = self.move_to_editor_end.take() { self.terminal .render(&[move_end, Change::ClearToEndOfScreen(Default::default())])?; } self.terminal.flush()?; self.terminal.set_cooked_mode()?; res } fn resolve_action( &mut self, event: &InputEvent, host: &mut dyn LineEditorHost, ) -> Option { if let Some(action) = host.resolve_action(event, self) { return Some(action); } match event { InputEvent::Key(KeyEvent { key: KeyCode::Char('C'), modifiers: Modifiers::CTRL, }) => Some(Action::Cancel), InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::NONE, }) => Some(Action::Complete), InputEvent::Key(KeyEvent { key: KeyCode::Char('D'), modifiers: Modifiers::CTRL, }) => Some(Action::EndOfFile), InputEvent::Key(KeyEvent { key: KeyCode::Char('J'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Char('M'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::NONE, }) => Some(Action::AcceptLine), InputEvent::Key(KeyEvent { key: KeyCode::Char('H'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::NONE, }) => Some(Action::Kill(Movement::BackwardChar(1))), InputEvent::Key(KeyEvent { key: KeyCode::Delete, modifiers: Modifiers::NONE, }) => Some(Action::KillAndMove( Movement::ForwardChar(1), Movement::None, )), InputEvent::Key(KeyEvent { key: KeyCode::Char('P'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::UpArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationUpArrow, modifiers: Modifiers::NONE, }) => Some(Action::HistoryPrevious), InputEvent::Key(KeyEvent { key: KeyCode::Char('N'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::DownArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationDownArrow, modifiers: Modifiers::NONE, }) => Some(Action::HistoryNext), InputEvent::Key(KeyEvent { key: KeyCode::Char('B'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationLeftArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::LeftArrow, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::BackwardChar(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('W'), modifiers: Modifiers::CTRL, }) => Some(Action::Kill(Movement::BackwardWord(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('b'), modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::LeftArrow, modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationLeftArrow, modifiers: Modifiers::ALT, }) => Some(Action::Move(Movement::BackwardWord(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('f'), modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::RightArrow, modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationRightArrow, modifiers: Modifiers::ALT, }) => Some(Action::Move(Movement::ForwardWord(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('A'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Home, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::StartOfLine)), InputEvent::Key(KeyEvent { key: KeyCode::Char('E'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::End, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::EndOfLine)), InputEvent::Key(KeyEvent { key: KeyCode::Char('F'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::RightArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationRightArrow, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::ForwardChar(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char(c), modifiers: Modifiers::SHIFT, }) | InputEvent::Key(KeyEvent { key: KeyCode::Char(c), modifiers: Modifiers::NONE, }) => Some(Action::InsertChar(1, *c)), InputEvent::Paste(text) => Some(Action::InsertText(1, text.clone())), InputEvent::Key(KeyEvent { key: KeyCode::Char('L'), modifiers: Modifiers::CTRL, }) => Some(Action::Repaint), InputEvent::Key(KeyEvent { key: KeyCode::Char('K'), modifiers: Modifiers::CTRL, }) => Some(Action::Kill(Movement::EndOfLine)), InputEvent::Key(KeyEvent { key: KeyCode::Char('R'), modifiers: Modifiers::CTRL, }) => Some(Action::HistoryIncSearchBackwards), // This is the common binding for forwards, but it is usually // masked by the stty stop setting InputEvent::Key(KeyEvent { key: KeyCode::Char('S'), modifiers: Modifiers::CTRL, }) => Some(Action::HistoryIncSearchForwards), _ => None, } } fn kill_text(&mut self, kill_movement: Movement, move_movement: Movement) { self.clear_completion(); self.line.kill_text(kill_movement, move_movement); } fn clear_completion(&mut self) { self.completion = None; } fn cancel_search_state(&mut self) { if let EditorState::Searching { matching_line, cursor, .. } = &self.state { self.line.set_line_and_cursor(matching_line, *cursor); self.state = EditorState::Editing; } } /// Returns the current line and cursor position. /// You don't normally need to call this unless you are defining /// a custom editor operation on the line buffer contents. /// The cursor position is the byte index into the line UTF-8 bytes. pub fn get_line_and_cursor(&mut self) -> (&str, usize) { (self.line.get_line(), self.line.get_cursor()) } /// Sets the current line and cursor position. /// You don't normally need to call this unless you are defining /// a custom editor operation on the line buffer contents. /// The cursor position is the byte index into the line UTF-8 bytes. /// Panics: the cursor must be the first byte in a UTF-8 code point /// sequence or the end of the provided line. pub fn set_line_and_cursor(&mut self, line: &str, cursor: usize) { self.line.set_line_and_cursor(line, cursor); } /// Call this after changing modifying the line buffer. /// If the editor is in search mode this will update the search /// results, otherwise it will be a NOP. fn reapply_search_pattern(&mut self, host: &mut dyn LineEditorHost) { if let EditorState::Searching { style, direction, matching_line, cursor, } = &self.state { // We always start again from the bottom self.history_pos.take(); let history_pos = match host.history().last() { Some(p) => p, None => { // TODO: there's no way we can match anything. // Generate a failed match result? return; } }; let last_matching_line; let last_cursor; if let Some(result) = host.history() .search(history_pos, *style, *direction, self.line.get_line()) { self.history_pos.replace(result.idx); last_matching_line = result.line.to_string(); last_cursor = result.cursor; } else { last_matching_line = matching_line.clone(); last_cursor = *cursor; } self.state = EditorState::Searching { style: *style, direction: *direction, matching_line: last_matching_line, cursor: last_cursor, }; } } fn trigger_search( &mut self, style: SearchStyle, direction: SearchDirection, host: &mut dyn LineEditorHost, ) { self.clear_completion(); if let EditorState::Searching { .. } = &self.state { // Already searching } else { // Not yet searching, so we start a new search // with an empty pattern self.line.clear(); self.history_pos.take(); } let history_pos = match self.history_pos { Some(p) => match direction.next(p) { Some(p) => p, None => return, }, None => match host.history().last() { Some(p) => p, None => { // TODO: there's no way we can match anything. // Generate a failed match result? return; } }, }; let search_result = host.history() .search(history_pos, style, direction, self.line.get_line()); let last_matching_line; let last_cursor; if let Some(result) = search_result { self.history_pos.replace(result.idx); last_matching_line = result.line.to_string(); last_cursor = result.cursor; } else if let EditorState::Searching { matching_line, cursor, .. } = &self.state { last_matching_line = matching_line.clone(); last_cursor = *cursor; } else { last_matching_line = String::new(); last_cursor = 0; } self.state = EditorState::Searching { style, direction, matching_line: last_matching_line, cursor: last_cursor, }; } /// Applies the effect of the specified action to the line editor. /// You don't normally need to call this unless you are defining /// custom key mapping or custom actions in your embedding application. pub fn apply_action(&mut self, host: &mut dyn LineEditorHost, action: Action) -> Result<()> { // When searching, reinterpret history next/prev as repeated // search actions in the appropriate direction let action = match (action, &self.state) { ( Action::HistoryPrevious, EditorState::Searching { style: SearchStyle::Substring, .. }, ) => Action::HistoryIncSearchBackwards, ( Action::HistoryNext, EditorState::Searching { style: SearchStyle::Substring, .. }, ) => Action::HistoryIncSearchForwards, (action, _) => action, }; match action { Action::Cancel => self.state = EditorState::Cancelled, Action::NoAction => {} Action::AcceptLine => { // Make sure that hitting Enter for a line that // shows in the incremental search causes that // line to be accepted, rather than the search pattern! self.cancel_search_state(); self.state = EditorState::Accepted; } Action::EndOfFile => { return Err( std::io::Error::new(std::io::ErrorKind::UnexpectedEof, "End Of File").into(), ) } Action::Kill(movement) => { self.kill_text(movement, movement); self.reapply_search_pattern(host); } Action::KillAndMove(kill_movement, move_movement) => { self.kill_text(kill_movement, move_movement); self.reapply_search_pattern(host); } Action::Move(movement) => { self.clear_completion(); self.cancel_search_state(); self.line.exec_movement(movement); } Action::InsertChar(rep, c) => { self.clear_completion(); for _ in 0..rep { self.line.insert_char(c); } self.reapply_search_pattern(host); } Action::InsertText(rep, text) => { self.clear_completion(); for _ in 0..rep { self.line.insert_text(&text); } self.reapply_search_pattern(host); } Action::Repaint => { self.terminal .render(&[Change::ClearScreen(Default::default())])?; } Action::HistoryPrevious => { self.clear_completion(); self.cancel_search_state(); if let Some(cur_pos) = self.history_pos.as_ref() { let prior_idx = cur_pos.saturating_sub(1); if let Some(prior) = host.history().get(prior_idx) { self.history_pos = Some(prior_idx); self.line.set_line_and_cursor(&prior, prior.len()); } } else if let Some(last) = host.history().last() { self.bottom_line = Some(self.line.get_line().to_string()); self.history_pos = Some(last); let line = host .history() .get(last) .expect("History::last and History::get to be consistent"); self.line.set_line_and_cursor(&line, line.len()) } } Action::HistoryNext => { self.clear_completion(); self.cancel_search_state(); if let Some(cur_pos) = self.history_pos.as_ref() { let next_idx = cur_pos.saturating_add(1); if let Some(next) = host.history().get(next_idx) { self.history_pos = Some(next_idx); self.line.set_line_and_cursor(&next, next.len()); } else if let Some(bottom) = self.bottom_line.take() { self.line.set_line_and_cursor(&bottom, bottom.len()); } else { self.line.clear(); } } } Action::HistoryIncSearchBackwards => { self.trigger_search(SearchStyle::Substring, SearchDirection::Backwards, host); } Action::HistoryIncSearchForwards => { self.trigger_search(SearchStyle::Substring, SearchDirection::Forwards, host); } Action::Complete => { self.cancel_search_state(); if self.completion.is_none() { let candidates = host.complete(self.line.get_line(), self.line.get_cursor()); if !candidates.is_empty() { let state = CompletionState { candidates, index: 0, original_line: self.line.get_line().to_string(), original_cursor: self.line.get_cursor(), }; let (cursor, line) = state.current(); self.line.set_line_and_cursor(&line, cursor); // If there is only a single completion then don't // leave us in a state where we just cycle on the // same completion over and over. if state.candidates.len() > 1 { self.completion = Some(state); } } } else if let Some(state) = self.completion.as_mut() { state.next(); let (cursor, line) = state.current(); self.line.set_line_and_cursor(&line, cursor); } } } Ok(()) } fn read_line_impl( &mut self, host: &mut dyn LineEditorHost, initial_value: Option<&str>, ) -> Result> { self.line.clear(); if let Some(value) = initial_value { self.line.set_line_and_cursor(value, value.len()); } self.history_pos = None; self.bottom_line = None; self.clear_completion(); self.render(host)?; while let Some(event) = self.terminal.poll_input(None)? { if let Some(action) = self.resolve_action(&event, host) { self.apply_action(host, action)?; // Editor state might have changed. Re-render to clear // preview or highlight lines differently. self.render(host)?; match self.state { EditorState::Searching { .. } | EditorState::Editing => {} EditorState::Cancelled => return Ok(None), EditorState::Accepted => return Ok(Some(self.line.get_line().to_string())), EditorState::Inactive => bail!("editor is inactive during read line!?"), } } else { self.render(host)?; } } Ok(Some(self.line.get_line().to_string())) } } /// Create a `Terminal` with the recommended settings for use with /// a `LineEditor`. pub fn line_editor_terminal() -> Result { let hints = ProbeHints::new_from_env().mouse_reporting(Some(false)); let caps = Capabilities::new_with_hints(hints)?; new_terminal(caps) } termwiz-0.23.3/src/macros.rs000064400000000000000000000012061046102023000140320ustar 00000000000000#[doc(hidden)] #[macro_export] macro_rules! builder { ( $( #[ $( $meta:tt )* ] )* $vis:vis struct $name:ident { $( $( #[doc=$doc:expr] )* $field:ident : $type:ty, )* } ) => { $( #[ $( $meta )* ] )* $vis struct $name { $( $( #[doc=$doc] )* $field : $type, )* } impl $name { $( pub fn $field(mut self, value: $type) -> Self { self.$field = value; self } )* } } } termwiz-0.23.3/src/nerdfonts.rs000064400000000000000000000005311046102023000145500ustar 00000000000000use std::collections::HashMap; lazy_static::lazy_static! { pub static ref NERD_FONTS: HashMap<&'static str, char> = build_map(); } pub use crate::nerdfonts_data::NERD_FONT_GLYPHS; fn build_map() -> HashMap<&'static str, char> { crate::nerdfonts_data::NERD_FONT_GLYPHS .iter() .map(|tuple| *tuple) .collect() } termwiz-0.23.3/src/nerdfonts_data.rs000064400000000000000000030645201046102023000155540ustar 00000000000000//! Data mapping nerd font symbol names to their char codepoints //! This file was generated by running: //! cd ../codegen ; cargo run pub const NERD_FONT_GLYPHS: &[(&str, char)] = &[ ("cod_account", '\u{eb99}'), //  ("cod_activate_breakpoints", '\u{ea97}'), //  ("cod_add", '\u{ea60}'), //  ("cod_archive", '\u{ea98}'), //  ("cod_arrow_both", '\u{ea99}'), //  ("cod_arrow_circle_down", '\u{ebfc}'), //  ("cod_arrow_circle_left", '\u{ebfd}'), //  ("cod_arrow_circle_right", '\u{ebfe}'), //  ("cod_arrow_circle_up", '\u{ebff}'), //  ("cod_arrow_down", '\u{ea9a}'), //  ("cod_arrow_left", '\u{ea9b}'), //  ("cod_arrow_right", '\u{ea9c}'), //  ("cod_arrow_small_down", '\u{ea9d}'), //  ("cod_arrow_small_left", '\u{ea9e}'), //  ("cod_arrow_small_right", '\u{ea9f}'), //  ("cod_arrow_small_up", '\u{eaa0}'), //  ("cod_arrow_swap", '\u{ebcb}'), //  ("cod_arrow_up", '\u{eaa1}'), //  ("cod_azure", '\u{ebd8}'), //  ("cod_azure_devops", '\u{ebe8}'), //  ("cod_beaker", '\u{ea79}'), //  ("cod_beaker_stop", '\u{ebe1}'), //  ("cod_bell", '\u{eaa2}'), //  ("cod_bell_dot", '\u{eb9a}'), //  ("cod_bell_slash", '\u{ec08}'), //  ("cod_bell_slash_dot", '\u{ec09}'), //  ("cod_blank", '\u{ec03}'), //  ("cod_bold", '\u{eaa3}'), //  ("cod_book", '\u{eaa4}'), //  ("cod_bookmark", '\u{eaa5}'), //  ("cod_bracket_dot", '\u{ebe5}'), //  ("cod_bracket_error", '\u{ebe6}'), //  ("cod_briefcase", '\u{eaac}'), //  ("cod_broadcast", '\u{eaad}'), //  ("cod_browser", '\u{eaae}'), //  ("cod_bug", '\u{eaaf}'), //  ("cod_calendar", '\u{eab0}'), //  ("cod_call_incoming", '\u{eb92}'), //  ("cod_call_outgoing", '\u{eb93}'), //  ("cod_case_sensitive", '\u{eab1}'), //  ("cod_check", '\u{eab2}'), //  ("cod_check_all", '\u{ebb1}'), //  ("cod_checklist", '\u{eab3}'), //  ("cod_chevron_down", '\u{eab4}'), //  ("cod_chevron_left", '\u{eab5}'), //  ("cod_chevron_right", '\u{eab6}'), //  ("cod_chevron_up", '\u{eab7}'), //  ("cod_chip", '\u{ec19}'), //  ("cod_chrome_close", '\u{eab8}'), //  ("cod_chrome_maximize", '\u{eab9}'), //  ("cod_chrome_minimize", '\u{eaba}'), //  ("cod_chrome_restore", '\u{eabb}'), //  ("cod_circle", '\u{eabc}'), //  ("cod_circle_filled", '\u{ea71}'), //  ("cod_circle_large", '\u{ebb5}'), //  ("cod_circle_large_filled", '\u{ebb4}'), //  ("cod_circle_slash", '\u{eabd}'), //  ("cod_circle_small", '\u{ec07}'), //  ("cod_circle_small_filled", '\u{eb8a}'), //  ("cod_circuit_board", '\u{eabe}'), //  ("cod_clear_all", '\u{eabf}'), //  ("cod_clippy", '\u{eac0}'), //  ("cod_close", '\u{ea76}'), //  ("cod_close_all", '\u{eac1}'), //  ("cod_cloud", '\u{ebaa}'), //  ("cod_cloud_download", '\u{eac2}'), //  ("cod_cloud_upload", '\u{eac3}'), //  ("cod_code", '\u{eac4}'), //  ("cod_coffee", '\u{ec15}'), //  ("cod_collapse_all", '\u{eac5}'), //  ("cod_color_mode", '\u{eac6}'), //  ("cod_combine", '\u{ebb6}'), //  ("cod_comment", '\u{ea6b}'), //  ("cod_comment_discussion", '\u{eac7}'), //  ("cod_comment_draft", '\u{ec0e}'), //  ("cod_comment_unresolved", '\u{ec0a}'), //  ("cod_compass", '\u{ebd5}'), //  ("cod_compass_active", '\u{ebd7}'), //  ("cod_compass_dot", '\u{ebd6}'), //  ("cod_copilot", '\u{ec1e}'), //  ("cod_copy", '\u{ebcc}'), //  ("cod_credit_card", '\u{eac9}'), //  ("cod_dash", '\u{eacc}'), //  ("cod_dashboard", '\u{eacd}'), //  ("cod_database", '\u{eace}'), //  ("cod_debug", '\u{ead8}'), //  ("cod_debug_all", '\u{ebdc}'), //  ("cod_debug_alt", '\u{eb91}'), //  ("cod_debug_alt_small", '\u{eba8}'), //  ("cod_debug_breakpoint_conditional", '\u{eaa7}'), //  ("cod_debug_breakpoint_conditional_unverified", '\u{eaa6}'), //  ("cod_debug_breakpoint_data", '\u{eaa9}'), //  ("cod_debug_breakpoint_data_unverified", '\u{eaa8}'), //  ("cod_debug_breakpoint_function", '\u{eb88}'), //  ("cod_debug_breakpoint_function_unverified", '\u{eb87}'), //  ("cod_debug_breakpoint_log", '\u{eaab}'), //  ("cod_debug_breakpoint_log_unverified", '\u{eaaa}'), //  ("cod_debug_breakpoint_unsupported", '\u{eb8c}'), //  ("cod_debug_console", '\u{eb9b}'), //  ("cod_debug_continue", '\u{eacf}'), //  ("cod_debug_continue_small", '\u{ebe0}'), //  ("cod_debug_coverage", '\u{ebdd}'), //  ("cod_debug_disconnect", '\u{ead0}'), //  ("cod_debug_line_by_line", '\u{ebd0}'), //  ("cod_debug_pause", '\u{ead1}'), //  ("cod_debug_rerun", '\u{ebc0}'), //  ("cod_debug_restart", '\u{ead2}'), //  ("cod_debug_restart_frame", '\u{eb90}'), //  ("cod_debug_reverse_continue", '\u{eb8e}'), //  ("cod_debug_stackframe", '\u{eb8b}'), //  ("cod_debug_stackframe_active", '\u{eb89}'), //  ("cod_debug_start", '\u{ead3}'), //  ("cod_debug_step_back", '\u{eb8f}'), //  ("cod_debug_step_into", '\u{ead4}'), //  ("cod_debug_step_out", '\u{ead5}'), //  ("cod_debug_step_over", '\u{ead6}'), //  ("cod_debug_stop", '\u{ead7}'), //  ("cod_desktop_download", '\u{ea78}'), //  ("cod_device_camera", '\u{eada}'), //  ("cod_device_camera_video", '\u{ead9}'), //  ("cod_device_mobile", '\u{eadb}'), //  ("cod_diff", '\u{eae1}'), //  ("cod_diff_added", '\u{eadc}'), //  ("cod_diff_ignored", '\u{eadd}'), //  ("cod_diff_modified", '\u{eade}'), //  ("cod_diff_removed", '\u{eadf}'), //  ("cod_diff_renamed", '\u{eae0}'), //  ("cod_discard", '\u{eae2}'), //  ("cod_edit", '\u{ea73}'), //  ("cod_editor_layout", '\u{eae3}'), //  ("cod_ellipsis", '\u{ea7c}'), //  ("cod_empty_window", '\u{eae4}'), //  ("cod_error", '\u{ea87}'), //  ("cod_error_small", '\u{ebfb}'), //  ("cod_exclude", '\u{eae5}'), //  ("cod_expand_all", '\u{eb95}'), //  ("cod_export", '\u{ebac}'), //  ("cod_extensions", '\u{eae6}'), //  ("cod_eye", '\u{ea70}'), //  ("cod_eye_closed", '\u{eae7}'), //  ("cod_feedback", '\u{eb96}'), //  ("cod_file", '\u{ea7b}'), //  ("cod_file_binary", '\u{eae8}'), //  ("cod_file_code", '\u{eae9}'), //  ("cod_file_media", '\u{eaea}'), //  ("cod_file_pdf", '\u{eaeb}'), //  ("cod_file_submodule", '\u{eaec}'), //  ("cod_file_symlink_directory", '\u{eaed}'), //  ("cod_file_symlink_file", '\u{eaee}'), //  ("cod_file_zip", '\u{eaef}'), //  ("cod_files", '\u{eaf0}'), //  ("cod_filter", '\u{eaf1}'), //  ("cod_filter_filled", '\u{ebce}'), //  ("cod_flame", '\u{eaf2}'), //  ("cod_fold", '\u{eaf5}'), //  ("cod_fold_down", '\u{eaf3}'), //  ("cod_fold_up", '\u{eaf4}'), //  ("cod_folder", '\u{ea83}'), //  ("cod_folder_active", '\u{eaf6}'), //  ("cod_folder_library", '\u{ebdf}'), //  ("cod_folder_opened", '\u{eaf7}'), //  ("cod_game", '\u{ec17}'), //  ("cod_gear", '\u{eaf8}'), //  ("cod_gift", '\u{eaf9}'), //  ("cod_gist_secret", '\u{eafa}'), //  ("cod_git_commit", '\u{eafc}'), //  ("cod_git_compare", '\u{eafd}'), //  ("cod_git_fetch", '\u{ec1d}'), //  ("cod_git_merge", '\u{eafe}'), //  ("cod_git_pull_request", '\u{ea64}'), //  ("cod_git_pull_request_closed", '\u{ebda}'), //  ("cod_git_pull_request_create", '\u{ebbc}'), //  ("cod_git_pull_request_draft", '\u{ebdb}'), //  ("cod_git_pull_request_go_to_changes", '\u{ec0b}'), //  ("cod_git_pull_request_new_changes", '\u{ec0c}'), //  ("cod_github", '\u{ea84}'), //  ("cod_github_action", '\u{eaff}'), //  ("cod_github_alt", '\u{eb00}'), //  ("cod_github_inverted", '\u{eba1}'), //  ("cod_globe", '\u{eb01}'), //  ("cod_go_to_file", '\u{ea94}'), //  ("cod_grabber", '\u{eb02}'), //  ("cod_graph", '\u{eb03}'), //  ("cod_graph_left", '\u{ebad}'), //  ("cod_graph_line", '\u{ebe2}'), //  ("cod_graph_scatter", '\u{ebe3}'), //  ("cod_gripper", '\u{eb04}'), //  ("cod_group_by_ref_type", '\u{eb97}'), //  ("cod_heart", '\u{eb05}'), //  ("cod_heart_filled", '\u{ec04}'), //  ("cod_history", '\u{ea82}'), //  ("cod_home", '\u{eb06}'), //  ("cod_horizontal_rule", '\u{eb07}'), //  ("cod_hubot", '\u{eb08}'), //  ("cod_inbox", '\u{eb09}'), //  ("cod_indent", '\u{ebf9}'), //  ("cod_info", '\u{ea74}'), //  ("cod_insert", '\u{ec11}'), //  ("cod_inspect", '\u{ebd1}'), //  ("cod_issue_draft", '\u{ebd9}'), //  ("cod_issue_reopened", '\u{eb0b}'), //  ("cod_issues", '\u{eb0c}'), //  ("cod_italic", '\u{eb0d}'), //  ("cod_jersey", '\u{eb0e}'), //  ("cod_json", '\u{eb0f}'), //  ("cod_kebab_vertical", '\u{eb10}'), //  ("cod_key", '\u{eb11}'), //  ("cod_law", '\u{eb12}'), //  ("cod_layers", '\u{ebd2}'), //  ("cod_layers_active", '\u{ebd4}'), //  ("cod_layers_dot", '\u{ebd3}'), //  ("cod_layout", '\u{ebeb}'), //  ("cod_layout_activitybar_left", '\u{ebec}'), //  ("cod_layout_activitybar_right", '\u{ebed}'), //  ("cod_layout_centered", '\u{ebf7}'), //  ("cod_layout_menubar", '\u{ebf6}'), //  ("cod_layout_panel", '\u{ebf2}'), //  ("cod_layout_panel_center", '\u{ebef}'), //  ("cod_layout_panel_justify", '\u{ebf0}'), //  ("cod_layout_panel_left", '\u{ebee}'), //  ("cod_layout_panel_off", '\u{ec01}'), //  ("cod_layout_panel_right", '\u{ebf1}'), //  ("cod_layout_sidebar_left", '\u{ebf3}'), //  ("cod_layout_sidebar_left_off", '\u{ec02}'), //  ("cod_layout_sidebar_right", '\u{ebf4}'), //  ("cod_layout_sidebar_right_off", '\u{ec00}'), //  ("cod_layout_statusbar", '\u{ebf5}'), //  ("cod_library", '\u{eb9c}'), //  ("cod_lightbulb", '\u{ea61}'), //  ("cod_lightbulb_autofix", '\u{eb13}'), //  ("cod_link", '\u{eb15}'), //  ("cod_link_external", '\u{eb14}'), //  ("cod_list_filter", '\u{eb83}'), //  ("cod_list_flat", '\u{eb84}'), //  ("cod_list_ordered", '\u{eb16}'), //  ("cod_list_selection", '\u{eb85}'), //  ("cod_list_tree", '\u{eb86}'), //  ("cod_list_unordered", '\u{eb17}'), //  ("cod_live_share", '\u{eb18}'), //  ("cod_loading", '\u{eb19}'), //  ("cod_location", '\u{eb1a}'), //  ("cod_lock", '\u{ea75}'), //  ("cod_lock_small", '\u{ebe7}'), //  ("cod_magnet", '\u{ebae}'), //  ("cod_mail", '\u{eb1c}'), //  ("cod_mail_read", '\u{eb1b}'), //  ("cod_map", '\u{ec05}'), //  ("cod_map_filled", '\u{ec06}'), //  ("cod_markdown", '\u{eb1d}'), //  ("cod_megaphone", '\u{eb1e}'), //  ("cod_mention", '\u{eb1f}'), //  ("cod_menu", '\u{eb94}'), //  ("cod_merge", '\u{ebab}'), //  ("cod_mic", '\u{ec12}'), //  ("cod_mic_filled", '\u{ec1c}'), //  ("cod_milestone", '\u{eb20}'), //  ("cod_mirror", '\u{ea69}'), //  ("cod_mortar_board", '\u{eb21}'), //  ("cod_move", '\u{eb22}'), //  ("cod_multiple_windows", '\u{eb23}'), //  ("cod_music", '\u{ec1b}'), //  ("cod_mute", '\u{eb24}'), //  ("cod_new_file", '\u{ea7f}'), //  ("cod_new_folder", '\u{ea80}'), //  ("cod_newline", '\u{ebea}'), //  ("cod_no_newline", '\u{eb25}'), //  ("cod_note", '\u{eb26}'), //  ("cod_notebook", '\u{ebaf}'), //  ("cod_notebook_template", '\u{ebbf}'), //  ("cod_octoface", '\u{eb27}'), //  ("cod_open_preview", '\u{eb28}'), //  ("cod_organization", '\u{ea7e}'), //  ("cod_output", '\u{eb9d}'), //  ("cod_package", '\u{eb29}'), //  ("cod_paintcan", '\u{eb2a}'), //  ("cod_pass", '\u{eba4}'), //  ("cod_pass_filled", '\u{ebb3}'), //  ("cod_person", '\u{ea67}'), //  ("cod_person_add", '\u{ebcd}'), //  ("cod_piano", '\u{ec1a}'), //  ("cod_pie_chart", '\u{ebe4}'), //  ("cod_pin", '\u{eb2b}'), //  ("cod_pinned", '\u{eba0}'), //  ("cod_pinned_dirty", '\u{ebb2}'), //  ("cod_play", '\u{eb2c}'), //  ("cod_play_circle", '\u{eba6}'), //  ("cod_plug", '\u{eb2d}'), //  ("cod_preserve_case", '\u{eb2e}'), //  ("cod_preview", '\u{eb2f}'), //  ("cod_primitive_square", '\u{ea72}'), //  ("cod_project", '\u{eb30}'), //  ("cod_pulse", '\u{eb31}'), //  ("cod_question", '\u{eb32}'), //  ("cod_quote", '\u{eb33}'), //  ("cod_radio_tower", '\u{eb34}'), //  ("cod_reactions", '\u{eb35}'), //  ("cod_record", '\u{eba7}'), //  ("cod_record_keys", '\u{ea65}'), //  ("cod_record_small", '\u{ebfa}'), //  ("cod_redo", '\u{ebb0}'), //  ("cod_references", '\u{eb36}'), //  ("cod_refresh", '\u{eb37}'), //  ("cod_regex", '\u{eb38}'), //  ("cod_remote", '\u{eb3a}'), //  ("cod_remote_explorer", '\u{eb39}'), //  ("cod_remove", '\u{eb3b}'), //  ("cod_replace", '\u{eb3d}'), //  ("cod_replace_all", '\u{eb3c}'), //  ("cod_reply", '\u{ea7d}'), //  ("cod_repo", '\u{ea62}'), //  ("cod_repo_clone", '\u{eb3e}'), //  ("cod_repo_force_push", '\u{eb3f}'), //  ("cod_repo_forked", '\u{ea63}'), //  ("cod_repo_pull", '\u{eb40}'), //  ("cod_repo_push", '\u{eb41}'), //  ("cod_report", '\u{eb42}'), //  ("cod_request_changes", '\u{eb43}'), //  ("cod_rocket", '\u{eb44}'), //  ("cod_root_folder", '\u{eb46}'), //  ("cod_root_folder_opened", '\u{eb45}'), //  ("cod_rss", '\u{eb47}'), //  ("cod_ruby", '\u{eb48}'), //  ("cod_run_above", '\u{ebbd}'), //  ("cod_run_all", '\u{eb9e}'), //  ("cod_run_below", '\u{ebbe}'), //  ("cod_run_errors", '\u{ebde}'), //  ("cod_save", '\u{eb4b}'), //  ("cod_save_all", '\u{eb49}'), //  ("cod_save_as", '\u{eb4a}'), //  ("cod_screen_full", '\u{eb4c}'), //  ("cod_screen_normal", '\u{eb4d}'), //  ("cod_search", '\u{ea6d}'), //  ("cod_search_fuzzy", '\u{ec0d}'), //  ("cod_search_stop", '\u{eb4e}'), //  ("cod_send", '\u{ec0f}'), //  ("cod_server", '\u{eb50}'), //  ("cod_server_environment", '\u{eba3}'), //  ("cod_server_process", '\u{eba2}'), //  ("cod_settings", '\u{eb52}'), //  ("cod_settings_gear", '\u{eb51}'), //  ("cod_shield", '\u{eb53}'), //  ("cod_sign_in", '\u{ea6f}'), //  ("cod_sign_out", '\u{ea6e}'), //  ("cod_smiley", '\u{eb54}'), //  ("cod_snake", '\u{ec16}'), //  ("cod_sort_precedence", '\u{eb55}'), //  ("cod_source_control", '\u{ea68}'), //  ("cod_sparkle", '\u{ec10}'), //  ("cod_split_horizontal", '\u{eb56}'), //  ("cod_split_vertical", '\u{eb57}'), //  ("cod_squirrel", '\u{eb58}'), //  ("cod_star_empty", '\u{ea6a}'), //  ("cod_star_full", '\u{eb59}'), //  ("cod_star_half", '\u{eb5a}'), //  ("cod_stop_circle", '\u{eba5}'), //  ("cod_symbol_array", '\u{ea8a}'), //  ("cod_symbol_boolean", '\u{ea8f}'), //  ("cod_symbol_class", '\u{eb5b}'), //  ("cod_symbol_color", '\u{eb5c}'), //  ("cod_symbol_constant", '\u{eb5d}'), //  ("cod_symbol_enum", '\u{ea95}'), //  ("cod_symbol_enum_member", '\u{eb5e}'), //  ("cod_symbol_event", '\u{ea86}'), //  ("cod_symbol_field", '\u{eb5f}'), //  ("cod_symbol_file", '\u{eb60}'), //  ("cod_symbol_interface", '\u{eb61}'), //  ("cod_symbol_key", '\u{ea93}'), //  ("cod_symbol_keyword", '\u{eb62}'), //  ("cod_symbol_method", '\u{ea8c}'), //  ("cod_symbol_misc", '\u{eb63}'), //  ("cod_symbol_namespace", '\u{ea8b}'), //  ("cod_symbol_numeric", '\u{ea90}'), //  ("cod_symbol_operator", '\u{eb64}'), //  ("cod_symbol_parameter", '\u{ea92}'), //  ("cod_symbol_property", '\u{eb65}'), //  ("cod_symbol_ruler", '\u{ea96}'), //  ("cod_symbol_snippet", '\u{eb66}'), //  ("cod_symbol_string", '\u{eb8d}'), //  ("cod_symbol_structure", '\u{ea91}'), //  ("cod_symbol_variable", '\u{ea88}'), //  ("cod_sync", '\u{ea77}'), //  ("cod_sync_ignored", '\u{eb9f}'), //  ("cod_table", '\u{ebb7}'), //  ("cod_tag", '\u{ea66}'), //  ("cod_target", '\u{ebf8}'), //  ("cod_tasklist", '\u{eb67}'), //  ("cod_telescope", '\u{eb68}'), //  ("cod_terminal", '\u{ea85}'), //  ("cod_terminal_bash", '\u{ebca}'), //  ("cod_terminal_cmd", '\u{ebc4}'), //  ("cod_terminal_debian", '\u{ebc5}'), //  ("cod_terminal_linux", '\u{ebc6}'), //  ("cod_terminal_powershell", '\u{ebc7}'), //  ("cod_terminal_tmux", '\u{ebc8}'), //  ("cod_terminal_ubuntu", '\u{ebc9}'), //  ("cod_text_size", '\u{eb69}'), //  ("cod_three_bars", '\u{eb6a}'), //  ("cod_thumbsdown", '\u{eb6b}'), //  ("cod_thumbsdown_filled", '\u{ec13}'), //  ("cod_thumbsup", '\u{eb6c}'), //  ("cod_thumbsup_filled", '\u{ec14}'), //  ("cod_tools", '\u{eb6d}'), //  ("cod_trash", '\u{ea81}'), //  ("cod_triangle_down", '\u{eb6e}'), //  ("cod_triangle_left", '\u{eb6f}'), //  ("cod_triangle_right", '\u{eb70}'), //  ("cod_triangle_up", '\u{eb71}'), //  ("cod_twitter", '\u{eb72}'), //  ("cod_type_hierarchy", '\u{ebb9}'), //  ("cod_type_hierarchy_sub", '\u{ebba}'), //  ("cod_type_hierarchy_super", '\u{ebbb}'), //  ("cod_unfold", '\u{eb73}'), //  ("cod_ungroup_by_ref_type", '\u{eb98}'), //  ("cod_unlock", '\u{eb74}'), //  ("cod_unmute", '\u{eb75}'), //  ("cod_unverified", '\u{eb76}'), //  ("cod_variable_group", '\u{ebb8}'), //  ("cod_verified", '\u{eb77}'), //  ("cod_verified_filled", '\u{ebe9}'), //  ("cod_versions", '\u{eb78}'), //  ("cod_vm", '\u{ea7a}'), //  ("cod_vm_active", '\u{eb79}'), //  ("cod_vm_connect", '\u{eba9}'), //  ("cod_vm_outline", '\u{eb7a}'), //  ("cod_vm_running", '\u{eb7b}'), //  ("cod_vr", '\u{ec18}'), //  ("cod_wand", '\u{ebcf}'), //  ("cod_warning", '\u{ea6c}'), //  ("cod_watch", '\u{eb7c}'), //  ("cod_whitespace", '\u{eb7d}'), //  ("cod_whole_word", '\u{eb7e}'), //  ("cod_window", '\u{eb7f}'), //  ("cod_word_wrap", '\u{eb80}'), //  ("cod_workspace_trusted", '\u{ebc1}'), //  ("cod_workspace_unknown", '\u{ebc3}'), //  ("cod_workspace_untrusted", '\u{ebc2}'), //  ("cod_zoom_in", '\u{eb81}'), //  ("cod_zoom_out", '\u{eb82}'), //  ("custom_ada", '\u{e6b5}'), //  ("custom_asm", '\u{e6ab}'), //  ("custom_astro", '\u{e6b3}'), //  ("custom_bazel", '\u{e63a}'), //  ("custom_c", '\u{e61e}'), //  ("custom_chuck", '\u{e6b6}'), //  ("custom_common_lisp", '\u{e6b0}'), //  ("custom_cpp", '\u{e61d}'), //  ("custom_crystal", '\u{e62f}'), //  ("custom_default", '\u{e612}'), //  ("custom_electron", '\u{e62e}'), //  ("custom_elixir", '\u{e62d}'), //  ("custom_elm", '\u{e62c}'), //  ("custom_emacs", '\u{e632}'), //  ("custom_fennel", '\u{e6af}'), //  ("custom_firebase", '\u{e657}'), //  ("custom_folder", '\u{e5ff}'), //  ("custom_folder_config", '\u{e5fc}'), //  ("custom_folder_git", '\u{e5fb}'), //  ("custom_folder_git_branch", '\u{e5fb}'), //  ("custom_folder_github", '\u{e5fd}'), //  ("custom_folder_npm", '\u{e5fa}'), //  ("custom_folder_oct", '\u{e6ad}'), //  ("custom_folder_open", '\u{e5fe}'), //  ("custom_go", '\u{e626}'), //  ("custom_home", '\u{e617}'), //  ("custom_kotlin", '\u{e634}'), //  ("custom_msdos", '\u{e629}'), //  ("custom_neovim", '\u{e6ae}'), //  ("custom_orgmode", '\u{e633}'), //  ("custom_play_arrow", '\u{e602}'), //  ("custom_prettier", '\u{e6b4}'), //  ("custom_puppet", '\u{e631}'), //  ("custom_purescript", '\u{e630}'), //  ("custom_ruby", '\u{e605}'), //  ("custom_scheme", '\u{e6b1}'), //  ("custom_toml", '\u{e6b2}'), //  ("custom_v_lang", '\u{e6ac}'), //  ("custom_vim", '\u{e62b}'), //  ("custom_vitruvian", '\u{e6b7}'), //  ("custom_windows", '\u{e62a}'), //  ("dev_aarch64", '\u{e700}'), //  ("dev_adonisjs", '\u{e701}'), //  ("dev_aftereffects", '\u{e705}'), //  ("dev_akka", '\u{e708}'), //  ("dev_algolia", '\u{e70a}'), //  ("dev_alpinejs", '\u{e713}'), //  ("dev_amazonwebservices", '\u{e7ad}'), //  ("dev_anaconda", '\u{e715}'), //  ("dev_android", '\u{e70e}'), //  ("dev_androidstudio", '\u{e71a}'), //  ("dev_angular", '\u{e753}'), //  ("dev_angularjs", '\u{e71c}'), //  ("dev_angularmaterial", '\u{e720}'), //  ("dev_ansible", '\u{e723}'), //  ("dev_antdesign", '\u{e72a}'), //  ("dev_apache", '\u{e72b}'), //  ("dev_apacheairflow", '\u{e72c}'), //  ("dev_apachekafka", '\u{e72e}'), //  ("dev_apachespark", '\u{e72f}'), //  ("dev_apl", '\u{e730}'), //  ("dev_appcelerator", '\u{e7ab}'), //  ("dev_apple", '\u{e711}'), //  ("dev_appwrite", '\u{e731}'), //  ("dev_archlinux", '\u{e732}'), //  ("dev_arduino", '\u{e733}'), //  ("dev_argocd", '\u{e734}'), //  ("dev_astro", '\u{e735}'), //  ("dev_atom", '\u{e764}'), //  ("dev_awk", '\u{e741}'), //  ("dev_aws", '\u{e7ad}'), //  ("dev_axios", '\u{e74f}'), //  ("dev_azure", '\u{e754}'), //  ("dev_azuredevops", '\u{e756}'), //  ("dev_azuresqldatabase", '\u{e75b}'), //  ("dev_babel", '\u{e75d}'), //  ("dev_backbone", '\u{e752}'), //  ("dev_backbonejs", '\u{e752}'), //  ("dev_ballerina", '\u{e75e}'), //  ("dev_bamboo", '\u{e75f}'), //  ("dev_bash", '\u{e760}'), //  ("dev_beats", '\u{e761}'), //  ("dev_behance", '\u{e762}'), //  ("dev_bitbucket", '\u{e703}'), //  ("dev_blazor", '\u{e765}'), //  ("dev_blender", '\u{e766}'), //  ("dev_bootstrap", '\u{e747}'), //  ("dev_bower", '\u{e74d}'), //  ("dev_browserstack", '\u{e76b}'), //  ("dev_bulma", '\u{e76c}'), //  ("dev_bun", '\u{e76f}'), //  ("dev_c", '\u{e771}'), //  ("dev_c_lang", '\u{e771}'), //  ("dev_cairo", '\u{e773}'), //  ("dev_cakephp", '\u{e77a}'), //  ("dev_canva", '\u{e77c}'), //  ("dev_capacitor", '\u{e785}'), //  ("dev_carbon", '\u{e788}'), //  ("dev_cassandra", '\u{e789}'), //  ("dev_centos", '\u{e78a}'), //  ("dev_ceylon", '\u{e78b}'), //  ("dev_chrome", '\u{e743}'), //  ("dev_circleci", '\u{e78c}'), //  ("dev_clarity", '\u{e78d}'), //  ("dev_clion", '\u{e78e}'), //  ("dev_clojure", '\u{e768}'), //  ("dev_clojure_alt", '\u{e76a}'), //  ("dev_clojurescript", '\u{e790}'), //  ("dev_cloudflare", '\u{e792}'), //  ("dev_cloudflareworkers", '\u{e793}'), //  ("dev_cmake", '\u{e794}'), //  ("dev_codeac", '\u{e796}'), //  ("dev_codecov", '\u{e797}'), //  ("dev_codeigniter", '\u{e780}'), //  ("dev_codepen", '\u{e716}'), //  ("dev_coffeescript", '\u{e751}'), //  ("dev_composer", '\u{e783}'), //  ("dev_confluence", '\u{e799}'), //  ("dev_consul", '\u{e79a}'), //  ("dev_contao", '\u{e79b}'), //  ("dev_corejs", '\u{e79d}'), //  ("dev_cosmosdb", '\u{e79f}'), //  ("dev_couchbase", '\u{e7a0}'), //  ("dev_couchdb", '\u{e7a2}'), //  ("dev_cplusplus", '\u{e7a3}'), //  ("dev_crystal", '\u{e7ac}'), //  ("dev_csharp", '\u{e7b2}'), //  ("dev_css3", '\u{e749}'), //  ("dev_css3_full", '\u{e74a}'), //  ("dev_cucumber", '\u{e7b7}'), //  ("dev_cypressio", '\u{e7b9}'), //  ("dev_d3js", '\u{e7bc}'), //  ("dev_dart", '\u{e798}'), //  ("dev_database", '\u{e706}'), //  ("dev_datagrip", '\u{e7bd}'), //  ("dev_dataspell", '\u{e7be}'), //  ("dev_dbeaver", '\u{e7bf}'), //  ("dev_debian", '\u{e77d}'), //  ("dev_denojs", '\u{e7c0}'), //  ("dev_devicon", '\u{e7c1}'), //  ("dev_digital_ocean", '\u{e7ae}'), //  ("dev_digitalocean", '\u{e7ae}'), //  ("dev_discordjs", '\u{e7c2}'), //  ("dev_django", '\u{e71d}'), //  ("dev_djangorest", '\u{e7c3}'), //  ("dev_dlang", '\u{e7af}'), //  ("dev_docker", '\u{e7b0}'), //  ("dev_doctrine", '\u{e774}'), //  ("dev_dotnet", '\u{e77f}'), //  ("dev_dotnetcore", '\u{e7c6}'), //  ("dev_dreamweaver", '\u{e79c}'), //  ("dev_dropbox", '\u{e707}'), //  ("dev_dropwizard", '\u{e7c7}'), //  ("dev_drupal", '\u{e742}'), //  ("dev_dynamodb", '\u{e7c8}'), //  ("dev_eclipse", '\u{e79e}'), //  ("dev_ecto", '\u{e7c9}'), //  ("dev_elasticsearch", '\u{e7ca}'), //  ("dev_electron", '\u{e7cb}'), //  ("dev_eleventy", '\u{e7cc}'), //  ("dev_elixir", '\u{e7cd}'), //  ("dev_elm", '\u{e7ce}'), //  ("dev_emacs", '\u{e7cf}'), //  ("dev_embeddedc", '\u{e7d0}'), //  ("dev_ember", '\u{e71b}'), //  ("dev_envoy", '\u{e7d1}'), //  ("dev_erlang", '\u{e7b1}'), //  ("dev_eslint", '\u{e7d2}'), //  ("dev_express", '\u{e7d3}'), //  ("dev_facebook", '\u{e7d4}'), //  ("dev_fastapi", '\u{e7d5}'), //  ("dev_fastify", '\u{e7d6}'), //  ("dev_faunadb", '\u{e7d7}'), //  ("dev_feathersjs", '\u{e7d8}'), //  ("dev_fedora", '\u{e7d9}'), //  ("dev_figma", '\u{e7da}'), //  ("dev_filezilla", '\u{e7db}'), //  ("dev_firebase", '\u{e787}'), //  ("dev_firefox", '\u{e745}'), //  ("dev_flask", '\u{e7dc}'), //  ("dev_flutter", '\u{e7dd}'), //  ("dev_fortran", '\u{e7de}'), //  ("dev_foundation", '\u{e7df}'), //  ("dev_framermotion", '\u{e7e0}'), //  ("dev_framework7", '\u{e7e1}'), //  ("dev_fsharp", '\u{e7a7}'), //  ("dev_gatling", '\u{e7e2}'), //  ("dev_gatsby", '\u{e7e3}'), //  ("dev_gazebo", '\u{e7e4}'), //  ("dev_gcc", '\u{e7e5}'), //  ("dev_gentoo", '\u{e7e6}'), //  ("dev_ghost", '\u{e71f}'), //  ("dev_ghost_small", '\u{e714}'), //  ("dev_gimp", '\u{e7e7}'), //  ("dev_git", '\u{e702}'), //  ("dev_git_branch", '\u{e725}'), //  ("dev_git_commit", '\u{e729}'), //  ("dev_git_compare", '\u{e728}'), //  ("dev_git_merge", '\u{e727}'), //  ("dev_git_pull_request", '\u{e726}'), //  ("dev_gitbook", '\u{e7e8}'), //  ("dev_github", '\u{e709}'), //  ("dev_github_badge", '\u{e709}'), //  ("dev_github_full", '\u{e717}'), //  ("dev_githubactions", '\u{e7e9}'), //  ("dev_githubcodespaces", '\u{e7ea}'), //  ("dev_gitlab", '\u{e7eb}'), //  ("dev_gitpod", '\u{e7ec}'), //  ("dev_gitter", '\u{e7ed}'), //  ("dev_gnu", '\u{e779}'), //  ("dev_go", '\u{e724}'), //  ("dev_godot", '\u{e7ee}'), //  ("dev_goland", '\u{e7ef}'), //  ("dev_google", '\u{e7f0}'), //  ("dev_googlecloud", '\u{e7f1}'), //  ("dev_gradle", '\u{e7f2}'), //  ("dev_grafana", '\u{e7f3}'), //  ("dev_grails", '\u{e7b3}'), //  ("dev_graphql", '\u{e7f4}'), //  ("dev_groovy", '\u{e775}'), //  ("dev_grpc", '\u{e7f5}'), //  ("dev_grunt", '\u{e74c}'), //  ("dev_gulp", '\u{e763}'), //  ("dev_hadoop", '\u{e7f6}'), //  ("dev_handlebars", '\u{e7f7}'), //  ("dev_hardhat", '\u{e7f8}'), //  ("dev_harvester", '\u{e7f9}'), //  ("dev_haskell", '\u{e777}'), //  ("dev_haxe", '\u{e7fa}'), //  ("dev_helm", '\u{e7fb}'), //  ("dev_heroku", '\u{e77b}'), //  ("dev_hibernate", '\u{e7fc}'), //  ("dev_homebrew", '\u{e7fd}'), //  ("dev_html5", '\u{e736}'), //  ("dev_hugo", '\u{e7fe}'), //  ("dev_ie", '\u{e744}'), //  ("dev_ifttt", '\u{e7ff}'), //  ("dev_illustrator", '\u{e7b4}'), //  ("dev_influxdb", '\u{e800}'), //  ("dev_inkscape", '\u{e801}'), //  ("dev_insomnia", '\u{e802}'), //  ("dev_intellij", '\u{e7b5}'), //  ("dev_ionic", '\u{e7a9}'), //  ("dev_jaegertracing", '\u{e803}'), //  ("dev_jamstack", '\u{e804}'), //  ("dev_jasmine", '\u{e805}'), //  ("dev_java", '\u{e738}'), //  ("dev_javascript", '\u{e781}'), //  ("dev_javascript_alt", '\u{e74e}'), //  ("dev_javascript_badge", '\u{e781}'), //  ("dev_jeet", '\u{e806}'), //  ("dev_jekyll", '\u{e70d}'), //  ("dev_jekyll_small", '\u{e70d}'), //  ("dev_jenkins", '\u{e767}'), //  ("dev_jest", '\u{e807}'), //  ("dev_jetbrains", '\u{e808}'), //  ("dev_jetpackcompose", '\u{e809}'), //  ("dev_jira", '\u{e75c}'), //  ("dev_jiraalign", '\u{e80a}'), //  ("dev_jquery", '\u{e750}'), //  ("dev_json", '\u{e80b}'), //  ("dev_jule", '\u{e80c}'), //  ("dev_julia", '\u{e80d}'), //  ("dev_junit", '\u{e80e}'), //  ("dev_jupyter", '\u{e80f}'), //  ("dev_k3os", '\u{e810}'), //  ("dev_k3s", '\u{e811}'), //  ("dev_k6", '\u{e812}'), //  ("dev_kaggle", '\u{e813}'), //  ("dev_karatelabs", '\u{e814}'), //  ("dev_karma", '\u{e815}'), //  ("dev_kdeneon", '\u{e816}'), //  ("dev_keras", '\u{e817}'), //  ("dev_kibana", '\u{e818}'), //  ("dev_knexjs", '\u{e819}'), //  ("dev_knockout", '\u{e81a}'), //  ("dev_kotlin", '\u{e81b}'), //  ("dev_krakenjs", '\u{e784}'), //  ("dev_krakenjs_badge", '\u{e784}'), //  ("dev_ktor", '\u{e81c}'), //  ("dev_kubernetes", '\u{e81d}'), //  ("dev_labview", '\u{e81e}'), //  ("dev_laravel", '\u{e73f}'), //  ("dev_latex", '\u{e81f}'), //  ("dev_less", '\u{e758}'), //  ("dev_linkedin", '\u{e820}'), //  ("dev_linux", '\u{e712}'), //  ("dev_liquibase", '\u{e821}'), //  ("dev_livewire", '\u{e822}'), //  ("dev_llvm", '\u{e823}'), //  ("dev_lodash", '\u{e824}'), //  ("dev_logstash", '\u{e825}'), //  ("dev_lua", '\u{e826}'), //  ("dev_lumen", '\u{e827}'), //  ("dev_magento", '\u{e740}'), //  ("dev_mariadb", '\u{e828}'), //  ("dev_markdown", '\u{e73e}'), //  ("dev_materializecss", '\u{e7b6}'), //  ("dev_materialui", '\u{e829}'), //  ("dev_matlab", '\u{e82a}'), //  ("dev_matplotlib", '\u{e82b}'), //  ("dev_maven", '\u{e82c}'), //  ("dev_maya", '\u{e82d}'), //  ("dev_meteor", '\u{e7a5}'), //  ("dev_meteorfull", '\u{e7a6}'), //  ("dev_microsoftsqlserver", '\u{e82e}'), //  ("dev_minitab", '\u{e82f}'), //  ("dev_mithril", '\u{e830}'), //  ("dev_mobx", '\u{e831}'), //  ("dev_mocha", '\u{e832}'), //  ("dev_modx", '\u{e833}'), //  ("dev_moleculer", '\u{e834}'), //  ("dev_mongodb", '\u{e7a4}'), //  ("dev_mongoose", '\u{e835}'), //  ("dev_moodle", '\u{e836}'), //  ("dev_mootools_badge", '\u{e78f}'), //  ("dev_mozilla", '\u{e786}'), //  ("dev_msdos", '\u{e837}'), //  ("dev_mysql", '\u{e704}'), //  ("dev_nano", '\u{e838}'), //  ("dev_neo4j", '\u{e839}'), //  ("dev_neovim", '\u{e83a}'), //  ("dev_nestjs", '\u{e83b}'), //  ("dev_netlify", '\u{e83c}'), //  ("dev_networkx", '\u{e83d}'), //  ("dev_nextjs", '\u{e83e}'), //  ("dev_nginx", '\u{e776}'), //  ("dev_ngrx", '\u{e83f}'), //  ("dev_nhibernate", '\u{e840}'), //  ("dev_nim", '\u{e841}'), //  ("dev_nimble", '\u{e842}'), //  ("dev_nixos", '\u{e843}'), //  ("dev_nodejs", '\u{e719}'), //  ("dev_nodejs_small", '\u{e718}'), //  ("dev_nodemon", '\u{e844}'), //  ("dev_nodewebkit", '\u{e845}'), //  ("dev_nomad", '\u{e846}'), //  ("dev_norg", '\u{e847}'), //  ("dev_notion", '\u{e848}'), //  ("dev_npm", '\u{e71e}'), //  ("dev_nuget", '\u{e849}'), //  ("dev_numpy", '\u{e84a}'), //  ("dev_nuxtjs", '\u{e84b}'), //  ("dev_oauth", '\u{e84c}'), //  ("dev_objectivec", '\u{e84d}'), //  ("dev_ocaml", '\u{e84e}'), //  ("dev_ohmyzsh", '\u{e84f}'), //  ("dev_okta", '\u{e850}'), //  ("dev_openal", '\u{e851}'), //  ("dev_openapi", '\u{e852}'), //  ("dev_opencl", '\u{e853}'), //  ("dev_opencv", '\u{e854}'), //  ("dev_opengl", '\u{e855}'), //  ("dev_openstack", '\u{e856}'), //  ("dev_opensuse", '\u{e857}'), //  ("dev_opentelemetry", '\u{e858}'), //  ("dev_opera", '\u{e746}'), //  ("dev_oracle", '\u{e859}'), //  ("dev_ory", '\u{e85a}'), //  ("dev_p5js", '\u{e85b}'), //  ("dev_packer", '\u{e85c}'), //  ("dev_pandas", '\u{e85d}'), //  ("dev_perl", '\u{e769}'), //  ("dev_pfsense", '\u{e85e}'), //  ("dev_phalcon", '\u{e85f}'), //  ("dev_phoenix", '\u{e860}'), //  ("dev_photonengine", '\u{e861}'), //  ("dev_photoshop", '\u{e7b8}'), //  ("dev_php", '\u{e73d}'), //  ("dev_phpstorm", '\u{e862}'), //  ("dev_playwright", '\u{e863}'), //  ("dev_plotly", '\u{e864}'), //  ("dev_pnpm", '\u{e865}'), //  ("dev_podman", '\u{e866}'), //  ("dev_poetry", '\u{e867}'), //  ("dev_polygon", '\u{e868}'), //  ("dev_portainer", '\u{e869}'), //  ("dev_postcss", '\u{e86a}'), //  ("dev_postgresql", '\u{e76e}'), //  ("dev_postman", '\u{e86b}'), //  ("dev_powershell", '\u{e86c}'), //  ("dev_premierepro", '\u{e86d}'), //  ("dev_prisma", '\u{e86e}'), //  ("dev_processing", '\u{e86f}'), //  ("dev_prolog", '\u{e7a1}'), //  ("dev_prometheus", '\u{e870}'), //  ("dev_protractor", '\u{e871}'), //  ("dev_pulsar", '\u{e872}'), //  ("dev_pulumi", '\u{e873}'), //  ("dev_puppeteer", '\u{e874}'), //  ("dev_purescript", '\u{e875}'), //  ("dev_putty", '\u{e876}'), //  ("dev_pycharm", '\u{e877}'), //  ("dev_pypi", '\u{e878}'), //  ("dev_pyscript", '\u{e879}'), //  ("dev_pytest", '\u{e87a}'), //  ("dev_python", '\u{e73c}'), //  ("dev_pytorch", '\u{e87b}'), //  ("dev_qodana", '\u{e87c}'), //  ("dev_qt", '\u{e87d}'), //  ("dev_quarkus", '\u{e87e}'), //  ("dev_quasar", '\u{e87f}'), //  ("dev_qwik", '\u{e880}'), //  ("dev_r", '\u{e881}'), //  ("dev_rabbitmq", '\u{e882}'), //  ("dev_rails", '\u{e73b}'), //  ("dev_railway", '\u{e883}'), //  ("dev_rancher", '\u{e884}'), //  ("dev_raspberry_pi", '\u{e722}'), //  ("dev_reach", '\u{e885}'), //  ("dev_react", '\u{e7ba}'), //  ("dev_reactbootstrap", '\u{e886}'), //  ("dev_reactnavigation", '\u{e887}'), //  ("dev_reactrouter", '\u{e888}'), //  ("dev_readthedocs", '\u{e889}'), //  ("dev_realm", '\u{e88a}'), //  ("dev_rect", '\u{e88b}'), //  ("dev_redhat", '\u{e7bb}'), //  ("dev_redis", '\u{e76d}'), //  ("dev_redux", '\u{e88c}'), //  ("dev_renpy", '\u{e88d}'), //  ("dev_replit", '\u{e88e}'), //  ("dev_requirejs", '\u{e770}'), //  ("dev_rider", '\u{e88f}'), //  ("dev_rocksdb", '\u{e890}'), //  ("dev_rockylinux", '\u{e891}'), //  ("dev_rollup", '\u{e892}'), //  ("dev_ros", '\u{e893}'), //  ("dev_rspec", '\u{e894}'), //  ("dev_rstudio", '\u{e895}'), //  ("dev_ruby", '\u{e739}'), //  ("dev_ruby_on_rails", '\u{e73b}'), //  ("dev_ruby_rough", '\u{e791}'), //  ("dev_rubymine", '\u{e896}'), //  ("dev_rust", '\u{e7a8}'), //  ("dev_rxjs", '\u{e897}'), //  ("dev_safari", '\u{e748}'), //  ("dev_salesforce", '\u{e898}'), //  ("dev_sanity", '\u{e899}'), //  ("dev_sass", '\u{e74b}'), //  ("dev_scala", '\u{e737}'), //  ("dev_scalingo", '\u{e89a}'), //  ("dev_scikitlearn", '\u{e89b}'), //  ("dev_sdl", '\u{e89c}'), //  ("dev_selenium", '\u{e89d}'), //  ("dev_sema", '\u{e89e}'), //  ("dev_sentry", '\u{e89f}'), //  ("dev_sequelize", '\u{e8a0}'), //  ("dev_shopware", '\u{e8a1}'), //  ("dev_shotgrid", '\u{e8a2}'), //  ("dev_sketch", '\u{e8a3}'), //  ("dev_slack", '\u{e8a4}'), //  ("dev_smashing_magazine", '\u{e72d}'), //  ("dev_socketio", '\u{e8a5}'), //  ("dev_solidity", '\u{e8a6}'), //  ("dev_solidjs", '\u{e8a7}'), //  ("dev_sonarqube", '\u{e8a8}'), //  ("dev_sourcetree", '\u{e8a9}'), //  ("dev_spack", '\u{e8aa}'), //  ("dev_splunk", '\u{e8ab}'), //  ("dev_spring", '\u{e8ac}'), //  ("dev_spss", '\u{e8ad}'), //  ("dev_spyder", '\u{e8ae}'), //  ("dev_sqlalchemy", '\u{e8af}'), //  ("dev_sqldeveloper", '\u{e8b0}'), //  ("dev_sqlite", '\u{e7c4}'), //  ("dev_ssh", '\u{e8b1}'), //  ("dev_stackoverflow", '\u{e710}'), //  ("dev_stata", '\u{e8b2}'), //  ("dev_storybook", '\u{e8b3}'), //  ("dev_streamlit", '\u{e8b4}'), //  ("dev_stylus", '\u{e759}'), //  ("dev_sublime", '\u{e7aa}'), //  ("dev_subversion", '\u{e8b5}'), //  ("dev_supabase", '\u{e8b6}'), //  ("dev_svelte", '\u{e8b7}'), //  ("dev_swagger", '\u{e8b8}'), //  ("dev_swift", '\u{e755}'), //  ("dev_swiper", '\u{e8b9}'), //  ("dev_symfony", '\u{e757}'), //  ("dev_symfony_badge", '\u{e757}'), //  ("dev_tailwindcss", '\u{e8ba}'), //  ("dev_tauri", '\u{e8bb}'), //  ("dev_tensorflow", '\u{e8bc}'), //  ("dev_terminal", '\u{e795}'), //  ("dev_terraform", '\u{e8bd}'), //  ("dev_tex", '\u{e8be}'), //  ("dev_thealgorithms", '\u{e8bf}'), //  ("dev_threedsmax", '\u{e8c0}'), //  ("dev_threejs", '\u{e8c1}'), //  ("dev_titaniumsdk", '\u{e8c2}'), //  ("dev_tomcat", '\u{e8c3}'), //  ("dev_tortoisegit", '\u{e8c4}'), //  ("dev_towergit", '\u{e8c5}'), //  ("dev_traefikmesh", '\u{e8c6}'), //  ("dev_traefikproxy", '\u{e8c7}'), //  ("dev_travis", '\u{e77e}'), //  ("dev_trello", '\u{e75a}'), //  ("dev_trpc", '\u{e8c8}'), //  ("dev_twitter", '\u{e8c9}'), //  ("dev_typescript", '\u{e8ca}'), //  ("dev_typo3", '\u{e772}'), //  ("dev_ubuntu", '\u{e73a}'), //  ("dev_uml", '\u{e8cb}'), //  ("dev_unifiedmodelinglanguage", '\u{e8cb}'), //  ("dev_unity", '\u{e721}'), //  ("dev_unity_small", '\u{e721}'), //  ("dev_unix", '\u{e8cc}'), //  ("dev_unrealengine", '\u{e8cd}'), //  ("dev_uwsgi", '\u{e8ce}'), //  ("dev_v8", '\u{e8cf}'), //  ("dev_vagrant", '\u{e8d0}'), //  ("dev_vala", '\u{e8d1}'), //  ("dev_vault", '\u{e8d2}'), //  ("dev_vercel", '\u{e8d3}'), //  ("dev_vertx", '\u{e8d4}'), //  ("dev_vim", '\u{e7c5}'), //  ("dev_visualbasic", '\u{e8d5}'), //  ("dev_visualstudio", '\u{e70c}'), //  ("dev_vite", '\u{e8d6}'), //  ("dev_vitejs", '\u{e8d7}'), //  ("dev_vitess", '\u{e8d8}'), //  ("dev_vitest", '\u{e8d9}'), //  ("dev_vscode", '\u{e8da}'), //  ("dev_vsphere", '\u{e8db}'), //  ("dev_vuejs", '\u{e8dc}'), //  ("dev_vuestorefront", '\u{e8dd}'), //  ("dev_vuetify", '\u{e8de}'), //  ("dev_vyper", '\u{e8df}'), //  ("dev_wasm", '\u{e8e0}'), //  ("dev_webflow", '\u{e8e1}'), //  ("dev_weblate", '\u{e8e2}'), //  ("dev_webpack", '\u{e8e3}'), //  ("dev_webstorm", '\u{e8e4}'), //  ("dev_windows", '\u{e70f}'), //  ("dev_windows11", '\u{e8e5}'), //  ("dev_woocommerce", '\u{e8e6}'), //  ("dev_wordpress", '\u{e70b}'), //  ("dev_xamarin", '\u{e8e7}'), //  ("dev_xcode", '\u{e8e8}'), //  ("dev_xd", '\u{e8e9}'), //  ("dev_xml", '\u{e8ea}'), //  ("dev_yaml", '\u{e8eb}'), //  ("dev_yarn", '\u{e8ec}'), //  ("dev_yii", '\u{e782}'), //  ("dev_yugabytedb", '\u{e8ed}'), //  ("dev_yunohost", '\u{e8ee}'), //  ("dev_zend", '\u{e778}'), //  ("dev_zig", '\u{e8ef}'), //  ("fa_500px", '\u{f26e}'), //  ("fa_accessible_icon", '\u{f29b}'), //  ("fa_accusoft", '\u{f0b7}'), //  ("fa_address_book", '\u{f2b9}'), //  ("fa_address_book_o", '\u{f2ba}'), //  ("fa_address_card", '\u{f2bb}'), //  ("fa_address_card_o", '\u{f2bc}'), //  ("fa_adjust", '\u{f042}'), //  ("fa_adn", '\u{f170}'), //  ("fa_adversal", '\u{f0b8}'), //  ("fa_affiliatetheme", '\u{f0b9}'), //  ("fa_airbnb", '\u{ef93}'), //  ("fa_algolia", '\u{f0ba}'), //  ("fa_align_center", '\u{f037}'), //  ("fa_align_justify", '\u{f039}'), //  ("fa_align_left", '\u{f036}'), //  ("fa_align_right", '\u{f038}'), //  ("fa_alipay", '\u{eebc}'), //  ("fa_amazon", '\u{f270}'), //  ("fa_amazon_pay", '\u{ed56}'), //  ("fa_ambulance", '\u{f0f9}'), //  ("fa_american_sign_language_interpreting", '\u{f2a3}'), //  ("fa_amilia", '\u{f0bb}'), //  ("fa_anchor", '\u{f13d}'), //  ("fa_android", '\u{f17b}'), //  ("fa_angellist", '\u{f209}'), //  ("fa_angle_double_down", '\u{f103}'), //  ("fa_angle_double_left", '\u{f100}'), //  ("fa_angle_double_right", '\u{f101}'), //  ("fa_angle_double_up", '\u{f102}'), //  ("fa_angle_down", '\u{f107}'), //  ("fa_angle_left", '\u{f104}'), //  ("fa_angle_right", '\u{f105}'), //  ("fa_angle_up", '\u{f106}'), //  ("fa_angles_down", '\u{f103}'), //  ("fa_angles_left", '\u{f100}'), //  ("fa_angles_right", '\u{f101}'), //  ("fa_angles_up", '\u{f102}'), //  ("fa_angrycreative", '\u{f0bc}'), //  ("fa_angular", '\u{ed4b}'), //  ("fa_ankh", '\u{eebd}'), //  ("fa_app_store", '\u{f0bd}'), //  ("fa_app_store_ios", '\u{f0be}'), //  ("fa_apper", '\u{f0bf}'), //  ("fa_apple", '\u{f179}'), //  ("fa_apple_pay", '\u{ed41}'), //  ("fa_apple_whole", '\u{ee98}'), //  ("fa_archive", '\u{f187}'), //  ("fa_archway", '\u{ee20}'), //  ("fa_area_chart", '\u{f1fe}'), //  ("fa_arrow_circle_down", '\u{f0ab}'), //  ("fa_arrow_circle_left", '\u{f0a8}'), //  ("fa_arrow_circle_o_down", '\u{f01a}'), //  ("fa_arrow_circle_o_left", '\u{f190}'), //  ("fa_arrow_circle_o_right", '\u{f18e}'), //  ("fa_arrow_circle_o_up", '\u{f01b}'), //  ("fa_arrow_circle_right", '\u{f0a9}'), //  ("fa_arrow_circle_up", '\u{f0aa}'), //  ("fa_arrow_down", '\u{f063}'), //  ("fa_arrow_down_1_9", '\u{f162}'), //  ("fa_arrow_down_9_1", '\u{efb1}'), //  ("fa_arrow_down_a_z", '\u{f15d}'), //  ("fa_arrow_down_long", '\u{f175}'), //  ("fa_arrow_down_short_wide", '\u{efaf}'), //  ("fa_arrow_down_wide_short", '\u{f160}'), //  ("fa_arrow_down_z_a", '\u{efad}'), //  ("fa_arrow_left", '\u{f060}'), //  ("fa_arrow_left_long", '\u{f177}'), //  ("fa_arrow_pointer", '\u{f245}'), //  ("fa_arrow_right", '\u{f061}'), //  ("fa_arrow_right_arrow_left", '\u{f0ec}'), //  ("fa_arrow_right_from_bracket", '\u{f08b}'), //  ("fa_arrow_right_long", '\u{f178}'), //  ("fa_arrow_right_to_bracket", '\u{f090}'), //  ("fa_arrow_rotate_left", '\u{f0e2}'), //  ("fa_arrow_rotate_right", '\u{f01e}'), //  ("fa_arrow_turn_down", '\u{f149}'), //  ("fa_arrow_turn_up", '\u{f148}'), //  ("fa_arrow_up", '\u{f062}'), //  ("fa_arrow_up_1_9", '\u{f163}'), //  ("fa_arrow_up_9_1", '\u{efb2}'), //  ("fa_arrow_up_a_z", '\u{f15e}'), //  ("fa_arrow_up_long", '\u{f176}'), //  ("fa_arrow_up_right_from_square", '\u{f08e}'), //  ("fa_arrow_up_short_wide", '\u{efb0}'), //  ("fa_arrow_up_wide_short", '\u{f161}'), //  ("fa_arrow_up_z_a", '\u{efae}'), //  ("fa_arrows", '\u{f047}'), //  ("fa_arrows_alt", '\u{f0b2}'), //  ("fa_arrows_h", '\u{f07e}'), //  ("fa_arrows_left_right", '\u{f07e}'), //  ("fa_arrows_rotate", '\u{f021}'), //  ("fa_arrows_up_down", '\u{f07d}'), //  ("fa_arrows_up_down_left_right", '\u{f047}'), //  ("fa_arrows_v", '\u{f07d}'), //  ("fa_artstation", '\u{ef31}'), //  ("fa_asl_interpreting", '\u{f2a3}'), //  ("fa_assistive_listening_systems", '\u{f2a2}'), //  ("fa_asterisk", '\u{f069}'), //  ("fa_asymmetrik", '\u{f0cf}'), //  ("fa_at", '\u{f1fa}'), //  ("fa_atlassian", '\u{ef32}'), //  ("fa_atom", '\u{ee99}'), //  ("fa_audible", '\u{f0df}'), //  ("fa_audio_description", '\u{f29e}'), //  ("fa_automobile", '\u{f1b9}'), //  ("fa_autoprefixer", '\u{ed47}'), //  ("fa_avianex", '\u{efc2}'), //  ("fa_aviato", '\u{ed4c}'), //  ("fa_award", '\u{ee22}'), //  ("fa_aws", '\u{f0ef}'), //  ("fa_baby", '\u{ef33}'), //  ("fa_baby_carriage", '\u{ef34}'), //  ("fa_backward", '\u{f04a}'), //  ("fa_backward_fast", '\u{f049}'), //  ("fa_backward_step", '\u{f048}'), //  ("fa_bacon", '\u{ef77}'), //  ("fa_bag_shopping", '\u{f290}'), //  ("fa_bahai", '\u{eecb}'), //  ("fa_balance_scale", '\u{f24e}'), //  ("fa_ban", '\u{f05e}'), //  ("fa_ban_smoking", '\u{ee16}'), //  ("fa_bandage", '\u{ed74}'), //  ("fa_bandcamp", '\u{f2d5}'), //  ("fa_bank", '\u{f19c}'), //  ("fa_bar_chart", '\u{f080}'), //  ("fa_bar_chart_o", '\u{f080}'), //  ("fa_barcode", '\u{f02a}'), //  ("fa_bars", '\u{f0c9}'), //  ("fa_bars_progress", '\u{ef8f}'), //  ("fa_bars_staggered", '\u{ee19}'), //  ("fa_baseball", '\u{ed5c}'), //  ("fa_baseball_bat_ball", '\u{ed5b}'), //  ("fa_basket_shopping", '\u{f291}'), //  ("fa_basketball", '\u{ed5d}'), //  ("fa_bath", '\u{f2cd}'), //  ("fa_bathtub", '\u{f2cd}'), //  ("fa_battery", '\u{f240}'), //  ("fa_battery_0", '\u{f244}'), //  ("fa_battery_1", '\u{f243}'), //  ("fa_battery_2", '\u{f242}'), //  ("fa_battery_3", '\u{f241}'), //  ("fa_battery_4", '\u{f240}'), //  ("fa_battery_empty", '\u{f244}'), //  ("fa_battery_full", '\u{f240}'), //  ("fa_battery_half", '\u{f242}'), //  ("fa_battery_quarter", '\u{f243}'), //  ("fa_battery_three_quarters", '\u{f241}'), //  ("fa_battle_net", '\u{ef94}'), //  ("fa_bed", '\u{f236}'), //  ("fa_bed_pulse", '\u{ed8a}'), //  ("fa_beer", '\u{f0fc}'), //  ("fa_beer_mug_empty", '\u{f0fc}'), //  ("fa_behance", '\u{f1b4}'), //  ("fa_behance_square", '\u{f1b5}'), //  ("fa_bell", '\u{f0f3}'), //  ("fa_bell_concierge", '\u{ee2b}'), //  ("fa_bell_o", '\u{f0a2}'), //  ("fa_bell_slash", '\u{f1f6}'), //  ("fa_bell_slash_o", '\u{f1f7}'), //  ("fa_bezier_curve", '\u{ee24}'), //  ("fa_bicycle", '\u{f206}'), //  ("fa_bimobject", '\u{f0ff}'), //  ("fa_binoculars", '\u{f1e5}'), //  ("fa_biohazard", '\u{ef35}'), //  ("fa_birthday_cake", '\u{f1fd}'), //  ("fa_bitbucket", '\u{f171}'), //  ("fa_bitbucket_square", '\u{f172}'), //  ("fa_bitcoin", '\u{f10f}'), //  ("fa_bity", '\u{f116}'), //  ("fa_black_tie", '\u{f27e}'), //  ("fa_blackberry", '\u{f117}'), //  ("fa_blender", '\u{ede1}'), //  ("fa_blender_phone", '\u{eeea}'), //  ("fa_blind", '\u{f29d}'), //  ("fa_blog", '\u{ef36}'), //  ("fa_blogger", '\u{f11f}'), //  ("fa_blogger_b", '\u{f12f}'), //  ("fa_bluetooth", '\u{f293}'), //  ("fa_bluetooth_b", '\u{f294}'), //  ("fa_bold", '\u{f032}'), //  ("fa_bolt", '\u{f0e7}'), //  ("fa_bomb", '\u{f1e2}'), //  ("fa_bone", '\u{ee9a}'), //  ("fa_bong", '\u{ee25}'), //  ("fa_book", '\u{f02d}'), //  ("fa_book_atlas", '\u{ee21}'), //  ("fa_book_bible", '\u{eebe}'), //  ("fa_book_journal_whills", '\u{eecd}'), //  ("fa_book_medical", '\u{ef78}'), //  ("fa_book_open", '\u{ede2}'), //  ("fa_book_open_reader", '\u{ee9b}'), //  ("fa_book_quran", '\u{eedc}'), //  ("fa_book_skull", '\u{eeeb}'), //  ("fa_book_tanakh", '\u{ef8e}'), //  ("fa_bookmark", '\u{f02e}'), //  ("fa_bookmark_o", '\u{f097}'), //  ("fa_bootstrap", '\u{ef95}'), //  ("fa_border_all", '\u{efa3}'), //  ("fa_border_none", '\u{efa4}'), //  ("fa_border_top_left", '\u{efa5}'), //  ("fa_bowling_ball", '\u{ed5e}'), //  ("fa_box", '\u{ed75}'), //  ("fa_box_archive", '\u{f187}'), //  ("fa_box_open", '\u{ed95}'), //  ("fa_boxes_stacked", '\u{ed76}'), //  ("fa_braille", '\u{f2a1}'), //  ("fa_brain", '\u{ee9c}'), //  ("fa_bread_slice", '\u{ef79}'), //  ("fa_briefcase", '\u{f0b1}'), //  ("fa_briefcase_medical", '\u{ed77}'), //  ("fa_broom", '\u{ede4}'), //  ("fa_broom_ball", '\u{ed6e}'), //  ("fa_brush", '\u{ee26}'), //  ("fa_btc", '\u{f15a}'), //  ("fa_buffer", '\u{ef96}'), //  ("fa_bug", '\u{f188}'), //  ("fa_building", '\u{f1ad}'), //  ("fa_building_columns", '\u{f19c}'), //  ("fa_building_o", '\u{f0f7}'), //  ("fa_bullhorn", '\u{f0a1}'), //  ("fa_bullseye", '\u{f140}'), //  ("fa_burger", '\u{ef82}'), //  ("fa_buromobelexperte", '\u{f13f}'), //  ("fa_bus", '\u{f207}'), //  ("fa_bus_simple", '\u{ee27}'), //  ("fa_business_time", '\u{eebf}'), //  ("fa_buy_n_large", '\u{efb6}'), //  ("fa_buysellads", '\u{f20d}'), //  ("fa_cab", '\u{f1ba}'), //  ("fa_cable_car", '\u{ef71}'), //  ("fa_cake_candles", '\u{f1fd}'), //  ("fa_calculator", '\u{f1ec}'), //  ("fa_calendar", '\u{f073}'), //  ("fa_calendar_check", '\u{f274}'), //  ("fa_calendar_check_o", '\u{f274}'), //  ("fa_calendar_day", '\u{ef37}'), //  ("fa_calendar_days", '\u{f073}'), //  ("fa_calendar_minus", '\u{f272}'), //  ("fa_calendar_minus_o", '\u{f272}'), //  ("fa_calendar_o", '\u{f133}'), //  ("fa_calendar_plus", '\u{f271}'), //  ("fa_calendar_plus_o", '\u{f271}'), //  ("fa_calendar_times_o", '\u{f273}'), //  ("fa_calendar_week", '\u{ef38}'), //  ("fa_calendar_xmark", '\u{f273}'), //  ("fa_camera", '\u{f030}'), //  ("fa_camera_retro", '\u{f083}'), //  ("fa_campground", '\u{eeec}'), //  ("fa_canadian_maple_leaf", '\u{ef39}'), //  ("fa_candy_cane", '\u{ef3a}'), //  ("fa_cannabis", '\u{ee28}'), //  ("fa_capsules", '\u{ed79}'), //  ("fa_car", '\u{f1b9}'), //  ("fa_car_battery", '\u{ee9e}'), //  ("fa_car_burst", '\u{ee9f}'), //  ("fa_car_rear", '\u{ee9d}'), //  ("fa_car_side", '\u{eea0}'), //  ("fa_caravan", '\u{efc1}'), //  ("fa_caret_down", '\u{f0d7}'), //  ("fa_caret_left", '\u{f0d9}'), //  ("fa_caret_right", '\u{f0da}'), //  ("fa_caret_square_o_down", '\u{f150}'), //  ("fa_caret_square_o_left", '\u{f191}'), //  ("fa_caret_square_o_right", '\u{f152}'), //  ("fa_caret_square_o_up", '\u{f151}'), //  ("fa_caret_up", '\u{f0d8}'), //  ("fa_carrot", '\u{ef3b}'), //  ("fa_cart_arrow_down", '\u{f218}'), //  ("fa_cart_flatbed", '\u{ed7f}'), //  ("fa_cart_flatbed_suitcase", '\u{ee66}'), //  ("fa_cart_plus", '\u{f217}'), //  ("fa_cart_shopping", '\u{f07a}'), //  ("fa_cash_register", '\u{ef3c}'), //  ("fa_cat", '\u{eeed}'), //  ("fa_cc", '\u{f20a}'), //  ("fa_cc_amazon_pay", '\u{ed57}'), //  ("fa_cc_amex", '\u{f1f3}'), //  ("fa_cc_apple_pay", '\u{ed42}'), //  ("fa_cc_diners_club", '\u{f24c}'), //  ("fa_cc_discover", '\u{f1f2}'), //  ("fa_cc_jcb", '\u{f24b}'), //  ("fa_cc_mastercard", '\u{f1f1}'), //  ("fa_cc_paypal", '\u{f1f4}'), //  ("fa_cc_stripe", '\u{f1f5}'), //  ("fa_cc_visa", '\u{f1f0}'), //  ("fa_centercode", '\u{f14f}'), //  ("fa_centos", '\u{ef3d}'), //  ("fa_certificate", '\u{f0a3}'), //  ("fa_chain", '\u{f0c1}'), //  ("fa_chain_broken", '\u{f127}'), //  ("fa_chair", '\u{eeee}'), //  ("fa_chalkboard", '\u{ede5}'), //  ("fa_chalkboard_user", '\u{ede6}'), //  ("fa_champagne_glasses", '\u{ef49}'), //  ("fa_charging_station", '\u{eea1}'), //  ("fa_chart_area", '\u{f1fe}'), //  ("fa_chart_bar", '\u{f080}'), //  ("fa_chart_line", '\u{f201}'), //  ("fa_chart_pie", '\u{f200}'), //  ("fa_check", '\u{f00c}'), //  ("fa_check_circle", '\u{f058}'), //  ("fa_check_circle_o", '\u{f05d}'), //  ("fa_check_double", '\u{ee29}'), //  ("fa_check_square", '\u{f14a}'), //  ("fa_check_square_o", '\u{f046}'), //  ("fa_check_to_slot", '\u{ef2f}'), //  ("fa_cheese", '\u{ef7a}'), //  ("fa_chess", '\u{ed5f}'), //  ("fa_chess_bishop", '\u{ed60}'), //  ("fa_chess_board", '\u{ed61}'), //  ("fa_chess_king", '\u{ed62}'), //  ("fa_chess_knight", '\u{ed63}'), //  ("fa_chess_pawn", '\u{ed64}'), //  ("fa_chess_queen", '\u{ed65}'), //  ("fa_chess_rook", '\u{ed66}'), //  ("fa_chevron_circle_down", '\u{f13a}'), //  ("fa_chevron_circle_left", '\u{f137}'), //  ("fa_chevron_circle_right", '\u{f138}'), //  ("fa_chevron_circle_up", '\u{f139}'), //  ("fa_chevron_down", '\u{f078}'), //  ("fa_chevron_left", '\u{f053}'), //  ("fa_chevron_right", '\u{f054}'), //  ("fa_chevron_up", '\u{f077}'), //  ("fa_child", '\u{f1ae}'), //  ("fa_chrome", '\u{f268}'), //  ("fa_chromecast", '\u{ef97}'), //  ("fa_church", '\u{ede7}'), //  ("fa_circle", '\u{f111}'), //  ("fa_circle_arrow_down", '\u{f0ab}'), //  ("fa_circle_arrow_left", '\u{f0a8}'), //  ("fa_circle_arrow_right", '\u{f0a9}'), //  ("fa_circle_arrow_up", '\u{f0aa}'), //  ("fa_circle_check", '\u{f05d}'), //  ("fa_circle_chevron_down", '\u{f13a}'), //  ("fa_circle_chevron_left", '\u{f137}'), //  ("fa_circle_chevron_right", '\u{f138}'), //  ("fa_circle_chevron_up", '\u{f139}'), //  ("fa_circle_dollar_to_slot", '\u{ed98}'), //  ("fa_circle_dot", '\u{f192}'), //  ("fa_circle_down", '\u{f01a}'), //  ("fa_circle_exclamation", '\u{f06a}'), //  ("fa_circle_h", '\u{ed83}'), //  ("fa_circle_half_stroke", '\u{f042}'), //  ("fa_circle_info", '\u{f05a}'), //  ("fa_circle_left", '\u{f190}'), //  ("fa_circle_minus", '\u{f056}'), //  ("fa_circle_notch", '\u{f1ce}'), //  ("fa_circle_o", '\u{f10c}'), //  ("fa_circle_o_notch", '\u{f1ce}'), //  ("fa_circle_pause", '\u{f28b}'), //  ("fa_circle_play", '\u{f144}'), //  ("fa_circle_plus", '\u{f055}'), //  ("fa_circle_question", '\u{f059}'), //  ("fa_circle_radiation", '\u{ef5b}'), //  ("fa_circle_right", '\u{f18e}'), //  ("fa_circle_stop", '\u{f28d}'), //  ("fa_circle_thin", '\u{f1db}'), //  ("fa_circle_up", '\u{f01b}'), //  ("fa_circle_user", '\u{f2bd}'), //  ("fa_circle_xmark", '\u{f05c}'), //  ("fa_city", '\u{eec0}'), //  ("fa_clipboard", '\u{f0ea}'), //  ("fa_clipboard_alt", '\u{f07f}'), //  ("fa_clipboard_check", '\u{ed7a}'), //  ("fa_clipboard_list", '\u{ed7b}'), //  ("fa_clipboard_user", '\u{ef7c}'), //  ("fa_clock", '\u{f017}'), //  ("fa_clock_o", '\u{f017}'), //  ("fa_clock_rotate_left", '\u{f1da}'), //  ("fa_clone", '\u{f24d}'), //  ("fa_close", '\u{f00d}'), //  ("fa_closed_captioning", '\u{f20a}'), //  ("fa_cloud", '\u{f0c2}'), //  ("fa_cloud_arrow_down", '\u{f0ed}'), //  ("fa_cloud_arrow_up", '\u{f0ee}'), //  ("fa_cloud_bolt", '\u{ef2c}'), //  ("fa_cloud_download", '\u{f0ed}'), //  ("fa_cloud_meatball", '\u{ef1a}'), //  ("fa_cloud_moon", '\u{eeef}'), //  ("fa_cloud_moon_rain", '\u{ef1b}'), //  ("fa_cloud_rain", '\u{ef1c}'), //  ("fa_cloud_showers_heavy", '\u{ef1d}'), //  ("fa_cloud_sun", '\u{eef0}'), //  ("fa_cloud_sun_rain", '\u{ef1e}'), //  ("fa_cloud_upload", '\u{f0ee}'), //  ("fa_cloudscale", '\u{f15f}'), //  ("fa_cloudsmith", '\u{f167}'), //  ("fa_cloudversify", '\u{f16f}'), //  ("fa_cny", '\u{f157}'), //  ("fa_code", '\u{f121}'), //  ("fa_code_branch", '\u{f126}'), //  ("fa_code_commit", '\u{f172}'), //  ("fa_code_fork", '\u{f126}'), //  ("fa_code_merge", '\u{f17f}'), //  ("fa_codepen", '\u{f1cb}'), //  ("fa_codiepie", '\u{f284}'), //  ("fa_coffee", '\u{f0f4}'), //  ("fa_cog", '\u{f013}'), //  ("fa_cogs", '\u{f085}'), //  ("fa_coins", '\u{ede8}'), //  ("fa_columns", '\u{f0db}'), //  ("fa_comment", '\u{f075}'), //  ("fa_comment_dollar", '\u{eec1}'), //  ("fa_comment_dots", '\u{f27b}'), //  ("fa_comment_medical", '\u{ef7d}'), //  ("fa_comment_o", '\u{f0e5}'), //  ("fa_comment_slash", '\u{ed96}'), //  ("fa_comment_sms", '\u{ef68}'), //  ("fa_commenting", '\u{f27a}'), //  ("fa_commenting_o", '\u{f27b}'), //  ("fa_comments", '\u{f086}'), //  ("fa_comments_dollar", '\u{eec2}'), //  ("fa_comments_o", '\u{f0e6}'), //  ("fa_compact_disc", '\u{ede9}'), //  ("fa_compass", '\u{f14e}'), //  ("fa_compass_drafting", '\u{ee31}'), //  ("fa_compress", '\u{f066}'), //  ("fa_computer_mouse", '\u{efba}'), //  ("fa_confluence", '\u{ef3f}'), //  ("fa_connectdevelop", '\u{f20e}'), //  ("fa_contao", '\u{f26d}'), //  ("fa_cookie", '\u{ee2c}'), //  ("fa_cookie_bite", '\u{ee2d}'), //  ("fa_copy", '\u{f0c5}'), //  ("fa_copyright", '\u{f1f9}'), //  ("fa_cotton_bureau", '\u{efb5}'), //  ("fa_couch", '\u{ed97}'), //  ("fa_cow", '\u{eef1}'), //  ("fa_cpanel", '\u{f18f}'), //  ("fa_creative_commons", '\u{f25e}'), //  ("fa_creative_commons_by", '\u{edb1}'), //  ("fa_creative_commons_nc", '\u{edb2}'), //  ("fa_creative_commons_nc_eu", '\u{edb3}'), //  ("fa_creative_commons_nc_jp", '\u{edb4}'), //  ("fa_creative_commons_nd", '\u{edb5}'), //  ("fa_creative_commons_pd", '\u{edb6}'), //  ("fa_creative_commons_pd_alt", '\u{edb7}'), //  ("fa_creative_commons_remix", '\u{edb8}'), //  ("fa_creative_commons_sa", '\u{edb9}'), //  ("fa_creative_commons_sampling", '\u{edba}'), //  ("fa_creative_commons_sampling_plus", '\u{edbb}'), //  ("fa_creative_commons_share", '\u{edbc}'), //  ("fa_creative_commons_zero", '\u{edbd}'), //  ("fa_credit_card", '\u{f09d}'), //  ("fa_credit_card_alt", '\u{f283}'), //  ("fa_critical_role", '\u{eef2}'), //  ("fa_crop", '\u{f125}'), //  ("fa_crop_simple", '\u{ee2e}'), //  ("fa_cross", '\u{eec3}'), //  ("fa_crosshairs", '\u{f05b}'), //  ("fa_crow", '\u{edea}'), //  ("fa_crown", '\u{edeb}'), //  ("fa_crutch", '\u{ef7e}'), //  ("fa_css3", '\u{f13c}'), //  ("fa_css3_alt", '\u{f19f}'), //  ("fa_cube", '\u{f1b2}'), //  ("fa_cubes", '\u{f1b3}'), //  ("fa_cut", '\u{f0c4}'), //  ("fa_cutlery", '\u{f0f5}'), //  ("fa_cuttlefish", '\u{f1af}'), //  ("fa_d_and_d", '\u{f1bf}'), //  ("fa_d_and_d_beyond", '\u{eef3}'), //  ("fa_dashboard", '\u{f0e4}'), //  ("fa_dashcube", '\u{f210}'), //  ("fa_database", '\u{f1c0}'), //  ("fa_deaf", '\u{f2a4}'), //  ("fa_deafness", '\u{f2a4}'), //  ("fa_dedent", '\u{f03b}'), //  ("fa_delete_left", '\u{ee23}'), //  ("fa_delicious", '\u{f1a5}'), //  ("fa_democrat", '\u{ef1f}'), //  ("fa_deploydog", '\u{f1cf}'), //  ("fa_deskpro", '\u{f1df}'), //  ("fa_desktop", '\u{f108}'), //  ("fa_dev", '\u{eef4}'), //  ("fa_deviantart", '\u{f1bd}'), //  ("fa_dharmachakra", '\u{eec4}'), //  ("fa_dhl", '\u{ef40}'), //  ("fa_diagram_project", '\u{efce}'), //  ("fa_diamond", '\u{f29f}'), //  ("fa_diamond_turn_right", '\u{eea2}'), //  ("fa_diaspora", '\u{ef41}'), //  ("fa_dice", '\u{edec}'), //  ("fa_dice_d6", '\u{eef6}'), //  ("fa_dice_d20", '\u{eef5}'), //  ("fa_dice_five", '\u{eded}'), //  ("fa_dice_four", '\u{edee}'), //  ("fa_dice_one", '\u{edef}'), //  ("fa_dice_six", '\u{edf0}'), //  ("fa_dice_three", '\u{edf1}'), //  ("fa_dice_two", '\u{edf2}'), //  ("fa_digg", '\u{f1a6}'), //  ("fa_digital_ocean", '\u{f1ef}'), //  ("fa_discord", '\u{f1ff}'), //  ("fa_discourse", '\u{f20c}'), //  ("fa_disease", '\u{ef7f}'), //  ("fa_divide", '\u{edf3}'), //  ("fa_dna", '\u{ed7d}'), //  ("fa_dochub", '\u{f20f}'), //  ("fa_docker", '\u{f21f}'), //  ("fa_dog", '\u{eef7}'), //  ("fa_dollar", '\u{f155}'), //  ("fa_dollar_sign", '\u{f155}'), //  ("fa_dolly", '\u{ed7e}'), //  ("fa_door_closed", '\u{edf4}'), //  ("fa_door_open", '\u{edf5}'), //  ("fa_dot_circle_o", '\u{f192}'), //  ("fa_dove", '\u{ed99}'), //  ("fa_down_left_and_up_right_to_center", '\u{ed4d}'), //  ("fa_down_long", '\u{f03f}'), //  ("fa_download", '\u{f019}'), //  ("fa_draft2digital", '\u{f220}'), //  ("fa_dragon", '\u{eef8}'), //  ("fa_draw_polygon", '\u{eea3}'), //  ("fa_dribbble", '\u{f17d}'), //  ("fa_drivers_license", '\u{f2c2}'), //  ("fa_drivers_license_o", '\u{f2c3}'), //  ("fa_dropbox", '\u{f16b}'), //  ("fa_droplet", '\u{f043}'), //  ("fa_droplet_slash", '\u{ee8e}'), //  ("fa_drum", '\u{ee32}'), //  ("fa_drum_steelpan", '\u{ee33}'), //  ("fa_drumstick_bite", '\u{eef9}'), //  ("fa_drupal", '\u{f1a9}'), //  ("fa_dumbbell", '\u{ed67}'), //  ("fa_dumpster", '\u{ef42}'), //  ("fa_dumpster_fire", '\u{ef43}'), //  ("fa_dungeon", '\u{eefa}'), //  ("fa_dyalog", '\u{f22f}'), //  ("fa_ear_deaf", '\u{f2a4}'), //  ("fa_ear_listen", '\u{f2a2}'), //  ("fa_earlybirds", '\u{f230}'), //  ("fa_earth_africa", '\u{ee45}'), //  ("fa_earth_americas", '\u{ee46}'), //  ("fa_earth_asia", '\u{ee47}'), //  ("fa_earth_europe", '\u{ef4b}'), //  ("fa_ebay", '\u{edbe}'), //  ("fa_edge", '\u{f282}'), //  ("fa_edit", '\u{f044}'), //  ("fa_eercast", '\u{f2da}'), //  ("fa_egg", '\u{ef80}'), //  ("fa_eject", '\u{f052}'), //  ("fa_elementor", '\u{ed5a}'), //  ("fa_ellipsis", '\u{f141}'), //  ("fa_ellipsis_h", '\u{f141}'), //  ("fa_ellipsis_v", '\u{f142}'), //  ("fa_ellipsis_vertical", '\u{f142}'), //  ("fa_ello", '\u{eea4}'), //  ("fa_ember", '\u{ed4e}'), //  ("fa_empire", '\u{f1d1}'), //  ("fa_envelope", '\u{f0e0}'), //  ("fa_envelope_o", '\u{f003}'), //  ("fa_envelope_open", '\u{f2b6}'), //  ("fa_envelope_open_o", '\u{f2b7}'), //  ("fa_envelope_open_text", '\u{eec5}'), //  ("fa_envelope_square", '\u{f199}'), //  ("fa_envelopes_bulk", '\u{eed1}'), //  ("fa_envira", '\u{f299}'), //  ("fa_equals", '\u{edf6}'), //  ("fa_eraser", '\u{f12d}'), //  ("fa_erlang", '\u{f23f}'), //  ("fa_ethereum", '\u{ed58}'), //  ("fa_ethernet", '\u{ef44}'), //  ("fa_etsy", '\u{f2d7}'), //  ("fa_eur", '\u{f153}'), //  ("fa_euro", '\u{f153}'), //  ("fa_euro_sign", '\u{f153}'), //  ("fa_evernote", '\u{ef98}'), //  ("fa_exchange", '\u{f0ec}'), //  ("fa_exclamation", '\u{f12a}'), //  ("fa_exclamation_circle", '\u{f06a}'), //  ("fa_exclamation_triangle", '\u{f071}'), //  ("fa_expand", '\u{f065}'), //  ("fa_expeditedssl", '\u{f23e}'), //  ("fa_external_link", '\u{f08e}'), //  ("fa_external_link_square", '\u{f14c}'), //  ("fa_eye", '\u{f06e}'), //  ("fa_eye_dropper", '\u{f1fb}'), //  ("fa_eye_low_vision", '\u{f2a8}'), //  ("fa_eye_slash", '\u{f070}'), //  ("fa_eyedropper", '\u{f1fb}'), //  ("fa_fa", '\u{f2b4}'), //  ("fa_face_angry", '\u{ee1f}'), //  ("fa_face_dizzy", '\u{ee30}'), //  ("fa_face_flushed", '\u{ee42}'), //  ("fa_face_frown", '\u{f119}'), //  ("fa_face_frown_open", '\u{ee43}'), //  ("fa_face_grimace", '\u{ee48}'), //  ("fa_face_grin", '\u{ee49}'), //  ("fa_face_grin_beam", '\u{ee4b}'), //  ("fa_face_grin_beam_sweat", '\u{ee4c}'), //  ("fa_face_grin_hearts", '\u{ee4d}'), //  ("fa_face_grin_squint", '\u{ee4e}'), //  ("fa_face_grin_squint_tears", '\u{ee4f}'), //  ("fa_face_grin_stars", '\u{ee50}'), //  ("fa_face_grin_tears", '\u{ee51}'), //  ("fa_face_grin_tongue", '\u{ee52}'), //  ("fa_face_grin_tongue_squint", '\u{ee53}'), //  ("fa_face_grin_tongue_wink", '\u{ee54}'), //  ("fa_face_grin_wide", '\u{ee4a}'), //  ("fa_face_grin_wink", '\u{ee55}'), //  ("fa_face_kiss", '\u{ee5f}'), //  ("fa_face_kiss_beam", '\u{ee60}'), //  ("fa_face_kiss_wink_heart", '\u{ee61}'), //  ("fa_face_laugh", '\u{ee62}'), //  ("fa_face_laugh_beam", '\u{ee63}'), //  ("fa_face_laugh_squint", '\u{ee64}'), //  ("fa_face_laugh_wink", '\u{ee65}'), //  ("fa_face_meh", '\u{f11a}'), //  ("fa_face_meh_blank", '\u{ee6d}'), //  ("fa_face_rolling_eyes", '\u{ee6e}'), //  ("fa_face_sad_cry", '\u{ee7b}'), //  ("fa_face_sad_tear", '\u{ee7c}'), //  ("fa_face_smile", '\u{f118}'), //  ("fa_face_smile_beam", '\u{ee80}'), //  ("fa_face_smile_wink", '\u{eda9}'), //  ("fa_face_surprise", '\u{ee89}'), //  ("fa_face_tired", '\u{ee8f}'), //  ("fa_facebook", '\u{f09a}'), //  ("fa_facebook_f", '\u{f24f}'), //  ("fa_facebook_messenger", '\u{f25f}'), //  ("fa_facebook_official", '\u{f230}'), //  ("fa_facebook_square", '\u{f082}'), //  ("fa_fan", '\u{efa7}'), //  ("fa_fantasy_flight_games", '\u{eefb}'), //  ("fa_fast_backward", '\u{f049}'), //  ("fa_fast_forward", '\u{f050}'), //  ("fa_fax", '\u{f1ac}'), //  ("fa_feather", '\u{edf7}'), //  ("fa_feather_pointed", '\u{ee34}'), //  ("fa_fedex", '\u{ef45}'), //  ("fa_fedora", '\u{ef46}'), //  ("fa_feed", '\u{f09e}'), //  ("fa_female", '\u{f182}'), //  ("fa_fighter_jet", '\u{f0fb}'), //  ("fa_figma", '\u{ef47}'), //  ("fa_file", '\u{f15b}'), //  ("fa_file_archive_o", '\u{f1c6}'), //  ("fa_file_arrow_down", '\u{ee36}'), //  ("fa_file_arrow_up", '\u{ee3d}'), //  ("fa_file_audio", '\u{f1c7}'), //  ("fa_file_audio_o", '\u{f1c7}'), //  ("fa_file_code", '\u{f1c9}'), //  ("fa_file_code_o", '\u{f1c9}'), //  ("fa_file_contract", '\u{ee35}'), //  ("fa_file_csv", '\u{eefc}'), //  ("fa_file_excel", '\u{f1c3}'), //  ("fa_file_excel_o", '\u{f1c3}'), //  ("fa_file_export", '\u{ee37}'), //  ("fa_file_image", '\u{f1c5}'), //  ("fa_file_image_o", '\u{f1c5}'), //  ("fa_file_import", '\u{ee38}'), //  ("fa_file_invoice", '\u{ee39}'), //  ("fa_file_invoice_dollar", '\u{ee3a}'), //  ("fa_file_lines", '\u{f15c}'), //  ("fa_file_medical", '\u{ed80}'), //  ("fa_file_movie_o", '\u{f1c8}'), //  ("fa_file_o", '\u{f016}'), //  ("fa_file_pdf", '\u{f1c1}'), //  ("fa_file_pdf_o", '\u{f1c1}'), //  ("fa_file_pen", '\u{f05f}'), //  ("fa_file_photo_o", '\u{f1c5}'), //  ("fa_file_picture_o", '\u{f1c5}'), //  ("fa_file_powerpoint", '\u{f1c4}'), //  ("fa_file_powerpoint_o", '\u{f1c4}'), //  ("fa_file_prescription", '\u{ee3b}'), //  ("fa_file_signature", '\u{ee3c}'), //  ("fa_file_sound_o", '\u{f1c7}'), //  ("fa_file_text", '\u{f15c}'), //  ("fa_file_text_o", '\u{f0f6}'), //  ("fa_file_video", '\u{f1c8}'), //  ("fa_file_video_o", '\u{f1c8}'), //  ("fa_file_waveform", '\u{ed81}'), //  ("fa_file_word", '\u{f1c2}'), //  ("fa_file_word_o", '\u{f1c2}'), //  ("fa_file_zip_o", '\u{f1c6}'), //  ("fa_file_zipper", '\u{f1c6}'), //  ("fa_files_o", '\u{f0c5}'), //  ("fa_fill", '\u{ee3e}'), //  ("fa_fill_drip", '\u{ee3f}'), //  ("fa_film", '\u{f008}'), //  ("fa_filter", '\u{f0b0}'), //  ("fa_filter_circle_dollar", '\u{eec8}'), //  ("fa_fingerprint", '\u{ee40}'), //  ("fa_fire", '\u{f06d}'), //  ("fa_fire_extinguisher", '\u{f134}'), //  ("fa_fire_flame_curved", '\u{ef76}'), //  ("fa_fire_flame_simple", '\u{ed78}'), //  ("fa_firefox", '\u{f269}'), //  ("fa_first_order", '\u{f2b0}'), //  ("fa_first_order_alt", '\u{edd4}'), //  ("fa_firstdraft", '\u{f262}'), //  ("fa_fish", '\u{ee41}'), //  ("fa_flag", '\u{f024}'), //  ("fa_flag_checkered", '\u{f11e}'), //  ("fa_flag_o", '\u{f11d}'), //  ("fa_flag_usa", '\u{ef20}'), //  ("fa_flash", '\u{f0e7}'), //  ("fa_flask", '\u{f0c3}'), //  ("fa_flickr", '\u{f16e}'), //  ("fa_flipboard", '\u{ed68}'), //  ("fa_floppy_disk", '\u{f0c7}'), //  ("fa_floppy_o", '\u{f0c7}'), //  ("fa_fly", '\u{ed43}'), //  ("fa_folder", '\u{f07b}'), //  ("fa_folder_minus", '\u{eec6}'), //  ("fa_folder_o", '\u{f114}'), //  ("fa_folder_open", '\u{f07c}'), //  ("fa_folder_open_o", '\u{f115}'), //  ("fa_folder_plus", '\u{eec7}'), //  ("fa_folder_tree", '\u{ef81}'), //  ("fa_font", '\u{f031}'), //  ("fa_font_awesome", '\u{f2b4}'), //  ("fa_fonticons", '\u{f280}'), //  ("fa_fonticons_fi", '\u{f26f}'), //  ("fa_football", '\u{ed69}'), //  ("fa_fort_awesome", '\u{f286}'), //  ("fa_fort_awesome_alt", '\u{f27f}'), //  ("fa_forumbee", '\u{f211}'), //  ("fa_forward", '\u{f04e}'), //  ("fa_forward_fast", '\u{f050}'), //  ("fa_forward_step", '\u{f051}'), //  ("fa_foursquare", '\u{f180}'), //  ("fa_free_code_camp", '\u{f2c5}'), //  ("fa_freebsd", '\u{f28f}'), //  ("fa_frog", '\u{edf8}'), //  ("fa_frown_o", '\u{f119}'), //  ("fa_fulcrum", '\u{edd5}'), //  ("fa_futbol", '\u{f1e3}'), //  ("fa_futbol_o", '\u{f1e3}'), //  ("fa_galactic_republic", '\u{edd6}'), //  ("fa_galactic_senate", '\u{edd7}'), //  ("fa_gamepad", '\u{f11b}'), //  ("fa_gas_pump", '\u{edf9}'), //  ("fa_gauge", '\u{eeb2}'), //  ("fa_gauge_high", '\u{ed2f}'), //  ("fa_gauge_simple", '\u{eeb3}'), //  ("fa_gauge_simple_high", '\u{f0e4}'), //  ("fa_gavel", '\u{f0e3}'), //  ("fa_gbp", '\u{f154}'), //  ("fa_ge", '\u{f1d1}'), //  ("fa_gear", '\u{f013}'), //  ("fa_gears", '\u{f085}'), //  ("fa_gem", '\u{f219}'), //  ("fa_genderless", '\u{f22d}'), //  ("fa_get_pocket", '\u{f265}'), //  ("fa_gg", '\u{f260}'), //  ("fa_gg_circle", '\u{f261}'), //  ("fa_ghost", '\u{eefe}'), //  ("fa_gift", '\u{f06b}'), //  ("fa_gifts", '\u{ef48}'), //  ("fa_git", '\u{f1d3}'), //  ("fa_git_alt", '\u{efa0}'), //  ("fa_git_square", '\u{f1d2}'), //  ("fa_github", '\u{f09b}'), //  ("fa_github_alt", '\u{f113}'), //  ("fa_github_square", '\u{f092}'), //  ("fa_gitkraken", '\u{f2ac}'), //  ("fa_gitlab", '\u{f296}'), //  ("fa_gitter", '\u{ed50}'), //  ("fa_gittip", '\u{f184}'), //  ("fa_glass", '\u{f000}'), //  ("fa_glasses", '\u{edfa}'), //  ("fa_glide", '\u{f2a5}'), //  ("fa_glide_g", '\u{f2a6}'), //  ("fa_globe", '\u{f0ac}'), //  ("fa_gofore", '\u{f2af}'), //  ("fa_golf_ball_tee", '\u{ed6a}'), //  ("fa_goodreads", '\u{f2bf}'), //  ("fa_goodreads_g", '\u{f2cf}'), //  ("fa_google", '\u{f1a0}'), //  ("fa_google_drive", '\u{f2df}'), //  ("fa_google_play", '\u{f2e1}'), //  ("fa_google_plus", '\u{f0d5}'), //  ("fa_google_plus_circle", '\u{f2b3}'), //  ("fa_google_plus_official", '\u{f2b3}'), //  ("fa_google_plus_square", '\u{f0d4}'), //  ("fa_google_wallet", '\u{f1ee}'), //  ("fa_gopuram", '\u{eec9}'), //  ("fa_graduation_cap", '\u{f19d}'), //  ("fa_gratipay", '\u{f184}'), //  ("fa_grav", '\u{f2d6}'), //  ("fa_greater_than", '\u{edfb}'), //  ("fa_greater_than_equal", '\u{edfc}'), //  ("fa_grip", '\u{ee56}'), //  ("fa_grip_lines", '\u{ef4c}'), //  ("fa_grip_lines_vertical", '\u{ef4d}'), //  ("fa_grip_vertical", '\u{ee57}'), //  ("fa_gripfire", '\u{f2e2}'), //  ("fa_group", '\u{f0c0}'), //  ("fa_grunt", '\u{f2e3}'), //  ("fa_guitar", '\u{ef4e}'), //  ("fa_gulp", '\u{f2e4}'), //  ("fa_h_square", '\u{f0fd}'), //  ("fa_hacker_news", '\u{f1d4}'), //  ("fa_hackerrank", '\u{eea5}'), //  ("fa_hammer", '\u{eeff}'), //  ("fa_hamsa", '\u{eeca}'), //  ("fa_hand", '\u{f256}'), //  ("fa_hand_back_fist", '\u{f255}'), //  ("fa_hand_dots", '\u{ed73}'), //  ("fa_hand_fist", '\u{eefd}'), //  ("fa_hand_grab_o", '\u{f255}'), //  ("fa_hand_holding", '\u{ed9a}'), //  ("fa_hand_holding_dollar", '\u{ed9c}'), //  ("fa_hand_holding_droplet", '\u{ed9d}'), //  ("fa_hand_holding_heart", '\u{ed9b}'), //  ("fa_hand_lizard", '\u{f258}'), //  ("fa_hand_lizard_o", '\u{f258}'), //  ("fa_hand_middle_finger", '\u{ef83}'), //  ("fa_hand_o_down", '\u{f0a7}'), //  ("fa_hand_o_left", '\u{f0a5}'), //  ("fa_hand_o_right", '\u{f0a4}'), //  ("fa_hand_o_up", '\u{f0a6}'), //  ("fa_hand_paper_o", '\u{f256}'), //  ("fa_hand_peace", '\u{f25b}'), //  ("fa_hand_peace_o", '\u{f25b}'), //  ("fa_hand_point_down", '\u{f0a7}'), //  ("fa_hand_point_left", '\u{f0a5}'), //  ("fa_hand_point_right", '\u{f0a4}'), //  ("fa_hand_point_up", '\u{f0a6}'), //  ("fa_hand_pointer", '\u{f25a}'), //  ("fa_hand_pointer_o", '\u{f25a}'), //  ("fa_hand_rock_o", '\u{f255}'), //  ("fa_hand_scissors", '\u{f257}'), //  ("fa_hand_scissors_o", '\u{f257}'), //  ("fa_hand_spock", '\u{f259}'), //  ("fa_hand_spock_o", '\u{f259}'), //  ("fa_hand_stop_o", '\u{f256}'), //  ("fa_hands", '\u{f2a7}'), //  ("fa_hands_asl_interpreting", '\u{f2a3}'), //  ("fa_hands_holding", '\u{ed9e}'), //  ("fa_hands_praying", '\u{eedb}'), //  ("fa_handshake", '\u{f2b5}'), //  ("fa_handshake_angle", '\u{ed9f}'), //  ("fa_handshake_o", '\u{f2b5}'), //  ("fa_handshake_simple", '\u{eda0}'), //  ("fa_hanukiah", '\u{ef00}'), //  ("fa_hard_drive", '\u{f0a0}'), //  ("fa_hard_of_hearing", '\u{f2a4}'), //  ("fa_hashtag", '\u{f292}'), //  ("fa_hat_cowboy", '\u{efb7}'), //  ("fa_hat_cowboy_side", '\u{efb8}'), //  ("fa_hat_wizard", '\u{ef01}'), //  ("fa_hdd_o", '\u{f0a0}'), //  ("fa_header", '\u{f1dc}'), //  ("fa_heading", '\u{f1dc}'), //  ("fa_headphones", '\u{f025}'), //  ("fa_headphones_simple", '\u{ee58}'), //  ("fa_headset", '\u{ee59}'), //  ("fa_heard_o", '\u{f08a}'), //  ("fa_heart", '\u{f004}'), //  ("fa_heart_crack", '\u{ef4f}'), //  ("fa_heart_o", '\u{f08a}'), //  ("fa_heart_pulse", '\u{f21e}'), //  ("fa_heartbeat", '\u{f21e}'), //  ("fa_helicopter", '\u{edfd}'), //  ("fa_helmet_safety", '\u{ef84}'), //  ("fa_highlighter", '\u{ee5a}'), //  ("fa_hippo", '\u{ef03}'), //  ("fa_hips", '\u{ed6b}'), //  ("fa_hire_a_helper", '\u{f2e6}'), //  ("fa_history", '\u{f1da}'), //  ("fa_hockey_puck", '\u{ed6c}'), //  ("fa_holly_berry", '\u{ef50}'), //  ("fa_home", '\u{f015}'), //  ("fa_hooli", '\u{ed51}'), //  ("fa_hornbill", '\u{ee5b}'), //  ("fa_horse", '\u{ef04}'), //  ("fa_horse_head", '\u{ef51}'), //  ("fa_hospital", '\u{f0f8}'), //  ("fa_hospital_o", '\u{f0f8}'), //  ("fa_hospital_user", '\u{ef86}'), //  ("fa_hot_tub_person", '\u{ee5c}'), //  ("fa_hotdog", '\u{ef87}'), //  ("fa_hotel", '\u{f236}'), //  ("fa_hotel_building", '\u{ee5d}'), //  ("fa_hotjar", '\u{f2e7}'), //  ("fa_hourglass", '\u{f254}'), //  ("fa_hourglass_1", '\u{f251}'), //  ("fa_hourglass_2", '\u{f252}'), //  ("fa_hourglass_3", '\u{f253}'), //  ("fa_hourglass_end", '\u{f253}'), //  ("fa_hourglass_half", '\u{f252}'), //  ("fa_hourglass_o", '\u{f250}'), //  ("fa_hourglass_start", '\u{f251}'), //  ("fa_house", '\u{f015}'), //  ("fa_house_chimney", '\u{ef85}'), //  ("fa_house_chimney_crack", '\u{ef05}'), //  ("fa_house_chimney_medical", '\u{ef7b}'), //  ("fa_houzz", '\u{f27c}'), //  ("fa_hryvnia_sign", '\u{ef06}'), //  ("fa_html5", '\u{f13b}'), //  ("fa_hubspot", '\u{f2e8}'), //  ("fa_hurricane", '\u{ef21}'), //  ("fa_i_cursor", '\u{f246}'), //  ("fa_ice_cream", '\u{ef88}'), //  ("fa_icicles", '\u{ef52}'), //  ("fa_icons", '\u{efa8}'), //  ("fa_id_badge", '\u{f2c1}'), //  ("fa_id_card", '\u{f2c2}'), //  ("fa_id_card_clip", '\u{ed84}'), //  ("fa_id_card_o", '\u{f2c3}'), //  ("fa_igloo", '\u{ef53}'), //  ("fa_ils", '\u{f20b}'), //  ("fa_image", '\u{f03e}'), //  ("fa_image_portrait", '\u{ed19}'), //  ("fa_images", '\u{f00f}'), //  ("fa_imdb", '\u{f2d8}'), //  ("fa_inbox", '\u{f01c}'), //  ("fa_indent", '\u{f03c}'), //  ("fa_industry", '\u{f275}'), //  ("fa_infinity", '\u{edfe}'), //  ("fa_info", '\u{f129}'), //  ("fa_info_circle", '\u{f05a}'), //  ("fa_inr", '\u{f156}'), //  ("fa_instagram", '\u{f16d}'), //  ("fa_institution", '\u{f19c}'), //  ("fa_intercom", '\u{ef54}'), //  ("fa_internet_explorer", '\u{f26b}'), //  ("fa_intersex", '\u{f224}'), //  ("fa_invision", '\u{ef55}'), //  ("fa_ioxhost", '\u{f208}'), //  ("fa_italic", '\u{f033}'), //  ("fa_itch_io", '\u{ef99}'), //  ("fa_itunes", '\u{f2e9}'), //  ("fa_itunes_note", '\u{f2eb}'), //  ("fa_java", '\u{edaf}'), //  ("fa_jedi", '\u{eecc}'), //  ("fa_jedi_order", '\u{edd8}'), //  ("fa_jenkins", '\u{f2ec}'), //  ("fa_jet_fighter", '\u{f0fb}'), //  ("fa_jira", '\u{ef56}'), //  ("fa_joget", '\u{f2ed}'), //  ("fa_joint", '\u{ee5e}'), //  ("fa_joomla", '\u{f1aa}'), //  ("fa_jpy", '\u{f157}'), //  ("fa_js", '\u{f2ee}'), //  ("fa_jsfiddle", '\u{f1cc}'), //  ("fa_kaaba", '\u{eece}'), //  ("fa_kaggle", '\u{eea6}'), //  ("fa_key", '\u{f084}'), //  ("fa_keybase", '\u{edbf}'), //  ("fa_keyboard", '\u{f11c}'), //  ("fa_keyboard_o", '\u{f11c}'), //  ("fa_keycdn", '\u{f2f0}'), //  ("fa_khanda", '\u{eecf}'), //  ("fa_kickstarter", '\u{f2f3}'), //  ("fa_kickstarter_k", '\u{f2f4}'), //  ("fa_kit_medical", '\u{ed82}'), //  ("fa_kiwi_bird", '\u{edff}'), //  ("fa_korvue", '\u{ed59}'), //  ("fa_krw", '\u{f159}'), //  ("fa_landmark", '\u{eed0}'), //  ("fa_landmark_dome", '\u{ef22}'), //  ("fa_language", '\u{f1ab}'), //  ("fa_laptop", '\u{f109}'), //  ("fa_laptop_code", '\u{eea7}'), //  ("fa_laptop_medical", '\u{ef89}'), //  ("fa_laravel", '\u{f2f7}'), //  ("fa_lastfm", '\u{f202}'), //  ("fa_lastfm_square", '\u{f203}'), //  ("fa_layer_group", '\u{eea8}'), //  ("fa_leaf", '\u{f06c}'), //  ("fa_leanpub", '\u{f212}'), //  ("fa_left_long", '\u{f04f}'), //  ("fa_left_right", '\u{f08f}'), //  ("fa_legal", '\u{f0e3}'), //  ("fa_lemon", '\u{f094}'), //  ("fa_lemon_o", '\u{f094}'), //  ("fa_less", '\u{ed48}'), //  ("fa_less_than", '\u{efc3}'), //  ("fa_less_than_equal", '\u{efc4}'), //  ("fa_level_down", '\u{f149}'), //  ("fa_level_up", '\u{f148}'), //  ("fa_life_bouy", '\u{f1cd}'), //  ("fa_life_buoy", '\u{f1cd}'), //  ("fa_life_ring", '\u{f1cd}'), //  ("fa_life_saver", '\u{f1cd}'), //  ("fa_lightbulb", '\u{f0eb}'), //  ("fa_lightbulb_o", '\u{f0eb}'), //  ("fa_line", '\u{f2fb}'), //  ("fa_line_chart", '\u{f201}'), //  ("fa_link", '\u{f0c1}'), //  ("fa_link_slash", '\u{f127}'), //  ("fa_linkedin", '\u{f0e1}'), //  ("fa_linkedin_in", '\u{f0e1}'), //  ("fa_linkedin_square", '\u{f08c}'), //  ("fa_linode", '\u{f2b8}'), //  ("fa_linux", '\u{f17c}'), //  ("fa_lira_sign", '\u{f195}'), //  ("fa_list", '\u{f03a}'), //  ("fa_list_alt", '\u{f022}'), //  ("fa_list_check", '\u{f0ae}'), //  ("fa_list_ol", '\u{f0cb}'), //  ("fa_list_ul", '\u{f0ca}'), //  ("fa_location_arrow", '\u{f124}'), //  ("fa_location_crosshairs", '\u{eea9}'), //  ("fa_location_dot", '\u{ed00}'), //  ("fa_location_pin", '\u{f041}'), //  ("fa_lock", '\u{f023}'), //  ("fa_lock_open", '\u{f2fc}'), //  ("fa_long_arrow_down", '\u{f175}'), //  ("fa_long_arrow_left", '\u{f177}'), //  ("fa_long_arrow_right", '\u{f178}'), //  ("fa_long_arrow_up", '\u{f176}'), //  ("fa_low_vision", '\u{f2a8}'), //  ("fa_lungs", '\u{eeaa}'), //  ("fa_lyft", '\u{f2fd}'), //  ("fa_magento", '\u{f2ff}'), //  ("fa_magic", '\u{f0d0}'), //  ("fa_magnet", '\u{f076}'), //  ("fa_magnifying_glass", '\u{f002}'), //  ("fa_magnifying_glass_dollar", '\u{eedd}'), //  ("fa_magnifying_glass_location", '\u{eede}'), //  ("fa_magnifying_glass_minus", '\u{f010}'), //  ("fa_magnifying_glass_plus", '\u{f00e}'), //  ("fa_mail_forward", '\u{f064}'), //  ("fa_mail_reply", '\u{f112}'), //  ("fa_mail_reply_all", '\u{f122}'), //  ("fa_mailchimp", '\u{ee67}'), //  ("fa_male", '\u{f183}'), //  ("fa_mandalorian", '\u{edd9}'), //  ("fa_map", '\u{f279}'), //  ("fa_map_location", '\u{ee68}'), //  ("fa_map_location_dot", '\u{ee69}'), //  ("fa_map_marker", '\u{f041}'), //  ("fa_map_o", '\u{f278}'), //  ("fa_map_pin", '\u{f276}'), //  ("fa_map_signs", '\u{f277}'), //  ("fa_markdown", '\u{eeab}'), //  ("fa_marker", '\u{ee6a}'), //  ("fa_mars", '\u{f222}'), //  ("fa_mars_double", '\u{f227}'), //  ("fa_mars_stroke", '\u{f229}'), //  ("fa_mars_stroke_h", '\u{f22b}'), //  ("fa_mars_stroke_right", '\u{f22b}'), //  ("fa_mars_stroke_up", '\u{f22a}'), //  ("fa_mars_stroke_v", '\u{f22a}'), //  ("fa_martini_glass", '\u{ee44}'), //  ("fa_martini_glass_citrus", '\u{ee2a}'), //  ("fa_martini_glass_empty", '\u{f000}'), //  ("fa_mask", '\u{ef07}'), //  ("fa_masks_theater", '\u{eeb6}'), //  ("fa_mastodon", '\u{edc0}'), //  ("fa_maxcdn", '\u{f136}'), //  ("fa_maximize", '\u{f06f}'), //  ("fa_mdb", '\u{efb9}'), //  ("fa_meanpath", '\u{f20c}'), //  ("fa_medal", '\u{ee6b}'), //  ("fa_medapps", '\u{ed01}'), //  ("fa_medium", '\u{f23a}'), //  ("fa_medkit", '\u{f0fa}'), //  ("fa_medrt", '\u{ed02}'), //  ("fa_meetup", '\u{f2e0}'), //  ("fa_megaport", '\u{ee6c}'), //  ("fa_meh_o", '\u{f11a}'), //  ("fa_memory", '\u{efc5}'), //  ("fa_mendeley", '\u{ef57}'), //  ("fa_menorah", '\u{eed2}'), //  ("fa_mercury", '\u{f223}'), //  ("fa_message", '\u{f27a}'), //  ("fa_meteor", '\u{ef23}'), //  ("fa_microchip", '\u{f2db}'), //  ("fa_microphone", '\u{f130}'), //  ("fa_microphone_lines", '\u{ed03}'), //  ("fa_microphone_lines_slash", '\u{efc6}'), //  ("fa_microphone_slash", '\u{f131}'), //  ("fa_microscope", '\u{eeac}'), //  ("fa_microsoft", '\u{ed04}'), //  ("fa_minimize", '\u{ef3e}'), //  ("fa_minus", '\u{f068}'), //  ("fa_minus_circle", '\u{f056}'), //  ("fa_minus_square", '\u{f146}'), //  ("fa_minus_square_o", '\u{f147}'), //  ("fa_mitten", '\u{ef58}'), //  ("fa_mix", '\u{ed05}'), //  ("fa_mixcloud", '\u{f289}'), //  ("fa_mizuni", '\u{ed06}'), //  ("fa_mobile", '\u{ed08}'), //  ("fa_mobile_button", '\u{ed07}'), //  ("fa_mobile_phone", '\u{f10b}'), //  ("fa_mobile_screen", '\u{ed09}'), //  ("fa_mobile_screen_button", '\u{f10b}'), //  ("fa_modx", '\u{f285}'), //  ("fa_monero", '\u{ed0a}'), //  ("fa_money", '\u{f0d6}'), //  ("fa_money_bill", '\u{f0d6}'), //  ("fa_money_bill_1", '\u{ed0b}'), //  ("fa_money_bill_1_wave", '\u{efc8}'), //  ("fa_money_bill_wave", '\u{efc7}'), //  ("fa_money_check", '\u{efc9}'), //  ("fa_money_check_dollar", '\u{efca}'), //  ("fa_monument", '\u{ee6f}'), //  ("fa_moon", '\u{f186}'), //  ("fa_moon_o", '\u{f186}'), //  ("fa_mortar_board", '\u{f19d}'), //  ("fa_mortar_pestle", '\u{ee70}'), //  ("fa_mosque", '\u{eed3}'), //  ("fa_motorcycle", '\u{f21c}'), //  ("fa_mountain", '\u{ef08}'), //  ("fa_mouse_pointer", '\u{f245}'), //  ("fa_mug_hot", '\u{ef59}'), //  ("fa_mug_saucer", '\u{f0f4}'), //  ("fa_music", '\u{f001}'), //  ("fa_napster", '\u{ed0c}'), //  ("fa_navicon", '\u{f0c9}'), //  ("fa_neos", '\u{eead}'), //  ("fa_network_wired", '\u{ef09}'), //  ("fa_neuter", '\u{f22c}'), //  ("fa_newspaper", '\u{f1ea}'), //  ("fa_newspaper_o", '\u{f1ea}'), //  ("fa_nimblr", '\u{ee71}'), //  ("fa_node", '\u{ed44}'), //  ("fa_node_js", '\u{ed0d}'), //  ("fa_not_equal", '\u{efcb}'), //  ("fa_note_sticky", '\u{f249}'), //  ("fa_notes_medical", '\u{ed85}'), //  ("fa_npm", '\u{ed0e}'), //  ("fa_ns8", '\u{ed0f}'), //  ("fa_nutritionix", '\u{ed10}'), //  ("fa_object_group", '\u{f247}'), //  ("fa_object_ungroup", '\u{f248}'), //  ("fa_odnoklassniki", '\u{f263}'), //  ("fa_odnoklassniki_square", '\u{f264}'), //  ("fa_oil_can", '\u{eeae}'), //  ("fa_ok_sign", '\u{f058}'), //  ("fa_old_republic", '\u{edda}'), //  ("fa_om", '\u{eed4}'), //  ("fa_opencart", '\u{f23d}'), //  ("fa_openid", '\u{f19b}'), //  ("fa_opera", '\u{f26a}'), //  ("fa_optin_monster", '\u{f23c}'), //  ("fa_orcid", '\u{efbb}'), //  ("fa_osi", '\u{ed45}'), //  ("fa_otter", '\u{ef0a}'), //  ("fa_outdent", '\u{f03b}'), //  ("fa_page4", '\u{ed11}'), //  ("fa_pagelines", '\u{f18c}'), //  ("fa_pager", '\u{ef8a}'), //  ("fa_paint_brush", '\u{f1fc}'), //  ("fa_paint_roller", '\u{ee72}'), //  ("fa_paintbrush", '\u{f1fc}'), //  ("fa_palette", '\u{efcc}'), //  ("fa_palfed", '\u{ed12}'), //  ("fa_pallet", '\u{ed86}'), //  ("fa_paper_plane", '\u{f1d8}'), //  ("fa_paper_plane_o", '\u{f1d9}'), //  ("fa_paperclip", '\u{f0c6}'), //  ("fa_parachute_box", '\u{eda1}'), //  ("fa_paragraph", '\u{f1dd}'), //  ("fa_passport", '\u{ee73}'), //  ("fa_paste", '\u{f0ea}'), //  ("fa_patreon", '\u{ed13}'), //  ("fa_pause", '\u{f04c}'), //  ("fa_pause_circle", '\u{f28b}'), //  ("fa_pause_circle_o", '\u{f28c}'), //  ("fa_paw", '\u{f1b0}'), //  ("fa_paypal", '\u{f1ed}'), //  ("fa_peace", '\u{eed6}'), //  ("fa_pen", '\u{f01f}'), //  ("fa_pen_clip", '\u{f020}'), //  ("fa_pen_fancy", '\u{ee74}'), //  ("fa_pen_nib", '\u{ee75}'), //  ("fa_pen_ruler", '\u{ee76}'), //  ("fa_pen_to_square", '\u{f044}'), //  ("fa_pencil", '\u{f040}'), //  ("fa_pencil_square", '\u{f14b}'), //  ("fa_pencil_square_o", '\u{f044}'), //  ("fa_people_carry_box", '\u{eda2}'), //  ("fa_pepper_hot", '\u{ef8b}'), //  ("fa_percent", '\u{f295}'), //  ("fa_periscope", '\u{ed14}'), //  ("fa_person", '\u{f183}'), //  ("fa_person_biking", '\u{efa2}'), //  ("fa_person_booth", '\u{ef24}'), //  ("fa_person_digging", '\u{efa6}'), //  ("fa_person_dots_from_line", '\u{ed7c}'), //  ("fa_person_dress", '\u{f182}'), //  ("fa_person_hiking", '\u{ef02}'), //  ("fa_person_praying", '\u{eeda}'), //  ("fa_person_running", '\u{ef0c}'), //  ("fa_person_skating", '\u{ef63}'), //  ("fa_person_skiing", '\u{ef65}'), //  ("fa_person_skiing_nordic", '\u{ef66}'), //  ("fa_person_snowboarding", '\u{ef69}'), //  ("fa_person_swimming", '\u{ee8b}'), //  ("fa_person_walking", '\u{ee1d}'), //  ("fa_person_walking_with_cane", '\u{f29d}'), //  ("fa_phabricator", '\u{ed15}'), //  ("fa_phoenix_framework", '\u{ed16}'), //  ("fa_phoenix_squadron", '\u{eddb}'), //  ("fa_phone", '\u{f095}'), //  ("fa_phone_flip", '\u{efa9}'), //  ("fa_phone_slash", '\u{ed17}'), //  ("fa_phone_square", '\u{f098}'), //  ("fa_phone_volume", '\u{f2a0}'), //  ("fa_photo", '\u{f03e}'), //  ("fa_photo_film", '\u{efab}'), //  ("fa_php", '\u{ed6d}'), //  ("fa_picture_o", '\u{f03e}'), //  ("fa_pie_chart", '\u{f200}'), //  ("fa_pied_piper", '\u{f2ae}'), //  ("fa_pied_piper_alt", '\u{f1a8}'), //  ("fa_pied_piper_hat", '\u{edb0}'), //  ("fa_pied_piper_pp", '\u{f1a7}'), //  ("fa_piggy_bank", '\u{eda3}'), //  ("fa_pills", '\u{ed87}'), //  ("fa_pinterest", '\u{f0d2}'), //  ("fa_pinterest_p", '\u{f231}'), //  ("fa_pinterest_square", '\u{f0d3}'), //  ("fa_pizza_slice", '\u{ef8c}'), //  ("fa_place_of_worship", '\u{eed7}'), //  ("fa_plane", '\u{f072}'), //  ("fa_plane_arrival", '\u{ee77}'), //  ("fa_plane_departure", '\u{ee78}'), //  ("fa_play", '\u{f04b}'), //  ("fa_play_circle", '\u{f144}'), //  ("fa_play_circle_o", '\u{f01d}'), //  ("fa_playstation", '\u{ed18}'), //  ("fa_plug", '\u{f1e6}'), //  ("fa_plus", '\u{f067}'), //  ("fa_plus_circle", '\u{f055}'), //  ("fa_plus_square", '\u{f0fe}'), //  ("fa_plus_square_o", '\u{f196}'), //  ("fa_podcast", '\u{f2ce}'), //  ("fa_poo", '\u{f2fe}'), //  ("fa_poo_storm", '\u{ef25}'), //  ("fa_poop", '\u{eeaf}'), //  ("fa_power_off", '\u{f011}'), //  ("fa_prescription", '\u{ee79}'), //  ("fa_prescription_bottle", '\u{ed88}'), //  ("fa_prescription_bottle_medical", '\u{ed89}'), //  ("fa_print", '\u{f02f}'), //  ("fa_product_hunt", '\u{f288}'), //  ("fa_pushed", '\u{ed1a}'), //  ("fa_puzzle_piece", '\u{f12e}'), //  ("fa_python", '\u{ed1b}'), //  ("fa_qq", '\u{f1d6}'), //  ("fa_qrcode", '\u{f029}'), //  ("fa_question", '\u{f128}'), //  ("fa_question_circle", '\u{f059}'), //  ("fa_question_circle_o", '\u{f29c}'), //  ("fa_quinscape", '\u{ed6f}'), //  ("fa_quora", '\u{f2c4}'), //  ("fa_quote_left", '\u{f10d}'), //  ("fa_quote_right", '\u{f10e}'), //  ("fa_r_project", '\u{edc1}'), //  ("fa_ra", '\u{f1d0}'), //  ("fa_radiation", '\u{ef5a}'), //  ("fa_radio", '\u{efbc}'), //  ("fa_rainbow", '\u{ef26}'), //  ("fa_random", '\u{f074}'), //  ("fa_raspberry_pi", '\u{ef5c}'), //  ("fa_ravelry", '\u{f2d9}'), //  ("fa_react", '\u{ed46}'), //  ("fa_reacteurope", '\u{ef27}'), //  ("fa_readme", '\u{eda4}'), //  ("fa_rebel", '\u{f1d0}'), //  ("fa_receipt", '\u{ee0c}'), //  ("fa_record_vinyl", '\u{efbd}'), //  ("fa_rectangle_ad", '\u{eebb}'), //  ("fa_rectangle_list", '\u{f022}'), //  ("fa_rectangle_xmark", '\u{f2d4}'), //  ("fa_recycle", '\u{f1b8}'), //  ("fa_red_river", '\u{ed1c}'), //  ("fa_reddit", '\u{f1a1}'), //  ("fa_reddit_alien", '\u{f281}'), //  ("fa_reddit_square", '\u{f1a2}'), //  ("fa_redhat", '\u{ef5d}'), //  ("fa_refresh", '\u{f021}'), //  ("fa_registered", '\u{f25d}'), //  ("fa_remove", '\u{f00d}'), //  ("fa_remove_sign", '\u{f057}'), //  ("fa_renren", '\u{f18b}'), //  ("fa_reorder", '\u{f0c9}'), //  ("fa_repeat", '\u{f01e}'), //  ("fa_repeat_alt", '\u{f0b6}'), //  ("fa_reply", '\u{f112}'), //  ("fa_reply_all", '\u{f122}'), //  ("fa_replyd", '\u{ed1e}'), //  ("fa_republican", '\u{ef28}'), //  ("fa_researchgate", '\u{edc2}'), //  ("fa_resistance", '\u{f1d0}'), //  ("fa_resolving", '\u{ed1f}'), //  ("fa_restroom", '\u{ef5e}'), //  ("fa_retweet", '\u{f079}'), //  ("fa_rev", '\u{ee7a}'), //  ("fa_ribbon", '\u{eda5}'), //  ("fa_right_from_bracket", '\u{f2f5}'), //  ("fa_right_left", '\u{f0b5}'), //  ("fa_right_to_bracket", '\u{f2f6}'), //  ("fa_ring", '\u{ef0b}'), //  ("fa_rmb", '\u{f157}'), //  ("fa_road", '\u{f018}'), //  ("fa_robot", '\u{ee0d}'), //  ("fa_rocket", '\u{f135}'), //  ("fa_rocketchat", '\u{ed20}'), //  ("fa_rockrms", '\u{ed21}'), //  ("fa_rotate", '\u{f2f1}'), //  ("fa_rotate_left", '\u{f2ea}'), //  ("fa_rotate_right", '\u{f2f9}'), //  ("fa_rouble", '\u{f158}'), //  ("fa_route", '\u{eda6}'), //  ("fa_rss", '\u{f09e}'), //  ("fa_rss_square", '\u{f143}'), //  ("fa_rub", '\u{f158}'), //  ("fa_ruble", '\u{f158}'), //  ("fa_ruble_sign", '\u{f158}'), //  ("fa_ruler", '\u{ee0e}'), //  ("fa_ruler_combined", '\u{ee0f}'), //  ("fa_ruler_horizontal", '\u{ee10}'), //  ("fa_ruler_vertical", '\u{ee11}'), //  ("fa_rupee", '\u{f156}'), //  ("fa_rupee_sign", '\u{f156}'), //  ("fa_s15", '\u{f2cd}'), //  ("fa_sack_dollar", '\u{ef8d}'), //  ("fa_safari", '\u{f267}'), //  ("fa_salesforce", '\u{ef9a}'), //  ("fa_sass", '\u{ed49}'), //  ("fa_satellite", '\u{ef5f}'), //  ("fa_satellite_dish", '\u{ef60}'), //  ("fa_save", '\u{f0c7}'), //  ("fa_scale_balanced", '\u{f24e}'), //  ("fa_scale_unbalanced", '\u{eddf}'), //  ("fa_scale_unbalanced_flip", '\u{ede0}'), //  ("fa_schlix", '\u{ed22}'), //  ("fa_school", '\u{ee12}'), //  ("fa_scissors", '\u{f0c4}'), //  ("fa_screwdriver", '\u{ee13}'), //  ("fa_screwdriver_wrench", '\u{ef70}'), //  ("fa_scribd", '\u{f28a}'), //  ("fa_scroll", '\u{ef0d}'), //  ("fa_scroll_torah", '\u{eee5}'), //  ("fa_sd_card", '\u{ef61}'), //  ("fa_search", '\u{f002}'), //  ("fa_search_minus", '\u{f010}'), //  ("fa_search_plus", '\u{f00e}'), //  ("fa_searchengin", '\u{ed23}'), //  ("fa_seedling", '\u{eda7}'), //  ("fa_sellcast", '\u{f2da}'), //  ("fa_sellsy", '\u{f213}'), //  ("fa_send", '\u{f1d8}'), //  ("fa_send_o", '\u{f1d9}'), //  ("fa_server", '\u{f233}'), //  ("fa_servicestack", '\u{ed24}'), //  ("fa_shapes", '\u{eeb0}'), //  ("fa_share", '\u{f064}'), //  ("fa_share_alt", '\u{f1e0}'), //  ("fa_share_alt_square", '\u{f1e1}'), //  ("fa_share_from_square", '\u{f14d}'), //  ("fa_share_nodes", '\u{f1e0}'), //  ("fa_share_square", '\u{f14d}'), //  ("fa_share_square_o", '\u{f045}'), //  ("fa_shekel", '\u{f20b}'), //  ("fa_shekel_sign", '\u{f20b}'), //  ("fa_sheqel", '\u{f20b}'), //  ("fa_shield", '\u{f132}'), //  ("fa_shield_halved", '\u{ed25}'), //  ("fa_ship", '\u{f21a}'), //  ("fa_shirt", '\u{ee1c}'), //  ("fa_shirtsinbulk", '\u{f214}'), //  ("fa_shoe_prints", '\u{ee14}'), //  ("fa_shop", '\u{ee18}'), //  ("fa_shopping_bag", '\u{f290}'), //  ("fa_shopping_basket", '\u{f291}'), //  ("fa_shopping_cart", '\u{f07a}'), //  ("fa_shopware", '\u{ee7d}'), //  ("fa_shower", '\u{f2cc}'), //  ("fa_shuffle", '\u{f074}'), //  ("fa_shuttle_space", '\u{f197}'), //  ("fa_sign_hanging", '\u{eda8}'), //  ("fa_sign_in", '\u{f090}'), //  ("fa_sign_language", '\u{f2a7}'), //  ("fa_sign_out", '\u{f08b}'), //  ("fa_signal", '\u{f012}'), //  ("fa_signature", '\u{ee7f}'), //  ("fa_signing", '\u{f2a7}'), //  ("fa_signs_post", '\u{f277}'), //  ("fa_sim_card", '\u{ef62}'), //  ("fa_simplybuilt", '\u{f215}'), //  ("fa_sistrix", '\u{ed26}'), //  ("fa_sitemap", '\u{f0e8}'), //  ("fa_sith", '\u{eddc}'), //  ("fa_sketch", '\u{ef64}'), //  ("fa_skull", '\u{ee15}'), //  ("fa_skull_crossbones", '\u{ef0e}'), //  ("fa_skyatlas", '\u{f216}'), //  ("fa_skype", '\u{f17e}'), //  ("fa_slack", '\u{f198}'), //  ("fa_slash", '\u{ef0f}'), //  ("fa_sleigh", '\u{ef67}'), //  ("fa_sliders", '\u{f1de}'), //  ("fa_slideshare", '\u{f1e7}'), //  ("fa_smile_o", '\u{f118}'), //  ("fa_smog", '\u{ef29}'), //  ("fa_smoking", '\u{ed8c}'), //  ("fa_snapchat", '\u{f2ab}'), //  ("fa_snapchat_ghost", '\u{f2ac}'), //  ("fa_snapchat_square", '\u{f2ad}'), //  ("fa_snowflake", '\u{f2dc}'), //  ("fa_snowflake_o", '\u{f2dc}'), //  ("fa_snowman", '\u{ef6a}'), //  ("fa_snowplow", '\u{ef6b}'), //  ("fa_soccer_ball_o", '\u{f1e3}'), //  ("fa_socks", '\u{eedf}'), //  ("fa_solar_panel", '\u{ee81}'), //  ("fa_sort", '\u{f0dc}'), //  ("fa_sort_alpha_asc", '\u{f15d}'), //  ("fa_sort_alpha_desc", '\u{f15e}'), //  ("fa_sort_amount_asc", '\u{f160}'), //  ("fa_sort_amount_desc", '\u{f161}'), //  ("fa_sort_asc", '\u{f0de}'), //  ("fa_sort_desc", '\u{f0dd}'), //  ("fa_sort_down", '\u{f0dd}'), //  ("fa_sort_numeric_asc", '\u{f162}'), //  ("fa_sort_numeric_desc", '\u{f163}'), //  ("fa_sort_up", '\u{f0de}'), //  ("fa_soundcloud", '\u{f1be}'), //  ("fa_sourcetree", '\u{ef6c}'), //  ("fa_spa", '\u{ee82}'), //  ("fa_space_shuttle", '\u{f197}'), //  ("fa_spaghetti_monster_flying", '\u{eed5}'), //  ("fa_speakap", '\u{ed27}'), //  ("fa_speaker_deck", '\u{ef9b}'), //  ("fa_spell_check", '\u{efb3}'), //  ("fa_spider", '\u{ef10}'), //  ("fa_spinner", '\u{f110}'), //  ("fa_splotch", '\u{ee83}'), //  ("fa_spoon", '\u{f1b1}'), //  ("fa_spotify", '\u{f1bc}'), //  ("fa_spray_can", '\u{ee84}'), //  ("fa_spray_can_sparkles", '\u{ee97}'), //  ("fa_square", '\u{f0c8}'), //  ("fa_square_arrow_up_right", '\u{f14c}'), //  ("fa_square_behance", '\u{f1b5}'), //  ("fa_square_caret_down", '\u{f150}'), //  ("fa_square_caret_left", '\u{f191}'), //  ("fa_square_caret_right", '\u{f152}'), //  ("fa_square_caret_up", '\u{f151}'), //  ("fa_square_check", '\u{f14a}'), //  ("fa_square_dribbble", '\u{f22e}'), //  ("fa_square_envelope", '\u{f199}'), //  ("fa_square_facebook", '\u{f082}'), //  ("fa_square_font_awesome_stroke", '\u{f0af}'), //  ("fa_square_full", '\u{ed70}'), //  ("fa_square_git", '\u{f1d2}'), //  ("fa_square_github", '\u{f092}'), //  ("fa_square_google_plus", '\u{f0d4}'), //  ("fa_square_h", '\u{f0fd}'), //  ("fa_square_hacker_news", '\u{f2e5}'), //  ("fa_square_js", '\u{f2ef}'), //  ("fa_square_lastfm", '\u{f203}'), //  ("fa_square_minus", '\u{f146}'), //  ("fa_square_o", '\u{f096}'), //  ("fa_square_odnoklassniki", '\u{f264}'), //  ("fa_square_parking", '\u{efcd}'), //  ("fa_square_pen", '\u{f14b}'), //  ("fa_square_phone", '\u{f098}'), //  ("fa_square_phone_flip", '\u{efaa}'), //  ("fa_square_pinterest", '\u{f0d3}'), //  ("fa_square_plus", '\u{f0fe}'), //  ("fa_square_poll_horizontal", '\u{eed9}'), //  ("fa_square_poll_vertical", '\u{eed8}'), //  ("fa_square_reddit", '\u{f1a2}'), //  ("fa_square_root_variable", '\u{eee0}'), //  ("fa_square_rss", '\u{f143}'), //  ("fa_square_share_nodes", '\u{f1e1}'), //  ("fa_square_snapchat", '\u{f2ad}'), //  ("fa_square_steam", '\u{f1b7}'), //  ("fa_square_tumblr", '\u{f174}'), //  ("fa_square_twitter", '\u{f081}'), //  ("fa_square_up_right", '\u{f0b4}'), //  ("fa_square_viadeo", '\u{f2aa}'), //  ("fa_square_vimeo", '\u{f194}'), //  ("fa_square_whatsapp", '\u{ed3b}'), //  ("fa_square_xing", '\u{f169}'), //  ("fa_square_xmark", '\u{f2d3}'), //  ("fa_square_youtube", '\u{f166}'), //  ("fa_squarespace", '\u{ee85}'), //  ("fa_stack_exchange", '\u{f18d}'), //  ("fa_stack_overflow", '\u{f16c}'), //  ("fa_stackpath", '\u{efa1}'), //  ("fa_stamp", '\u{ee86}'), //  ("fa_star", '\u{f005}'), //  ("fa_star_and_crescent", '\u{eee1}'), //  ("fa_star_half", '\u{f089}'), //  ("fa_star_half_empty", '\u{f123}'), //  ("fa_star_half_full", '\u{f123}'), //  ("fa_star_half_o", '\u{f123}'), //  ("fa_star_half_stroke", '\u{ee87}'), //  ("fa_star_o", '\u{f006}'), //  ("fa_star_of_david", '\u{eee2}'), //  ("fa_star_of_life", '\u{eeb1}'), //  ("fa_staylinked", '\u{ed28}'), //  ("fa_steam", '\u{f1b6}'), //  ("fa_steam_square", '\u{f1b7}'), //  ("fa_steam_symbol", '\u{ed29}'), //  ("fa_step_backward", '\u{f048}'), //  ("fa_step_forward", '\u{f051}'), //  ("fa_sterling_sign", '\u{f154}'), //  ("fa_stethoscope", '\u{f0f1}'), //  ("fa_sticker_mule", '\u{ed2a}'), //  ("fa_sticky_note", '\u{f249}'), //  ("fa_sticky_note_o", '\u{f24a}'), //  ("fa_stop", '\u{f04d}'), //  ("fa_stop_circle", '\u{f28d}'), //  ("fa_stop_circle_o", '\u{f28e}'), //  ("fa_stopwatch", '\u{f2f2}'), //  ("fa_store", '\u{ee17}'), //  ("fa_strava", '\u{ed52}'), //  ("fa_street_view", '\u{f21d}'), //  ("fa_strikethrough", '\u{f0cc}'), //  ("fa_stripe", '\u{ed53}'), //  ("fa_stripe_s", '\u{ed54}'), //  ("fa_stroopwafel", '\u{ee1a}'), //  ("fa_studiovinari", '\u{ed2b}'), //  ("fa_stumbleupon", '\u{f1a4}'), //  ("fa_stumbleupon_circle", '\u{f1a3}'), //  ("fa_subscript", '\u{f12c}'), //  ("fa_subway", '\u{f239}'), //  ("fa_suitcase", '\u{f0f2}'), //  ("fa_suitcase_medical", '\u{f0fa}'), //  ("fa_suitcase_rolling", '\u{ee88}'), //  ("fa_sun", '\u{f185}'), //  ("fa_sun_o", '\u{f185}'), //  ("fa_superpowers", '\u{f2dd}'), //  ("fa_superscript", '\u{f12b}'), //  ("fa_supple", '\u{ed2c}'), //  ("fa_support", '\u{f1cd}'), //  ("fa_suse", '\u{ef6d}'), //  ("fa_swatchbook", '\u{ee8a}'), //  ("fa_swift", '\u{efbe}'), //  ("fa_symfony", '\u{ef9c}'), //  ("fa_synagogue", '\u{eee3}'), //  ("fa_syringe", '\u{ed8d}'), //  ("fa_table", '\u{f0ce}'), //  ("fa_table_cells", '\u{f00a}'), //  ("fa_table_cells_large", '\u{f009}'), //  ("fa_table_columns", '\u{f0db}'), //  ("fa_table_list", '\u{f00b}'), //  ("fa_table_tennis_paddle_ball", '\u{ed71}'), //  ("fa_tablet", '\u{ed2e}'), //  ("fa_tablet_button", '\u{ed2d}'), //  ("fa_tablet_screen_button", '\u{f10a}'), //  ("fa_tablets", '\u{ed8e}'), //  ("fa_tachograph_digital", '\u{ee2f}'), //  ("fa_tachometer", '\u{f0e4}'), //  ("fa_tag", '\u{f02b}'), //  ("fa_tags", '\u{f02c}'), //  ("fa_tape", '\u{edaa}'), //  ("fa_tasks", '\u{f0ae}'), //  ("fa_taxi", '\u{f1ba}'), //  ("fa_teamspeak", '\u{edc3}'), //  ("fa_teeth", '\u{eeb4}'), //  ("fa_teeth_open", '\u{eeb5}'), //  ("fa_telegram", '\u{f2c6}'), //  ("fa_television", '\u{f26c}'), //  ("fa_temperature_empty", '\u{f2cb}'), //  ("fa_temperature_full", '\u{f2c7}'), //  ("fa_temperature_half", '\u{f2c9}'), //  ("fa_temperature_high", '\u{ef2a}'), //  ("fa_temperature_low", '\u{ef2b}'), //  ("fa_temperature_quarter", '\u{f2ca}'), //  ("fa_temperature_three_quarters", '\u{f2c8}'), //  ("fa_tencent_weibo", '\u{f1d5}'), //  ("fa_tenge_sign", '\u{ef6e}'), //  ("fa_terminal", '\u{f120}'), //  ("fa_text_height", '\u{f034}'), //  ("fa_text_slash", '\u{efac}'), //  ("fa_text_width", '\u{f035}'), //  ("fa_th", '\u{f00a}'), //  ("fa_th_large", '\u{f009}'), //  ("fa_th_list", '\u{f00b}'), //  ("fa_the_red_yeti", '\u{eee4}'), //  ("fa_themeco", '\u{ee8d}'), //  ("fa_themeisle", '\u{f2b2}'), //  ("fa_thermometer", '\u{f2c7}'), //  ("fa_thermometer_0", '\u{f2cb}'), //  ("fa_thermometer_1", '\u{f2ca}'), //  ("fa_thermometer_2", '\u{f2c9}'), //  ("fa_thermometer_3", '\u{f2c8}'), //  ("fa_thermometer_4", '\u{f2c7}'), //  ("fa_thermometer_alt", '\u{ed8f}'), //  ("fa_thermometer_empty", '\u{f2cb}'), //  ("fa_thermometer_full", '\u{f2c7}'), //  ("fa_thermometer_half", '\u{f2c9}'), //  ("fa_thermometer_quarter", '\u{f2ca}'), //  ("fa_thermometer_three_quarters", '\u{f2c8}'), //  ("fa_think_peaks", '\u{ef19}'), //  ("fa_thumb_tack", '\u{f08d}'), //  ("fa_thumbs_down", '\u{f165}'), //  ("fa_thumbs_o_down", '\u{f088}'), //  ("fa_thumbs_o_up", '\u{f087}'), //  ("fa_thumbs_up", '\u{f164}'), //  ("fa_thumbtack", '\u{f08d}'), //  ("fa_ticket", '\u{f145}'), //  ("fa_ticket_simple", '\u{ed30}'), //  ("fa_times", '\u{f00d}'), //  ("fa_times_circle", '\u{f057}'), //  ("fa_times_circle_o", '\u{f05c}'), //  ("fa_times_rectangle", '\u{f2d3}'), //  ("fa_times_rectangle_o", '\u{f2d4}'), //  ("fa_tint", '\u{f043}'), //  ("fa_toggle_down", '\u{f150}'), //  ("fa_toggle_left", '\u{f191}'), //  ("fa_toggle_off", '\u{f204}'), //  ("fa_toggle_on", '\u{f205}'), //  ("fa_toggle_right", '\u{f152}'), //  ("fa_toggle_up", '\u{f151}'), //  ("fa_toilet", '\u{ef6f}'), //  ("fa_toilet_paper", '\u{ef11}'), //  ("fa_toolbox", '\u{ee1b}'), //  ("fa_tooth", '\u{ee90}'), //  ("fa_torii_gate", '\u{eee6}'), //  ("fa_tornado", '\u{ef2d}'), //  ("fa_tower_broadcast", '\u{ede3}'), //  ("fa_tractor", '\u{ef12}'), //  ("fa_trade_federation", '\u{eddd}'), //  ("fa_trademark", '\u{f25c}'), //  ("fa_traffic_light", '\u{eeb7}'), //  ("fa_train", '\u{f238}'), //  ("fa_train_subway", '\u{f239}'), //  ("fa_transgender", '\u{f224}'), //  ("fa_transgender_alt", '\u{f225}'), //  ("fa_trash", '\u{f1f8}'), //  ("fa_trash_arrow_up", '\u{ef90}'), //  ("fa_trash_can", '\u{f014}'), //  ("fa_trash_can_arrow_up", '\u{ef91}'), //  ("fa_trash_o", '\u{f014}'), //  ("fa_tree", '\u{f1bb}'), //  ("fa_trello", '\u{f181}'), //  ("fa_triangle_exclamation", '\u{f071}'), //  ("fa_tripadvisor", '\u{f262}'), //  ("fa_trophy", '\u{f091}'), //  ("fa_truck", '\u{f0d1}'), //  ("fa_truck_fast", '\u{ed8b}'), //  ("fa_truck_medical", '\u{f0f9}'), //  ("fa_truck_monster", '\u{eeb8}'), //  ("fa_truck_moving", '\u{edac}'), //  ("fa_truck_pickup", '\u{eeb9}'), //  ("fa_truck_ramp_box", '\u{edab}'), //  ("fa_try", '\u{f195}'), //  ("fa_tty", '\u{f1e4}'), //  ("fa_tumblr", '\u{f173}'), //  ("fa_tumblr_square", '\u{f174}'), //  ("fa_turkish_lira", '\u{f195}'), //  ("fa_turn_down", '\u{f2f8}'), //  ("fa_turn_up", '\u{f2fa}'), //  ("fa_tv", '\u{f26c}'), //  ("fa_twitch", '\u{f1e8}'), //  ("fa_twitter", '\u{f099}'), //  ("fa_twitter_square", '\u{f081}'), //  ("fa_typo3", '\u{ed55}'), //  ("fa_uber", '\u{ed31}'), //  ("fa_ubuntu", '\u{ef72}'), //  ("fa_uikit", '\u{ed32}'), //  ("fa_umbraco", '\u{efbf}'), //  ("fa_umbrella", '\u{f0e9}'), //  ("fa_umbrella_beach", '\u{ee91}'), //  ("fa_underline", '\u{f0cd}'), //  ("fa_undo", '\u{f0e2}'), //  ("fa_uniregistry", '\u{ed33}'), //  ("fa_universal_access", '\u{f29a}'), //  ("fa_university", '\u{f19c}'), //  ("fa_unlink", '\u{f127}'), //  ("fa_unlock", '\u{f09c}'), //  ("fa_unlock_alt", '\u{f13e}'), //  ("fa_unlock_keyhole", '\u{f13e}'), //  ("fa_unsorted", '\u{f0dc}'), //  ("fa_untappd", '\u{ed34}'), //  ("fa_up_down", '\u{f09f}'), //  ("fa_up_down_left_right", '\u{f0b2}'), //  ("fa_up_right_and_down_left_from_center", '\u{ed4f}'), //  ("fa_up_right_from_square", '\u{f0b3}'), //  ("fa_upload", '\u{f093}'), //  ("fa_ups", '\u{ef73}'), //  ("fa_usb", '\u{f287}'), //  ("fa_usd", '\u{f155}'), //  ("fa_user", '\u{f007}'), //  ("fa_user_astronaut", '\u{edc5}'), //  ("fa_user_check", '\u{edc6}'), //  ("fa_user_circle", '\u{f2bd}'), //  ("fa_user_circle_o", '\u{f2be}'), //  ("fa_user_clock", '\u{edc7}'), //  ("fa_user_doctor", '\u{f0f0}'), //  ("fa_user_gear", '\u{edc8}'), //  ("fa_user_graduate", '\u{edcb}'), //  ("fa_user_group", '\u{edca}'), //  ("fa_user_injured", '\u{ef13}'), //  ("fa_user_large", '\u{ed35}'), //  ("fa_user_large_slash", '\u{edc4}'), //  ("fa_user_lock", '\u{edcc}'), //  ("fa_user_md", '\u{f0f0}'), //  ("fa_user_minus", '\u{edcd}'), //  ("fa_user_ninja", '\u{edce}'), //  ("fa_user_nurse", '\u{ef92}'), //  ("fa_user_o", '\u{f2c0}'), //  ("fa_user_pen", '\u{edc9}'), //  ("fa_user_plus", '\u{f234}'), //  ("fa_user_secret", '\u{f21b}'), //  ("fa_user_shield", '\u{edcf}'), //  ("fa_user_slash", '\u{edd0}'), //  ("fa_user_tag", '\u{edd1}'), //  ("fa_user_tie", '\u{edd2}'), //  ("fa_user_times", '\u{f235}'), //  ("fa_user_xmark", '\u{f235}'), //  ("fa_users", '\u{f0c0}'), //  ("fa_users_gear", '\u{edd3}'), //  ("fa_usps", '\u{ef74}'), //  ("fa_ussunnah", '\u{ed36}'), //  ("fa_utensils", '\u{f0f5}'), //  ("fa_vaadin", '\u{ed37}'), //  ("fa_van_shuttle", '\u{ee7e}'), //  ("fa_vcard", '\u{f2bb}'), //  ("fa_vcard_o", '\u{f2bc}'), //  ("fa_vector_square", '\u{ee92}'), //  ("fa_venus", '\u{f221}'), //  ("fa_venus_double", '\u{f226}'), //  ("fa_venus_mars", '\u{f228}'), //  ("fa_viacoin", '\u{f237}'), //  ("fa_viadeo", '\u{f2a9}'), //  ("fa_viadeo_square", '\u{f2aa}'), //  ("fa_vial", '\u{ed90}'), //  ("fa_vials", '\u{ed91}'), //  ("fa_viber", '\u{ed38}'), //  ("fa_video", '\u{f03d}'), //  ("fa_video_camera", '\u{f03d}'), //  ("fa_video_slash", '\u{edad}'), //  ("fa_vihara", '\u{eee7}'), //  ("fa_vimeo", '\u{ed39}'), //  ("fa_vimeo_square", '\u{f194}'), //  ("fa_vimeo_v", '\u{f27d}'), //  ("fa_vine", '\u{f1ca}'), //  ("fa_vk", '\u{f189}'), //  ("fa_vnv", '\u{ed3a}'), //  ("fa_voicemail", '\u{efb4}'), //  ("fa_volcano", '\u{ef2e}'), //  ("fa_volleyball", '\u{ed72}'), //  ("fa_volume_control_phone", '\u{f2a0}'), //  ("fa_volume_down", '\u{f027}'), //  ("fa_volume_high", '\u{f028}'), //  ("fa_volume_low", '\u{f027}'), //  ("fa_volume_off", '\u{f026}'), //  ("fa_volume_up", '\u{f028}'), //  ("fa_volume_xmark", '\u{eee8}'), //  ("fa_vr_cardboard", '\u{ef14}'), //  ("fa_vuejs", '\u{ed4a}'), //  ("fa_walkie_talkie", '\u{efc0}'), //  ("fa_wallet", '\u{ee1e}'), //  ("fa_wand_magic", '\u{f0d0}'), //  ("fa_wand_sparkles", '\u{ef15}'), //  ("fa_warehouse", '\u{ed92}'), //  ("fa_warning", '\u{f071}'), //  ("fa_water", '\u{ef30}'), //  ("fa_water_ladder", '\u{ee8c}'), //  ("fa_wave_square", '\u{ef9d}'), //  ("fa_waze", '\u{ef9e}'), //  ("fa_wechat", '\u{f1d7}'), //  ("fa_weebly", '\u{ee93}'), //  ("fa_weibo", '\u{f18a}'), //  ("fa_weight_hanging", '\u{ee94}'), //  ("fa_weight_scale", '\u{ed93}'), //  ("fa_weixin", '\u{f1d7}'), //  ("fa_whatsapp", '\u{f232}'), //  ("fa_wheelchair", '\u{f193}'), //  ("fa_wheelchair_alt", '\u{f29b}'), //  ("fa_whiskey_glass", '\u{ef4a}'), //  ("fa_whmcs", '\u{ed3c}'), //  ("fa_wifi", '\u{f1eb}'), //  ("fa_wikipedia_w", '\u{f266}'), //  ("fa_wind", '\u{ef16}'), //  ("fa_window_close", '\u{f2d3}'), //  ("fa_window_close_o", '\u{f2d4}'), //  ("fa_window_maximize", '\u{f2d0}'), //  ("fa_window_minimize", '\u{f2d1}'), //  ("fa_window_restore", '\u{f2d2}'), //  ("fa_windows", '\u{f17a}'), //  ("fa_wine_bottle", '\u{ef17}'), //  ("fa_wine_glass", '\u{edae}'), //  ("fa_wine_glass_empty", '\u{ee95}'), //  ("fa_wix", '\u{ee96}'), //  ("fa_wizards_of_the_coast", '\u{ef18}'), //  ("fa_wolf_pack_battalion", '\u{edde}'), //  ("fa_won", '\u{f159}'), //  ("fa_won_sign", '\u{f159}'), //  ("fa_wordpress", '\u{f19a}'), //  ("fa_wordpress_simple", '\u{ed3d}'), //  ("fa_wpbeginner", '\u{f297}'), //  ("fa_wpexplorer", '\u{f2de}'), //  ("fa_wpforms", '\u{f298}'), //  ("fa_wpressr", '\u{ed1d}'), //  ("fa_wrench", '\u{f0ad}'), //  ("fa_x_ray", '\u{ed94}'), //  ("fa_xbox", '\u{ed3e}'), //  ("fa_xing", '\u{f168}'), //  ("fa_xing_square", '\u{f169}'), //  ("fa_xmark", '\u{f00d}'), //  ("fa_y_combinator", '\u{f23b}'), //  ("fa_y_combinator_square", '\u{f1d4}'), //  ("fa_yahoo", '\u{f19e}'), //  ("fa_yammer", '\u{ef9f}'), //  ("fa_yandex", '\u{ed3f}'), //  ("fa_yandex_international", '\u{ed40}'), //  ("fa_yarn", '\u{ef75}'), //  ("fa_yc", '\u{f23b}'), //  ("fa_yc_square", '\u{f1d4}'), //  ("fa_yelp", '\u{f1e9}'), //  ("fa_yen", '\u{f157}'), //  ("fa_yen_sign", '\u{f157}'), //  ("fa_yin_yang", '\u{eee9}'), //  ("fa_yoast", '\u{f2b1}'), //  ("fa_youtube", '\u{f16a}'), //  ("fa_youtube_play", '\u{f16a}'), //  ("fa_youtube_square", '\u{f166}'), //  ("fa_zhihu", '\u{eeba}'), //  ("fae_apple_fruit", '\u{e29e}'), //  ("fae_atom", '\u{e27f}'), //  ("fae_bacteria", '\u{e280}'), //  ("fae_banana", '\u{e281}'), //  ("fae_bath", '\u{e282}'), //  ("fae_bed", '\u{e283}'), //  ("fae_benzene", '\u{e284}'), //  ("fae_bigger", '\u{e285}'), //  ("fae_biohazard", '\u{e286}'), //  ("fae_blogger_circle", '\u{e287}'), //  ("fae_blogger_square", '\u{e288}'), //  ("fae_bones", '\u{e289}'), //  ("fae_book_open", '\u{e28a}'), //  ("fae_book_open_o", '\u{e28b}'), //  ("fae_brain", '\u{e28c}'), //  ("fae_bread", '\u{e28d}'), //  ("fae_butterfly", '\u{e28e}'), //  ("fae_carot", '\u{e28f}'), //  ("fae_cc_by", '\u{e290}'), //  ("fae_cc_cc", '\u{e291}'), //  ("fae_cc_nc", '\u{e292}'), //  ("fae_cc_nc_eu", '\u{e293}'), //  ("fae_cc_nc_jp", '\u{e294}'), //  ("fae_cc_nd", '\u{e295}'), //  ("fae_cc_remix", '\u{e296}'), //  ("fae_cc_sa", '\u{e297}'), //  ("fae_cc_share", '\u{e298}'), //  ("fae_cc_zero", '\u{e299}'), //  ("fae_checklist_o", '\u{e29a}'), //  ("fae_cheese", '\u{e264}'), //  ("fae_cherry", '\u{e29b}'), //  ("fae_chess_bishop", '\u{e29c}'), //  ("fae_chess_horse", '\u{e25f}'), //  ("fae_chess_king", '\u{e260}'), //  ("fae_chess_pawn", '\u{e261}'), //  ("fae_chess_queen", '\u{e262}'), //  ("fae_chess_tower", '\u{e263}'), //  ("fae_chicken_thigh", '\u{e29f}'), //  ("fae_chilli", '\u{e265}'), //  ("fae_chip", '\u{e266}'), //  ("fae_cicling", '\u{e267}'), //  ("fae_cloud", '\u{e268}'), //  ("fae_cockroach", '\u{e269}'), //  ("fae_coffe_beans", '\u{e26a}'), //  ("fae_coins", '\u{e26b}'), //  ("fae_comb", '\u{e26c}'), //  ("fae_comet", '\u{e26d}'), //  ("fae_crown", '\u{e26e}'), //  ("fae_cup_coffe", '\u{e26f}'), //  ("fae_dice", '\u{e270}'), //  ("fae_disco", '\u{e271}'), //  ("fae_dna", '\u{e272}'), //  ("fae_donut", '\u{e273}'), //  ("fae_dress", '\u{e274}'), //  ("fae_drop", '\u{e275}'), //  ("fae_ello", '\u{e276}'), //  ("fae_envelope_open", '\u{e277}'), //  ("fae_envelope_open_o", '\u{e278}'), //  ("fae_equal", '\u{e279}'), //  ("fae_equal_bigger", '\u{e27a}'), //  ("fae_feedly", '\u{e27b}'), //  ("fae_file_export", '\u{e27c}'), //  ("fae_file_import", '\u{e27d}'), //  ("fae_fingerprint", '\u{e23f}'), //  ("fae_floppy", '\u{e240}'), //  ("fae_footprint", '\u{e241}'), //  ("fae_freecodecamp", '\u{e242}'), //  ("fae_galaxy", '\u{e243}'), //  ("fae_galery", '\u{e244}'), //  ("fae_gift_card", '\u{e2a0}'), //  ("fae_glass", '\u{e245}'), //  ("fae_google_drive", '\u{e246}'), //  ("fae_google_play", '\u{e247}'), //  ("fae_gps", '\u{e248}'), //  ("fae_grav", '\u{e249}'), //  ("fae_guitar", '\u{e24a}'), //  ("fae_gut", '\u{e24b}'), //  ("fae_halter", '\u{e24c}'), //  ("fae_hamburger", '\u{e24d}'), //  ("fae_hat", '\u{e24e}'), //  ("fae_hexagon", '\u{e24f}'), //  ("fae_high_heel", '\u{e250}'), //  ("fae_hotdog", '\u{e251}'), //  ("fae_ice_cream", '\u{e252}'), //  ("fae_id_card", '\u{e253}'), //  ("fae_imdb", '\u{e254}'), //  ("fae_infinity", '\u{e255}'), //  ("fae_injection", '\u{e2a1}'), //  ("fae_isle", '\u{e2a2}'), //  ("fae_java", '\u{e256}'), //  ("fae_layers", '\u{e257}'), //  ("fae_lips", '\u{e258}'), //  ("fae_lipstick", '\u{e259}'), //  ("fae_liver", '\u{e25a}'), //  ("fae_lollipop", '\u{e2a3}'), //  ("fae_loyalty_card", '\u{e2a4}'), //  ("fae_lung", '\u{e25b}'), //  ("fae_makeup_brushes", '\u{e25c}'), //  ("fae_maximize", '\u{e25d}'), //  ("fae_meat", '\u{e2a5}'), //  ("fae_medicine", '\u{e221}'), //  ("fae_microscope", '\u{e222}'), //  ("fae_milk_bottle", '\u{e223}'), //  ("fae_minimize", '\u{e224}'), //  ("fae_molecule", '\u{e225}'), //  ("fae_moon_cloud", '\u{e226}'), //  ("fae_mountains", '\u{e2a6}'), //  ("fae_mushroom", '\u{e227}'), //  ("fae_mustache", '\u{e228}'), //  ("fae_mysql", '\u{e229}'), //  ("fae_nintendo", '\u{e22a}'), //  ("fae_orange", '\u{e2a7}'), //  ("fae_palette_color", '\u{e22b}'), //  ("fae_peach", '\u{e2a8}'), //  ("fae_pear", '\u{e2a9}'), //  ("fae_pi", '\u{e22c}'), //  ("fae_pizza", '\u{e22d}'), //  ("fae_planet", '\u{e22e}'), //  ("fae_plant", '\u{e22f}'), //  ("fae_playstation", '\u{e230}'), //  ("fae_poison", '\u{e231}'), //  ("fae_popcorn", '\u{e232}'), //  ("fae_popsicle", '\u{e233}'), //  ("fae_pulse", '\u{e234}'), //  ("fae_python", '\u{e235}'), //  ("fae_quora_circle", '\u{e236}'), //  ("fae_quora_square", '\u{e237}'), //  ("fae_radioactive", '\u{e238}'), //  ("fae_raining", '\u{e239}'), //  ("fae_real_heart", '\u{e23a}'), //  ("fae_refrigerator", '\u{e23b}'), //  ("fae_restore", '\u{e23c}'), //  ("fae_ring", '\u{e23d}'), //  ("fae_ruby", '\u{e23e}'), //  ("fae_ruby_o", '\u{e21e}'), //  ("fae_ruler", '\u{e21f}'), //  ("fae_shirt", '\u{e218}'), //  ("fae_slash", '\u{e216}'), //  ("fae_smaller", '\u{e200}'), //  ("fae_snowing", '\u{e201}'), //  ("fae_soda", '\u{e202}'), //  ("fae_sofa", '\u{e203}'), //  ("fae_soup", '\u{e204}'), //  ("fae_spermatozoon", '\u{e205}'), //  ("fae_spin_double", '\u{e206}'), //  ("fae_stomach", '\u{e207}'), //  ("fae_storm", '\u{e208}'), //  ("fae_sun_cloud", '\u{e21d}'), //  ("fae_sushi", '\u{e21a}'), //  ("fae_tacos", '\u{e219}'), //  ("fae_telegram", '\u{e217}'), //  ("fae_telegram_circle", '\u{e215}'), //  ("fae_telescope", '\u{e209}'), //  ("fae_thermometer", '\u{e20a}'), //  ("fae_thermometer_high", '\u{e20b}'), //  ("fae_thermometer_low", '\u{e20c}'), //  ("fae_thin_close", '\u{e20d}'), //  ("fae_toilet", '\u{e20e}'), //  ("fae_tools", '\u{e20f}'), //  ("fae_tooth", '\u{e210}'), //  ("fae_tree", '\u{e21c}'), //  ("fae_triangle_ruler", '\u{e21b}'), //  ("fae_umbrella", '\u{e220}'), //  ("fae_uterus", '\u{e211}'), //  ("fae_virus", '\u{e214}'), //  ("fae_w3c", '\u{e212}'), //  ("fae_walking", '\u{e213}'), //  ("fae_wallet", '\u{e25e}'), //  ("fae_wind", '\u{e27e}'), //  ("fae_xbox", '\u{e29d}'), //  ("iec_power", '\u{23fb}'), // ⏻ ("iec_power_off", '\u{2b58}'), // ⭘ ("iec_power_on", '\u{23fd}'), // ⏽ ("iec_sleep_mode", '\u{23fe}'), // ⏾ ("iec_toggle_power", '\u{23fc}'), // ⏼ ("indent_dotted_guide", '\u{e621}'), //  ("indent_line", '\u{e621}'), //  ("indentation_line", '\u{e621}'), //  ("linux_almalinux", '\u{f31d}'), //  ("linux_alpine", '\u{f300}'), //  ("linux_aosc", '\u{f301}'), //  ("linux_apple", '\u{f302}'), //  ("linux_archcraft", '\u{f345}'), //  ("linux_archlabs", '\u{f31e}'), //  ("linux_archlinux", '\u{f303}'), //  ("linux_arcolinux", '\u{f346}'), //  ("linux_arduino", '\u{f34b}'), //  ("linux_artix", '\u{f31f}'), //  ("linux_awesome", '\u{f354}'), //  ("linux_biglinux", '\u{f347}'), //  ("linux_bspwm", '\u{f355}'), //  ("linux_budgie", '\u{f320}'), //  ("linux_centos", '\u{f304}'), //  ("linux_cinnamon", '\u{f35f}'), //  ("linux_codeberg", '\u{f330}'), //  ("linux_coreos", '\u{f305}'), //  ("linux_crystal", '\u{f348}'), //  ("linux_debian", '\u{f306}'), //  ("linux_deepin", '\u{f321}'), //  ("linux_devuan", '\u{f307}'), //  ("linux_docker", '\u{f308}'), //  ("linux_dwm", '\u{f356}'), //  ("linux_elementary", '\u{f309}'), //  ("linux_endeavour", '\u{f322}'), //  ("linux_enlightenment", '\u{f357}'), //  ("linux_fdroid", '\u{f36a}'), //  ("linux_fedora", '\u{f30a}'), //  ("linux_fedora_inverse", '\u{f30b}'), //  ("linux_ferris", '\u{f323}'), //  ("linux_flathub", '\u{f324}'), //  ("linux_fluxbox", '\u{f358}'), //  ("linux_forgejo", '\u{f335}'), //  ("linux_fosdem", '\u{f36b}'), //  ("linux_freebsd", '\u{f30c}'), //  ("linux_freecad", '\u{f336}'), //  ("linux_freedesktop", '\u{f360}'), //  ("linux_garuda", '\u{f337}'), //  ("linux_gentoo", '\u{f30d}'), //  ("linux_gimp", '\u{f338}'), //  ("linux_gitea", '\u{f339}'), //  ("linux_gnome", '\u{f361}'), //  ("linux_gnu_guix", '\u{f325}'), //  ("linux_gtk", '\u{f362}'), //  ("linux_hyperbola", '\u{f33a}'), //  ("linux_hyprland", '\u{f359}'), //  ("linux_i3", '\u{f35a}'), //  ("linux_illumos", '\u{f326}'), //  ("linux_inkscape", '\u{f33b}'), //  ("linux_jwm", '\u{f35b}'), //  ("linux_kali_linux", '\u{f327}'), //  ("linux_kde", '\u{f373}'), //  ("linux_kde_neon", '\u{f331}'), //  ("linux_kde_plasma", '\u{f332}'), //  ("linux_kdenlive", '\u{f33c}'), //  ("linux_kicad", '\u{f34c}'), //  ("linux_krita", '\u{f33d}'), //  ("linux_kubuntu", '\u{f333}'), //  ("linux_kubuntu_inverse", '\u{f334}'), //  ("linux_leap", '\u{f37e}'), //  ("linux_libreoffice", '\u{f376}'), //  ("linux_libreofficebase", '\u{f377}'), //  ("linux_libreofficecalc", '\u{f378}'), //  ("linux_libreofficedraw", '\u{f379}'), //  ("linux_libreofficeimpress", '\u{f37a}'), //  ("linux_libreofficemath", '\u{f37b}'), //  ("linux_libreofficewriter", '\u{f37c}'), //  ("linux_linuxmint", '\u{f30e}'), //  ("linux_linuxmint_inverse", '\u{f30f}'), //  ("linux_locos", '\u{f349}'), //  ("linux_lxde", '\u{f363}'), //  ("linux_lxle", '\u{f33e}'), //  ("linux_lxqt", '\u{f364}'), //  ("linux_mageia", '\u{f310}'), //  ("linux_mandriva", '\u{f311}'), //  ("linux_manjaro", '\u{f312}'), //  ("linux_mate", '\u{f365}'), //  ("linux_mpv", '\u{f36e}'), //  ("linux_mxlinux", '\u{f33f}'), //  ("linux_neovim", '\u{f36f}'), //  ("linux_nixos", '\u{f313}'), //  ("linux_nobara", '\u{f380}'), //  ("linux_octoprint", '\u{f34d}'), //  ("linux_openbsd", '\u{f328}'), //  ("linux_openscad", '\u{f34e}'), //  ("linux_opensuse", '\u{f314}'), //  ("linux_osh", '\u{f34f}'), //  ("linux_oshwa", '\u{f350}'), //  ("linux_osi", '\u{f36c}'), //  ("linux_parabola", '\u{f340}'), //  ("linux_parrot", '\u{f329}'), //  ("linux_pop_os", '\u{f32a}'), //  ("linux_postmarketos", '\u{f374}'), //  ("linux_prusaslicer", '\u{f351}'), //  ("linux_puppy", '\u{f341}'), //  ("linux_qt", '\u{f375}'), //  ("linux_qtile", '\u{f35c}'), //  ("linux_qubesos", '\u{f342}'), //  ("linux_raspberry_pi", '\u{f315}'), //  ("linux_redhat", '\u{f316}'), //  ("linux_reprap", '\u{f352}'), //  ("linux_riscv", '\u{f353}'), //  ("linux_river", '\u{f381}'), //  ("linux_rocky_linux", '\u{f32b}'), //  ("linux_sabayon", '\u{f317}'), //  ("linux_slackware", '\u{f318}'), //  ("linux_slackware_inverse", '\u{f319}'), //  ("linux_snappy", '\u{f32c}'), //  ("linux_solus", '\u{f32d}'), //  ("linux_sway", '\u{f35d}'), //  ("linux_tails", '\u{f343}'), //  ("linux_thunderbird", '\u{f370}'), //  ("linux_tor", '\u{f371}'), //  ("linux_trisquel", '\u{f344}'), //  ("linux_tumbleweed", '\u{f37d}'), //  ("linux_tux", '\u{f31a}'), //  ("linux_typst", '\u{f37f}'), //  ("linux_ubuntu", '\u{f31b}'), //  ("linux_ubuntu_inverse", '\u{f31c}'), //  ("linux_vanilla", '\u{f366}'), //  ("linux_void", '\u{f32e}'), //  ("linux_vscodium", '\u{f372}'), //  ("linux_wayland", '\u{f367}'), //  ("linux_wikimedia", '\u{f36d}'), //  ("linux_xerolinux", '\u{f34a}'), //  ("linux_xfce", '\u{f368}'), //  ("linux_xmonad", '\u{f35e}'), //  ("linux_xorg", '\u{f369}'), //  ("linux_zorin", '\u{f32f}'), //  ("md_ab_testing", '\u{f01c9}'), // 󰇉 ("md_abacus", '\u{f16e0}'), // 󱛠 ("md_abjad_arabic", '\u{f1328}'), // 󱌨 ("md_abjad_hebrew", '\u{f1329}'), // 󱌩 ("md_abugida_devanagari", '\u{f132a}'), // 󱌪 ("md_abugida_thai", '\u{f132b}'), // 󱌫 ("md_access_point", '\u{f0003}'), // 󰀃 ("md_access_point_check", '\u{f1538}'), // 󱔸 ("md_access_point_minus", '\u{f1539}'), // 󱔹 ("md_access_point_network", '\u{f0002}'), // 󰀂 ("md_access_point_network_off", '\u{f0be1}'), // 󰯡 ("md_access_point_off", '\u{f1511}'), // 󱔑 ("md_access_point_plus", '\u{f153a}'), // 󱔺 ("md_access_point_remove", '\u{f153b}'), // 󱔻 ("md_account", '\u{f0004}'), // 󰀄 ("md_account_alert", '\u{f0005}'), // 󰀅 ("md_account_alert_outline", '\u{f0b50}'), // 󰭐 ("md_account_arrow_down", '\u{f1868}'), // 󱡨 ("md_account_arrow_down_outline", '\u{f1869}'), // 󱡩 ("md_account_arrow_left", '\u{f0b51}'), // 󰭑 ("md_account_arrow_left_outline", '\u{f0b52}'), // 󰭒 ("md_account_arrow_right", '\u{f0b53}'), // 󰭓 ("md_account_arrow_right_outline", '\u{f0b54}'), // 󰭔 ("md_account_arrow_up", '\u{f1867}'), // 󱡧 ("md_account_arrow_up_outline", '\u{f186a}'), // 󱡪 ("md_account_box", '\u{f0006}'), // 󰀆 ("md_account_box_multiple", '\u{f0934}'), // 󰤴 ("md_account_box_multiple_outline", '\u{f100a}'), // 󱀊 ("md_account_box_outline", '\u{f0007}'), // 󰀇 ("md_account_cancel", '\u{f12df}'), // 󱋟 ("md_account_cancel_outline", '\u{f12e0}'), // 󱋠 ("md_account_cash", '\u{f1097}'), // 󱂗 ("md_account_cash_outline", '\u{f1098}'), // 󱂘 ("md_account_check", '\u{f0008}'), // 󰀈 ("md_account_check_outline", '\u{f0be2}'), // 󰯢 ("md_account_child", '\u{f0a89}'), // 󰪉 ("md_account_child_circle", '\u{f0a8a}'), // 󰪊 ("md_account_child_outline", '\u{f10c8}'), // 󱃈 ("md_account_circle", '\u{f0009}'), // 󰀉 ("md_account_circle_outline", '\u{f0b55}'), // 󰭕 ("md_account_clock", '\u{f0b56}'), // 󰭖 ("md_account_clock_outline", '\u{f0b57}'), // 󰭗 ("md_account_cog", '\u{f1370}'), // 󱍰 ("md_account_cog_outline", '\u{f1371}'), // 󱍱 ("md_account_convert", '\u{f000a}'), // 󰀊 ("md_account_convert_outline", '\u{f1301}'), // 󱌁 ("md_account_cowboy_hat", '\u{f0e9b}'), // 󰺛 ("md_account_cowboy_hat_outline", '\u{f17f3}'), // 󱟳 ("md_account_details", '\u{f0631}'), // 󰘱 ("md_account_details_outline", '\u{f1372}'), // 󱍲 ("md_account_edit", '\u{f06bc}'), // 󰚼 ("md_account_edit_outline", '\u{f0ffb}'), // 󰿻 ("md_account_eye", '\u{f0420}'), // 󰐠 ("md_account_eye_outline", '\u{f127b}'), // 󱉻 ("md_account_filter", '\u{f0936}'), // 󰤶 ("md_account_filter_outline", '\u{f0f9d}'), // 󰾝 ("md_account_group", '\u{f0849}'), // 󰡉 ("md_account_group_outline", '\u{f0b58}'), // 󰭘 ("md_account_hard_hat", '\u{f05b5}'), // 󰖵 ("md_account_hard_hat_outline", '\u{f1a1f}'), // 󱨟 ("md_account_heart", '\u{f0899}'), // 󰢙 ("md_account_heart_outline", '\u{f0be3}'), // 󰯣 ("md_account_injury", '\u{f1815}'), // 󱠕 ("md_account_injury_outline", '\u{f1816}'), // 󱠖 ("md_account_key", '\u{f000b}'), // 󰀋 ("md_account_key_outline", '\u{f0be4}'), // 󰯤 ("md_account_lock", '\u{f115e}'), // 󱅞 ("md_account_lock_open", '\u{f1960}'), // 󱥠 ("md_account_lock_open_outline", '\u{f1961}'), // 󱥡 ("md_account_lock_outline", '\u{f115f}'), // 󱅟 ("md_account_minus", '\u{f000d}'), // 󰀍 ("md_account_minus_outline", '\u{f0aec}'), // 󰫬 ("md_account_multiple", '\u{f000e}'), // 󰀎 ("md_account_multiple_check", '\u{f08c5}'), // 󰣅 ("md_account_multiple_check_outline", '\u{f11fe}'), // 󱇾 ("md_account_multiple_minus", '\u{f05d3}'), // 󰗓 ("md_account_multiple_minus_outline", '\u{f0be5}'), // 󰯥 ("md_account_multiple_outline", '\u{f000f}'), // 󰀏 ("md_account_multiple_plus", '\u{f0010}'), // 󰀐 ("md_account_multiple_plus_outline", '\u{f0800}'), // 󰠀 ("md_account_multiple_remove", '\u{f120a}'), // 󱈊 ("md_account_multiple_remove_outline", '\u{f120b}'), // 󱈋 ("md_account_music", '\u{f0803}'), // 󰠃 ("md_account_music_outline", '\u{f0ce9}'), // 󰳩 ("md_account_network", '\u{f0011}'), // 󰀑 ("md_account_network_outline", '\u{f0be6}'), // 󰯦 ("md_account_off", '\u{f0012}'), // 󰀒 ("md_account_off_outline", '\u{f0be7}'), // 󰯧 ("md_account_outline", '\u{f0013}'), // 󰀓 ("md_account_plus", '\u{f0014}'), // 󰀔 ("md_account_plus_outline", '\u{f0801}'), // 󰠁 ("md_account_question", '\u{f0b59}'), // 󰭙 ("md_account_question_outline", '\u{f0b5a}'), // 󰭚 ("md_account_reactivate", '\u{f152b}'), // 󱔫 ("md_account_reactivate_outline", '\u{f152c}'), // 󱔬 ("md_account_remove", '\u{f0015}'), // 󰀕 ("md_account_remove_outline", '\u{f0aed}'), // 󰫭 ("md_account_school", '\u{f1a20}'), // 󱨠 ("md_account_school_outline", '\u{f1a21}'), // 󱨡 ("md_account_search", '\u{f0016}'), // 󰀖 ("md_account_search_outline", '\u{f0935}'), // 󰤵 ("md_account_settings", '\u{f0630}'), // 󰘰 ("md_account_settings_outline", '\u{f10c9}'), // 󱃉 ("md_account_star", '\u{f0017}'), // 󰀗 ("md_account_star_outline", '\u{f0be8}'), // 󰯨 ("md_account_supervisor", '\u{f0a8b}'), // 󰪋 ("md_account_supervisor_circle", '\u{f0a8c}'), // 󰪌 ("md_account_supervisor_circle_outline", '\u{f14ec}'), // 󱓬 ("md_account_supervisor_outline", '\u{f112d}'), // 󱄭 ("md_account_switch", '\u{f0019}'), // 󰀙 ("md_account_switch_outline", '\u{f04cb}'), // 󰓋 ("md_account_sync", '\u{f191b}'), // 󱤛 ("md_account_sync_outline", '\u{f191c}'), // 󱤜 ("md_account_tie", '\u{f0ce3}'), // 󰳣 ("md_account_tie_hat", '\u{f1898}'), // 󱢘 ("md_account_tie_hat_outline", '\u{f1899}'), // 󱢙 ("md_account_tie_outline", '\u{f10ca}'), // 󱃊 ("md_account_tie_voice", '\u{f1308}'), // 󱌈 ("md_account_tie_voice_off", '\u{f130a}'), // 󱌊 ("md_account_tie_voice_off_outline", '\u{f130b}'), // 󱌋 ("md_account_tie_voice_outline", '\u{f1309}'), // 󱌉 ("md_account_tie_woman", '\u{f1a8c}'), // 󱪌 ("md_account_voice", '\u{f05cb}'), // 󰗋 ("md_account_voice_off", '\u{f0ed4}'), // 󰻔 ("md_account_wrench", '\u{f189a}'), // 󱢚 ("md_account_wrench_outline", '\u{f189b}'), // 󱢛 ("md_adjust", '\u{f001a}'), // 󰀚 ("md_advertisements", '\u{f192a}'), // 󱤪 ("md_advertisements_off", '\u{f192b}'), // 󱤫 ("md_air_conditioner", '\u{f001b}'), // 󰀛 ("md_air_filter", '\u{f0d43}'), // 󰵃 ("md_air_horn", '\u{f0dac}'), // 󰶬 ("md_air_humidifier", '\u{f1099}'), // 󱂙 ("md_air_humidifier_off", '\u{f1466}'), // 󱑦 ("md_air_purifier", '\u{f0d44}'), // 󰵄 ("md_airbag", '\u{f0be9}'), // 󰯩 ("md_airballoon", '\u{f001c}'), // 󰀜 ("md_airballoon_outline", '\u{f100b}'), // 󱀋 ("md_airplane", '\u{f001d}'), // 󰀝 ("md_airplane_alert", '\u{f187a}'), // 󱡺 ("md_airplane_check", '\u{f187b}'), // 󱡻 ("md_airplane_clock", '\u{f187c}'), // 󱡼 ("md_airplane_cog", '\u{f187d}'), // 󱡽 ("md_airplane_edit", '\u{f187e}'), // 󱡾 ("md_airplane_landing", '\u{f05d4}'), // 󰗔 ("md_airplane_marker", '\u{f187f}'), // 󱡿 ("md_airplane_minus", '\u{f1880}'), // 󱢀 ("md_airplane_off", '\u{f001e}'), // 󰀞 ("md_airplane_plus", '\u{f1881}'), // 󱢁 ("md_airplane_remove", '\u{f1882}'), // 󱢂 ("md_airplane_search", '\u{f1883}'), // 󱢃 ("md_airplane_settings", '\u{f1884}'), // 󱢄 ("md_airplane_takeoff", '\u{f05d5}'), // 󰗕 ("md_airport", '\u{f084b}'), // 󰡋 ("md_alarm", '\u{f0020}'), // 󰀠 ("md_alarm_bell", '\u{f078e}'), // 󰞎 ("md_alarm_check", '\u{f0021}'), // 󰀡 ("md_alarm_light", '\u{f078f}'), // 󰞏 ("md_alarm_light_off", '\u{f171e}'), // 󱜞 ("md_alarm_light_off_outline", '\u{f171f}'), // 󱜟 ("md_alarm_light_outline", '\u{f0bea}'), // 󰯪 ("md_alarm_multiple", '\u{f0022}'), // 󰀢 ("md_alarm_note", '\u{f0e71}'), // 󰹱 ("md_alarm_note_off", '\u{f0e72}'), // 󰹲 ("md_alarm_off", '\u{f0023}'), // 󰀣 ("md_alarm_panel", '\u{f15c4}'), // 󱗄 ("md_alarm_panel_outline", '\u{f15c5}'), // 󱗅 ("md_alarm_plus", '\u{f0024}'), // 󰀤 ("md_alarm_snooze", '\u{f068e}'), // 󰚎 ("md_album", '\u{f0025}'), // 󰀥 ("md_alert", '\u{f0026}'), // 󰀦 ("md_alert_box", '\u{f0027}'), // 󰀧 ("md_alert_box_outline", '\u{f0ce4}'), // 󰳤 ("md_alert_circle", '\u{f0028}'), // 󰀨 ("md_alert_circle_check", '\u{f11ed}'), // 󱇭 ("md_alert_circle_check_outline", '\u{f11ee}'), // 󱇮 ("md_alert_circle_outline", '\u{f05d6}'), // 󰗖 ("md_alert_decagram", '\u{f06bd}'), // 󰚽 ("md_alert_decagram_outline", '\u{f0ce5}'), // 󰳥 ("md_alert_minus", '\u{f14bb}'), // 󱒻 ("md_alert_minus_outline", '\u{f14be}'), // 󱒾 ("md_alert_octagon", '\u{f0029}'), // 󰀩 ("md_alert_octagon_outline", '\u{f0ce6}'), // 󰳦 ("md_alert_octagram", '\u{f0767}'), // 󰝧 ("md_alert_octagram_outline", '\u{f0ce7}'), // 󰳧 ("md_alert_outline", '\u{f002a}'), // 󰀪 ("md_alert_plus", '\u{f14ba}'), // 󱒺 ("md_alert_plus_outline", '\u{f14bd}'), // 󱒽 ("md_alert_remove", '\u{f14bc}'), // 󱒼 ("md_alert_remove_outline", '\u{f14bf}'), // 󱒿 ("md_alert_rhombus", '\u{f11ce}'), // 󱇎 ("md_alert_rhombus_outline", '\u{f11cf}'), // 󱇏 ("md_alien", '\u{f089a}'), // 󰢚 ("md_alien_outline", '\u{f10cb}'), // 󱃋 ("md_align_horizontal_center", '\u{f11c3}'), // 󱇃 ("md_align_horizontal_distribute", '\u{f1962}'), // 󱥢 ("md_align_horizontal_left", '\u{f11c2}'), // 󱇂 ("md_align_horizontal_right", '\u{f11c4}'), // 󱇄 ("md_align_vertical_bottom", '\u{f11c5}'), // 󱇅 ("md_align_vertical_center", '\u{f11c6}'), // 󱇆 ("md_align_vertical_distribute", '\u{f1963}'), // 󱥣 ("md_align_vertical_top", '\u{f11c7}'), // 󱇇 ("md_all_inclusive", '\u{f06be}'), // 󰚾 ("md_all_inclusive_box", '\u{f188d}'), // 󱢍 ("md_all_inclusive_box_outline", '\u{f188e}'), // 󱢎 ("md_allergy", '\u{f1258}'), // 󱉘 ("md_alpha", '\u{f002b}'), // 󰀫 ("md_alpha_a", '\u{f0aee}'), // 󰫮 ("md_alpha_a_box", '\u{f0b08}'), // 󰬈 ("md_alpha_a_box_outline", '\u{f0beb}'), // 󰯫 ("md_alpha_a_circle", '\u{f0bec}'), // 󰯬 ("md_alpha_a_circle_outline", '\u{f0bed}'), // 󰯭 ("md_alpha_b", '\u{f0aef}'), // 󰫯 ("md_alpha_b_box", '\u{f0b09}'), // 󰬉 ("md_alpha_b_box_outline", '\u{f0bee}'), // 󰯮 ("md_alpha_b_circle", '\u{f0bef}'), // 󰯯 ("md_alpha_b_circle_outline", '\u{f0bf0}'), // 󰯰 ("md_alpha_c", '\u{f0af0}'), // 󰫰 ("md_alpha_c_box", '\u{f0b0a}'), // 󰬊 ("md_alpha_c_box_outline", '\u{f0bf1}'), // 󰯱 ("md_alpha_c_circle", '\u{f0bf2}'), // 󰯲 ("md_alpha_c_circle_outline", '\u{f0bf3}'), // 󰯳 ("md_alpha_d", '\u{f0af1}'), // 󰫱 ("md_alpha_d_box", '\u{f0b0b}'), // 󰬋 ("md_alpha_d_box_outline", '\u{f0bf4}'), // 󰯴 ("md_alpha_d_circle", '\u{f0bf5}'), // 󰯵 ("md_alpha_d_circle_outline", '\u{f0bf6}'), // 󰯶 ("md_alpha_e", '\u{f0af2}'), // 󰫲 ("md_alpha_e_box", '\u{f0b0c}'), // 󰬌 ("md_alpha_e_box_outline", '\u{f0bf7}'), // 󰯷 ("md_alpha_e_circle", '\u{f0bf8}'), // 󰯸 ("md_alpha_e_circle_outline", '\u{f0bf9}'), // 󰯹 ("md_alpha_f", '\u{f0af3}'), // 󰫳 ("md_alpha_f_box", '\u{f0b0d}'), // 󰬍 ("md_alpha_f_box_outline", '\u{f0bfa}'), // 󰯺 ("md_alpha_f_circle", '\u{f0bfb}'), // 󰯻 ("md_alpha_f_circle_outline", '\u{f0bfc}'), // 󰯼 ("md_alpha_g", '\u{f0af4}'), // 󰫴 ("md_alpha_g_box", '\u{f0b0e}'), // 󰬎 ("md_alpha_g_box_outline", '\u{f0bfd}'), // 󰯽 ("md_alpha_g_circle", '\u{f0bfe}'), // 󰯾 ("md_alpha_g_circle_outline", '\u{f0bff}'), // 󰯿 ("md_alpha_h", '\u{f0af5}'), // 󰫵 ("md_alpha_h_box", '\u{f0b0f}'), // 󰬏 ("md_alpha_h_box_outline", '\u{f0c00}'), // 󰰀 ("md_alpha_h_circle", '\u{f0c01}'), // 󰰁 ("md_alpha_h_circle_outline", '\u{f0c02}'), // 󰰂 ("md_alpha_i", '\u{f0af6}'), // 󰫶 ("md_alpha_i_box", '\u{f0b10}'), // 󰬐 ("md_alpha_i_box_outline", '\u{f0c03}'), // 󰰃 ("md_alpha_i_circle", '\u{f0c04}'), // 󰰄 ("md_alpha_i_circle_outline", '\u{f0c05}'), // 󰰅 ("md_alpha_j", '\u{f0af7}'), // 󰫷 ("md_alpha_j_box", '\u{f0b11}'), // 󰬑 ("md_alpha_j_box_outline", '\u{f0c06}'), // 󰰆 ("md_alpha_j_circle", '\u{f0c07}'), // 󰰇 ("md_alpha_j_circle_outline", '\u{f0c08}'), // 󰰈 ("md_alpha_k", '\u{f0af8}'), // 󰫸 ("md_alpha_k_box", '\u{f0b12}'), // 󰬒 ("md_alpha_k_box_outline", '\u{f0c09}'), // 󰰉 ("md_alpha_k_circle", '\u{f0c0a}'), // 󰰊 ("md_alpha_k_circle_outline", '\u{f0c0b}'), // 󰰋 ("md_alpha_l", '\u{f0af9}'), // 󰫹 ("md_alpha_l_box", '\u{f0b13}'), // 󰬓 ("md_alpha_l_box_outline", '\u{f0c0c}'), // 󰰌 ("md_alpha_l_circle", '\u{f0c0d}'), // 󰰍 ("md_alpha_l_circle_outline", '\u{f0c0e}'), // 󰰎 ("md_alpha_m", '\u{f0afa}'), // 󰫺 ("md_alpha_m_box", '\u{f0b14}'), // 󰬔 ("md_alpha_m_box_outline", '\u{f0c0f}'), // 󰰏 ("md_alpha_m_circle", '\u{f0c10}'), // 󰰐 ("md_alpha_m_circle_outline", '\u{f0c11}'), // 󰰑 ("md_alpha_n", '\u{f0afb}'), // 󰫻 ("md_alpha_n_box", '\u{f0b15}'), // 󰬕 ("md_alpha_n_box_outline", '\u{f0c12}'), // 󰰒 ("md_alpha_n_circle", '\u{f0c13}'), // 󰰓 ("md_alpha_n_circle_outline", '\u{f0c14}'), // 󰰔 ("md_alpha_o", '\u{f0afc}'), // 󰫼 ("md_alpha_o_box", '\u{f0b16}'), // 󰬖 ("md_alpha_o_box_outline", '\u{f0c15}'), // 󰰕 ("md_alpha_o_circle", '\u{f0c16}'), // 󰰖 ("md_alpha_o_circle_outline", '\u{f0c17}'), // 󰰗 ("md_alpha_p", '\u{f0afd}'), // 󰫽 ("md_alpha_p_box", '\u{f0b17}'), // 󰬗 ("md_alpha_p_box_outline", '\u{f0c18}'), // 󰰘 ("md_alpha_p_circle", '\u{f0c19}'), // 󰰙 ("md_alpha_p_circle_outline", '\u{f0c1a}'), // 󰰚 ("md_alpha_q", '\u{f0afe}'), // 󰫾 ("md_alpha_q_box", '\u{f0b18}'), // 󰬘 ("md_alpha_q_box_outline", '\u{f0c1b}'), // 󰰛 ("md_alpha_q_circle", '\u{f0c1c}'), // 󰰜 ("md_alpha_q_circle_outline", '\u{f0c1d}'), // 󰰝 ("md_alpha_r", '\u{f0aff}'), // 󰫿 ("md_alpha_r_box", '\u{f0b19}'), // 󰬙 ("md_alpha_r_box_outline", '\u{f0c1e}'), // 󰰞 ("md_alpha_r_circle", '\u{f0c1f}'), // 󰰟 ("md_alpha_r_circle_outline", '\u{f0c20}'), // 󰰠 ("md_alpha_s", '\u{f0b00}'), // 󰬀 ("md_alpha_s_box", '\u{f0b1a}'), // 󰬚 ("md_alpha_s_box_outline", '\u{f0c21}'), // 󰰡 ("md_alpha_s_circle", '\u{f0c22}'), // 󰰢 ("md_alpha_s_circle_outline", '\u{f0c23}'), // 󰰣 ("md_alpha_t", '\u{f0b01}'), // 󰬁 ("md_alpha_t_box", '\u{f0b1b}'), // 󰬛 ("md_alpha_t_box_outline", '\u{f0c24}'), // 󰰤 ("md_alpha_t_circle", '\u{f0c25}'), // 󰰥 ("md_alpha_t_circle_outline", '\u{f0c26}'), // 󰰦 ("md_alpha_u", '\u{f0b02}'), // 󰬂 ("md_alpha_u_box", '\u{f0b1c}'), // 󰬜 ("md_alpha_u_box_outline", '\u{f0c27}'), // 󰰧 ("md_alpha_u_circle", '\u{f0c28}'), // 󰰨 ("md_alpha_u_circle_outline", '\u{f0c29}'), // 󰰩 ("md_alpha_v", '\u{f0b03}'), // 󰬃 ("md_alpha_v_box", '\u{f0b1d}'), // 󰬝 ("md_alpha_v_box_outline", '\u{f0c2a}'), // 󰰪 ("md_alpha_v_circle", '\u{f0c2b}'), // 󰰫 ("md_alpha_v_circle_outline", '\u{f0c2c}'), // 󰰬 ("md_alpha_w", '\u{f0b04}'), // 󰬄 ("md_alpha_w_box", '\u{f0b1e}'), // 󰬞 ("md_alpha_w_box_outline", '\u{f0c2d}'), // 󰰭 ("md_alpha_w_circle", '\u{f0c2e}'), // 󰰮 ("md_alpha_w_circle_outline", '\u{f0c2f}'), // 󰰯 ("md_alpha_x", '\u{f0b05}'), // 󰬅 ("md_alpha_x_box", '\u{f0b1f}'), // 󰬟 ("md_alpha_x_box_outline", '\u{f0c30}'), // 󰰰 ("md_alpha_x_circle", '\u{f0c31}'), // 󰰱 ("md_alpha_x_circle_outline", '\u{f0c32}'), // 󰰲 ("md_alpha_y", '\u{f0b06}'), // 󰬆 ("md_alpha_y_box", '\u{f0b20}'), // 󰬠 ("md_alpha_y_box_outline", '\u{f0c33}'), // 󰰳 ("md_alpha_y_circle", '\u{f0c34}'), // 󰰴 ("md_alpha_y_circle_outline", '\u{f0c35}'), // 󰰵 ("md_alpha_z", '\u{f0b07}'), // 󰬇 ("md_alpha_z_box", '\u{f0b21}'), // 󰬡 ("md_alpha_z_box_outline", '\u{f0c36}'), // 󰰶 ("md_alpha_z_circle", '\u{f0c37}'), // 󰰷 ("md_alpha_z_circle_outline", '\u{f0c38}'), // 󰰸 ("md_alphabet_aurebesh", '\u{f132c}'), // 󱌬 ("md_alphabet_cyrillic", '\u{f132d}'), // 󱌭 ("md_alphabet_greek", '\u{f132e}'), // 󱌮 ("md_alphabet_latin", '\u{f132f}'), // 󱌯 ("md_alphabet_piqad", '\u{f1330}'), // 󱌰 ("md_alphabet_tengwar", '\u{f1337}'), // 󱌷 ("md_alphabetical", '\u{f002c}'), // 󰀬 ("md_alphabetical_off", '\u{f100c}'), // 󱀌 ("md_alphabetical_variant", '\u{f100d}'), // 󱀍 ("md_alphabetical_variant_off", '\u{f100e}'), // 󱀎 ("md_altimeter", '\u{f05d7}'), // 󰗗 ("md_ambulance", '\u{f002f}'), // 󰀯 ("md_ammunition", '\u{f0ce8}'), // 󰳨 ("md_ampersand", '\u{f0a8d}'), // 󰪍 ("md_amplifier", '\u{f0030}'), // 󰀰 ("md_amplifier_off", '\u{f11b5}'), // 󱆵 ("md_anchor", '\u{f0031}'), // 󰀱 ("md_android", '\u{f0032}'), // 󰀲 ("md_android_messages", '\u{f0d45}'), // 󰵅 ("md_android_studio", '\u{f0034}'), // 󰀴 ("md_angle_acute", '\u{f0937}'), // 󰤷 ("md_angle_obtuse", '\u{f0938}'), // 󰤸 ("md_angle_right", '\u{f0939}'), // 󰤹 ("md_angular", '\u{f06b2}'), // 󰚲 ("md_angularjs", '\u{f06bf}'), // 󰚿 ("md_animation", '\u{f05d8}'), // 󰗘 ("md_animation_outline", '\u{f0a8f}'), // 󰪏 ("md_animation_play", '\u{f093a}'), // 󰤺 ("md_animation_play_outline", '\u{f0a90}'), // 󰪐 ("md_ansible", '\u{f109a}'), // 󱂚 ("md_antenna", '\u{f1119}'), // 󱄙 ("md_anvil", '\u{f089b}'), // 󰢛 ("md_apache_kafka", '\u{f100f}'), // 󱀏 ("md_api", '\u{f109b}'), // 󱂛 ("md_api_off", '\u{f1257}'), // 󱉗 ("md_apple", '\u{f0035}'), // 󰀵 ("md_apple_finder", '\u{f0036}'), // 󰀶 ("md_apple_icloud", '\u{f0038}'), // 󰀸 ("md_apple_ios", '\u{f0037}'), // 󰀷 ("md_apple_keyboard_caps", '\u{f0632}'), // 󰘲 ("md_apple_keyboard_command", '\u{f0633}'), // 󰘳 ("md_apple_keyboard_control", '\u{f0634}'), // 󰘴 ("md_apple_keyboard_option", '\u{f0635}'), // 󰘵 ("md_apple_keyboard_shift", '\u{f0636}'), // 󰘶 ("md_apple_safari", '\u{f0039}'), // 󰀹 ("md_application", '\u{f08c6}'), // 󰣆 ("md_application_array", '\u{f10f5}'), // 󱃵 ("md_application_array_outline", '\u{f10f6}'), // 󱃶 ("md_application_braces", '\u{f10f7}'), // 󱃷 ("md_application_braces_outline", '\u{f10f8}'), // 󱃸 ("md_application_brackets", '\u{f0c8b}'), // 󰲋 ("md_application_brackets_outline", '\u{f0c8c}'), // 󰲌 ("md_application_cog", '\u{f0675}'), // 󰙵 ("md_application_cog_outline", '\u{f1577}'), // 󱕷 ("md_application_edit", '\u{f00ae}'), // 󰂮 ("md_application_edit_outline", '\u{f0619}'), // 󰘙 ("md_application_export", '\u{f0dad}'), // 󰶭 ("md_application_import", '\u{f0dae}'), // 󰶮 ("md_application_outline", '\u{f0614}'), // 󰘔 ("md_application_parentheses", '\u{f10f9}'), // 󱃹 ("md_application_parentheses_outline", '\u{f10fa}'), // 󱃺 ("md_application_settings", '\u{f0b60}'), // 󰭠 ("md_application_settings_outline", '\u{f1555}'), // 󱕕 ("md_application_variable", '\u{f10fb}'), // 󱃻 ("md_application_variable_outline", '\u{f10fc}'), // 󱃼 ("md_approximately_equal", '\u{f0f9e}'), // 󰾞 ("md_approximately_equal_box", '\u{f0f9f}'), // 󰾟 ("md_apps", '\u{f003b}'), // 󰀻 ("md_apps_box", '\u{f0d46}'), // 󰵆 ("md_arch", '\u{f08c7}'), // 󰣇 ("md_archive", '\u{f003c}'), // 󰀼 ("md_archive_alert", '\u{f14fd}'), // 󱓽 ("md_archive_alert_outline", '\u{f14fe}'), // 󱓾 ("md_archive_arrow_down", '\u{f1259}'), // 󱉙 ("md_archive_arrow_down_outline", '\u{f125a}'), // 󱉚 ("md_archive_arrow_up", '\u{f125b}'), // 󱉛 ("md_archive_arrow_up_outline", '\u{f125c}'), // 󱉜 ("md_archive_cancel", '\u{f174b}'), // 󱝋 ("md_archive_cancel_outline", '\u{f174c}'), // 󱝌 ("md_archive_check", '\u{f174d}'), // 󱝍 ("md_archive_check_outline", '\u{f174e}'), // 󱝎 ("md_archive_clock", '\u{f174f}'), // 󱝏 ("md_archive_clock_outline", '\u{f1750}'), // 󱝐 ("md_archive_cog", '\u{f1751}'), // 󱝑 ("md_archive_cog_outline", '\u{f1752}'), // 󱝒 ("md_archive_edit", '\u{f1753}'), // 󱝓 ("md_archive_edit_outline", '\u{f1754}'), // 󱝔 ("md_archive_eye", '\u{f1755}'), // 󱝕 ("md_archive_eye_outline", '\u{f1756}'), // 󱝖 ("md_archive_lock", '\u{f1757}'), // 󱝗 ("md_archive_lock_open", '\u{f1758}'), // 󱝘 ("md_archive_lock_open_outline", '\u{f1759}'), // 󱝙 ("md_archive_lock_outline", '\u{f175a}'), // 󱝚 ("md_archive_marker", '\u{f175b}'), // 󱝛 ("md_archive_marker_outline", '\u{f175c}'), // 󱝜 ("md_archive_minus", '\u{f175d}'), // 󱝝 ("md_archive_minus_outline", '\u{f175e}'), // 󱝞 ("md_archive_music", '\u{f175f}'), // 󱝟 ("md_archive_music_outline", '\u{f1760}'), // 󱝠 ("md_archive_off", '\u{f1761}'), // 󱝡 ("md_archive_off_outline", '\u{f1762}'), // 󱝢 ("md_archive_outline", '\u{f120e}'), // 󱈎 ("md_archive_plus", '\u{f1763}'), // 󱝣 ("md_archive_plus_outline", '\u{f1764}'), // 󱝤 ("md_archive_refresh", '\u{f1765}'), // 󱝥 ("md_archive_refresh_outline", '\u{f1766}'), // 󱝦 ("md_archive_remove", '\u{f1767}'), // 󱝧 ("md_archive_remove_outline", '\u{f1768}'), // 󱝨 ("md_archive_search", '\u{f1769}'), // 󱝩 ("md_archive_search_outline", '\u{f176a}'), // 󱝪 ("md_archive_settings", '\u{f176b}'), // 󱝫 ("md_archive_settings_outline", '\u{f176c}'), // 󱝬 ("md_archive_star", '\u{f176d}'), // 󱝭 ("md_archive_star_outline", '\u{f176e}'), // 󱝮 ("md_archive_sync", '\u{f176f}'), // 󱝯 ("md_archive_sync_outline", '\u{f1770}'), // 󱝰 ("md_arm_flex", '\u{f0fd7}'), // 󰿗 ("md_arm_flex_outline", '\u{f0fd6}'), // 󰿖 ("md_arrange_bring_forward", '\u{f003d}'), // 󰀽 ("md_arrange_bring_to_front", '\u{f003e}'), // 󰀾 ("md_arrange_send_backward", '\u{f003f}'), // 󰀿 ("md_arrange_send_to_back", '\u{f0040}'), // 󰁀 ("md_arrow_all", '\u{f0041}'), // 󰁁 ("md_arrow_bottom_left", '\u{f0042}'), // 󰁂 ("md_arrow_bottom_left_bold_box", '\u{f1964}'), // 󱥤 ("md_arrow_bottom_left_bold_box_outline", '\u{f1965}'), // 󱥥 ("md_arrow_bottom_left_bold_outline", '\u{f09b7}'), // 󰦷 ("md_arrow_bottom_left_thick", '\u{f09b8}'), // 󰦸 ("md_arrow_bottom_left_thin", '\u{f19b6}'), // 󱦶 ("md_arrow_bottom_left_thin_circle_outline", '\u{f1596}'), // 󱖖 ("md_arrow_bottom_right", '\u{f0043}'), // 󰁃 ("md_arrow_bottom_right_bold_box", '\u{f1966}'), // 󱥦 ("md_arrow_bottom_right_bold_box_outline", '\u{f1967}'), // 󱥧 ("md_arrow_bottom_right_bold_outline", '\u{f09b9}'), // 󰦹 ("md_arrow_bottom_right_thick", '\u{f09ba}'), // 󰦺 ("md_arrow_bottom_right_thin", '\u{f19b7}'), // 󱦷 ("md_arrow_bottom_right_thin_circle_outline", '\u{f1595}'), // 󱖕 ("md_arrow_collapse", '\u{f0615}'), // 󰘕 ("md_arrow_collapse_all", '\u{f0044}'), // 󰁄 ("md_arrow_collapse_down", '\u{f0792}'), // 󰞒 ("md_arrow_collapse_horizontal", '\u{f084c}'), // 󰡌 ("md_arrow_collapse_left", '\u{f0793}'), // 󰞓 ("md_arrow_collapse_right", '\u{f0794}'), // 󰞔 ("md_arrow_collapse_up", '\u{f0795}'), // 󰞕 ("md_arrow_collapse_vertical", '\u{f084d}'), // 󰡍 ("md_arrow_decision", '\u{f09bb}'), // 󰦻 ("md_arrow_decision_auto", '\u{f09bc}'), // 󰦼 ("md_arrow_decision_auto_outline", '\u{f09bd}'), // 󰦽 ("md_arrow_decision_outline", '\u{f09be}'), // 󰦾 ("md_arrow_down", '\u{f0045}'), // 󰁅 ("md_arrow_down_bold", '\u{f072e}'), // 󰜮 ("md_arrow_down_bold_box", '\u{f072f}'), // 󰜯 ("md_arrow_down_bold_box_outline", '\u{f0730}'), // 󰜰 ("md_arrow_down_bold_circle", '\u{f0047}'), // 󰁇 ("md_arrow_down_bold_circle_outline", '\u{f0048}'), // 󰁈 ("md_arrow_down_bold_hexagon_outline", '\u{f0049}'), // 󰁉 ("md_arrow_down_bold_outline", '\u{f09bf}'), // 󰦿 ("md_arrow_down_box", '\u{f06c0}'), // 󰛀 ("md_arrow_down_circle", '\u{f0cdb}'), // 󰳛 ("md_arrow_down_circle_outline", '\u{f0cdc}'), // 󰳜 ("md_arrow_down_drop_circle", '\u{f004a}'), // 󰁊 ("md_arrow_down_drop_circle_outline", '\u{f004b}'), // 󰁋 ("md_arrow_down_left", '\u{f17a1}'), // 󱞡 ("md_arrow_down_left_bold", '\u{f17a2}'), // 󱞢 ("md_arrow_down_right", '\u{f17a3}'), // 󱞣 ("md_arrow_down_right_bold", '\u{f17a4}'), // 󱞤 ("md_arrow_down_thick", '\u{f0046}'), // 󰁆 ("md_arrow_down_thin", '\u{f19b3}'), // 󱦳 ("md_arrow_down_thin_circle_outline", '\u{f1599}'), // 󱖙 ("md_arrow_expand", '\u{f0616}'), // 󰘖 ("md_arrow_expand_all", '\u{f004c}'), // 󰁌 ("md_arrow_expand_down", '\u{f0796}'), // 󰞖 ("md_arrow_expand_horizontal", '\u{f084e}'), // 󰡎 ("md_arrow_expand_left", '\u{f0797}'), // 󰞗 ("md_arrow_expand_right", '\u{f0798}'), // 󰞘 ("md_arrow_expand_up", '\u{f0799}'), // 󰞙 ("md_arrow_expand_vertical", '\u{f084f}'), // 󰡏 ("md_arrow_horizontal_lock", '\u{f115b}'), // 󱅛 ("md_arrow_left", '\u{f004d}'), // 󰁍 ("md_arrow_left_bold", '\u{f0731}'), // 󰜱 ("md_arrow_left_bold_box", '\u{f0732}'), // 󰜲 ("md_arrow_left_bold_box_outline", '\u{f0733}'), // 󰜳 ("md_arrow_left_bold_circle", '\u{f004f}'), // 󰁏 ("md_arrow_left_bold_circle_outline", '\u{f0050}'), // 󰁐 ("md_arrow_left_bold_hexagon_outline", '\u{f0051}'), // 󰁑 ("md_arrow_left_bold_outline", '\u{f09c0}'), // 󰧀 ("md_arrow_left_bottom", '\u{f17a5}'), // 󱞥 ("md_arrow_left_bottom_bold", '\u{f17a6}'), // 󱞦 ("md_arrow_left_box", '\u{f06c1}'), // 󰛁 ("md_arrow_left_circle", '\u{f0cdd}'), // 󰳝 ("md_arrow_left_circle_outline", '\u{f0cde}'), // 󰳞 ("md_arrow_left_drop_circle", '\u{f0052}'), // 󰁒 ("md_arrow_left_drop_circle_outline", '\u{f0053}'), // 󰁓 ("md_arrow_left_right", '\u{f0e73}'), // 󰹳 ("md_arrow_left_right_bold", '\u{f0e74}'), // 󰹴 ("md_arrow_left_right_bold_outline", '\u{f09c1}'), // 󰧁 ("md_arrow_left_thick", '\u{f004e}'), // 󰁎 ("md_arrow_left_thin", '\u{f19b1}'), // 󱦱 ("md_arrow_left_thin_circle_outline", '\u{f159a}'), // 󱖚 ("md_arrow_left_top", '\u{f17a7}'), // 󱞧 ("md_arrow_left_top_bold", '\u{f17a8}'), // 󱞨 ("md_arrow_projectile", '\u{f1840}'), // 󱡀 ("md_arrow_projectile_multiple", '\u{f183f}'), // 󱠿 ("md_arrow_right", '\u{f0054}'), // 󰁔 ("md_arrow_right_bold", '\u{f0734}'), // 󰜴 ("md_arrow_right_bold_box", '\u{f0735}'), // 󰜵 ("md_arrow_right_bold_box_outline", '\u{f0736}'), // 󰜶 ("md_arrow_right_bold_circle", '\u{f0056}'), // 󰁖 ("md_arrow_right_bold_circle_outline", '\u{f0057}'), // 󰁗 ("md_arrow_right_bold_hexagon_outline", '\u{f0058}'), // 󰁘 ("md_arrow_right_bold_outline", '\u{f09c2}'), // 󰧂 ("md_arrow_right_bottom", '\u{f17a9}'), // 󱞩 ("md_arrow_right_bottom_bold", '\u{f17aa}'), // 󱞪 ("md_arrow_right_box", '\u{f06c2}'), // 󰛂 ("md_arrow_right_circle", '\u{f0cdf}'), // 󰳟 ("md_arrow_right_circle_outline", '\u{f0ce0}'), // 󰳠 ("md_arrow_right_drop_circle", '\u{f0059}'), // 󰁙 ("md_arrow_right_drop_circle_outline", '\u{f005a}'), // 󰁚 ("md_arrow_right_thick", '\u{f0055}'), // 󰁕 ("md_arrow_right_thin", '\u{f19b0}'), // 󱦰 ("md_arrow_right_thin_circle_outline", '\u{f1598}'), // 󱖘 ("md_arrow_right_top", '\u{f17ab}'), // 󱞫 ("md_arrow_right_top_bold", '\u{f17ac}'), // 󱞬 ("md_arrow_split_horizontal", '\u{f093b}'), // 󰤻 ("md_arrow_split_vertical", '\u{f093c}'), // 󰤼 ("md_arrow_top_left", '\u{f005b}'), // 󰁛 ("md_arrow_top_left_bold_box", '\u{f1968}'), // 󱥨 ("md_arrow_top_left_bold_box_outline", '\u{f1969}'), // 󱥩 ("md_arrow_top_left_bold_outline", '\u{f09c3}'), // 󰧃 ("md_arrow_top_left_bottom_right", '\u{f0e75}'), // 󰹵 ("md_arrow_top_left_bottom_right_bold", '\u{f0e76}'), // 󰹶 ("md_arrow_top_left_thick", '\u{f09c4}'), // 󰧄 ("md_arrow_top_left_thin", '\u{f19b5}'), // 󱦵 ("md_arrow_top_left_thin_circle_outline", '\u{f1593}'), // 󱖓 ("md_arrow_top_right", '\u{f005c}'), // 󰁜 ("md_arrow_top_right_bold_box", '\u{f196a}'), // 󱥪 ("md_arrow_top_right_bold_box_outline", '\u{f196b}'), // 󱥫 ("md_arrow_top_right_bold_outline", '\u{f09c5}'), // 󰧅 ("md_arrow_top_right_bottom_left", '\u{f0e77}'), // 󰹷 ("md_arrow_top_right_bottom_left_bold", '\u{f0e78}'), // 󰹸 ("md_arrow_top_right_thick", '\u{f09c6}'), // 󰧆 ("md_arrow_top_right_thin", '\u{f19b4}'), // 󱦴 ("md_arrow_top_right_thin_circle_outline", '\u{f1594}'), // 󱖔 ("md_arrow_u_down_left", '\u{f17ad}'), // 󱞭 ("md_arrow_u_down_left_bold", '\u{f17ae}'), // 󱞮 ("md_arrow_u_down_right", '\u{f17af}'), // 󱞯 ("md_arrow_u_down_right_bold", '\u{f17b0}'), // 󱞰 ("md_arrow_u_left_bottom", '\u{f17b1}'), // 󱞱 ("md_arrow_u_left_bottom_bold", '\u{f17b2}'), // 󱞲 ("md_arrow_u_left_top", '\u{f17b3}'), // 󱞳 ("md_arrow_u_left_top_bold", '\u{f17b4}'), // 󱞴 ("md_arrow_u_right_bottom", '\u{f17b5}'), // 󱞵 ("md_arrow_u_right_bottom_bold", '\u{f17b6}'), // 󱞶 ("md_arrow_u_right_top", '\u{f17b7}'), // 󱞷 ("md_arrow_u_right_top_bold", '\u{f17b8}'), // 󱞸 ("md_arrow_u_up_left", '\u{f17b9}'), // 󱞹 ("md_arrow_u_up_left_bold", '\u{f17ba}'), // 󱞺 ("md_arrow_u_up_right", '\u{f17bb}'), // 󱞻 ("md_arrow_u_up_right_bold", '\u{f17bc}'), // 󱞼 ("md_arrow_up", '\u{f005d}'), // 󰁝 ("md_arrow_up_bold", '\u{f0737}'), // 󰜷 ("md_arrow_up_bold_box", '\u{f0738}'), // 󰜸 ("md_arrow_up_bold_box_outline", '\u{f0739}'), // 󰜹 ("md_arrow_up_bold_circle", '\u{f005f}'), // 󰁟 ("md_arrow_up_bold_circle_outline", '\u{f0060}'), // 󰁠 ("md_arrow_up_bold_hexagon_outline", '\u{f0061}'), // 󰁡 ("md_arrow_up_bold_outline", '\u{f09c7}'), // 󰧇 ("md_arrow_up_box", '\u{f06c3}'), // 󰛃 ("md_arrow_up_circle", '\u{f0ce1}'), // 󰳡 ("md_arrow_up_circle_outline", '\u{f0ce2}'), // 󰳢 ("md_arrow_up_down", '\u{f0e79}'), // 󰹹 ("md_arrow_up_down_bold", '\u{f0e7a}'), // 󰹺 ("md_arrow_up_down_bold_outline", '\u{f09c8}'), // 󰧈 ("md_arrow_up_drop_circle", '\u{f0062}'), // 󰁢 ("md_arrow_up_drop_circle_outline", '\u{f0063}'), // 󰁣 ("md_arrow_up_left", '\u{f17bd}'), // 󱞽 ("md_arrow_up_left_bold", '\u{f17be}'), // 󱞾 ("md_arrow_up_right", '\u{f17bf}'), // 󱞿 ("md_arrow_up_right_bold", '\u{f17c0}'), // 󱟀 ("md_arrow_up_thick", '\u{f005e}'), // 󰁞 ("md_arrow_up_thin", '\u{f19b2}'), // 󱦲 ("md_arrow_up_thin_circle_outline", '\u{f1597}'), // 󱖗 ("md_arrow_vertical_lock", '\u{f115c}'), // 󱅜 ("md_artstation", '\u{f0b5b}'), // 󰭛 ("md_aspect_ratio", '\u{f0a24}'), // 󰨤 ("md_assistant", '\u{f0064}'), // 󰁤 ("md_asterisk", '\u{f06c4}'), // 󰛄 ("md_asterisk_circle_outline", '\u{f1a27}'), // 󱨧 ("md_at", '\u{f0065}'), // 󰁥 ("md_atlassian", '\u{f0804}'), // 󰠄 ("md_atm", '\u{f0d47}'), // 󰵇 ("md_atom", '\u{f0768}'), // 󰝨 ("md_atom_variant", '\u{f0e7b}'), // 󰹻 ("md_attachment", '\u{f0066}'), // 󰁦 ("md_attachment_check", '\u{f1ac1}'), // 󱫁 ("md_attachment_lock", '\u{f19c4}'), // 󱧄 ("md_attachment_minus", '\u{f1ac2}'), // 󱫂 ("md_attachment_off", '\u{f1ac3}'), // 󱫃 ("md_attachment_plus", '\u{f1ac4}'), // 󱫄 ("md_attachment_remove", '\u{f1ac5}'), // 󱫅 ("md_audio_input_rca", '\u{f186b}'), // 󱡫 ("md_audio_input_stereo_minijack", '\u{f186c}'), // 󱡬 ("md_audio_input_xlr", '\u{f186d}'), // 󱡭 ("md_audio_video", '\u{f093d}'), // 󰤽 ("md_audio_video_off", '\u{f11b6}'), // 󱆶 ("md_augmented_reality", '\u{f0850}'), // 󰡐 ("md_auto_download", '\u{f137e}'), // 󱍾 ("md_auto_fix", '\u{f0068}'), // 󰁨 ("md_auto_upload", '\u{f0069}'), // 󰁩 ("md_autorenew", '\u{f006a}'), // 󰁪 ("md_autorenew_off", '\u{f19e7}'), // 󱧧 ("md_av_timer", '\u{f006b}'), // 󰁫 ("md_aws", '\u{f0e0f}'), // 󰸏 ("md_axe", '\u{f08c8}'), // 󰣈 ("md_axe_battle", '\u{f1842}'), // 󱡂 ("md_axis", '\u{f0d48}'), // 󰵈 ("md_axis_arrow", '\u{f0d49}'), // 󰵉 ("md_axis_arrow_info", '\u{f140e}'), // 󱐎 ("md_axis_arrow_lock", '\u{f0d4a}'), // 󰵊 ("md_axis_lock", '\u{f0d4b}'), // 󰵋 ("md_axis_x_arrow", '\u{f0d4c}'), // 󰵌 ("md_axis_x_arrow_lock", '\u{f0d4d}'), // 󰵍 ("md_axis_x_rotate_clockwise", '\u{f0d4e}'), // 󰵎 ("md_axis_x_rotate_counterclockwise", '\u{f0d4f}'), // 󰵏 ("md_axis_x_y_arrow_lock", '\u{f0d50}'), // 󰵐 ("md_axis_y_arrow", '\u{f0d51}'), // 󰵑 ("md_axis_y_arrow_lock", '\u{f0d52}'), // 󰵒 ("md_axis_y_rotate_clockwise", '\u{f0d53}'), // 󰵓 ("md_axis_y_rotate_counterclockwise", '\u{f0d54}'), // 󰵔 ("md_axis_z_arrow", '\u{f0d55}'), // 󰵕 ("md_axis_z_arrow_lock", '\u{f0d56}'), // 󰵖 ("md_axis_z_rotate_clockwise", '\u{f0d57}'), // 󰵗 ("md_axis_z_rotate_counterclockwise", '\u{f0d58}'), // 󰵘 ("md_babel", '\u{f0a25}'), // 󰨥 ("md_baby", '\u{f006c}'), // 󰁬 ("md_baby_bottle", '\u{f0f39}'), // 󰼹 ("md_baby_bottle_outline", '\u{f0f3a}'), // 󰼺 ("md_baby_buggy", '\u{f13e0}'), // 󱏠 ("md_baby_carriage", '\u{f068f}'), // 󰚏 ("md_baby_carriage_off", '\u{f0fa0}'), // 󰾠 ("md_baby_face", '\u{f0e7c}'), // 󰹼 ("md_baby_face_outline", '\u{f0e7d}'), // 󰹽 ("md_backburger", '\u{f006d}'), // 󰁭 ("md_backspace", '\u{f006e}'), // 󰁮 ("md_backspace_outline", '\u{f0b5c}'), // 󰭜 ("md_backspace_reverse", '\u{f0e7e}'), // 󰹾 ("md_backspace_reverse_outline", '\u{f0e7f}'), // 󰹿 ("md_backup_restore", '\u{f006f}'), // 󰁯 ("md_bacteria", '\u{f0ed5}'), // 󰻕 ("md_bacteria_outline", '\u{f0ed6}'), // 󰻖 ("md_badge_account", '\u{f0da7}'), // 󰶧 ("md_badge_account_alert", '\u{f0da8}'), // 󰶨 ("md_badge_account_alert_outline", '\u{f0da9}'), // 󰶩 ("md_badge_account_horizontal", '\u{f0e0d}'), // 󰸍 ("md_badge_account_horizontal_outline", '\u{f0e0e}'), // 󰸎 ("md_badge_account_outline", '\u{f0daa}'), // 󰶪 ("md_badminton", '\u{f0851}'), // 󰡑 ("md_bag_carry_on", '\u{f0f3b}'), // 󰼻 ("md_bag_carry_on_check", '\u{f0d65}'), // 󰵥 ("md_bag_carry_on_off", '\u{f0f3c}'), // 󰼼 ("md_bag_checked", '\u{f0f3d}'), // 󰼽 ("md_bag_personal", '\u{f0e10}'), // 󰸐 ("md_bag_personal_off", '\u{f0e11}'), // 󰸑 ("md_bag_personal_off_outline", '\u{f0e12}'), // 󰸒 ("md_bag_personal_outline", '\u{f0e13}'), // 󰸓 ("md_bag_suitcase", '\u{f158b}'), // 󱖋 ("md_bag_suitcase_off", '\u{f158d}'), // 󱖍 ("md_bag_suitcase_off_outline", '\u{f158e}'), // 󱖎 ("md_bag_suitcase_outline", '\u{f158c}'), // 󱖌 ("md_baguette", '\u{f0f3e}'), // 󰼾 ("md_balcony", '\u{f1817}'), // 󱠗 ("md_balloon", '\u{f0a26}'), // 󰨦 ("md_ballot", '\u{f09c9}'), // 󰧉 ("md_ballot_outline", '\u{f09ca}'), // 󰧊 ("md_ballot_recount", '\u{f0c39}'), // 󰰹 ("md_ballot_recount_outline", '\u{f0c3a}'), // 󰰺 ("md_bandage", '\u{f0daf}'), // 󰶯 ("md_bank", '\u{f0070}'), // 󰁰 ("md_bank_check", '\u{f1655}'), // 󱙕 ("md_bank_minus", '\u{f0db0}'), // 󰶰 ("md_bank_off", '\u{f1656}'), // 󱙖 ("md_bank_off_outline", '\u{f1657}'), // 󱙗 ("md_bank_outline", '\u{f0e80}'), // 󰺀 ("md_bank_plus", '\u{f0db1}'), // 󰶱 ("md_bank_remove", '\u{f0db2}'), // 󰶲 ("md_bank_transfer", '\u{f0a27}'), // 󰨧 ("md_bank_transfer_in", '\u{f0a28}'), // 󰨨 ("md_bank_transfer_out", '\u{f0a29}'), // 󰨩 ("md_barcode", '\u{f0071}'), // 󰁱 ("md_barcode_off", '\u{f1236}'), // 󱈶 ("md_barcode_scan", '\u{f0072}'), // 󰁲 ("md_barley", '\u{f0073}'), // 󰁳 ("md_barley_off", '\u{f0b5d}'), // 󰭝 ("md_barn", '\u{f0b5e}'), // 󰭞 ("md_barrel", '\u{f0074}'), // 󰁴 ("md_barrel_outline", '\u{f1a28}'), // 󱨨 ("md_baseball", '\u{f0852}'), // 󰡒 ("md_baseball_bat", '\u{f0853}'), // 󰡓 ("md_baseball_diamond", '\u{f15ec}'), // 󱗬 ("md_baseball_diamond_outline", '\u{f15ed}'), // 󱗭 ("md_bash", '\u{f1183}'), // 󱆃 ("md_basket", '\u{f0076}'), // 󰁶 ("md_basket_check", '\u{f18e5}'), // 󱣥 ("md_basket_check_outline", '\u{f18e6}'), // 󱣦 ("md_basket_fill", '\u{f0077}'), // 󰁷 ("md_basket_minus", '\u{f1523}'), // 󱔣 ("md_basket_minus_outline", '\u{f1524}'), // 󱔤 ("md_basket_off", '\u{f1525}'), // 󱔥 ("md_basket_off_outline", '\u{f1526}'), // 󱔦 ("md_basket_outline", '\u{f1181}'), // 󱆁 ("md_basket_plus", '\u{f1527}'), // 󱔧 ("md_basket_plus_outline", '\u{f1528}'), // 󱔨 ("md_basket_remove", '\u{f1529}'), // 󱔩 ("md_basket_remove_outline", '\u{f152a}'), // 󱔪 ("md_basket_unfill", '\u{f0078}'), // 󰁸 ("md_basketball", '\u{f0806}'), // 󰠆 ("md_basketball_hoop", '\u{f0c3b}'), // 󰰻 ("md_basketball_hoop_outline", '\u{f0c3c}'), // 󰰼 ("md_bat", '\u{f0b5f}'), // 󰭟 ("md_bathtub", '\u{f1818}'), // 󱠘 ("md_bathtub_outline", '\u{f1819}'), // 󱠙 ("md_battery", '\u{f0079}'), // 󰁹 ("md_battery_10", '\u{f007a}'), // 󰁺 ("md_battery_10_bluetooth", '\u{f093e}'), // 󰤾 ("md_battery_20", '\u{f007b}'), // 󰁻 ("md_battery_20_bluetooth", '\u{f093f}'), // 󰤿 ("md_battery_30", '\u{f007c}'), // 󰁼 ("md_battery_30_bluetooth", '\u{f0940}'), // 󰥀 ("md_battery_40", '\u{f007d}'), // 󰁽 ("md_battery_40_bluetooth", '\u{f0941}'), // 󰥁 ("md_battery_50", '\u{f007e}'), // 󰁾 ("md_battery_50_bluetooth", '\u{f0942}'), // 󰥂 ("md_battery_60", '\u{f007f}'), // 󰁿 ("md_battery_60_bluetooth", '\u{f0943}'), // 󰥃 ("md_battery_70", '\u{f0080}'), // 󰂀 ("md_battery_70_bluetooth", '\u{f0944}'), // 󰥄 ("md_battery_80", '\u{f0081}'), // 󰂁 ("md_battery_80_bluetooth", '\u{f0945}'), // 󰥅 ("md_battery_90", '\u{f0082}'), // 󰂂 ("md_battery_90_bluetooth", '\u{f0946}'), // 󰥆 ("md_battery_alert", '\u{f0083}'), // 󰂃 ("md_battery_alert_bluetooth", '\u{f0947}'), // 󰥇 ("md_battery_alert_variant", '\u{f10cc}'), // 󱃌 ("md_battery_alert_variant_outline", '\u{f10cd}'), // 󱃍 ("md_battery_arrow_down", '\u{f17de}'), // 󱟞 ("md_battery_arrow_down_outline", '\u{f17df}'), // 󱟟 ("md_battery_arrow_up", '\u{f17e0}'), // 󱟠 ("md_battery_arrow_up_outline", '\u{f17e1}'), // 󱟡 ("md_battery_bluetooth", '\u{f0948}'), // 󰥈 ("md_battery_bluetooth_variant", '\u{f0949}'), // 󰥉 ("md_battery_charging", '\u{f0084}'), // 󰂄 ("md_battery_charging_10", '\u{f089c}'), // 󰢜 ("md_battery_charging_20", '\u{f0086}'), // 󰂆 ("md_battery_charging_30", '\u{f0087}'), // 󰂇 ("md_battery_charging_40", '\u{f0088}'), // 󰂈 ("md_battery_charging_50", '\u{f089d}'), // 󰢝 ("md_battery_charging_60", '\u{f0089}'), // 󰂉 ("md_battery_charging_70", '\u{f089e}'), // 󰢞 ("md_battery_charging_80", '\u{f008a}'), // 󰂊 ("md_battery_charging_90", '\u{f008b}'), // 󰂋 ("md_battery_charging_100", '\u{f0085}'), // 󰂅 ("md_battery_charging_high", '\u{f12a6}'), // 󱊦 ("md_battery_charging_low", '\u{f12a4}'), // 󱊤 ("md_battery_charging_medium", '\u{f12a5}'), // 󱊥 ("md_battery_charging_outline", '\u{f089f}'), // 󰢟 ("md_battery_charging_wireless", '\u{f0807}'), // 󰠇 ("md_battery_charging_wireless_10", '\u{f0808}'), // 󰠈 ("md_battery_charging_wireless_20", '\u{f0809}'), // 󰠉 ("md_battery_charging_wireless_30", '\u{f080a}'), // 󰠊 ("md_battery_charging_wireless_40", '\u{f080b}'), // 󰠋 ("md_battery_charging_wireless_50", '\u{f080c}'), // 󰠌 ("md_battery_charging_wireless_60", '\u{f080d}'), // 󰠍 ("md_battery_charging_wireless_70", '\u{f080e}'), // 󰠎 ("md_battery_charging_wireless_80", '\u{f080f}'), // 󰠏 ("md_battery_charging_wireless_90", '\u{f0810}'), // 󰠐 ("md_battery_charging_wireless_alert", '\u{f0811}'), // 󰠑 ("md_battery_charging_wireless_outline", '\u{f0812}'), // 󰠒 ("md_battery_check", '\u{f17e2}'), // 󱟢 ("md_battery_check_outline", '\u{f17e3}'), // 󱟣 ("md_battery_clock", '\u{f19e5}'), // 󱧥 ("md_battery_clock_outline", '\u{f19e6}'), // 󱧦 ("md_battery_heart", '\u{f120f}'), // 󱈏 ("md_battery_heart_outline", '\u{f1210}'), // 󱈐 ("md_battery_heart_variant", '\u{f1211}'), // 󱈑 ("md_battery_high", '\u{f12a3}'), // 󱊣 ("md_battery_lock", '\u{f179c}'), // 󱞜 ("md_battery_lock_open", '\u{f179d}'), // 󱞝 ("md_battery_low", '\u{f12a1}'), // 󱊡 ("md_battery_medium", '\u{f12a2}'), // 󱊢 ("md_battery_minus", '\u{f17e4}'), // 󱟤 ("md_battery_minus_outline", '\u{f17e5}'), // 󱟥 ("md_battery_minus_variant", '\u{f008c}'), // 󰂌 ("md_battery_negative", '\u{f008d}'), // 󰂍 ("md_battery_off", '\u{f125d}'), // 󱉝 ("md_battery_off_outline", '\u{f125e}'), // 󱉞 ("md_battery_outline", '\u{f008e}'), // 󰂎 ("md_battery_plus", '\u{f17e6}'), // 󱟦 ("md_battery_plus_outline", '\u{f17e7}'), // 󱟧 ("md_battery_plus_variant", '\u{f008f}'), // 󰂏 ("md_battery_positive", '\u{f0090}'), // 󰂐 ("md_battery_remove", '\u{f17e8}'), // 󱟨 ("md_battery_remove_outline", '\u{f17e9}'), // 󱟩 ("md_battery_sync", '\u{f1834}'), // 󱠴 ("md_battery_sync_outline", '\u{f1835}'), // 󱠵 ("md_battery_unknown", '\u{f0091}'), // 󰂑 ("md_battery_unknown_bluetooth", '\u{f094a}'), // 󰥊 ("md_beach", '\u{f0092}'), // 󰂒 ("md_beaker", '\u{f0cea}'), // 󰳪 ("md_beaker_alert", '\u{f1229}'), // 󱈩 ("md_beaker_alert_outline", '\u{f122a}'), // 󱈪 ("md_beaker_check", '\u{f122b}'), // 󱈫 ("md_beaker_check_outline", '\u{f122c}'), // 󱈬 ("md_beaker_minus", '\u{f122d}'), // 󱈭 ("md_beaker_minus_outline", '\u{f122e}'), // 󱈮 ("md_beaker_outline", '\u{f0690}'), // 󰚐 ("md_beaker_plus", '\u{f122f}'), // 󱈯 ("md_beaker_plus_outline", '\u{f1230}'), // 󱈰 ("md_beaker_question", '\u{f1231}'), // 󱈱 ("md_beaker_question_outline", '\u{f1232}'), // 󱈲 ("md_beaker_remove", '\u{f1233}'), // 󱈳 ("md_beaker_remove_outline", '\u{f1234}'), // 󱈴 ("md_bed", '\u{f02e3}'), // 󰋣 ("md_bed_double", '\u{f0fd4}'), // 󰿔 ("md_bed_double_outline", '\u{f0fd3}'), // 󰿓 ("md_bed_empty", '\u{f08a0}'), // 󰢠 ("md_bed_king", '\u{f0fd2}'), // 󰿒 ("md_bed_king_outline", '\u{f0fd1}'), // 󰿑 ("md_bed_outline", '\u{f0099}'), // 󰂙 ("md_bed_queen", '\u{f0fd0}'), // 󰿐 ("md_bed_queen_outline", '\u{f0fdb}'), // 󰿛 ("md_bed_single", '\u{f106d}'), // 󱁭 ("md_bed_single_outline", '\u{f106e}'), // 󱁮 ("md_bee", '\u{f0fa1}'), // 󰾡 ("md_bee_flower", '\u{f0fa2}'), // 󰾢 ("md_beehive_off_outline", '\u{f13ed}'), // 󱏭 ("md_beehive_outline", '\u{f10ce}'), // 󱃎 ("md_beekeeper", '\u{f14e2}'), // 󱓢 ("md_beer", '\u{f0098}'), // 󰂘 ("md_beer_outline", '\u{f130c}'), // 󱌌 ("md_bell", '\u{f009a}'), // 󰂚 ("md_bell_alert", '\u{f0d59}'), // 󰵙 ("md_bell_alert_outline", '\u{f0e81}'), // 󰺁 ("md_bell_badge", '\u{f116b}'), // 󱅫 ("md_bell_badge_outline", '\u{f0178}'), // 󰅸 ("md_bell_cancel", '\u{f13e7}'), // 󱏧 ("md_bell_cancel_outline", '\u{f13e8}'), // 󱏨 ("md_bell_check", '\u{f11e5}'), // 󱇥 ("md_bell_check_outline", '\u{f11e6}'), // 󱇦 ("md_bell_circle", '\u{f0d5a}'), // 󰵚 ("md_bell_circle_outline", '\u{f0d5b}'), // 󰵛 ("md_bell_cog", '\u{f1a29}'), // 󱨩 ("md_bell_cog_outline", '\u{f1a2a}'), // 󱨪 ("md_bell_minus", '\u{f13e9}'), // 󱏩 ("md_bell_minus_outline", '\u{f13ea}'), // 󱏪 ("md_bell_off", '\u{f009b}'), // 󰂛 ("md_bell_off_outline", '\u{f0a91}'), // 󰪑 ("md_bell_outline", '\u{f009c}'), // 󰂜 ("md_bell_plus", '\u{f009d}'), // 󰂝 ("md_bell_plus_outline", '\u{f0a92}'), // 󰪒 ("md_bell_remove", '\u{f13eb}'), // 󱏫 ("md_bell_remove_outline", '\u{f13ec}'), // 󱏬 ("md_bell_ring", '\u{f009e}'), // 󰂞 ("md_bell_ring_outline", '\u{f009f}'), // 󰂟 ("md_bell_sleep", '\u{f00a0}'), // 󰂠 ("md_bell_sleep_outline", '\u{f0a93}'), // 󰪓 ("md_beta", '\u{f00a1}'), // 󰂡 ("md_betamax", '\u{f09cb}'), // 󰧋 ("md_biathlon", '\u{f0e14}'), // 󰸔 ("md_bicycle", '\u{f109c}'), // 󱂜 ("md_bicycle_basket", '\u{f1235}'), // 󱈵 ("md_bicycle_cargo", '\u{f189c}'), // 󱢜 ("md_bicycle_electric", '\u{f15b4}'), // 󱖴 ("md_bicycle_penny_farthing", '\u{f15e9}'), // 󱗩 ("md_bike", '\u{f00a3}'), // 󰂣 ("md_bike_fast", '\u{f111f}'), // 󱄟 ("md_billboard", '\u{f1010}'), // 󱀐 ("md_billiards", '\u{f0b61}'), // 󰭡 ("md_billiards_rack", '\u{f0b62}'), // 󰭢 ("md_binoculars", '\u{f00a5}'), // 󰂥 ("md_bio", '\u{f00a6}'), // 󰂦 ("md_biohazard", '\u{f00a7}'), // 󰂧 ("md_bird", '\u{f15c6}'), // 󱗆 ("md_bitbucket", '\u{f00a8}'), // 󰂨 ("md_bitcoin", '\u{f0813}'), // 󰠓 ("md_black_mesa", '\u{f00a9}'), // 󰂩 ("md_blender", '\u{f0ceb}'), // 󰳫 ("md_blender_outline", '\u{f181a}'), // 󱠚 ("md_blender_software", '\u{f00ab}'), // 󰂫 ("md_blinds", '\u{f00ac}'), // 󰂬 ("md_blinds_horizontal", '\u{f1a2b}'), // 󱨫 ("md_blinds_horizontal_closed", '\u{f1a2c}'), // 󱨬 ("md_blinds_open", '\u{f1011}'), // 󱀑 ("md_blinds_vertical", '\u{f1a2d}'), // 󱨭 ("md_blinds_vertical_closed", '\u{f1a2e}'), // 󱨮 ("md_block_helper", '\u{f00ad}'), // 󰂭 ("md_blood_bag", '\u{f0cec}'), // 󰳬 ("md_bluetooth", '\u{f00af}'), // 󰂯 ("md_bluetooth_audio", '\u{f00b0}'), // 󰂰 ("md_bluetooth_connect", '\u{f00b1}'), // 󰂱 ("md_bluetooth_off", '\u{f00b2}'), // 󰂲 ("md_bluetooth_settings", '\u{f00b3}'), // 󰂳 ("md_bluetooth_transfer", '\u{f00b4}'), // 󰂴 ("md_blur", '\u{f00b5}'), // 󰂵 ("md_blur_linear", '\u{f00b6}'), // 󰂶 ("md_blur_off", '\u{f00b7}'), // 󰂷 ("md_blur_radial", '\u{f00b8}'), // 󰂸 ("md_bolt", '\u{f0db3}'), // 󰶳 ("md_bomb", '\u{f0691}'), // 󰚑 ("md_bomb_off", '\u{f06c5}'), // 󰛅 ("md_bone", '\u{f00b9}'), // 󰂹 ("md_bone_off", '\u{f19e0}'), // 󱧠 ("md_book", '\u{f00ba}'), // 󰂺 ("md_book_account", '\u{f13ad}'), // 󱎭 ("md_book_account_outline", '\u{f13ae}'), // 󱎮 ("md_book_alert", '\u{f167c}'), // 󱙼 ("md_book_alert_outline", '\u{f167d}'), // 󱙽 ("md_book_alphabet", '\u{f061d}'), // 󰘝 ("md_book_arrow_down", '\u{f167e}'), // 󱙾 ("md_book_arrow_down_outline", '\u{f167f}'), // 󱙿 ("md_book_arrow_left", '\u{f1680}'), // 󱚀 ("md_book_arrow_left_outline", '\u{f1681}'), // 󱚁 ("md_book_arrow_right", '\u{f1682}'), // 󱚂 ("md_book_arrow_right_outline", '\u{f1683}'), // 󱚃 ("md_book_arrow_up", '\u{f1684}'), // 󱚄 ("md_book_arrow_up_outline", '\u{f1685}'), // 󱚅 ("md_book_cancel", '\u{f1686}'), // 󱚆 ("md_book_cancel_outline", '\u{f1687}'), // 󱚇 ("md_book_check", '\u{f14f3}'), // 󱓳 ("md_book_check_outline", '\u{f14f4}'), // 󱓴 ("md_book_clock", '\u{f1688}'), // 󱚈 ("md_book_clock_outline", '\u{f1689}'), // 󱚉 ("md_book_cog", '\u{f168a}'), // 󱚊 ("md_book_cog_outline", '\u{f168b}'), // 󱚋 ("md_book_cross", '\u{f00a2}'), // 󰂢 ("md_book_edit", '\u{f168c}'), // 󱚌 ("md_book_edit_outline", '\u{f168d}'), // 󱚍 ("md_book_education", '\u{f16c9}'), // 󱛉 ("md_book_education_outline", '\u{f16ca}'), // 󱛊 ("md_book_heart", '\u{f1a1d}'), // 󱨝 ("md_book_heart_outline", '\u{f1a1e}'), // 󱨞 ("md_book_information_variant", '\u{f106f}'), // 󱁯 ("md_book_lock", '\u{f079a}'), // 󰞚 ("md_book_lock_open", '\u{f079b}'), // 󰞛 ("md_book_lock_open_outline", '\u{f168e}'), // 󱚎 ("md_book_lock_outline", '\u{f168f}'), // 󱚏 ("md_book_marker", '\u{f1690}'), // 󱚐 ("md_book_marker_outline", '\u{f1691}'), // 󱚑 ("md_book_minus", '\u{f05d9}'), // 󰗙 ("md_book_minus_multiple", '\u{f0a94}'), // 󰪔 ("md_book_minus_multiple_outline", '\u{f090b}'), // 󰤋 ("md_book_minus_outline", '\u{f1692}'), // 󱚒 ("md_book_multiple", '\u{f00bb}'), // 󰂻 ("md_book_multiple_outline", '\u{f0436}'), // 󰐶 ("md_book_music", '\u{f0067}'), // 󰁧 ("md_book_music_outline", '\u{f1693}'), // 󱚓 ("md_book_off", '\u{f1694}'), // 󱚔 ("md_book_off_outline", '\u{f1695}'), // 󱚕 ("md_book_open", '\u{f00bd}'), // 󰂽 ("md_book_open_blank_variant", '\u{f00be}'), // 󰂾 ("md_book_open_outline", '\u{f0b63}'), // 󰭣 ("md_book_open_page_variant", '\u{f05da}'), // 󰗚 ("md_book_open_page_variant_outline", '\u{f15d6}'), // 󱗖 ("md_book_open_variant", '\u{f14f7}'), // 󱓷 ("md_book_outline", '\u{f0b64}'), // 󰭤 ("md_book_play", '\u{f0e82}'), // 󰺂 ("md_book_play_outline", '\u{f0e83}'), // 󰺃 ("md_book_plus", '\u{f05db}'), // 󰗛 ("md_book_plus_multiple", '\u{f0a95}'), // 󰪕 ("md_book_plus_multiple_outline", '\u{f0ade}'), // 󰫞 ("md_book_plus_outline", '\u{f1696}'), // 󱚖 ("md_book_refresh", '\u{f1697}'), // 󱚗 ("md_book_refresh_outline", '\u{f1698}'), // 󱚘 ("md_book_remove", '\u{f0a97}'), // 󰪗 ("md_book_remove_multiple", '\u{f0a96}'), // 󰪖 ("md_book_remove_multiple_outline", '\u{f04ca}'), // 󰓊 ("md_book_remove_outline", '\u{f1699}'), // 󱚙 ("md_book_search", '\u{f0e84}'), // 󰺄 ("md_book_search_outline", '\u{f0e85}'), // 󰺅 ("md_book_settings", '\u{f169a}'), // 󱚚 ("md_book_settings_outline", '\u{f169b}'), // 󱚛 ("md_book_sync", '\u{f169c}'), // 󱚜 ("md_book_sync_outline", '\u{f16c8}'), // 󱛈 ("md_book_variant", '\u{f00bf}'), // 󰂿 ("md_book_variant_multiple", '\u{f00bc}'), // 󰂼 ("md_bookmark", '\u{f00c0}'), // 󰃀 ("md_bookmark_box_multiple", '\u{f196c}'), // 󱥬 ("md_bookmark_box_multiple_outline", '\u{f196d}'), // 󱥭 ("md_bookmark_check", '\u{f00c1}'), // 󰃁 ("md_bookmark_check_outline", '\u{f137b}'), // 󱍻 ("md_bookmark_minus", '\u{f09cc}'), // 󰧌 ("md_bookmark_minus_outline", '\u{f09cd}'), // 󰧍 ("md_bookmark_multiple", '\u{f0e15}'), // 󰸕 ("md_bookmark_multiple_outline", '\u{f0e16}'), // 󰸖 ("md_bookmark_music", '\u{f00c2}'), // 󰃂 ("md_bookmark_music_outline", '\u{f1379}'), // 󱍹 ("md_bookmark_off", '\u{f09ce}'), // 󰧎 ("md_bookmark_off_outline", '\u{f09cf}'), // 󰧏 ("md_bookmark_outline", '\u{f00c3}'), // 󰃃 ("md_bookmark_plus", '\u{f00c5}'), // 󰃅 ("md_bookmark_plus_outline", '\u{f00c4}'), // 󰃄 ("md_bookmark_remove", '\u{f00c6}'), // 󰃆 ("md_bookmark_remove_outline", '\u{f137a}'), // 󱍺 ("md_bookshelf", '\u{f125f}'), // 󱉟 ("md_boom_gate", '\u{f0e86}'), // 󰺆 ("md_boom_gate_alert", '\u{f0e87}'), // 󰺇 ("md_boom_gate_alert_outline", '\u{f0e88}'), // 󰺈 ("md_boom_gate_arrow_down", '\u{f0e89}'), // 󰺉 ("md_boom_gate_arrow_down_outline", '\u{f0e8a}'), // 󰺊 ("md_boom_gate_arrow_up", '\u{f0e8c}'), // 󰺌 ("md_boom_gate_arrow_up_outline", '\u{f0e8d}'), // 󰺍 ("md_boom_gate_outline", '\u{f0e8b}'), // 󰺋 ("md_boom_gate_up", '\u{f17f9}'), // 󱟹 ("md_boom_gate_up_outline", '\u{f17fa}'), // 󱟺 ("md_boombox", '\u{f05dc}'), // 󰗜 ("md_boomerang", '\u{f10cf}'), // 󱃏 ("md_bootstrap", '\u{f06c6}'), // 󰛆 ("md_border_all", '\u{f00c7}'), // 󰃇 ("md_border_all_variant", '\u{f08a1}'), // 󰢡 ("md_border_bottom", '\u{f00c8}'), // 󰃈 ("md_border_bottom_variant", '\u{f08a2}'), // 󰢢 ("md_border_color", '\u{f00c9}'), // 󰃉 ("md_border_horizontal", '\u{f00ca}'), // 󰃊 ("md_border_inside", '\u{f00cb}'), // 󰃋 ("md_border_left", '\u{f00cc}'), // 󰃌 ("md_border_left_variant", '\u{f08a3}'), // 󰢣 ("md_border_none", '\u{f00cd}'), // 󰃍 ("md_border_none_variant", '\u{f08a4}'), // 󰢤 ("md_border_outside", '\u{f00ce}'), // 󰃎 ("md_border_right", '\u{f00cf}'), // 󰃏 ("md_border_right_variant", '\u{f08a5}'), // 󰢥 ("md_border_style", '\u{f00d0}'), // 󰃐 ("md_border_top", '\u{f00d1}'), // 󰃑 ("md_border_top_variant", '\u{f08a6}'), // 󰢦 ("md_border_vertical", '\u{f00d2}'), // 󰃒 ("md_bottle_soda", '\u{f1070}'), // 󱁰 ("md_bottle_soda_classic", '\u{f1071}'), // 󱁱 ("md_bottle_soda_classic_outline", '\u{f1363}'), // 󱍣 ("md_bottle_soda_outline", '\u{f1072}'), // 󱁲 ("md_bottle_tonic", '\u{f112e}'), // 󱄮 ("md_bottle_tonic_outline", '\u{f112f}'), // 󱄯 ("md_bottle_tonic_plus", '\u{f1130}'), // 󱄰 ("md_bottle_tonic_plus_outline", '\u{f1131}'), // 󱄱 ("md_bottle_tonic_skull", '\u{f1132}'), // 󱄲 ("md_bottle_tonic_skull_outline", '\u{f1133}'), // 󱄳 ("md_bottle_wine", '\u{f0854}'), // 󰡔 ("md_bottle_wine_outline", '\u{f1310}'), // 󱌐 ("md_bow_arrow", '\u{f1841}'), // 󱡁 ("md_bow_tie", '\u{f0678}'), // 󰙸 ("md_bowl", '\u{f028e}'), // 󰊎 ("md_bowl_mix", '\u{f0617}'), // 󰘗 ("md_bowl_mix_outline", '\u{f02e4}'), // 󰋤 ("md_bowl_outline", '\u{f02a9}'), // 󰊩 ("md_bowling", '\u{f00d3}'), // 󰃓 ("md_box", '\u{f00d4}'), // 󰃔 ("md_box_cutter", '\u{f00d5}'), // 󰃕 ("md_box_cutter_off", '\u{f0b4a}'), // 󰭊 ("md_box_shadow", '\u{f0637}'), // 󰘷 ("md_boxing_glove", '\u{f0b65}'), // 󰭥 ("md_braille", '\u{f09d0}'), // 󰧐 ("md_brain", '\u{f09d1}'), // 󰧑 ("md_bread_slice", '\u{f0cee}'), // 󰳮 ("md_bread_slice_outline", '\u{f0cef}'), // 󰳯 ("md_bridge", '\u{f0618}'), // 󰘘 ("md_briefcase", '\u{f00d6}'), // 󰃖 ("md_briefcase_account", '\u{f0cf0}'), // 󰳰 ("md_briefcase_account_outline", '\u{f0cf1}'), // 󰳱 ("md_briefcase_arrow_left_right", '\u{f1a8d}'), // 󱪍 ("md_briefcase_arrow_left_right_outline", '\u{f1a8e}'), // 󱪎 ("md_briefcase_arrow_up_down", '\u{f1a8f}'), // 󱪏 ("md_briefcase_arrow_up_down_outline", '\u{f1a90}'), // 󱪐 ("md_briefcase_check", '\u{f00d7}'), // 󰃗 ("md_briefcase_check_outline", '\u{f131e}'), // 󱌞 ("md_briefcase_clock", '\u{f10d0}'), // 󱃐 ("md_briefcase_clock_outline", '\u{f10d1}'), // 󱃑 ("md_briefcase_download", '\u{f00d8}'), // 󰃘 ("md_briefcase_download_outline", '\u{f0c3d}'), // 󰰽 ("md_briefcase_edit", '\u{f0a98}'), // 󰪘 ("md_briefcase_edit_outline", '\u{f0c3e}'), // 󰰾 ("md_briefcase_eye", '\u{f17d9}'), // 󱟙 ("md_briefcase_eye_outline", '\u{f17da}'), // 󱟚 ("md_briefcase_minus", '\u{f0a2a}'), // 󰨪 ("md_briefcase_minus_outline", '\u{f0c3f}'), // 󰰿 ("md_briefcase_off", '\u{f1658}'), // 󱙘 ("md_briefcase_off_outline", '\u{f1659}'), // 󱙙 ("md_briefcase_outline", '\u{f0814}'), // 󰠔 ("md_briefcase_plus", '\u{f0a2b}'), // 󰨫 ("md_briefcase_plus_outline", '\u{f0c40}'), // 󰱀 ("md_briefcase_remove", '\u{f0a2c}'), // 󰨬 ("md_briefcase_remove_outline", '\u{f0c41}'), // 󰱁 ("md_briefcase_search", '\u{f0a2d}'), // 󰨭 ("md_briefcase_search_outline", '\u{f0c42}'), // 󰱂 ("md_briefcase_upload", '\u{f00d9}'), // 󰃙 ("md_briefcase_upload_outline", '\u{f0c43}'), // 󰱃 ("md_briefcase_variant", '\u{f1494}'), // 󱒔 ("md_briefcase_variant_off", '\u{f165a}'), // 󱙚 ("md_briefcase_variant_off_outline", '\u{f165b}'), // 󱙛 ("md_briefcase_variant_outline", '\u{f1495}'), // 󱒕 ("md_brightness_1", '\u{f00da}'), // 󰃚 ("md_brightness_2", '\u{f00db}'), // 󰃛 ("md_brightness_3", '\u{f00dc}'), // 󰃜 ("md_brightness_4", '\u{f00dd}'), // 󰃝 ("md_brightness_5", '\u{f00de}'), // 󰃞 ("md_brightness_6", '\u{f00df}'), // 󰃟 ("md_brightness_7", '\u{f00e0}'), // 󰃠 ("md_brightness_auto", '\u{f00e1}'), // 󰃡 ("md_brightness_percent", '\u{f0cf2}'), // 󰳲 ("md_broadcast", '\u{f1720}'), // 󱜠 ("md_broadcast_off", '\u{f1721}'), // 󱜡 ("md_broom", '\u{f00e2}'), // 󰃢 ("md_brush", '\u{f00e3}'), // 󰃣 ("md_brush_off", '\u{f1771}'), // 󱝱 ("md_brush_outline", '\u{f1a0d}'), // 󱨍 ("md_brush_variant", '\u{f1813}'), // 󱠓 ("md_bucket", '\u{f1415}'), // 󱐕 ("md_bucket_outline", '\u{f1416}'), // 󱐖 ("md_buffet", '\u{f0578}'), // 󰕸 ("md_bug", '\u{f00e4}'), // 󰃤 ("md_bug_check", '\u{f0a2e}'), // 󰨮 ("md_bug_check_outline", '\u{f0a2f}'), // 󰨯 ("md_bug_outline", '\u{f0a30}'), // 󰨰 ("md_bugle", '\u{f0db4}'), // 󰶴 ("md_bulkhead_light", '\u{f1a2f}'), // 󱨯 ("md_bulldozer", '\u{f0b22}'), // 󰬢 ("md_bullet", '\u{f0cf3}'), // 󰳳 ("md_bulletin_board", '\u{f00e5}'), // 󰃥 ("md_bullhorn", '\u{f00e6}'), // 󰃦 ("md_bullhorn_outline", '\u{f0b23}'), // 󰬣 ("md_bullhorn_variant", '\u{f196e}'), // 󱥮 ("md_bullhorn_variant_outline", '\u{f196f}'), // 󱥯 ("md_bullseye", '\u{f05dd}'), // 󰗝 ("md_bullseye_arrow", '\u{f08c9}'), // 󰣉 ("md_bulma", '\u{f12e7}'), // 󱋧 ("md_bunk_bed", '\u{f1302}'), // 󱌂 ("md_bunk_bed_outline", '\u{f0097}'), // 󰂗 ("md_bus", '\u{f00e7}'), // 󰃧 ("md_bus_alert", '\u{f0a99}'), // 󰪙 ("md_bus_articulated_end", '\u{f079c}'), // 󰞜 ("md_bus_articulated_front", '\u{f079d}'), // 󰞝 ("md_bus_clock", '\u{f08ca}'), // 󰣊 ("md_bus_double_decker", '\u{f079e}'), // 󰞞 ("md_bus_electric", '\u{f191d}'), // 󱤝 ("md_bus_marker", '\u{f1212}'), // 󱈒 ("md_bus_multiple", '\u{f0f3f}'), // 󰼿 ("md_bus_school", '\u{f079f}'), // 󰞟 ("md_bus_side", '\u{f07a0}'), // 󰞠 ("md_bus_stop", '\u{f1012}'), // 󱀒 ("md_bus_stop_covered", '\u{f1013}'), // 󱀓 ("md_bus_stop_uncovered", '\u{f1014}'), // 󱀔 ("md_butterfly", '\u{f1589}'), // 󱖉 ("md_butterfly_outline", '\u{f158a}'), // 󱖊 ("md_cabin_a_frame", '\u{f188c}'), // 󱢌 ("md_cable_data", '\u{f1394}'), // 󱎔 ("md_cached", '\u{f00e8}'), // 󰃨 ("md_cactus", '\u{f0db5}'), // 󰶵 ("md_cake", '\u{f00e9}'), // 󰃩 ("md_cake_layered", '\u{f00ea}'), // 󰃪 ("md_cake_variant", '\u{f00eb}'), // 󰃫 ("md_cake_variant_outline", '\u{f17f0}'), // 󱟰 ("md_calculator", '\u{f00ec}'), // 󰃬 ("md_calculator_variant", '\u{f0a9a}'), // 󰪚 ("md_calculator_variant_outline", '\u{f15a6}'), // 󱖦 ("md_calendar", '\u{f00ed}'), // 󰃭 ("md_calendar_account", '\u{f0ed7}'), // 󰻗 ("md_calendar_account_outline", '\u{f0ed8}'), // 󰻘 ("md_calendar_alert", '\u{f0a31}'), // 󰨱 ("md_calendar_arrow_left", '\u{f1134}'), // 󱄴 ("md_calendar_arrow_right", '\u{f1135}'), // 󱄵 ("md_calendar_blank", '\u{f00ee}'), // 󰃮 ("md_calendar_blank_multiple", '\u{f1073}'), // 󱁳 ("md_calendar_blank_outline", '\u{f0b66}'), // 󰭦 ("md_calendar_check", '\u{f00ef}'), // 󰃯 ("md_calendar_check_outline", '\u{f0c44}'), // 󰱄 ("md_calendar_clock", '\u{f00f0}'), // 󰃰 ("md_calendar_clock_outline", '\u{f16e1}'), // 󱛡 ("md_calendar_collapse_horizontal", '\u{f189d}'), // 󱢝 ("md_calendar_cursor", '\u{f157b}'), // 󱕻 ("md_calendar_edit", '\u{f08a7}'), // 󰢧 ("md_calendar_end", '\u{f166c}'), // 󱙬 ("md_calendar_expand_horizontal", '\u{f189e}'), // 󱢞 ("md_calendar_export", '\u{f0b24}'), // 󰬤 ("md_calendar_heart", '\u{f09d2}'), // 󰧒 ("md_calendar_import", '\u{f0b25}'), // 󰬥 ("md_calendar_lock", '\u{f1641}'), // 󱙁 ("md_calendar_lock_outline", '\u{f1642}'), // 󱙂 ("md_calendar_minus", '\u{f0d5c}'), // 󰵜 ("md_calendar_month", '\u{f0e17}'), // 󰸗 ("md_calendar_month_outline", '\u{f0e18}'), // 󰸘 ("md_calendar_multiple", '\u{f00f1}'), // 󰃱 ("md_calendar_multiple_check", '\u{f00f2}'), // 󰃲 ("md_calendar_multiselect", '\u{f0a32}'), // 󰨲 ("md_calendar_outline", '\u{f0b67}'), // 󰭧 ("md_calendar_plus", '\u{f00f3}'), // 󰃳 ("md_calendar_question", '\u{f0692}'), // 󰚒 ("md_calendar_range", '\u{f0679}'), // 󰙹 ("md_calendar_range_outline", '\u{f0b68}'), // 󰭨 ("md_calendar_refresh", '\u{f01e1}'), // 󰇡 ("md_calendar_refresh_outline", '\u{f0203}'), // 󰈃 ("md_calendar_remove", '\u{f00f4}'), // 󰃴 ("md_calendar_remove_outline", '\u{f0c45}'), // 󰱅 ("md_calendar_search", '\u{f094c}'), // 󰥌 ("md_calendar_star", '\u{f09d3}'), // 󰧓 ("md_calendar_start", '\u{f166d}'), // 󱙭 ("md_calendar_sync", '\u{f0e8e}'), // 󰺎 ("md_calendar_sync_outline", '\u{f0e8f}'), // 󰺏 ("md_calendar_text", '\u{f00f5}'), // 󰃵 ("md_calendar_text_outline", '\u{f0c46}'), // 󰱆 ("md_calendar_today", '\u{f00f6}'), // 󰃶 ("md_calendar_today_outline", '\u{f1a30}'), // 󱨰 ("md_calendar_week", '\u{f0a33}'), // 󰨳 ("md_calendar_week_begin", '\u{f0a34}'), // 󰨴 ("md_calendar_week_begin_outline", '\u{f1a31}'), // 󱨱 ("md_calendar_week_end", '\u{f1a32}'), // 󱨲 ("md_calendar_week_end_outline", '\u{f1a33}'), // 󱨳 ("md_calendar_week_outline", '\u{f1a34}'), // 󱨴 ("md_calendar_weekend", '\u{f0ed9}'), // 󰻙 ("md_calendar_weekend_outline", '\u{f0eda}'), // 󰻚 ("md_call_made", '\u{f00f7}'), // 󰃷 ("md_call_merge", '\u{f00f8}'), // 󰃸 ("md_call_missed", '\u{f00f9}'), // 󰃹 ("md_call_received", '\u{f00fa}'), // 󰃺 ("md_call_split", '\u{f00fb}'), // 󰃻 ("md_camcorder", '\u{f00fc}'), // 󰃼 ("md_camcorder_off", '\u{f00ff}'), // 󰃿 ("md_camera", '\u{f0100}'), // 󰄀 ("md_camera_account", '\u{f08cb}'), // 󰣋 ("md_camera_burst", '\u{f0693}'), // 󰚓 ("md_camera_control", '\u{f0b69}'), // 󰭩 ("md_camera_document", '\u{f1871}'), // 󱡱 ("md_camera_document_off", '\u{f1872}'), // 󱡲 ("md_camera_enhance", '\u{f0101}'), // 󰄁 ("md_camera_enhance_outline", '\u{f0b6a}'), // 󰭪 ("md_camera_flip", '\u{f15d9}'), // 󱗙 ("md_camera_flip_outline", '\u{f15da}'), // 󱗚 ("md_camera_front", '\u{f0102}'), // 󰄂 ("md_camera_front_variant", '\u{f0103}'), // 󰄃 ("md_camera_gopro", '\u{f07a1}'), // 󰞡 ("md_camera_image", '\u{f08cc}'), // 󰣌 ("md_camera_iris", '\u{f0104}'), // 󰄄 ("md_camera_lock", '\u{f1a14}'), // 󱨔 ("md_camera_lock_outline", '\u{f1a15}'), // 󱨕 ("md_camera_marker", '\u{f19a7}'), // 󱦧 ("md_camera_marker_outline", '\u{f19a8}'), // 󱦨 ("md_camera_metering_center", '\u{f07a2}'), // 󰞢 ("md_camera_metering_matrix", '\u{f07a3}'), // 󰞣 ("md_camera_metering_partial", '\u{f07a4}'), // 󰞤 ("md_camera_metering_spot", '\u{f07a5}'), // 󰞥 ("md_camera_off", '\u{f05df}'), // 󰗟 ("md_camera_off_outline", '\u{f19bf}'), // 󱦿 ("md_camera_outline", '\u{f0d5d}'), // 󰵝 ("md_camera_party_mode", '\u{f0105}'), // 󰄅 ("md_camera_plus", '\u{f0edb}'), // 󰻛 ("md_camera_plus_outline", '\u{f0edc}'), // 󰻜 ("md_camera_rear", '\u{f0106}'), // 󰄆 ("md_camera_rear_variant", '\u{f0107}'), // 󰄇 ("md_camera_retake", '\u{f0e19}'), // 󰸙 ("md_camera_retake_outline", '\u{f0e1a}'), // 󰸚 ("md_camera_switch", '\u{f0108}'), // 󰄈 ("md_camera_switch_outline", '\u{f084a}'), // 󰡊 ("md_camera_timer", '\u{f0109}'), // 󰄉 ("md_camera_wireless", '\u{f0db6}'), // 󰶶 ("md_camera_wireless_outline", '\u{f0db7}'), // 󰶷 ("md_campfire", '\u{f0edd}'), // 󰻝 ("md_cancel", '\u{f073a}'), // 󰜺 ("md_candelabra", '\u{f17d2}'), // 󱟒 ("md_candelabra_fire", '\u{f17d3}'), // 󱟓 ("md_candle", '\u{f05e2}'), // 󰗢 ("md_candy", '\u{f1970}'), // 󱥰 ("md_candy_off", '\u{f1971}'), // 󱥱 ("md_candy_off_outline", '\u{f1972}'), // 󱥲 ("md_candy_outline", '\u{f1973}'), // 󱥳 ("md_candycane", '\u{f010a}'), // 󰄊 ("md_cannabis", '\u{f07a6}'), // 󰞦 ("md_cannabis_off", '\u{f166e}'), // 󱙮 ("md_caps_lock", '\u{f0a9b}'), // 󰪛 ("md_car", '\u{f010b}'), // 󰄋 ("md_car_2_plus", '\u{f1015}'), // 󱀕 ("md_car_3_plus", '\u{f1016}'), // 󱀖 ("md_car_arrow_left", '\u{f13b2}'), // 󱎲 ("md_car_arrow_right", '\u{f13b3}'), // 󱎳 ("md_car_back", '\u{f0e1b}'), // 󰸛 ("md_car_battery", '\u{f010c}'), // 󰄌 ("md_car_brake_abs", '\u{f0c47}'), // 󰱇 ("md_car_brake_alert", '\u{f0c48}'), // 󰱈 ("md_car_brake_fluid_level", '\u{f1909}'), // 󱤉 ("md_car_brake_hold", '\u{f0d5e}'), // 󰵞 ("md_car_brake_low_pressure", '\u{f190a}'), // 󱤊 ("md_car_brake_parking", '\u{f0d5f}'), // 󰵟 ("md_car_brake_retarder", '\u{f1017}'), // 󱀗 ("md_car_brake_temperature", '\u{f190b}'), // 󱤋 ("md_car_brake_worn_linings", '\u{f190c}'), // 󱤌 ("md_car_child_seat", '\u{f0fa3}'), // 󰾣 ("md_car_clock", '\u{f1974}'), // 󱥴 ("md_car_clutch", '\u{f1018}'), // 󱀘 ("md_car_cog", '\u{f13cc}'), // 󱏌 ("md_car_connected", '\u{f010d}'), // 󰄍 ("md_car_convertible", '\u{f07a7}'), // 󰞧 ("md_car_coolant_level", '\u{f1019}'), // 󱀙 ("md_car_cruise_control", '\u{f0d60}'), // 󰵠 ("md_car_defrost_front", '\u{f0d61}'), // 󰵡 ("md_car_defrost_rear", '\u{f0d62}'), // 󰵢 ("md_car_door", '\u{f0b6b}'), // 󰭫 ("md_car_door_lock", '\u{f109d}'), // 󱂝 ("md_car_electric", '\u{f0b6c}'), // 󰭬 ("md_car_electric_outline", '\u{f15b5}'), // 󱖵 ("md_car_emergency", '\u{f160f}'), // 󱘏 ("md_car_esp", '\u{f0c49}'), // 󰱉 ("md_car_estate", '\u{f07a8}'), // 󰞨 ("md_car_hatchback", '\u{f07a9}'), // 󰞩 ("md_car_info", '\u{f11be}'), // 󱆾 ("md_car_key", '\u{f0b6d}'), // 󰭭 ("md_car_lifted_pickup", '\u{f152d}'), // 󱔭 ("md_car_light_alert", '\u{f190d}'), // 󱤍 ("md_car_light_dimmed", '\u{f0c4a}'), // 󰱊 ("md_car_light_fog", '\u{f0c4b}'), // 󰱋 ("md_car_light_high", '\u{f0c4c}'), // 󰱌 ("md_car_limousine", '\u{f08cd}'), // 󰣍 ("md_car_multiple", '\u{f0b6e}'), // 󰭮 ("md_car_off", '\u{f0e1c}'), // 󰸜 ("md_car_outline", '\u{f14ed}'), // 󱓭 ("md_car_parking_lights", '\u{f0d63}'), // 󰵣 ("md_car_pickup", '\u{f07aa}'), // 󰞪 ("md_car_seat", '\u{f0fa4}'), // 󰾤 ("md_car_seat_cooler", '\u{f0fa5}'), // 󰾥 ("md_car_seat_heater", '\u{f0fa6}'), // 󰾦 ("md_car_select", '\u{f1879}'), // 󱡹 ("md_car_settings", '\u{f13cd}'), // 󱏍 ("md_car_shift_pattern", '\u{f0f40}'), // 󰽀 ("md_car_side", '\u{f07ab}'), // 󰞫 ("md_car_speed_limiter", '\u{f190e}'), // 󱤎 ("md_car_sports", '\u{f07ac}'), // 󰞬 ("md_car_tire_alert", '\u{f0c4d}'), // 󰱍 ("md_car_traction_control", '\u{f0d64}'), // 󰵤 ("md_car_turbocharger", '\u{f101a}'), // 󱀚 ("md_car_wash", '\u{f010e}'), // 󰄎 ("md_car_windshield", '\u{f101b}'), // 󱀛 ("md_car_windshield_outline", '\u{f101c}'), // 󱀜 ("md_car_wireless", '\u{f1878}'), // 󱡸 ("md_car_wrench", '\u{f1814}'), // 󱠔 ("md_carabiner", '\u{f14c0}'), // 󱓀 ("md_caravan", '\u{f07ad}'), // 󰞭 ("md_card", '\u{f0b6f}'), // 󰭯 ("md_card_account_details", '\u{f05d2}'), // 󰗒 ("md_card_account_details_outline", '\u{f0dab}'), // 󰶫 ("md_card_account_details_star", '\u{f02a3}'), // 󰊣 ("md_card_account_details_star_outline", '\u{f06db}'), // 󰛛 ("md_card_account_mail", '\u{f018e}'), // 󰆎 ("md_card_account_mail_outline", '\u{f0e98}'), // 󰺘 ("md_card_account_phone", '\u{f0e99}'), // 󰺙 ("md_card_account_phone_outline", '\u{f0e9a}'), // 󰺚 ("md_card_bulleted", '\u{f0b70}'), // 󰭰 ("md_card_bulleted_off", '\u{f0b71}'), // 󰭱 ("md_card_bulleted_off_outline", '\u{f0b72}'), // 󰭲 ("md_card_bulleted_outline", '\u{f0b73}'), // 󰭳 ("md_card_bulleted_settings", '\u{f0b74}'), // 󰭴 ("md_card_bulleted_settings_outline", '\u{f0b75}'), // 󰭵 ("md_card_minus", '\u{f1600}'), // 󱘀 ("md_card_minus_outline", '\u{f1601}'), // 󱘁 ("md_card_multiple", '\u{f17f1}'), // 󱟱 ("md_card_multiple_outline", '\u{f17f2}'), // 󱟲 ("md_card_off", '\u{f1602}'), // 󱘂 ("md_card_off_outline", '\u{f1603}'), // 󱘃 ("md_card_outline", '\u{f0b76}'), // 󰭶 ("md_card_plus", '\u{f11ff}'), // 󱇿 ("md_card_plus_outline", '\u{f1200}'), // 󱈀 ("md_card_remove", '\u{f1604}'), // 󱘄 ("md_card_remove_outline", '\u{f1605}'), // 󱘅 ("md_card_search", '\u{f1074}'), // 󱁴 ("md_card_search_outline", '\u{f1075}'), // 󱁵 ("md_card_text", '\u{f0b77}'), // 󰭷 ("md_card_text_outline", '\u{f0b78}'), // 󰭸 ("md_cards", '\u{f0638}'), // 󰘸 ("md_cards_club", '\u{f08ce}'), // 󰣎 ("md_cards_club_outline", '\u{f189f}'), // 󱢟 ("md_cards_diamond", '\u{f08cf}'), // 󰣏 ("md_cards_diamond_outline", '\u{f101d}'), // 󱀝 ("md_cards_outline", '\u{f0639}'), // 󰘹 ("md_cards_playing", '\u{f18a1}'), // 󱢡 ("md_cards_playing_club", '\u{f18a2}'), // 󱢢 ("md_cards_playing_club_multiple", '\u{f18a3}'), // 󱢣 ("md_cards_playing_club_multiple_outline", '\u{f18a4}'), // 󱢤 ("md_cards_playing_club_outline", '\u{f18a5}'), // 󱢥 ("md_cards_playing_diamond", '\u{f18a6}'), // 󱢦 ("md_cards_playing_diamond_multiple", '\u{f18a7}'), // 󱢧 ("md_cards_playing_diamond_multiple_outline", '\u{f18a8}'), // 󱢨 ("md_cards_playing_diamond_outline", '\u{f18a9}'), // 󱢩 ("md_cards_playing_heart", '\u{f18aa}'), // 󱢪 ("md_cards_playing_heart_multiple", '\u{f18ab}'), // 󱢫 ("md_cards_playing_heart_multiple_outline", '\u{f18ac}'), // 󱢬 ("md_cards_playing_heart_outline", '\u{f18ad}'), // 󱢭 ("md_cards_playing_outline", '\u{f063a}'), // 󰘺 ("md_cards_playing_spade", '\u{f18ae}'), // 󱢮 ("md_cards_playing_spade_multiple", '\u{f18af}'), // 󱢯 ("md_cards_playing_spade_multiple_outline", '\u{f18b0}'), // 󱢰 ("md_cards_playing_spade_outline", '\u{f18b1}'), // 󱢱 ("md_cards_spade", '\u{f08d1}'), // 󰣑 ("md_cards_spade_outline", '\u{f18b2}'), // 󱢲 ("md_cards_variant", '\u{f06c7}'), // 󰛇 ("md_carrot", '\u{f010f}'), // 󰄏 ("md_cart", '\u{f0110}'), // 󰄐 ("md_cart_arrow_down", '\u{f0d66}'), // 󰵦 ("md_cart_arrow_right", '\u{f0c4e}'), // 󰱎 ("md_cart_arrow_up", '\u{f0d67}'), // 󰵧 ("md_cart_check", '\u{f15ea}'), // 󱗪 ("md_cart_heart", '\u{f18e0}'), // 󱣠 ("md_cart_minus", '\u{f0d68}'), // 󰵨 ("md_cart_off", '\u{f066b}'), // 󰙫 ("md_cart_outline", '\u{f0111}'), // 󰄑 ("md_cart_plus", '\u{f0112}'), // 󰄒 ("md_cart_remove", '\u{f0d69}'), // 󰵩 ("md_cart_variant", '\u{f15eb}'), // 󱗫 ("md_case_sensitive_alt", '\u{f0113}'), // 󰄓 ("md_cash", '\u{f0114}'), // 󰄔 ("md_cash_100", '\u{f0115}'), // 󰄕 ("md_cash_check", '\u{f14ee}'), // 󱓮 ("md_cash_clock", '\u{f1a91}'), // 󱪑 ("md_cash_fast", '\u{f185c}'), // 󱡜 ("md_cash_lock", '\u{f14ea}'), // 󱓪 ("md_cash_lock_open", '\u{f14eb}'), // 󱓫 ("md_cash_marker", '\u{f0db8}'), // 󰶸 ("md_cash_minus", '\u{f1260}'), // 󱉠 ("md_cash_multiple", '\u{f0116}'), // 󰄖 ("md_cash_plus", '\u{f1261}'), // 󱉡 ("md_cash_refund", '\u{f0a9c}'), // 󰪜 ("md_cash_register", '\u{f0cf4}'), // 󰳴 ("md_cash_remove", '\u{f1262}'), // 󱉢 ("md_cash_sync", '\u{f1a92}'), // 󱪒 ("md_cassette", '\u{f09d4}'), // 󰧔 ("md_cast", '\u{f0118}'), // 󰄘 ("md_cast_audio", '\u{f101e}'), // 󱀞 ("md_cast_audio_variant", '\u{f1749}'), // 󱝉 ("md_cast_connected", '\u{f0119}'), // 󰄙 ("md_cast_education", '\u{f0e1d}'), // 󰸝 ("md_cast_off", '\u{f078a}'), // 󰞊 ("md_cast_variant", '\u{f001f}'), // 󰀟 ("md_castle", '\u{f011a}'), // 󰄚 ("md_cat", '\u{f011b}'), // 󰄛 ("md_cctv", '\u{f07ae}'), // 󰞮 ("md_cctv_off", '\u{f185f}'), // 󱡟 ("md_ceiling_fan", '\u{f1797}'), // 󱞗 ("md_ceiling_fan_light", '\u{f1798}'), // 󱞘 ("md_ceiling_light", '\u{f0769}'), // 󰝩 ("md_ceiling_light_multiple", '\u{f18dd}'), // 󱣝 ("md_ceiling_light_multiple_outline", '\u{f18de}'), // 󱣞 ("md_ceiling_light_outline", '\u{f17c7}'), // 󱟇 ("md_cellphone", '\u{f011c}'), // 󰄜 ("md_cellphone_arrow_down", '\u{f09d5}'), // 󰧕 ("md_cellphone_arrow_down_variant", '\u{f19c5}'), // 󱧅 ("md_cellphone_basic", '\u{f011e}'), // 󰄞 ("md_cellphone_charging", '\u{f1397}'), // 󱎗 ("md_cellphone_check", '\u{f17fd}'), // 󱟽 ("md_cellphone_cog", '\u{f0951}'), // 󰥑 ("md_cellphone_dock", '\u{f011f}'), // 󰄟 ("md_cellphone_information", '\u{f0f41}'), // 󰽁 ("md_cellphone_key", '\u{f094e}'), // 󰥎 ("md_cellphone_link", '\u{f0121}'), // 󰄡 ("md_cellphone_link_off", '\u{f0122}'), // 󰄢 ("md_cellphone_lock", '\u{f094f}'), // 󰥏 ("md_cellphone_marker", '\u{f183a}'), // 󱠺 ("md_cellphone_message", '\u{f08d3}'), // 󰣓 ("md_cellphone_message_off", '\u{f10d2}'), // 󱃒 ("md_cellphone_nfc", '\u{f0e90}'), // 󰺐 ("md_cellphone_nfc_off", '\u{f12d8}'), // 󱋘 ("md_cellphone_off", '\u{f0950}'), // 󰥐 ("md_cellphone_play", '\u{f101f}'), // 󱀟 ("md_cellphone_remove", '\u{f094d}'), // 󰥍 ("md_cellphone_screenshot", '\u{f0a35}'), // 󰨵 ("md_cellphone_settings", '\u{f0123}'), // 󰄣 ("md_cellphone_sound", '\u{f0952}'), // 󰥒 ("md_cellphone_text", '\u{f08d2}'), // 󰣒 ("md_cellphone_wireless", '\u{f0815}'), // 󰠕 ("md_centos", '\u{f111a}'), // 󱄚 ("md_certificate", '\u{f0124}'), // 󰄤 ("md_certificate_outline", '\u{f1188}'), // 󱆈 ("md_chair_rolling", '\u{f0f48}'), // 󰽈 ("md_chair_school", '\u{f0125}'), // 󰄥 ("md_chandelier", '\u{f1793}'), // 󱞓 ("md_charity", '\u{f0c4f}'), // 󰱏 ("md_chart_arc", '\u{f0126}'), // 󰄦 ("md_chart_areaspline", '\u{f0127}'), // 󰄧 ("md_chart_areaspline_variant", '\u{f0e91}'), // 󰺑 ("md_chart_bar", '\u{f0128}'), // 󰄨 ("md_chart_bar_stacked", '\u{f076a}'), // 󰝪 ("md_chart_bell_curve", '\u{f0c50}'), // 󰱐 ("md_chart_bell_curve_cumulative", '\u{f0fa7}'), // 󰾧 ("md_chart_box", '\u{f154d}'), // 󱕍 ("md_chart_box_outline", '\u{f154e}'), // 󱕎 ("md_chart_box_plus_outline", '\u{f154f}'), // 󱕏 ("md_chart_bubble", '\u{f05e3}'), // 󰗣 ("md_chart_donut", '\u{f07af}'), // 󰞯 ("md_chart_donut_variant", '\u{f07b0}'), // 󰞰 ("md_chart_gantt", '\u{f066c}'), // 󰙬 ("md_chart_histogram", '\u{f0129}'), // 󰄩 ("md_chart_line", '\u{f012a}'), // 󰄪 ("md_chart_line_stacked", '\u{f076b}'), // 󰝫 ("md_chart_line_variant", '\u{f07b1}'), // 󰞱 ("md_chart_multiline", '\u{f08d4}'), // 󰣔 ("md_chart_multiple", '\u{f1213}'), // 󱈓 ("md_chart_pie", '\u{f012b}'), // 󰄫 ("md_chart_ppf", '\u{f1380}'), // 󱎀 ("md_chart_sankey", '\u{f11df}'), // 󱇟 ("md_chart_sankey_variant", '\u{f11e0}'), // 󱇠 ("md_chart_scatter_plot", '\u{f0e92}'), // 󰺒 ("md_chart_scatter_plot_hexbin", '\u{f066d}'), // 󰙭 ("md_chart_timeline", '\u{f066e}'), // 󰙮 ("md_chart_timeline_variant", '\u{f0e93}'), // 󰺓 ("md_chart_timeline_variant_shimmer", '\u{f15b6}'), // 󱖶 ("md_chart_tree", '\u{f0e94}'), // 󰺔 ("md_chart_waterfall", '\u{f1918}'), // 󱤘 ("md_chat", '\u{f0b79}'), // 󰭹 ("md_chat_alert", '\u{f0b7a}'), // 󰭺 ("md_chat_alert_outline", '\u{f12c9}'), // 󱋉 ("md_chat_minus", '\u{f1410}'), // 󱐐 ("md_chat_minus_outline", '\u{f1413}'), // 󱐓 ("md_chat_outline", '\u{f0ede}'), // 󰻞 ("md_chat_plus", '\u{f140f}'), // 󱐏 ("md_chat_plus_outline", '\u{f1412}'), // 󱐒 ("md_chat_processing", '\u{f0b7b}'), // 󰭻 ("md_chat_processing_outline", '\u{f12ca}'), // 󱋊 ("md_chat_question", '\u{f1738}'), // 󱜸 ("md_chat_question_outline", '\u{f1739}'), // 󱜹 ("md_chat_remove", '\u{f1411}'), // 󱐑 ("md_chat_remove_outline", '\u{f1414}'), // 󱐔 ("md_chat_sleep", '\u{f12d1}'), // 󱋑 ("md_chat_sleep_outline", '\u{f12d2}'), // 󱋒 ("md_check", '\u{f012c}'), // 󰄬 ("md_check_all", '\u{f012d}'), // 󰄭 ("md_check_bold", '\u{f0e1e}'), // 󰸞 ("md_check_circle", '\u{f05e0}'), // 󰗠 ("md_check_circle_outline", '\u{f05e1}'), // 󰗡 ("md_check_decagram", '\u{f0791}'), // 󰞑 ("md_check_decagram_outline", '\u{f1740}'), // 󱝀 ("md_check_network", '\u{f0c53}'), // 󰱓 ("md_check_network_outline", '\u{f0c54}'), // 󰱔 ("md_check_outline", '\u{f0855}'), // 󰡕 ("md_check_underline", '\u{f0e1f}'), // 󰸟 ("md_check_underline_circle", '\u{f0e20}'), // 󰸠 ("md_check_underline_circle_outline", '\u{f0e21}'), // 󰸡 ("md_checkbook", '\u{f0a9d}'), // 󰪝 ("md_checkbox_blank", '\u{f012e}'), // 󰄮 ("md_checkbox_blank_badge", '\u{f1176}'), // 󱅶 ("md_checkbox_blank_badge_outline", '\u{f0117}'), // 󰄗 ("md_checkbox_blank_circle", '\u{f012f}'), // 󰄯 ("md_checkbox_blank_circle_outline", '\u{f0130}'), // 󰄰 ("md_checkbox_blank_off", '\u{f12ec}'), // 󱋬 ("md_checkbox_blank_off_outline", '\u{f12ed}'), // 󱋭 ("md_checkbox_blank_outline", '\u{f0131}'), // 󰄱 ("md_checkbox_intermediate", '\u{f0856}'), // 󰡖 ("md_checkbox_marked", '\u{f0132}'), // 󰄲 ("md_checkbox_marked_circle", '\u{f0133}'), // 󰄳 ("md_checkbox_marked_circle_outline", '\u{f0134}'), // 󰄴 ("md_checkbox_marked_circle_plus_outline", '\u{f1927}'), // 󱤧 ("md_checkbox_marked_outline", '\u{f0135}'), // 󰄵 ("md_checkbox_multiple_blank", '\u{f0136}'), // 󰄶 ("md_checkbox_multiple_blank_circle", '\u{f063b}'), // 󰘻 ("md_checkbox_multiple_blank_circle_outline", '\u{f063c}'), // 󰘼 ("md_checkbox_multiple_blank_outline", '\u{f0137}'), // 󰄷 ("md_checkbox_multiple_marked", '\u{f0138}'), // 󰄸 ("md_checkbox_multiple_marked_circle", '\u{f063d}'), // 󰘽 ("md_checkbox_multiple_marked_circle_outline", '\u{f063e}'), // 󰘾 ("md_checkbox_multiple_marked_outline", '\u{f0139}'), // 󰄹 ("md_checkbox_multiple_outline", '\u{f0c51}'), // 󰱑 ("md_checkbox_outline", '\u{f0c52}'), // 󰱒 ("md_checkerboard", '\u{f013a}'), // 󰄺 ("md_checkerboard_minus", '\u{f1202}'), // 󱈂 ("md_checkerboard_plus", '\u{f1201}'), // 󱈁 ("md_checkerboard_remove", '\u{f1203}'), // 󱈃 ("md_cheese", '\u{f12b9}'), // 󱊹 ("md_cheese_off", '\u{f13ee}'), // 󱏮 ("md_chef_hat", '\u{f0b7c}'), // 󰭼 ("md_chemical_weapon", '\u{f013b}'), // 󰄻 ("md_chess_bishop", '\u{f085c}'), // 󰡜 ("md_chess_king", '\u{f0857}'), // 󰡗 ("md_chess_knight", '\u{f0858}'), // 󰡘 ("md_chess_pawn", '\u{f0859}'), // 󰡙 ("md_chess_queen", '\u{f085a}'), // 󰡚 ("md_chess_rook", '\u{f085b}'), // 󰡛 ("md_chevron_double_down", '\u{f013c}'), // 󰄼 ("md_chevron_double_left", '\u{f013d}'), // 󰄽 ("md_chevron_double_right", '\u{f013e}'), // 󰄾 ("md_chevron_double_up", '\u{f013f}'), // 󰄿 ("md_chevron_down", '\u{f0140}'), // 󰅀 ("md_chevron_down_box", '\u{f09d6}'), // 󰧖 ("md_chevron_down_box_outline", '\u{f09d7}'), // 󰧗 ("md_chevron_down_circle", '\u{f0b26}'), // 󰬦 ("md_chevron_down_circle_outline", '\u{f0b27}'), // 󰬧 ("md_chevron_left", '\u{f0141}'), // 󰅁 ("md_chevron_left_box", '\u{f09d8}'), // 󰧘 ("md_chevron_left_box_outline", '\u{f09d9}'), // 󰧙 ("md_chevron_left_circle", '\u{f0b28}'), // 󰬨 ("md_chevron_left_circle_outline", '\u{f0b29}'), // 󰬩 ("md_chevron_right", '\u{f0142}'), // 󰅂 ("md_chevron_right_box", '\u{f09da}'), // 󰧚 ("md_chevron_right_box_outline", '\u{f09db}'), // 󰧛 ("md_chevron_right_circle", '\u{f0b2a}'), // 󰬪 ("md_chevron_right_circle_outline", '\u{f0b2b}'), // 󰬫 ("md_chevron_triple_down", '\u{f0db9}'), // 󰶹 ("md_chevron_triple_left", '\u{f0dba}'), // 󰶺 ("md_chevron_triple_right", '\u{f0dbb}'), // 󰶻 ("md_chevron_triple_up", '\u{f0dbc}'), // 󰶼 ("md_chevron_up", '\u{f0143}'), // 󰅃 ("md_chevron_up_box", '\u{f09dc}'), // 󰧜 ("md_chevron_up_box_outline", '\u{f09dd}'), // 󰧝 ("md_chevron_up_circle", '\u{f0b2c}'), // 󰬬 ("md_chevron_up_circle_outline", '\u{f0b2d}'), // 󰬭 ("md_chili_alert", '\u{f17ea}'), // 󱟪 ("md_chili_alert_outline", '\u{f17eb}'), // 󱟫 ("md_chili_hot", '\u{f07b2}'), // 󰞲 ("md_chili_hot_outline", '\u{f17ec}'), // 󱟬 ("md_chili_medium", '\u{f07b3}'), // 󰞳 ("md_chili_medium_outline", '\u{f17ed}'), // 󱟭 ("md_chili_mild", '\u{f07b4}'), // 󰞴 ("md_chili_mild_outline", '\u{f17ee}'), // 󱟮 ("md_chili_off", '\u{f1467}'), // 󱑧 ("md_chili_off_outline", '\u{f17ef}'), // 󱟯 ("md_chip", '\u{f061a}'), // 󰘚 ("md_church", '\u{f0144}'), // 󰅄 ("md_cigar", '\u{f1189}'), // 󱆉 ("md_cigar_off", '\u{f141b}'), // 󱐛 ("md_circle_box", '\u{f15dc}'), // 󱗜 ("md_circle_box_outline", '\u{f15dd}'), // 󱗝 ("md_circle_double", '\u{f0e95}'), // 󰺕 ("md_circle_edit_outline", '\u{f08d5}'), // 󰣕 ("md_circle_expand", '\u{f0e96}'), // 󰺖 ("md_circle_half", '\u{f1395}'), // 󱎕 ("md_circle_half_full", '\u{f1396}'), // 󱎖 ("md_circle_medium", '\u{f09de}'), // 󰧞 ("md_circle_multiple", '\u{f0b38}'), // 󰬸 ("md_circle_multiple_outline", '\u{f0695}'), // 󰚕 ("md_circle_off_outline", '\u{f10d3}'), // 󱃓 ("md_circle_opacity", '\u{f1853}'), // 󱡓 ("md_circle_slice_1", '\u{f0a9e}'), // 󰪞 ("md_circle_slice_2", '\u{f0a9f}'), // 󰪟 ("md_circle_slice_3", '\u{f0aa0}'), // 󰪠 ("md_circle_slice_4", '\u{f0aa1}'), // 󰪡 ("md_circle_slice_5", '\u{f0aa2}'), // 󰪢 ("md_circle_slice_6", '\u{f0aa3}'), // 󰪣 ("md_circle_slice_7", '\u{f0aa4}'), // 󰪤 ("md_circle_slice_8", '\u{f0aa5}'), // 󰪥 ("md_circle_small", '\u{f09df}'), // 󰧟 ("md_circular_saw", '\u{f0e22}'), // 󰸢 ("md_city", '\u{f0146}'), // 󰅆 ("md_city_variant", '\u{f0a36}'), // 󰨶 ("md_city_variant_outline", '\u{f0a37}'), // 󰨷 ("md_clipboard", '\u{f0147}'), // 󰅇 ("md_clipboard_account", '\u{f0148}'), // 󰅈 ("md_clipboard_account_outline", '\u{f0c55}'), // 󰱕 ("md_clipboard_alert", '\u{f0149}'), // 󰅉 ("md_clipboard_alert_outline", '\u{f0cf7}'), // 󰳷 ("md_clipboard_arrow_down", '\u{f014a}'), // 󰅊 ("md_clipboard_arrow_down_outline", '\u{f0c56}'), // 󰱖 ("md_clipboard_arrow_left", '\u{f014b}'), // 󰅋 ("md_clipboard_arrow_left_outline", '\u{f0cf8}'), // 󰳸 ("md_clipboard_arrow_right", '\u{f0cf9}'), // 󰳹 ("md_clipboard_arrow_right_outline", '\u{f0cfa}'), // 󰳺 ("md_clipboard_arrow_up", '\u{f0c57}'), // 󰱗 ("md_clipboard_arrow_up_outline", '\u{f0c58}'), // 󰱘 ("md_clipboard_check", '\u{f014e}'), // 󰅎 ("md_clipboard_check_multiple", '\u{f1263}'), // 󱉣 ("md_clipboard_check_multiple_outline", '\u{f1264}'), // 󱉤 ("md_clipboard_check_outline", '\u{f08a8}'), // 󰢨 ("md_clipboard_clock", '\u{f16e2}'), // 󱛢 ("md_clipboard_clock_outline", '\u{f16e3}'), // 󱛣 ("md_clipboard_edit", '\u{f14e5}'), // 󱓥 ("md_clipboard_edit_outline", '\u{f14e6}'), // 󱓦 ("md_clipboard_file", '\u{f1265}'), // 󱉥 ("md_clipboard_file_outline", '\u{f1266}'), // 󱉦 ("md_clipboard_flow", '\u{f06c8}'), // 󰛈 ("md_clipboard_flow_outline", '\u{f1117}'), // 󱄗 ("md_clipboard_list", '\u{f10d4}'), // 󱃔 ("md_clipboard_list_outline", '\u{f10d5}'), // 󱃕 ("md_clipboard_minus", '\u{f1618}'), // 󱘘 ("md_clipboard_minus_outline", '\u{f1619}'), // 󱘙 ("md_clipboard_multiple", '\u{f1267}'), // 󱉧 ("md_clipboard_multiple_outline", '\u{f1268}'), // 󱉨 ("md_clipboard_off", '\u{f161a}'), // 󱘚 ("md_clipboard_off_outline", '\u{f161b}'), // 󱘛 ("md_clipboard_outline", '\u{f014c}'), // 󰅌 ("md_clipboard_play", '\u{f0c59}'), // 󰱙 ("md_clipboard_play_multiple", '\u{f1269}'), // 󱉩 ("md_clipboard_play_multiple_outline", '\u{f126a}'), // 󱉪 ("md_clipboard_play_outline", '\u{f0c5a}'), // 󰱚 ("md_clipboard_plus", '\u{f0751}'), // 󰝑 ("md_clipboard_plus_outline", '\u{f131f}'), // 󱌟 ("md_clipboard_pulse", '\u{f085d}'), // 󰡝 ("md_clipboard_pulse_outline", '\u{f085e}'), // 󰡞 ("md_clipboard_remove", '\u{f161c}'), // 󱘜 ("md_clipboard_remove_outline", '\u{f161d}'), // 󱘝 ("md_clipboard_search", '\u{f161e}'), // 󱘞 ("md_clipboard_search_outline", '\u{f161f}'), // 󱘟 ("md_clipboard_text", '\u{f014d}'), // 󰅍 ("md_clipboard_text_clock", '\u{f18f9}'), // 󱣹 ("md_clipboard_text_clock_outline", '\u{f18fa}'), // 󱣺 ("md_clipboard_text_multiple", '\u{f126b}'), // 󱉫 ("md_clipboard_text_multiple_outline", '\u{f126c}'), // 󱉬 ("md_clipboard_text_off", '\u{f1620}'), // 󱘠 ("md_clipboard_text_off_outline", '\u{f1621}'), // 󱘡 ("md_clipboard_text_outline", '\u{f0a38}'), // 󰨸 ("md_clipboard_text_play", '\u{f0c5b}'), // 󰱛 ("md_clipboard_text_play_outline", '\u{f0c5c}'), // 󰱜 ("md_clipboard_text_search", '\u{f1622}'), // 󱘢 ("md_clipboard_text_search_outline", '\u{f1623}'), // 󱘣 ("md_clippy", '\u{f014f}'), // 󰅏 ("md_clock", '\u{f0954}'), // 󰥔 ("md_clock_alert", '\u{f0955}'), // 󰥕 ("md_clock_alert_outline", '\u{f05ce}'), // 󰗎 ("md_clock_check", '\u{f0fa8}'), // 󰾨 ("md_clock_check_outline", '\u{f0fa9}'), // 󰾩 ("md_clock_digital", '\u{f0e97}'), // 󰺗 ("md_clock_edit", '\u{f19ba}'), // 󱦺 ("md_clock_edit_outline", '\u{f19bb}'), // 󱦻 ("md_clock_end", '\u{f0151}'), // 󰅑 ("md_clock_fast", '\u{f0152}'), // 󰅒 ("md_clock_in", '\u{f0153}'), // 󰅓 ("md_clock_minus", '\u{f1863}'), // 󱡣 ("md_clock_minus_outline", '\u{f1864}'), // 󱡤 ("md_clock_out", '\u{f0154}'), // 󰅔 ("md_clock_outline", '\u{f0150}'), // 󰅐 ("md_clock_plus", '\u{f1861}'), // 󱡡 ("md_clock_plus_outline", '\u{f1862}'), // 󱡢 ("md_clock_remove", '\u{f1865}'), // 󱡥 ("md_clock_remove_outline", '\u{f1866}'), // 󱡦 ("md_clock_start", '\u{f0155}'), // 󰅕 ("md_clock_time_eight", '\u{f1446}'), // 󱑆 ("md_clock_time_eight_outline", '\u{f1452}'), // 󱑒 ("md_clock_time_eleven", '\u{f1449}'), // 󱑉 ("md_clock_time_eleven_outline", '\u{f1455}'), // 󱑕 ("md_clock_time_five", '\u{f1443}'), // 󱑃 ("md_clock_time_five_outline", '\u{f144f}'), // 󱑏 ("md_clock_time_four", '\u{f1442}'), // 󱑂 ("md_clock_time_four_outline", '\u{f144e}'), // 󱑎 ("md_clock_time_nine", '\u{f1447}'), // 󱑇 ("md_clock_time_nine_outline", '\u{f1453}'), // 󱑓 ("md_clock_time_one", '\u{f143f}'), // 󱐿 ("md_clock_time_one_outline", '\u{f144b}'), // 󱑋 ("md_clock_time_seven", '\u{f1445}'), // 󱑅 ("md_clock_time_seven_outline", '\u{f1451}'), // 󱑑 ("md_clock_time_six", '\u{f1444}'), // 󱑄 ("md_clock_time_six_outline", '\u{f1450}'), // 󱑐 ("md_clock_time_ten", '\u{f1448}'), // 󱑈 ("md_clock_time_ten_outline", '\u{f1454}'), // 󱑔 ("md_clock_time_three", '\u{f1441}'), // 󱑁 ("md_clock_time_three_outline", '\u{f144d}'), // 󱑍 ("md_clock_time_twelve", '\u{f144a}'), // 󱑊 ("md_clock_time_twelve_outline", '\u{f1456}'), // 󱑖 ("md_clock_time_two", '\u{f1440}'), // 󱑀 ("md_clock_time_two_outline", '\u{f144c}'), // 󱑌 ("md_close", '\u{f0156}'), // 󰅖 ("md_close_box", '\u{f0157}'), // 󰅗 ("md_close_box_multiple", '\u{f0c5d}'), // 󰱝 ("md_close_box_multiple_outline", '\u{f0c5e}'), // 󰱞 ("md_close_box_outline", '\u{f0158}'), // 󰅘 ("md_close_circle", '\u{f0159}'), // 󰅙 ("md_close_circle_multiple", '\u{f062a}'), // 󰘪 ("md_close_circle_multiple_outline", '\u{f0883}'), // 󰢃 ("md_close_circle_outline", '\u{f015a}'), // 󰅚 ("md_close_network", '\u{f015b}'), // 󰅛 ("md_close_network_outline", '\u{f0c5f}'), // 󰱟 ("md_close_octagon", '\u{f015c}'), // 󰅜 ("md_close_octagon_outline", '\u{f015d}'), // 󰅝 ("md_close_outline", '\u{f06c9}'), // 󰛉 ("md_close_thick", '\u{f1398}'), // 󱎘 ("md_closed_caption", '\u{f015e}'), // 󰅞 ("md_closed_caption_outline", '\u{f0dbd}'), // 󰶽 ("md_cloud", '\u{f015f}'), // 󰅟 ("md_cloud_alert", '\u{f09e0}'), // 󰧠 ("md_cloud_braces", '\u{f07b5}'), // 󰞵 ("md_cloud_check", '\u{f0160}'), // 󰅠 ("md_cloud_check_outline", '\u{f12cc}'), // 󱋌 ("md_cloud_circle", '\u{f0161}'), // 󰅡 ("md_cloud_download", '\u{f0162}'), // 󰅢 ("md_cloud_download_outline", '\u{f0b7d}'), // 󰭽 ("md_cloud_lock", '\u{f11f1}'), // 󱇱 ("md_cloud_lock_outline", '\u{f11f2}'), // 󱇲 ("md_cloud_off_outline", '\u{f0164}'), // 󰅤 ("md_cloud_outline", '\u{f0163}'), // 󰅣 ("md_cloud_percent", '\u{f1a35}'), // 󱨵 ("md_cloud_percent_outline", '\u{f1a36}'), // 󱨶 ("md_cloud_print", '\u{f0165}'), // 󰅥 ("md_cloud_print_outline", '\u{f0166}'), // 󰅦 ("md_cloud_question", '\u{f0a39}'), // 󰨹 ("md_cloud_refresh", '\u{f052a}'), // 󰔪 ("md_cloud_search", '\u{f0956}'), // 󰥖 ("md_cloud_search_outline", '\u{f0957}'), // 󰥗 ("md_cloud_sync", '\u{f063f}'), // 󰘿 ("md_cloud_sync_outline", '\u{f12d6}'), // 󱋖 ("md_cloud_tags", '\u{f07b6}'), // 󰞶 ("md_cloud_upload", '\u{f0167}'), // 󰅧 ("md_cloud_upload_outline", '\u{f0b7e}'), // 󰭾 ("md_clover", '\u{f0816}'), // 󰠖 ("md_coach_lamp", '\u{f1020}'), // 󱀠 ("md_coach_lamp_variant", '\u{f1a37}'), // 󱨷 ("md_coat_rack", '\u{f109e}'), // 󱂞 ("md_code_array", '\u{f0168}'), // 󰅨 ("md_code_braces", '\u{f0169}'), // 󰅩 ("md_code_braces_box", '\u{f10d6}'), // 󱃖 ("md_code_brackets", '\u{f016a}'), // 󰅪 ("md_code_equal", '\u{f016b}'), // 󰅫 ("md_code_greater_than", '\u{f016c}'), // 󰅬 ("md_code_greater_than_or_equal", '\u{f016d}'), // 󰅭 ("md_code_json", '\u{f0626}'), // 󰘦 ("md_code_less_than", '\u{f016e}'), // 󰅮 ("md_code_less_than_or_equal", '\u{f016f}'), // 󰅯 ("md_code_not_equal", '\u{f0170}'), // 󰅰 ("md_code_not_equal_variant", '\u{f0171}'), // 󰅱 ("md_code_parentheses", '\u{f0172}'), // 󰅲 ("md_code_parentheses_box", '\u{f10d7}'), // 󱃗 ("md_code_string", '\u{f0173}'), // 󰅳 ("md_code_tags", '\u{f0174}'), // 󰅴 ("md_code_tags_check", '\u{f0694}'), // 󰚔 ("md_codepen", '\u{f0175}'), // 󰅵 ("md_coffee", '\u{f0176}'), // 󰅶 ("md_coffee_maker", '\u{f109f}'), // 󱂟 ("md_coffee_maker_check", '\u{f1931}'), // 󱤱 ("md_coffee_maker_check_outline", '\u{f1932}'), // 󱤲 ("md_coffee_maker_outline", '\u{f181b}'), // 󱠛 ("md_coffee_off", '\u{f0faa}'), // 󰾪 ("md_coffee_off_outline", '\u{f0fab}'), // 󰾫 ("md_coffee_outline", '\u{f06ca}'), // 󰛊 ("md_coffee_to_go", '\u{f0177}'), // 󰅷 ("md_coffee_to_go_outline", '\u{f130e}'), // 󱌎 ("md_coffin", '\u{f0b7f}'), // 󰭿 ("md_cog", '\u{f0493}'), // 󰒓 ("md_cog_box", '\u{f0494}'), // 󰒔 ("md_cog_clockwise", '\u{f11dd}'), // 󱇝 ("md_cog_counterclockwise", '\u{f11de}'), // 󱇞 ("md_cog_off", '\u{f13ce}'), // 󱏎 ("md_cog_off_outline", '\u{f13cf}'), // 󱏏 ("md_cog_outline", '\u{f08bb}'), // 󰢻 ("md_cog_pause", '\u{f1933}'), // 󱤳 ("md_cog_pause_outline", '\u{f1934}'), // 󱤴 ("md_cog_play", '\u{f1935}'), // 󱤵 ("md_cog_play_outline", '\u{f1936}'), // 󱤶 ("md_cog_refresh", '\u{f145e}'), // 󱑞 ("md_cog_refresh_outline", '\u{f145f}'), // 󱑟 ("md_cog_stop", '\u{f1937}'), // 󱤷 ("md_cog_stop_outline", '\u{f1938}'), // 󱤸 ("md_cog_sync", '\u{f1460}'), // 󱑠 ("md_cog_sync_outline", '\u{f1461}'), // 󱑡 ("md_cog_transfer", '\u{f105b}'), // 󱁛 ("md_cog_transfer_outline", '\u{f105c}'), // 󱁜 ("md_cogs", '\u{f08d6}'), // 󰣖 ("md_collage", '\u{f0640}'), // 󰙀 ("md_collapse_all", '\u{f0aa6}'), // 󰪦 ("md_collapse_all_outline", '\u{f0aa7}'), // 󰪧 ("md_color_helper", '\u{f0179}'), // 󰅹 ("md_comma", '\u{f0e23}'), // 󰸣 ("md_comma_box", '\u{f0e2b}'), // 󰸫 ("md_comma_box_outline", '\u{f0e24}'), // 󰸤 ("md_comma_circle", '\u{f0e25}'), // 󰸥 ("md_comma_circle_outline", '\u{f0e26}'), // 󰸦 ("md_comment", '\u{f017a}'), // 󰅺 ("md_comment_account", '\u{f017b}'), // 󰅻 ("md_comment_account_outline", '\u{f017c}'), // 󰅼 ("md_comment_alert", '\u{f017d}'), // 󰅽 ("md_comment_alert_outline", '\u{f017e}'), // 󰅾 ("md_comment_arrow_left", '\u{f09e1}'), // 󰧡 ("md_comment_arrow_left_outline", '\u{f09e2}'), // 󰧢 ("md_comment_arrow_right", '\u{f09e3}'), // 󰧣 ("md_comment_arrow_right_outline", '\u{f09e4}'), // 󰧤 ("md_comment_bookmark", '\u{f15ae}'), // 󱖮 ("md_comment_bookmark_outline", '\u{f15af}'), // 󱖯 ("md_comment_check", '\u{f017f}'), // 󰅿 ("md_comment_check_outline", '\u{f0180}'), // 󰆀 ("md_comment_edit", '\u{f11bf}'), // 󱆿 ("md_comment_edit_outline", '\u{f12c4}'), // 󱋄 ("md_comment_eye", '\u{f0a3a}'), // 󰨺 ("md_comment_eye_outline", '\u{f0a3b}'), // 󰨻 ("md_comment_flash", '\u{f15b0}'), // 󱖰 ("md_comment_flash_outline", '\u{f15b1}'), // 󱖱 ("md_comment_minus", '\u{f15df}'), // 󱗟 ("md_comment_minus_outline", '\u{f15e0}'), // 󱗠 ("md_comment_multiple", '\u{f085f}'), // 󰡟 ("md_comment_multiple_outline", '\u{f0181}'), // 󰆁 ("md_comment_off", '\u{f15e1}'), // 󱗡 ("md_comment_off_outline", '\u{f15e2}'), // 󱗢 ("md_comment_outline", '\u{f0182}'), // 󰆂 ("md_comment_plus", '\u{f09e5}'), // 󰧥 ("md_comment_plus_outline", '\u{f0183}'), // 󰆃 ("md_comment_processing", '\u{f0184}'), // 󰆄 ("md_comment_processing_outline", '\u{f0185}'), // 󰆅 ("md_comment_question", '\u{f0817}'), // 󰠗 ("md_comment_question_outline", '\u{f0186}'), // 󰆆 ("md_comment_quote", '\u{f1021}'), // 󱀡 ("md_comment_quote_outline", '\u{f1022}'), // 󱀢 ("md_comment_remove", '\u{f05de}'), // 󰗞 ("md_comment_remove_outline", '\u{f0187}'), // 󰆇 ("md_comment_search", '\u{f0a3c}'), // 󰨼 ("md_comment_search_outline", '\u{f0a3d}'), // 󰨽 ("md_comment_text", '\u{f0188}'), // 󰆈 ("md_comment_text_multiple", '\u{f0860}'), // 󰡠 ("md_comment_text_multiple_outline", '\u{f0861}'), // 󰡡 ("md_comment_text_outline", '\u{f0189}'), // 󰆉 ("md_compare", '\u{f018a}'), // 󰆊 ("md_compare_horizontal", '\u{f1492}'), // 󱒒 ("md_compare_remove", '\u{f18b3}'), // 󱢳 ("md_compare_vertical", '\u{f1493}'), // 󱒓 ("md_compass", '\u{f018b}'), // 󰆋 ("md_compass_off", '\u{f0b80}'), // 󰮀 ("md_compass_off_outline", '\u{f0b81}'), // 󰮁 ("md_compass_outline", '\u{f018c}'), // 󰆌 ("md_compass_rose", '\u{f1382}'), // 󱎂 ("md_compost", '\u{f1a38}'), // 󱨸 ("md_cone", '\u{f194c}'), // 󱥌 ("md_cone_off", '\u{f194d}'), // 󱥍 ("md_connection", '\u{f1616}'), // 󱘖 ("md_console", '\u{f018d}'), // 󰆍 ("md_console_line", '\u{f07b7}'), // 󰞷 ("md_console_network", '\u{f08a9}'), // 󰢩 ("md_console_network_outline", '\u{f0c60}'), // 󰱠 ("md_consolidate", '\u{f10d8}'), // 󱃘 ("md_contactless_payment", '\u{f0d6a}'), // 󰵪 ("md_contactless_payment_circle", '\u{f0321}'), // 󰌡 ("md_contactless_payment_circle_outline", '\u{f0408}'), // 󰐈 ("md_contacts", '\u{f06cb}'), // 󰛋 ("md_contacts_outline", '\u{f05b8}'), // 󰖸 ("md_contain", '\u{f0a3e}'), // 󰨾 ("md_contain_end", '\u{f0a3f}'), // 󰨿 ("md_contain_start", '\u{f0a40}'), // 󰩀 ("md_content_copy", '\u{f018f}'), // 󰆏 ("md_content_cut", '\u{f0190}'), // 󰆐 ("md_content_duplicate", '\u{f0191}'), // 󰆑 ("md_content_paste", '\u{f0192}'), // 󰆒 ("md_content_save", '\u{f0193}'), // 󰆓 ("md_content_save_alert", '\u{f0f42}'), // 󰽂 ("md_content_save_alert_outline", '\u{f0f43}'), // 󰽃 ("md_content_save_all", '\u{f0194}'), // 󰆔 ("md_content_save_all_outline", '\u{f0f44}'), // 󰽄 ("md_content_save_check", '\u{f18ea}'), // 󱣪 ("md_content_save_check_outline", '\u{f18eb}'), // 󱣫 ("md_content_save_cog", '\u{f145b}'), // 󱑛 ("md_content_save_cog_outline", '\u{f145c}'), // 󱑜 ("md_content_save_edit", '\u{f0cfb}'), // 󰳻 ("md_content_save_edit_outline", '\u{f0cfc}'), // 󰳼 ("md_content_save_move", '\u{f0e27}'), // 󰸧 ("md_content_save_move_outline", '\u{f0e28}'), // 󰸨 ("md_content_save_off", '\u{f1643}'), // 󱙃 ("md_content_save_off_outline", '\u{f1644}'), // 󱙄 ("md_content_save_outline", '\u{f0818}'), // 󰠘 ("md_content_save_settings", '\u{f061b}'), // 󰘛 ("md_content_save_settings_outline", '\u{f0b2e}'), // 󰬮 ("md_contrast", '\u{f0195}'), // 󰆕 ("md_contrast_box", '\u{f0196}'), // 󰆖 ("md_contrast_circle", '\u{f0197}'), // 󰆗 ("md_controller_classic", '\u{f0b82}'), // 󰮂 ("md_controller_classic_outline", '\u{f0b83}'), // 󰮃 ("md_cookie", '\u{f0198}'), // 󰆘 ("md_cookie_alert", '\u{f16d0}'), // 󱛐 ("md_cookie_alert_outline", '\u{f16d1}'), // 󱛑 ("md_cookie_check", '\u{f16d2}'), // 󱛒 ("md_cookie_check_outline", '\u{f16d3}'), // 󱛓 ("md_cookie_clock", '\u{f16e4}'), // 󱛤 ("md_cookie_clock_outline", '\u{f16e5}'), // 󱛥 ("md_cookie_cog", '\u{f16d4}'), // 󱛔 ("md_cookie_cog_outline", '\u{f16d5}'), // 󱛕 ("md_cookie_edit", '\u{f16e6}'), // 󱛦 ("md_cookie_edit_outline", '\u{f16e7}'), // 󱛧 ("md_cookie_lock", '\u{f16e8}'), // 󱛨 ("md_cookie_lock_outline", '\u{f16e9}'), // 󱛩 ("md_cookie_minus", '\u{f16da}'), // 󱛚 ("md_cookie_minus_outline", '\u{f16db}'), // 󱛛 ("md_cookie_off", '\u{f16ea}'), // 󱛪 ("md_cookie_off_outline", '\u{f16eb}'), // 󱛫 ("md_cookie_outline", '\u{f16de}'), // 󱛞 ("md_cookie_plus", '\u{f16d6}'), // 󱛖 ("md_cookie_plus_outline", '\u{f16d7}'), // 󱛗 ("md_cookie_refresh", '\u{f16ec}'), // 󱛬 ("md_cookie_refresh_outline", '\u{f16ed}'), // 󱛭 ("md_cookie_remove", '\u{f16d8}'), // 󱛘 ("md_cookie_remove_outline", '\u{f16d9}'), // 󱛙 ("md_cookie_settings", '\u{f16dc}'), // 󱛜 ("md_cookie_settings_outline", '\u{f16dd}'), // 󱛝 ("md_coolant_temperature", '\u{f03c8}'), // 󰏈 ("md_copyleft", '\u{f1939}'), // 󱤹 ("md_copyright", '\u{f05e6}'), // 󰗦 ("md_cordova", '\u{f0958}'), // 󰥘 ("md_corn", '\u{f07b8}'), // 󰞸 ("md_corn_off", '\u{f13ef}'), // 󱏯 ("md_cosine_wave", '\u{f1479}'), // 󱑹 ("md_counter", '\u{f0199}'), // 󰆙 ("md_countertop", '\u{f181c}'), // 󱠜 ("md_countertop_outline", '\u{f181d}'), // 󱠝 ("md_cow", '\u{f019a}'), // 󰆚 ("md_cow_off", '\u{f18fc}'), // 󱣼 ("md_cpu_32_bit", '\u{f0edf}'), // 󰻟 ("md_cpu_64_bit", '\u{f0ee0}'), // 󰻠 ("md_cradle", '\u{f198b}'), // 󱦋 ("md_cradle_outline", '\u{f1991}'), // 󱦑 ("md_crane", '\u{f0862}'), // 󰡢 ("md_creation", '\u{f0674}'), // 󰙴 ("md_creative_commons", '\u{f0d6b}'), // 󰵫 ("md_credit_card", '\u{f0fef}'), // 󰿯 ("md_credit_card_check", '\u{f13d0}'), // 󱏐 ("md_credit_card_check_outline", '\u{f13d1}'), // 󱏑 ("md_credit_card_chip", '\u{f190f}'), // 󱤏 ("md_credit_card_chip_outline", '\u{f1910}'), // 󱤐 ("md_credit_card_clock", '\u{f0ee1}'), // 󰻡 ("md_credit_card_clock_outline", '\u{f0ee2}'), // 󰻢 ("md_credit_card_edit", '\u{f17d7}'), // 󱟗 ("md_credit_card_edit_outline", '\u{f17d8}'), // 󱟘 ("md_credit_card_fast", '\u{f1911}'), // 󱤑 ("md_credit_card_fast_outline", '\u{f1912}'), // 󱤒 ("md_credit_card_lock", '\u{f18e7}'), // 󱣧 ("md_credit_card_lock_outline", '\u{f18e8}'), // 󱣨 ("md_credit_card_marker", '\u{f06a8}'), // 󰚨 ("md_credit_card_marker_outline", '\u{f0dbe}'), // 󰶾 ("md_credit_card_minus", '\u{f0fac}'), // 󰾬 ("md_credit_card_minus_outline", '\u{f0fad}'), // 󰾭 ("md_credit_card_multiple", '\u{f0ff0}'), // 󰿰 ("md_credit_card_multiple_outline", '\u{f019c}'), // 󰆜 ("md_credit_card_off", '\u{f0ff1}'), // 󰿱 ("md_credit_card_off_outline", '\u{f05e4}'), // 󰗤 ("md_credit_card_outline", '\u{f019b}'), // 󰆛 ("md_credit_card_plus", '\u{f0ff2}'), // 󰿲 ("md_credit_card_plus_outline", '\u{f0676}'), // 󰙶 ("md_credit_card_refresh", '\u{f1645}'), // 󱙅 ("md_credit_card_refresh_outline", '\u{f1646}'), // 󱙆 ("md_credit_card_refund", '\u{f0ff3}'), // 󰿳 ("md_credit_card_refund_outline", '\u{f0aa8}'), // 󰪨 ("md_credit_card_remove", '\u{f0fae}'), // 󰾮 ("md_credit_card_remove_outline", '\u{f0faf}'), // 󰾯 ("md_credit_card_scan", '\u{f0ff4}'), // 󰿴 ("md_credit_card_scan_outline", '\u{f019d}'), // 󰆝 ("md_credit_card_search", '\u{f1647}'), // 󱙇 ("md_credit_card_search_outline", '\u{f1648}'), // 󱙈 ("md_credit_card_settings", '\u{f0ff5}'), // 󰿵 ("md_credit_card_settings_outline", '\u{f08d7}'), // 󰣗 ("md_credit_card_sync", '\u{f1649}'), // 󱙉 ("md_credit_card_sync_outline", '\u{f164a}'), // 󱙊 ("md_credit_card_wireless", '\u{f0802}'), // 󰠂 ("md_credit_card_wireless_off", '\u{f057a}'), // 󰕺 ("md_credit_card_wireless_off_outline", '\u{f057b}'), // 󰕻 ("md_credit_card_wireless_outline", '\u{f0d6c}'), // 󰵬 ("md_cricket", '\u{f0d6d}'), // 󰵭 ("md_crop", '\u{f019e}'), // 󰆞 ("md_crop_free", '\u{f019f}'), // 󰆟 ("md_crop_landscape", '\u{f01a0}'), // 󰆠 ("md_crop_portrait", '\u{f01a1}'), // 󰆡 ("md_crop_rotate", '\u{f0696}'), // 󰚖 ("md_crop_square", '\u{f01a2}'), // 󰆢 ("md_cross", '\u{f0953}'), // 󰥓 ("md_cross_bolnisi", '\u{f0ced}'), // 󰳭 ("md_cross_celtic", '\u{f0cf5}'), // 󰳵 ("md_cross_outline", '\u{f0cf6}'), // 󰳶 ("md_crosshairs", '\u{f01a3}'), // 󰆣 ("md_crosshairs_gps", '\u{f01a4}'), // 󰆤 ("md_crosshairs_off", '\u{f0f45}'), // 󰽅 ("md_crosshairs_question", '\u{f1136}'), // 󱄶 ("md_crowd", '\u{f1975}'), // 󱥵 ("md_crown", '\u{f01a5}'), // 󰆥 ("md_crown_circle", '\u{f17dc}'), // 󱟜 ("md_crown_circle_outline", '\u{f17dd}'), // 󱟝 ("md_crown_outline", '\u{f11d0}'), // 󱇐 ("md_cryengine", '\u{f0959}'), // 󰥙 ("md_crystal_ball", '\u{f0b2f}'), // 󰬯 ("md_cube", '\u{f01a6}'), // 󰆦 ("md_cube_off", '\u{f141c}'), // 󱐜 ("md_cube_off_outline", '\u{f141d}'), // 󱐝 ("md_cube_outline", '\u{f01a7}'), // 󰆧 ("md_cube_scan", '\u{f0b84}'), // 󰮄 ("md_cube_send", '\u{f01a8}'), // 󰆨 ("md_cube_unfolded", '\u{f01a9}'), // 󰆩 ("md_cup", '\u{f01aa}'), // 󰆪 ("md_cup_off", '\u{f05e5}'), // 󰗥 ("md_cup_off_outline", '\u{f137d}'), // 󱍽 ("md_cup_outline", '\u{f130f}'), // 󱌏 ("md_cup_water", '\u{f01ab}'), // 󰆫 ("md_cupboard", '\u{f0f46}'), // 󰽆 ("md_cupboard_outline", '\u{f0f47}'), // 󰽇 ("md_cupcake", '\u{f095a}'), // 󰥚 ("md_curling", '\u{f0863}'), // 󰡣 ("md_currency_bdt", '\u{f0864}'), // 󰡤 ("md_currency_brl", '\u{f0b85}'), // 󰮅 ("md_currency_btc", '\u{f01ac}'), // 󰆬 ("md_currency_cny", '\u{f07ba}'), // 󰞺 ("md_currency_eth", '\u{f07bb}'), // 󰞻 ("md_currency_eur", '\u{f01ad}'), // 󰆭 ("md_currency_eur_off", '\u{f1315}'), // 󱌕 ("md_currency_fra", '\u{f1a39}'), // 󱨹 ("md_currency_gbp", '\u{f01ae}'), // 󰆮 ("md_currency_ils", '\u{f0c61}'), // 󰱡 ("md_currency_inr", '\u{f01af}'), // 󰆯 ("md_currency_jpy", '\u{f07bc}'), // 󰞼 ("md_currency_krw", '\u{f07bd}'), // 󰞽 ("md_currency_kzt", '\u{f0865}'), // 󰡥 ("md_currency_mnt", '\u{f1512}'), // 󱔒 ("md_currency_ngn", '\u{f01b0}'), // 󰆰 ("md_currency_php", '\u{f09e6}'), // 󰧦 ("md_currency_rial", '\u{f0e9c}'), // 󰺜 ("md_currency_rub", '\u{f01b1}'), // 󰆱 ("md_currency_rupee", '\u{f1976}'), // 󱥶 ("md_currency_sign", '\u{f07be}'), // 󰞾 ("md_currency_try", '\u{f01b2}'), // 󰆲 ("md_currency_twd", '\u{f07bf}'), // 󰞿 ("md_currency_usd", '\u{f01c1}'), // 󰇁 ("md_currency_usd_off", '\u{f067a}'), // 󰙺 ("md_current_ac", '\u{f1480}'), // 󱒀 ("md_current_dc", '\u{f095c}'), // 󰥜 ("md_cursor_default", '\u{f01c0}'), // 󰇀 ("md_cursor_default_click", '\u{f0cfd}'), // 󰳽 ("md_cursor_default_click_outline", '\u{f0cfe}'), // 󰳾 ("md_cursor_default_gesture", '\u{f1127}'), // 󱄧 ("md_cursor_default_gesture_outline", '\u{f1128}'), // 󱄨 ("md_cursor_default_outline", '\u{f01bf}'), // 󰆿 ("md_cursor_move", '\u{f01be}'), // 󰆾 ("md_cursor_pointer", '\u{f01bd}'), // 󰆽 ("md_cursor_text", '\u{f05e7}'), // 󰗧 ("md_curtains", '\u{f1846}'), // 󱡆 ("md_curtains_closed", '\u{f1847}'), // 󱡇 ("md_cylinder", '\u{f194e}'), // 󱥎 ("md_cylinder_off", '\u{f194f}'), // 󱥏 ("md_dance_ballroom", '\u{f15fb}'), // 󱗻 ("md_dance_pole", '\u{f1578}'), // 󱕸 ("md_data_matrix", '\u{f153c}'), // 󱔼 ("md_data_matrix_edit", '\u{f153d}'), // 󱔽 ("md_data_matrix_minus", '\u{f153e}'), // 󱔾 ("md_data_matrix_plus", '\u{f153f}'), // 󱔿 ("md_data_matrix_remove", '\u{f1540}'), // 󱕀 ("md_data_matrix_scan", '\u{f1541}'), // 󱕁 ("md_database", '\u{f01bc}'), // 󰆼 ("md_database_alert", '\u{f163a}'), // 󱘺 ("md_database_alert_outline", '\u{f1624}'), // 󱘤 ("md_database_arrow_down", '\u{f163b}'), // 󱘻 ("md_database_arrow_down_outline", '\u{f1625}'), // 󱘥 ("md_database_arrow_left", '\u{f163c}'), // 󱘼 ("md_database_arrow_left_outline", '\u{f1626}'), // 󱘦 ("md_database_arrow_right", '\u{f163d}'), // 󱘽 ("md_database_arrow_right_outline", '\u{f1627}'), // 󱘧 ("md_database_arrow_up", '\u{f163e}'), // 󱘾 ("md_database_arrow_up_outline", '\u{f1628}'), // 󱘨 ("md_database_check", '\u{f0aa9}'), // 󰪩 ("md_database_check_outline", '\u{f1629}'), // 󱘩 ("md_database_clock", '\u{f163f}'), // 󱘿 ("md_database_clock_outline", '\u{f162a}'), // 󱘪 ("md_database_cog", '\u{f164b}'), // 󱙋 ("md_database_cog_outline", '\u{f164c}'), // 󱙌 ("md_database_edit", '\u{f0b86}'), // 󰮆 ("md_database_edit_outline", '\u{f162b}'), // 󱘫 ("md_database_export", '\u{f095e}'), // 󰥞 ("md_database_export_outline", '\u{f162c}'), // 󱘬 ("md_database_eye", '\u{f191f}'), // 󱤟 ("md_database_eye_off", '\u{f1920}'), // 󱤠 ("md_database_eye_off_outline", '\u{f1921}'), // 󱤡 ("md_database_eye_outline", '\u{f1922}'), // 󱤢 ("md_database_import", '\u{f095d}'), // 󰥝 ("md_database_import_outline", '\u{f162d}'), // 󱘭 ("md_database_lock", '\u{f0aaa}'), // 󰪪 ("md_database_lock_outline", '\u{f162e}'), // 󱘮 ("md_database_marker", '\u{f12f6}'), // 󱋶 ("md_database_marker_outline", '\u{f162f}'), // 󱘯 ("md_database_minus", '\u{f01bb}'), // 󰆻 ("md_database_minus_outline", '\u{f1630}'), // 󱘰 ("md_database_off", '\u{f1640}'), // 󱙀 ("md_database_off_outline", '\u{f1631}'), // 󱘱 ("md_database_outline", '\u{f1632}'), // 󱘲 ("md_database_plus", '\u{f01ba}'), // 󰆺 ("md_database_plus_outline", '\u{f1633}'), // 󱘳 ("md_database_refresh", '\u{f05c2}'), // 󰗂 ("md_database_refresh_outline", '\u{f1634}'), // 󱘴 ("md_database_remove", '\u{f0d00}'), // 󰴀 ("md_database_remove_outline", '\u{f1635}'), // 󱘵 ("md_database_search", '\u{f0866}'), // 󰡦 ("md_database_search_outline", '\u{f1636}'), // 󱘶 ("md_database_settings", '\u{f0d01}'), // 󰴁 ("md_database_settings_outline", '\u{f1637}'), // 󱘷 ("md_database_sync", '\u{f0cff}'), // 󰳿 ("md_database_sync_outline", '\u{f1638}'), // 󱘸 ("md_death_star", '\u{f08d8}'), // 󰣘 ("md_death_star_variant", '\u{f08d9}'), // 󰣙 ("md_deathly_hallows", '\u{f0b87}'), // 󰮇 ("md_debian", '\u{f08da}'), // 󰣚 ("md_debug_step_into", '\u{f01b9}'), // 󰆹 ("md_debug_step_out", '\u{f01b8}'), // 󰆸 ("md_debug_step_over", '\u{f01b7}'), // 󰆷 ("md_decagram", '\u{f076c}'), // 󰝬 ("md_decagram_outline", '\u{f076d}'), // 󰝭 ("md_decimal", '\u{f10a1}'), // 󱂡 ("md_decimal_comma", '\u{f10a2}'), // 󱂢 ("md_decimal_comma_decrease", '\u{f10a3}'), // 󱂣 ("md_decimal_comma_increase", '\u{f10a4}'), // 󱂤 ("md_decimal_decrease", '\u{f01b6}'), // 󰆶 ("md_decimal_increase", '\u{f01b5}'), // 󰆵 ("md_delete", '\u{f01b4}'), // 󰆴 ("md_delete_alert", '\u{f10a5}'), // 󱂥 ("md_delete_alert_outline", '\u{f10a6}'), // 󱂦 ("md_delete_circle", '\u{f0683}'), // 󰚃 ("md_delete_circle_outline", '\u{f0b88}'), // 󰮈 ("md_delete_clock", '\u{f1556}'), // 󱕖 ("md_delete_clock_outline", '\u{f1557}'), // 󱕗 ("md_delete_empty", '\u{f06cc}'), // 󰛌 ("md_delete_empty_outline", '\u{f0e9d}'), // 󰺝 ("md_delete_forever", '\u{f05e8}'), // 󰗨 ("md_delete_forever_outline", '\u{f0b89}'), // 󰮉 ("md_delete_off", '\u{f10a7}'), // 󱂧 ("md_delete_off_outline", '\u{f10a8}'), // 󱂨 ("md_delete_outline", '\u{f09e7}'), // 󰧧 ("md_delete_restore", '\u{f0819}'), // 󰠙 ("md_delete_sweep", '\u{f05e9}'), // 󰗩 ("md_delete_sweep_outline", '\u{f0c62}'), // 󰱢 ("md_delete_variant", '\u{f01b3}'), // 󰆳 ("md_delta", '\u{f01c2}'), // 󰇂 ("md_desk", '\u{f1239}'), // 󱈹 ("md_desk_lamp", '\u{f095f}'), // 󰥟 ("md_deskphone", '\u{f01c3}'), // 󰇃 ("md_desktop_classic", '\u{f07c0}'), // 󰟀 ("md_desktop_mac", '\u{f01c4}'), // 󰇄 ("md_desktop_mac_dashboard", '\u{f09e8}'), // 󰧨 ("md_desktop_tower", '\u{f01c5}'), // 󰇅 ("md_desktop_tower_monitor", '\u{f0aab}'), // 󰪫 ("md_details", '\u{f01c6}'), // 󰇆 ("md_dev_to", '\u{f0d6e}'), // 󰵮 ("md_developer_board", '\u{f0697}'), // 󰚗 ("md_deviantart", '\u{f01c7}'), // 󰇇 ("md_devices", '\u{f0fb0}'), // 󰾰 ("md_dharmachakra", '\u{f094b}'), // 󰥋 ("md_diabetes", '\u{f1126}'), // 󱄦 ("md_dialpad", '\u{f061c}'), // 󰘜 ("md_diameter", '\u{f0c63}'), // 󰱣 ("md_diameter_outline", '\u{f0c64}'), // 󰱤 ("md_diameter_variant", '\u{f0c65}'), // 󰱥 ("md_diamond", '\u{f0b8a}'), // 󰮊 ("md_diamond_outline", '\u{f0b8b}'), // 󰮋 ("md_diamond_stone", '\u{f01c8}'), // 󰇈 ("md_dice_1", '\u{f01ca}'), // 󰇊 ("md_dice_1_outline", '\u{f114a}'), // 󱅊 ("md_dice_2", '\u{f01cb}'), // 󰇋 ("md_dice_2_outline", '\u{f114b}'), // 󱅋 ("md_dice_3", '\u{f01cc}'), // 󰇌 ("md_dice_3_outline", '\u{f114c}'), // 󱅌 ("md_dice_4", '\u{f01cd}'), // 󰇍 ("md_dice_4_outline", '\u{f114d}'), // 󱅍 ("md_dice_5", '\u{f01ce}'), // 󰇎 ("md_dice_5_outline", '\u{f114e}'), // 󱅎 ("md_dice_6", '\u{f01cf}'), // 󰇏 ("md_dice_6_outline", '\u{f114f}'), // 󱅏 ("md_dice_d4", '\u{f1150}'), // 󱅐 ("md_dice_d4_outline", '\u{f05eb}'), // 󰗫 ("md_dice_d6", '\u{f1151}'), // 󱅑 ("md_dice_d6_outline", '\u{f05ed}'), // 󰗭 ("md_dice_d8", '\u{f1152}'), // 󱅒 ("md_dice_d8_outline", '\u{f05ec}'), // 󰗬 ("md_dice_d10", '\u{f1153}'), // 󱅓 ("md_dice_d10_outline", '\u{f076f}'), // 󰝯 ("md_dice_d12", '\u{f1154}'), // 󱅔 ("md_dice_d12_outline", '\u{f0867}'), // 󰡧 ("md_dice_d20", '\u{f1155}'), // 󱅕 ("md_dice_d20_outline", '\u{f05ea}'), // 󰗪 ("md_dice_multiple", '\u{f076e}'), // 󰝮 ("md_dice_multiple_outline", '\u{f1156}'), // 󱅖 ("md_digital_ocean", '\u{f1237}'), // 󱈷 ("md_dip_switch", '\u{f07c1}'), // 󰟁 ("md_directions", '\u{f01d0}'), // 󰇐 ("md_directions_fork", '\u{f0641}'), // 󰙁 ("md_disc", '\u{f05ee}'), // 󰗮 ("md_disc_alert", '\u{f01d1}'), // 󰇑 ("md_disc_player", '\u{f0960}'), // 󰥠 ("md_discord", '\u{f066f}'), // 󰙯 ("md_dishwasher", '\u{f0aac}'), // 󰪬 ("md_dishwasher_alert", '\u{f11b8}'), // 󱆸 ("md_dishwasher_off", '\u{f11b9}'), // 󱆹 ("md_disqus", '\u{f01d2}'), // 󰇒 ("md_distribute_horizontal_center", '\u{f11c9}'), // 󱇉 ("md_distribute_horizontal_left", '\u{f11c8}'), // 󱇈 ("md_distribute_horizontal_right", '\u{f11ca}'), // 󱇊 ("md_distribute_vertical_bottom", '\u{f11cb}'), // 󱇋 ("md_distribute_vertical_center", '\u{f11cc}'), // 󱇌 ("md_distribute_vertical_top", '\u{f11cd}'), // 󱇍 ("md_diversify", '\u{f1877}'), // 󱡷 ("md_diving", '\u{f1977}'), // 󱥷 ("md_diving_flippers", '\u{f0dbf}'), // 󰶿 ("md_diving_helmet", '\u{f0dc0}'), // 󰷀 ("md_diving_scuba", '\u{f0dc1}'), // 󰷁 ("md_diving_scuba_flag", '\u{f0dc2}'), // 󰷂 ("md_diving_scuba_tank", '\u{f0dc3}'), // 󰷃 ("md_diving_scuba_tank_multiple", '\u{f0dc4}'), // 󰷄 ("md_diving_snorkel", '\u{f0dc5}'), // 󰷅 ("md_division", '\u{f01d4}'), // 󰇔 ("md_division_box", '\u{f01d5}'), // 󰇕 ("md_dlna", '\u{f0a41}'), // 󰩁 ("md_dna", '\u{f0684}'), // 󰚄 ("md_dns", '\u{f01d6}'), // 󰇖 ("md_dns_outline", '\u{f0b8c}'), // 󰮌 ("md_dock_bottom", '\u{f10a9}'), // 󱂩 ("md_dock_left", '\u{f10aa}'), // 󱂪 ("md_dock_right", '\u{f10ab}'), // 󱂫 ("md_dock_top", '\u{f1513}'), // 󱔓 ("md_dock_window", '\u{f10ac}'), // 󱂬 ("md_docker", '\u{f0868}'), // 󰡨 ("md_doctor", '\u{f0a42}'), // 󰩂 ("md_dog", '\u{f0a43}'), // 󰩃 ("md_dog_service", '\u{f0aad}'), // 󰪭 ("md_dog_side", '\u{f0a44}'), // 󰩄 ("md_dog_side_off", '\u{f16ee}'), // 󱛮 ("md_dolby", '\u{f06b3}'), // 󰚳 ("md_dolly", '\u{f0e9e}'), // 󰺞 ("md_dolphin", '\u{f18b4}'), // 󱢴 ("md_domain", '\u{f01d7}'), // 󰇗 ("md_domain_off", '\u{f0d6f}'), // 󰵯 ("md_domain_plus", '\u{f10ad}'), // 󱂭 ("md_domain_remove", '\u{f10ae}'), // 󱂮 ("md_dome_light", '\u{f141e}'), // 󱐞 ("md_domino_mask", '\u{f1023}'), // 󱀣 ("md_donkey", '\u{f07c2}'), // 󰟂 ("md_door", '\u{f081a}'), // 󰠚 ("md_door_closed", '\u{f081b}'), // 󰠛 ("md_door_closed_lock", '\u{f10af}'), // 󱂯 ("md_door_open", '\u{f081c}'), // 󰠜 ("md_door_sliding", '\u{f181e}'), // 󱠞 ("md_door_sliding_lock", '\u{f181f}'), // 󱠟 ("md_door_sliding_open", '\u{f1820}'), // 󱠠 ("md_doorbell", '\u{f12e6}'), // 󱋦 ("md_doorbell_video", '\u{f0869}'), // 󰡩 ("md_dot_net", '\u{f0aae}'), // 󰪮 ("md_dots_circle", '\u{f1978}'), // 󱥸 ("md_dots_grid", '\u{f15fc}'), // 󱗼 ("md_dots_hexagon", '\u{f15ff}'), // 󱗿 ("md_dots_horizontal", '\u{f01d8}'), // 󰇘 ("md_dots_horizontal_circle", '\u{f07c3}'), // 󰟃 ("md_dots_horizontal_circle_outline", '\u{f0b8d}'), // 󰮍 ("md_dots_square", '\u{f15fd}'), // 󱗽 ("md_dots_triangle", '\u{f15fe}'), // 󱗾 ("md_dots_vertical", '\u{f01d9}'), // 󰇙 ("md_dots_vertical_circle", '\u{f07c4}'), // 󰟄 ("md_dots_vertical_circle_outline", '\u{f0b8e}'), // 󰮎 ("md_download", '\u{f01da}'), // 󰇚 ("md_download_box", '\u{f1462}'), // 󱑢 ("md_download_box_outline", '\u{f1463}'), // 󱑣 ("md_download_circle", '\u{f1464}'), // 󱑤 ("md_download_circle_outline", '\u{f1465}'), // 󱑥 ("md_download_lock", '\u{f1320}'), // 󱌠 ("md_download_lock_outline", '\u{f1321}'), // 󱌡 ("md_download_multiple", '\u{f09e9}'), // 󰧩 ("md_download_network", '\u{f06f4}'), // 󰛴 ("md_download_network_outline", '\u{f0c66}'), // 󰱦 ("md_download_off", '\u{f10b0}'), // 󱂰 ("md_download_off_outline", '\u{f10b1}'), // 󱂱 ("md_download_outline", '\u{f0b8f}'), // 󰮏 ("md_drag", '\u{f01db}'), // 󰇛 ("md_drag_horizontal", '\u{f01dc}'), // 󰇜 ("md_drag_horizontal_variant", '\u{f12f0}'), // 󱋰 ("md_drag_variant", '\u{f0b90}'), // 󰮐 ("md_drag_vertical", '\u{f01dd}'), // 󰇝 ("md_drag_vertical_variant", '\u{f12f1}'), // 󱋱 ("md_drama_masks", '\u{f0d02}'), // 󰴂 ("md_draw", '\u{f0f49}'), // 󰽉 ("md_draw_pen", '\u{f19b9}'), // 󱦹 ("md_drawing", '\u{f01de}'), // 󰇞 ("md_drawing_box", '\u{f01df}'), // 󰇟 ("md_dresser", '\u{f0f4a}'), // 󰽊 ("md_dresser_outline", '\u{f0f4b}'), // 󰽋 ("md_drone", '\u{f01e2}'), // 󰇢 ("md_dropbox", '\u{f01e3}'), // 󰇣 ("md_drupal", '\u{f01e4}'), // 󰇤 ("md_duck", '\u{f01e5}'), // 󰇥 ("md_dumbbell", '\u{f01e6}'), // 󰇦 ("md_dump_truck", '\u{f0c67}'), // 󰱧 ("md_ear_hearing", '\u{f07c5}'), // 󰟅 ("md_ear_hearing_loop", '\u{f1aee}'), // 󱫮 ("md_ear_hearing_off", '\u{f0a45}'), // 󰩅 ("md_earbuds", '\u{f184f}'), // 󱡏 ("md_earbuds_off", '\u{f1850}'), // 󱡐 ("md_earbuds_off_outline", '\u{f1851}'), // 󱡑 ("md_earbuds_outline", '\u{f1852}'), // 󱡒 ("md_earth", '\u{f01e7}'), // 󰇧 ("md_earth_arrow_right", '\u{f1311}'), // 󱌑 ("md_earth_box", '\u{f06cd}'), // 󰛍 ("md_earth_box_minus", '\u{f1407}'), // 󱐇 ("md_earth_box_off", '\u{f06ce}'), // 󰛎 ("md_earth_box_plus", '\u{f1406}'), // 󱐆 ("md_earth_box_remove", '\u{f1408}'), // 󱐈 ("md_earth_minus", '\u{f1404}'), // 󱐄 ("md_earth_off", '\u{f01e8}'), // 󰇨 ("md_earth_plus", '\u{f1403}'), // 󱐃 ("md_earth_remove", '\u{f1405}'), // 󱐅 ("md_egg", '\u{f0aaf}'), // 󰪯 ("md_egg_easter", '\u{f0ab0}'), // 󰪰 ("md_egg_fried", '\u{f184a}'), // 󱡊 ("md_egg_off", '\u{f13f0}'), // 󱏰 ("md_egg_off_outline", '\u{f13f1}'), // 󱏱 ("md_egg_outline", '\u{f13f2}'), // 󱏲 ("md_eiffel_tower", '\u{f156b}'), // 󱕫 ("md_eight_track", '\u{f09ea}'), // 󰧪 ("md_eject", '\u{f01ea}'), // 󰇪 ("md_eject_outline", '\u{f0b91}'), // 󰮑 ("md_electric_switch", '\u{f0e9f}'), // 󰺟 ("md_electric_switch_closed", '\u{f10d9}'), // 󱃙 ("md_electron_framework", '\u{f1024}'), // 󱀤 ("md_elephant", '\u{f07c6}'), // 󰟆 ("md_elevation_decline", '\u{f01eb}'), // 󰇫 ("md_elevation_rise", '\u{f01ec}'), // 󰇬 ("md_elevator", '\u{f01ed}'), // 󰇭 ("md_elevator_down", '\u{f12c2}'), // 󱋂 ("md_elevator_passenger", '\u{f1381}'), // 󱎁 ("md_elevator_passenger_off", '\u{f1979}'), // 󱥹 ("md_elevator_passenger_off_outline", '\u{f197a}'), // 󱥺 ("md_elevator_passenger_outline", '\u{f197b}'), // 󱥻 ("md_elevator_up", '\u{f12c1}'), // 󱋁 ("md_ellipse", '\u{f0ea0}'), // 󰺠 ("md_ellipse_outline", '\u{f0ea1}'), // 󰺡 ("md_email", '\u{f01ee}'), // 󰇮 ("md_email_alert", '\u{f06cf}'), // 󰛏 ("md_email_alert_outline", '\u{f0d42}'), // 󰵂 ("md_email_box", '\u{f0d03}'), // 󰴃 ("md_email_check", '\u{f0ab1}'), // 󰪱 ("md_email_check_outline", '\u{f0ab2}'), // 󰪲 ("md_email_edit", '\u{f0ee3}'), // 󰻣 ("md_email_edit_outline", '\u{f0ee4}'), // 󰻤 ("md_email_fast", '\u{f186f}'), // 󱡯 ("md_email_fast_outline", '\u{f1870}'), // 󱡰 ("md_email_lock", '\u{f01f1}'), // 󰇱 ("md_email_mark_as_unread", '\u{f0b92}'), // 󰮒 ("md_email_minus", '\u{f0ee5}'), // 󰻥 ("md_email_minus_outline", '\u{f0ee6}'), // 󰻦 ("md_email_multiple", '\u{f0ee7}'), // 󰻧 ("md_email_multiple_outline", '\u{f0ee8}'), // 󰻨 ("md_email_newsletter", '\u{f0fb1}'), // 󰾱 ("md_email_off", '\u{f13e3}'), // 󱏣 ("md_email_off_outline", '\u{f13e4}'), // 󱏤 ("md_email_open", '\u{f01ef}'), // 󰇯 ("md_email_open_multiple", '\u{f0ee9}'), // 󰻩 ("md_email_open_multiple_outline", '\u{f0eea}'), // 󰻪 ("md_email_open_outline", '\u{f05ef}'), // 󰗯 ("md_email_outline", '\u{f01f0}'), // 󰇰 ("md_email_plus", '\u{f09eb}'), // 󰧫 ("md_email_plus_outline", '\u{f09ec}'), // 󰧬 ("md_email_receive", '\u{f10da}'), // 󱃚 ("md_email_receive_outline", '\u{f10db}'), // 󱃛 ("md_email_remove", '\u{f1661}'), // 󱙡 ("md_email_remove_outline", '\u{f1662}'), // 󱙢 ("md_email_seal", '\u{f195b}'), // 󱥛 ("md_email_seal_outline", '\u{f195c}'), // 󱥜 ("md_email_search", '\u{f0961}'), // 󰥡 ("md_email_search_outline", '\u{f0962}'), // 󰥢 ("md_email_send", '\u{f10dc}'), // 󱃜 ("md_email_send_outline", '\u{f10dd}'), // 󱃝 ("md_email_sync", '\u{f12c7}'), // 󱋇 ("md_email_sync_outline", '\u{f12c8}'), // 󱋈 ("md_email_variant", '\u{f05f0}'), // 󰗰 ("md_ember", '\u{f0b30}'), // 󰬰 ("md_emby", '\u{f06b4}'), // 󰚴 ("md_emoticon", '\u{f0c68}'), // 󰱨 ("md_emoticon_angry", '\u{f0c69}'), // 󰱩 ("md_emoticon_angry_outline", '\u{f0c6a}'), // 󰱪 ("md_emoticon_confused", '\u{f10de}'), // 󱃞 ("md_emoticon_confused_outline", '\u{f10df}'), // 󱃟 ("md_emoticon_cool", '\u{f0c6b}'), // 󰱫 ("md_emoticon_cool_outline", '\u{f01f3}'), // 󰇳 ("md_emoticon_cry", '\u{f0c6c}'), // 󰱬 ("md_emoticon_cry_outline", '\u{f0c6d}'), // 󰱭 ("md_emoticon_dead", '\u{f0c6e}'), // 󰱮 ("md_emoticon_dead_outline", '\u{f069b}'), // 󰚛 ("md_emoticon_devil", '\u{f0c6f}'), // 󰱯 ("md_emoticon_devil_outline", '\u{f01f4}'), // 󰇴 ("md_emoticon_excited", '\u{f0c70}'), // 󰱰 ("md_emoticon_excited_outline", '\u{f069c}'), // 󰚜 ("md_emoticon_frown", '\u{f0f4c}'), // 󰽌 ("md_emoticon_frown_outline", '\u{f0f4d}'), // 󰽍 ("md_emoticon_happy", '\u{f0c71}'), // 󰱱 ("md_emoticon_happy_outline", '\u{f01f5}'), // 󰇵 ("md_emoticon_kiss", '\u{f0c72}'), // 󰱲 ("md_emoticon_kiss_outline", '\u{f0c73}'), // 󰱳 ("md_emoticon_lol", '\u{f1214}'), // 󱈔 ("md_emoticon_lol_outline", '\u{f1215}'), // 󱈕 ("md_emoticon_neutral", '\u{f0c74}'), // 󰱴 ("md_emoticon_neutral_outline", '\u{f01f6}'), // 󰇶 ("md_emoticon_outline", '\u{f01f2}'), // 󰇲 ("md_emoticon_poop", '\u{f01f7}'), // 󰇷 ("md_emoticon_poop_outline", '\u{f0c75}'), // 󰱵 ("md_emoticon_sad", '\u{f0c76}'), // 󰱶 ("md_emoticon_sad_outline", '\u{f01f8}'), // 󰇸 ("md_emoticon_sick", '\u{f157c}'), // 󱕼 ("md_emoticon_sick_outline", '\u{f157d}'), // 󱕽 ("md_emoticon_tongue", '\u{f01f9}'), // 󰇹 ("md_emoticon_tongue_outline", '\u{f0c77}'), // 󰱷 ("md_emoticon_wink", '\u{f0c78}'), // 󰱸 ("md_emoticon_wink_outline", '\u{f0c79}'), // 󰱹 ("md_engine", '\u{f01fa}'), // 󰇺 ("md_engine_off", '\u{f0a46}'), // 󰩆 ("md_engine_off_outline", '\u{f0a47}'), // 󰩇 ("md_engine_outline", '\u{f01fb}'), // 󰇻 ("md_epsilon", '\u{f10e0}'), // 󱃠 ("md_equal", '\u{f01fc}'), // 󰇼 ("md_equal_box", '\u{f01fd}'), // 󰇽 ("md_equalizer", '\u{f0ea2}'), // 󰺢 ("md_equalizer_outline", '\u{f0ea3}'), // 󰺣 ("md_eraser", '\u{f01fe}'), // 󰇾 ("md_eraser_variant", '\u{f0642}'), // 󰙂 ("md_escalator", '\u{f01ff}'), // 󰇿 ("md_escalator_box", '\u{f1399}'), // 󱎙 ("md_escalator_down", '\u{f12c0}'), // 󱋀 ("md_escalator_up", '\u{f12bf}'), // 󱊿 ("md_eslint", '\u{f0c7a}'), // 󰱺 ("md_et", '\u{f0ab3}'), // 󰪳 ("md_ethereum", '\u{f086a}'), // 󰡪 ("md_ethernet", '\u{f0200}'), // 󰈀 ("md_ethernet_cable", '\u{f0201}'), // 󰈁 ("md_ethernet_cable_off", '\u{f0202}'), // 󰈂 ("md_ev_plug_ccs1", '\u{f1519}'), // 󱔙 ("md_ev_plug_ccs2", '\u{f151a}'), // 󱔚 ("md_ev_plug_chademo", '\u{f151b}'), // 󱔛 ("md_ev_plug_tesla", '\u{f151c}'), // 󱔜 ("md_ev_plug_type1", '\u{f151d}'), // 󱔝 ("md_ev_plug_type2", '\u{f151e}'), // 󱔞 ("md_ev_station", '\u{f05f1}'), // 󰗱 ("md_evernote", '\u{f0204}'), // 󰈄 ("md_excavator", '\u{f1025}'), // 󱀥 ("md_exclamation", '\u{f0205}'), // 󰈅 ("md_exclamation_thick", '\u{f1238}'), // 󱈸 ("md_exit_run", '\u{f0a48}'), // 󰩈 ("md_exit_to_app", '\u{f0206}'), // 󰈆 ("md_expand_all", '\u{f0ab4}'), // 󰪴 ("md_expand_all_outline", '\u{f0ab5}'), // 󰪵 ("md_expansion_card", '\u{f08ae}'), // 󰢮 ("md_expansion_card_variant", '\u{f0fb2}'), // 󰾲 ("md_exponent", '\u{f0963}'), // 󰥣 ("md_exponent_box", '\u{f0964}'), // 󰥤 ("md_export", '\u{f0207}'), // 󰈇 ("md_export_variant", '\u{f0b93}'), // 󰮓 ("md_eye", '\u{f0208}'), // 󰈈 ("md_eye_arrow_left", '\u{f18fd}'), // 󱣽 ("md_eye_arrow_left_outline", '\u{f18fe}'), // 󱣾 ("md_eye_arrow_right", '\u{f18ff}'), // 󱣿 ("md_eye_arrow_right_outline", '\u{f1900}'), // 󱤀 ("md_eye_check", '\u{f0d04}'), // 󰴄 ("md_eye_check_outline", '\u{f0d05}'), // 󰴅 ("md_eye_circle", '\u{f0b94}'), // 󰮔 ("md_eye_circle_outline", '\u{f0b95}'), // 󰮕 ("md_eye_minus", '\u{f1026}'), // 󱀦 ("md_eye_minus_outline", '\u{f1027}'), // 󱀧 ("md_eye_off", '\u{f0209}'), // 󰈉 ("md_eye_off_outline", '\u{f06d1}'), // 󰛑 ("md_eye_outline", '\u{f06d0}'), // 󰛐 ("md_eye_plus", '\u{f086b}'), // 󰡫 ("md_eye_plus_outline", '\u{f086c}'), // 󰡬 ("md_eye_refresh", '\u{f197c}'), // 󱥼 ("md_eye_refresh_outline", '\u{f197d}'), // 󱥽 ("md_eye_remove", '\u{f15e3}'), // 󱗣 ("md_eye_remove_outline", '\u{f15e4}'), // 󱗤 ("md_eye_settings", '\u{f086d}'), // 󰡭 ("md_eye_settings_outline", '\u{f086e}'), // 󰡮 ("md_eyedropper", '\u{f020a}'), // 󰈊 ("md_eyedropper_minus", '\u{f13dd}'), // 󱏝 ("md_eyedropper_off", '\u{f13df}'), // 󱏟 ("md_eyedropper_plus", '\u{f13dc}'), // 󱏜 ("md_eyedropper_remove", '\u{f13de}'), // 󱏞 ("md_eyedropper_variant", '\u{f020b}'), // 󰈋 ("md_face_agent", '\u{f0d70}'), // 󰵰 ("md_face_man", '\u{f0643}'), // 󰙃 ("md_face_man_outline", '\u{f0b96}'), // 󰮖 ("md_face_man_profile", '\u{f0644}'), // 󰙄 ("md_face_man_shimmer", '\u{f15cc}'), // 󱗌 ("md_face_man_shimmer_outline", '\u{f15cd}'), // 󱗍 ("md_face_mask", '\u{f1586}'), // 󱖆 ("md_face_mask_outline", '\u{f1587}'), // 󱖇 ("md_face_recognition", '\u{f0c7b}'), // 󰱻 ("md_face_woman", '\u{f1077}'), // 󱁷 ("md_face_woman_outline", '\u{f1078}'), // 󱁸 ("md_face_woman_profile", '\u{f1076}'), // 󱁶 ("md_face_woman_shimmer", '\u{f15ce}'), // 󱗎 ("md_face_woman_shimmer_outline", '\u{f15cf}'), // 󱗏 ("md_facebook", '\u{f020c}'), // 󰈌 ("md_facebook_gaming", '\u{f07dd}'), // 󰟝 ("md_facebook_messenger", '\u{f020e}'), // 󰈎 ("md_facebook_workplace", '\u{f0b31}'), // 󰬱 ("md_factory", '\u{f020f}'), // 󰈏 ("md_family_tree", '\u{f160e}'), // 󱘎 ("md_fan", '\u{f0210}'), // 󰈐 ("md_fan_alert", '\u{f146c}'), // 󱑬 ("md_fan_auto", '\u{f171d}'), // 󱜝 ("md_fan_chevron_down", '\u{f146d}'), // 󱑭 ("md_fan_chevron_up", '\u{f146e}'), // 󱑮 ("md_fan_clock", '\u{f1a3a}'), // 󱨺 ("md_fan_minus", '\u{f1470}'), // 󱑰 ("md_fan_off", '\u{f081d}'), // 󰠝 ("md_fan_plus", '\u{f146f}'), // 󱑯 ("md_fan_remove", '\u{f1471}'), // 󱑱 ("md_fan_speed_1", '\u{f1472}'), // 󱑲 ("md_fan_speed_2", '\u{f1473}'), // 󱑳 ("md_fan_speed_3", '\u{f1474}'), // 󱑴 ("md_fast_forward", '\u{f0211}'), // 󰈑 ("md_fast_forward_5", '\u{f11f8}'), // 󱇸 ("md_fast_forward_10", '\u{f0d71}'), // 󰵱 ("md_fast_forward_15", '\u{f193a}'), // 󱤺 ("md_fast_forward_30", '\u{f0d06}'), // 󰴆 ("md_fast_forward_60", '\u{f160b}'), // 󱘋 ("md_fast_forward_outline", '\u{f06d2}'), // 󰛒 ("md_fax", '\u{f0212}'), // 󰈒 ("md_feather", '\u{f06d3}'), // 󰛓 ("md_feature_search", '\u{f0a49}'), // 󰩉 ("md_feature_search_outline", '\u{f0a4a}'), // 󰩊 ("md_fedora", '\u{f08db}'), // 󰣛 ("md_fence", '\u{f179a}'), // 󱞚 ("md_fence_electric", '\u{f17f6}'), // 󱟶 ("md_fencing", '\u{f14c1}'), // 󱓁 ("md_ferris_wheel", '\u{f0ea4}'), // 󰺤 ("md_ferry", '\u{f0213}'), // 󰈓 ("md_file", '\u{f0214}'), // 󰈔 ("md_file_account", '\u{f073b}'), // 󰜻 ("md_file_account_outline", '\u{f1028}'), // 󱀨 ("md_file_alert", '\u{f0a4b}'), // 󰩋 ("md_file_alert_outline", '\u{f0a4c}'), // 󰩌 ("md_file_arrow_left_right", '\u{f1a93}'), // 󱪓 ("md_file_arrow_left_right_outline", '\u{f1a94}'), // 󱪔 ("md_file_arrow_up_down", '\u{f1a95}'), // 󱪕 ("md_file_arrow_up_down_outline", '\u{f1a96}'), // 󱪖 ("md_file_cabinet", '\u{f0ab6}'), // 󰪶 ("md_file_cad", '\u{f0eeb}'), // 󰻫 ("md_file_cad_box", '\u{f0eec}'), // 󰻬 ("md_file_cancel", '\u{f0dc6}'), // 󰷆 ("md_file_cancel_outline", '\u{f0dc7}'), // 󰷇 ("md_file_certificate", '\u{f1186}'), // 󱆆 ("md_file_certificate_outline", '\u{f1187}'), // 󱆇 ("md_file_chart", '\u{f0215}'), // 󰈕 ("md_file_chart_check", '\u{f19c6}'), // 󱧆 ("md_file_chart_check_outline", '\u{f19c7}'), // 󱧇 ("md_file_chart_outline", '\u{f1029}'), // 󱀩 ("md_file_check", '\u{f0216}'), // 󰈖 ("md_file_check_outline", '\u{f0e29}'), // 󰸩 ("md_file_clock", '\u{f12e1}'), // 󱋡 ("md_file_clock_outline", '\u{f12e2}'), // 󱋢 ("md_file_cloud", '\u{f0217}'), // 󰈗 ("md_file_cloud_outline", '\u{f102a}'), // 󱀪 ("md_file_code", '\u{f022e}'), // 󰈮 ("md_file_code_outline", '\u{f102b}'), // 󱀫 ("md_file_cog", '\u{f107b}'), // 󱁻 ("md_file_cog_outline", '\u{f107c}'), // 󱁼 ("md_file_compare", '\u{f08aa}'), // 󰢪 ("md_file_delimited", '\u{f0218}'), // 󰈘 ("md_file_delimited_outline", '\u{f0ea5}'), // 󰺥 ("md_file_document", '\u{f0219}'), // 󰈙 ("md_file_document_alert", '\u{f1a97}'), // 󱪗 ("md_file_document_alert_outline", '\u{f1a98}'), // 󱪘 ("md_file_document_check", '\u{f1a99}'), // 󱪙 ("md_file_document_check_outline", '\u{f1a9a}'), // 󱪚 ("md_file_document_edit", '\u{f0dc8}'), // 󰷈 ("md_file_document_edit_outline", '\u{f0dc9}'), // 󰷉 ("md_file_document_minus", '\u{f1a9b}'), // 󱪛 ("md_file_document_minus_outline", '\u{f1a9c}'), // 󱪜 ("md_file_document_multiple", '\u{f1517}'), // 󱔗 ("md_file_document_multiple_outline", '\u{f1518}'), // 󱔘 ("md_file_document_outline", '\u{f09ee}'), // 󰧮 ("md_file_document_plus", '\u{f1a9d}'), // 󱪝 ("md_file_document_plus_outline", '\u{f1a9e}'), // 󱪞 ("md_file_document_remove", '\u{f1a9f}'), // 󱪟 ("md_file_document_remove_outline", '\u{f1aa0}'), // 󱪠 ("md_file_download", '\u{f0965}'), // 󰥥 ("md_file_download_outline", '\u{f0966}'), // 󰥦 ("md_file_edit", '\u{f11e7}'), // 󱇧 ("md_file_edit_outline", '\u{f11e8}'), // 󱇨 ("md_file_excel", '\u{f021b}'), // 󰈛 ("md_file_excel_box", '\u{f021c}'), // 󰈜 ("md_file_excel_box_outline", '\u{f102c}'), // 󱀬 ("md_file_excel_outline", '\u{f102d}'), // 󱀭 ("md_file_export", '\u{f021d}'), // 󰈝 ("md_file_export_outline", '\u{f102e}'), // 󱀮 ("md_file_eye", '\u{f0dca}'), // 󰷊 ("md_file_eye_outline", '\u{f0dcb}'), // 󰷋 ("md_file_find", '\u{f021e}'), // 󰈞 ("md_file_find_outline", '\u{f0b97}'), // 󰮗 ("md_file_gif_box", '\u{f0d78}'), // 󰵸 ("md_file_hidden", '\u{f0613}'), // 󰘓 ("md_file_image", '\u{f021f}'), // 󰈟 ("md_file_image_marker", '\u{f1772}'), // 󱝲 ("md_file_image_marker_outline", '\u{f1773}'), // 󱝳 ("md_file_image_minus", '\u{f193b}'), // 󱤻 ("md_file_image_minus_outline", '\u{f193c}'), // 󱤼 ("md_file_image_outline", '\u{f0eb0}'), // 󰺰 ("md_file_image_plus", '\u{f193d}'), // 󱤽 ("md_file_image_plus_outline", '\u{f193e}'), // 󱤾 ("md_file_image_remove", '\u{f193f}'), // 󱤿 ("md_file_image_remove_outline", '\u{f1940}'), // 󱥀 ("md_file_import", '\u{f0220}'), // 󰈠 ("md_file_import_outline", '\u{f102f}'), // 󱀯 ("md_file_jpg_box", '\u{f0225}'), // 󰈥 ("md_file_key", '\u{f1184}'), // 󱆄 ("md_file_key_outline", '\u{f1185}'), // 󱆅 ("md_file_link", '\u{f1177}'), // 󱅷 ("md_file_link_outline", '\u{f1178}'), // 󱅸 ("md_file_lock", '\u{f0221}'), // 󰈡 ("md_file_lock_open", '\u{f19c8}'), // 󱧈 ("md_file_lock_open_outline", '\u{f19c9}'), // 󱧉 ("md_file_lock_outline", '\u{f1030}'), // 󱀰 ("md_file_marker", '\u{f1774}'), // 󱝴 ("md_file_marker_outline", '\u{f1775}'), // 󱝵 ("md_file_minus", '\u{f1aa1}'), // 󱪡 ("md_file_minus_outline", '\u{f1aa2}'), // 󱪢 ("md_file_move", '\u{f0ab9}'), // 󰪹 ("md_file_move_outline", '\u{f1031}'), // 󱀱 ("md_file_multiple", '\u{f0222}'), // 󰈢 ("md_file_multiple_outline", '\u{f1032}'), // 󱀲 ("md_file_music", '\u{f0223}'), // 󰈣 ("md_file_music_outline", '\u{f0e2a}'), // 󰸪 ("md_file_outline", '\u{f0224}'), // 󰈤 ("md_file_pdf_box", '\u{f0226}'), // 󰈦 ("md_file_percent", '\u{f081e}'), // 󰠞 ("md_file_percent_outline", '\u{f1033}'), // 󱀳 ("md_file_phone", '\u{f1179}'), // 󱅹 ("md_file_phone_outline", '\u{f117a}'), // 󱅺 ("md_file_plus", '\u{f0752}'), // 󰝒 ("md_file_plus_outline", '\u{f0eed}'), // 󰻭 ("md_file_png_box", '\u{f0e2d}'), // 󰸭 ("md_file_powerpoint", '\u{f0227}'), // 󰈧 ("md_file_powerpoint_box", '\u{f0228}'), // 󰈨 ("md_file_powerpoint_box_outline", '\u{f1034}'), // 󱀴 ("md_file_powerpoint_outline", '\u{f1035}'), // 󱀵 ("md_file_presentation_box", '\u{f0229}'), // 󰈩 ("md_file_question", '\u{f086f}'), // 󰡯 ("md_file_question_outline", '\u{f1036}'), // 󱀶 ("md_file_refresh", '\u{f0918}'), // 󰤘 ("md_file_refresh_outline", '\u{f0541}'), // 󰕁 ("md_file_remove", '\u{f0b98}'), // 󰮘 ("md_file_remove_outline", '\u{f1037}'), // 󱀷 ("md_file_replace", '\u{f0b32}'), // 󰬲 ("md_file_replace_outline", '\u{f0b33}'), // 󰬳 ("md_file_restore", '\u{f0670}'), // 󰙰 ("md_file_restore_outline", '\u{f1038}'), // 󱀸 ("md_file_rotate_left", '\u{f1a3b}'), // 󱨻 ("md_file_rotate_left_outline", '\u{f1a3c}'), // 󱨼 ("md_file_rotate_right", '\u{f1a3d}'), // 󱨽 ("md_file_rotate_right_outline", '\u{f1a3e}'), // 󱨾 ("md_file_search", '\u{f0c7c}'), // 󰱼 ("md_file_search_outline", '\u{f0c7d}'), // 󰱽 ("md_file_send", '\u{f022a}'), // 󰈪 ("md_file_send_outline", '\u{f1039}'), // 󱀹 ("md_file_settings", '\u{f1079}'), // 󱁹 ("md_file_settings_outline", '\u{f107a}'), // 󱁺 ("md_file_sign", '\u{f19c3}'), // 󱧃 ("md_file_star", '\u{f103a}'), // 󱀺 ("md_file_star_outline", '\u{f103b}'), // 󱀻 ("md_file_swap", '\u{f0fb4}'), // 󰾴 ("md_file_swap_outline", '\u{f0fb5}'), // 󰾵 ("md_file_sync", '\u{f1216}'), // 󱈖 ("md_file_sync_outline", '\u{f1217}'), // 󱈗 ("md_file_table", '\u{f0c7e}'), // 󰱾 ("md_file_table_box", '\u{f10e1}'), // 󱃡 ("md_file_table_box_multiple", '\u{f10e2}'), // 󱃢 ("md_file_table_box_multiple_outline", '\u{f10e3}'), // 󱃣 ("md_file_table_box_outline", '\u{f10e4}'), // 󱃤 ("md_file_table_outline", '\u{f0c7f}'), // 󰱿 ("md_file_tree", '\u{f0645}'), // 󰙅 ("md_file_tree_outline", '\u{f13d2}'), // 󱏒 ("md_file_undo", '\u{f08dc}'), // 󰣜 ("md_file_undo_outline", '\u{f103c}'), // 󱀼 ("md_file_upload", '\u{f0a4d}'), // 󰩍 ("md_file_upload_outline", '\u{f0a4e}'), // 󰩎 ("md_file_video", '\u{f022b}'), // 󰈫 ("md_file_video_outline", '\u{f0e2c}'), // 󰸬 ("md_file_word", '\u{f022c}'), // 󰈬 ("md_file_word_box", '\u{f022d}'), // 󰈭 ("md_file_word_box_outline", '\u{f103d}'), // 󱀽 ("md_file_word_outline", '\u{f103e}'), // 󱀾 ("md_film", '\u{f022f}'), // 󰈯 ("md_filmstrip", '\u{f0230}'), // 󰈰 ("md_filmstrip_box", '\u{f0332}'), // 󰌲 ("md_filmstrip_box_multiple", '\u{f0d18}'), // 󰴘 ("md_filmstrip_off", '\u{f0231}'), // 󰈱 ("md_filter", '\u{f0232}'), // 󰈲 ("md_filter_check", '\u{f18ec}'), // 󱣬 ("md_filter_check_outline", '\u{f18ed}'), // 󱣭 ("md_filter_cog", '\u{f1aa3}'), // 󱪣 ("md_filter_cog_outline", '\u{f1aa4}'), // 󱪤 ("md_filter_menu", '\u{f10e5}'), // 󱃥 ("md_filter_menu_outline", '\u{f10e6}'), // 󱃦 ("md_filter_minus", '\u{f0eee}'), // 󰻮 ("md_filter_minus_outline", '\u{f0eef}'), // 󰻯 ("md_filter_multiple", '\u{f1a3f}'), // 󱨿 ("md_filter_multiple_outline", '\u{f1a40}'), // 󱩀 ("md_filter_off", '\u{f14ef}'), // 󱓯 ("md_filter_off_outline", '\u{f14f0}'), // 󱓰 ("md_filter_outline", '\u{f0233}'), // 󰈳 ("md_filter_plus", '\u{f0ef0}'), // 󰻰 ("md_filter_plus_outline", '\u{f0ef1}'), // 󰻱 ("md_filter_remove", '\u{f0234}'), // 󰈴 ("md_filter_remove_outline", '\u{f0235}'), // 󰈵 ("md_filter_settings", '\u{f1aa5}'), // 󱪥 ("md_filter_settings_outline", '\u{f1aa6}'), // 󱪦 ("md_filter_variant", '\u{f0236}'), // 󰈶 ("md_filter_variant_minus", '\u{f1112}'), // 󱄒 ("md_filter_variant_plus", '\u{f1113}'), // 󱄓 ("md_filter_variant_remove", '\u{f103f}'), // 󱀿 ("md_finance", '\u{f081f}'), // 󰠟 ("md_find_replace", '\u{f06d4}'), // 󰛔 ("md_fingerprint", '\u{f0237}'), // 󰈷 ("md_fingerprint_off", '\u{f0eb1}'), // 󰺱 ("md_fire", '\u{f0238}'), // 󰈸 ("md_fire_alert", '\u{f15d7}'), // 󱗗 ("md_fire_circle", '\u{f1807}'), // 󱠇 ("md_fire_extinguisher", '\u{f0ef2}'), // 󰻲 ("md_fire_hydrant", '\u{f1137}'), // 󱄷 ("md_fire_hydrant_alert", '\u{f1138}'), // 󱄸 ("md_fire_hydrant_off", '\u{f1139}'), // 󱄹 ("md_fire_off", '\u{f1722}'), // 󱜢 ("md_fire_truck", '\u{f08ab}'), // 󰢫 ("md_firebase", '\u{f0967}'), // 󰥧 ("md_firefox", '\u{f0239}'), // 󰈹 ("md_fireplace", '\u{f0e2e}'), // 󰸮 ("md_fireplace_off", '\u{f0e2f}'), // 󰸯 ("md_firewire", '\u{f05be}'), // 󰖾 ("md_firework", '\u{f0e30}'), // 󰸰 ("md_firework_off", '\u{f1723}'), // 󱜣 ("md_fish", '\u{f023a}'), // 󰈺 ("md_fish_off", '\u{f13f3}'), // 󱏳 ("md_fishbowl", '\u{f0ef3}'), // 󰻳 ("md_fishbowl_outline", '\u{f0ef4}'), // 󰻴 ("md_fit_to_page", '\u{f0ef5}'), // 󰻵 ("md_fit_to_page_outline", '\u{f0ef6}'), // 󰻶 ("md_fit_to_screen", '\u{f18f4}'), // 󱣴 ("md_fit_to_screen_outline", '\u{f18f5}'), // 󱣵 ("md_flag", '\u{f023b}'), // 󰈻 ("md_flag_checkered", '\u{f023c}'), // 󰈼 ("md_flag_minus", '\u{f0b99}'), // 󰮙 ("md_flag_minus_outline", '\u{f10b2}'), // 󱂲 ("md_flag_off", '\u{f18ee}'), // 󱣮 ("md_flag_off_outline", '\u{f18ef}'), // 󱣯 ("md_flag_outline", '\u{f023d}'), // 󰈽 ("md_flag_plus", '\u{f0b9a}'), // 󰮚 ("md_flag_plus_outline", '\u{f10b3}'), // 󱂳 ("md_flag_remove", '\u{f0b9b}'), // 󰮛 ("md_flag_remove_outline", '\u{f10b4}'), // 󱂴 ("md_flag_triangle", '\u{f023f}'), // 󰈿 ("md_flag_variant", '\u{f0240}'), // 󰉀 ("md_flag_variant_outline", '\u{f023e}'), // 󰈾 ("md_flare", '\u{f0d72}'), // 󰵲 ("md_flash", '\u{f0241}'), // 󰉁 ("md_flash_alert", '\u{f0ef7}'), // 󰻷 ("md_flash_alert_outline", '\u{f0ef8}'), // 󰻸 ("md_flash_auto", '\u{f0242}'), // 󰉂 ("md_flash_off", '\u{f0243}'), // 󰉃 ("md_flash_outline", '\u{f06d5}'), // 󰛕 ("md_flash_red_eye", '\u{f067b}'), // 󰙻 ("md_flashlight", '\u{f0244}'), // 󰉄 ("md_flashlight_off", '\u{f0245}'), // 󰉅 ("md_flask", '\u{f0093}'), // 󰂓 ("md_flask_empty", '\u{f0094}'), // 󰂔 ("md_flask_empty_minus", '\u{f123a}'), // 󱈺 ("md_flask_empty_minus_outline", '\u{f123b}'), // 󱈻 ("md_flask_empty_off", '\u{f13f4}'), // 󱏴 ("md_flask_empty_off_outline", '\u{f13f5}'), // 󱏵 ("md_flask_empty_outline", '\u{f0095}'), // 󰂕 ("md_flask_empty_plus", '\u{f123c}'), // 󱈼 ("md_flask_empty_plus_outline", '\u{f123d}'), // 󱈽 ("md_flask_empty_remove", '\u{f123e}'), // 󱈾 ("md_flask_empty_remove_outline", '\u{f123f}'), // 󱈿 ("md_flask_minus", '\u{f1240}'), // 󱉀 ("md_flask_minus_outline", '\u{f1241}'), // 󱉁 ("md_flask_off", '\u{f13f6}'), // 󱏶 ("md_flask_off_outline", '\u{f13f7}'), // 󱏷 ("md_flask_outline", '\u{f0096}'), // 󰂖 ("md_flask_plus", '\u{f1242}'), // 󱉂 ("md_flask_plus_outline", '\u{f1243}'), // 󱉃 ("md_flask_remove", '\u{f1244}'), // 󱉄 ("md_flask_remove_outline", '\u{f1245}'), // 󱉅 ("md_flask_round_bottom", '\u{f124b}'), // 󱉋 ("md_flask_round_bottom_empty", '\u{f124c}'), // 󱉌 ("md_flask_round_bottom_empty_outline", '\u{f124d}'), // 󱉍 ("md_flask_round_bottom_outline", '\u{f124e}'), // 󱉎 ("md_fleur_de_lis", '\u{f1303}'), // 󱌃 ("md_flip_horizontal", '\u{f10e7}'), // 󱃧 ("md_flip_to_back", '\u{f0247}'), // 󰉇 ("md_flip_to_front", '\u{f0248}'), // 󰉈 ("md_flip_vertical", '\u{f10e8}'), // 󱃨 ("md_floor_lamp", '\u{f08dd}'), // 󰣝 ("md_floor_lamp_dual", '\u{f1040}'), // 󱁀 ("md_floor_lamp_dual_outline", '\u{f17ce}'), // 󱟎 ("md_floor_lamp_outline", '\u{f17c8}'), // 󱟈 ("md_floor_lamp_torchiere", '\u{f1747}'), // 󱝇 ("md_floor_lamp_torchiere_outline", '\u{f17d6}'), // 󱟖 ("md_floor_lamp_torchiere_variant", '\u{f1041}'), // 󱁁 ("md_floor_lamp_torchiere_variant_outline", '\u{f17cf}'), // 󱟏 ("md_floor_plan", '\u{f0821}'), // 󰠡 ("md_floppy", '\u{f0249}'), // 󰉉 ("md_floppy_variant", '\u{f09ef}'), // 󰧯 ("md_flower", '\u{f024a}'), // 󰉊 ("md_flower_outline", '\u{f09f0}'), // 󰧰 ("md_flower_pollen", '\u{f1885}'), // 󱢅 ("md_flower_pollen_outline", '\u{f1886}'), // 󱢆 ("md_flower_poppy", '\u{f0d08}'), // 󰴈 ("md_flower_tulip", '\u{f09f1}'), // 󰧱 ("md_flower_tulip_outline", '\u{f09f2}'), // 󰧲 ("md_focus_auto", '\u{f0f4e}'), // 󰽎 ("md_focus_field", '\u{f0f4f}'), // 󰽏 ("md_focus_field_horizontal", '\u{f0f50}'), // 󰽐 ("md_focus_field_vertical", '\u{f0f51}'), // 󰽑 ("md_folder", '\u{f024b}'), // 󰉋 ("md_folder_account", '\u{f024c}'), // 󰉌 ("md_folder_account_outline", '\u{f0b9c}'), // 󰮜 ("md_folder_alert", '\u{f0dcc}'), // 󰷌 ("md_folder_alert_outline", '\u{f0dcd}'), // 󰷍 ("md_folder_arrow_down", '\u{f19e8}'), // 󱧨 ("md_folder_arrow_down_outline", '\u{f19e9}'), // 󱧩 ("md_folder_arrow_left", '\u{f19ea}'), // 󱧪 ("md_folder_arrow_left_outline", '\u{f19eb}'), // 󱧫 ("md_folder_arrow_left_right", '\u{f19ec}'), // 󱧬 ("md_folder_arrow_left_right_outline", '\u{f19ed}'), // 󱧭 ("md_folder_arrow_right", '\u{f19ee}'), // 󱧮 ("md_folder_arrow_right_outline", '\u{f19ef}'), // 󱧯 ("md_folder_arrow_up", '\u{f19f0}'), // 󱧰 ("md_folder_arrow_up_down", '\u{f19f1}'), // 󱧱 ("md_folder_arrow_up_down_outline", '\u{f19f2}'), // 󱧲 ("md_folder_arrow_up_outline", '\u{f19f3}'), // 󱧳 ("md_folder_cancel", '\u{f19f4}'), // 󱧴 ("md_folder_cancel_outline", '\u{f19f5}'), // 󱧵 ("md_folder_check", '\u{f197e}'), // 󱥾 ("md_folder_check_outline", '\u{f197f}'), // 󱥿 ("md_folder_clock", '\u{f0aba}'), // 󰪺 ("md_folder_clock_outline", '\u{f0abb}'), // 󰪻 ("md_folder_cog", '\u{f107f}'), // 󱁿 ("md_folder_cog_outline", '\u{f1080}'), // 󱂀 ("md_folder_download", '\u{f024d}'), // 󰉍 ("md_folder_download_outline", '\u{f10e9}'), // 󱃩 ("md_folder_edit", '\u{f08de}'), // 󰣞 ("md_folder_edit_outline", '\u{f0dce}'), // 󰷎 ("md_folder_eye", '\u{f178a}'), // 󱞊 ("md_folder_eye_outline", '\u{f178b}'), // 󱞋 ("md_folder_file", '\u{f19f6}'), // 󱧶 ("md_folder_file_outline", '\u{f19f7}'), // 󱧷 ("md_folder_google_drive", '\u{f024e}'), // 󰉎 ("md_folder_heart", '\u{f10ea}'), // 󱃪 ("md_folder_heart_outline", '\u{f10eb}'), // 󱃫 ("md_folder_hidden", '\u{f179e}'), // 󱞞 ("md_folder_home", '\u{f10b5}'), // 󱂵 ("md_folder_home_outline", '\u{f10b6}'), // 󱂶 ("md_folder_image", '\u{f024f}'), // 󰉏 ("md_folder_information", '\u{f10b7}'), // 󱂷 ("md_folder_information_outline", '\u{f10b8}'), // 󱂸 ("md_folder_key", '\u{f08ac}'), // 󰢬 ("md_folder_key_network", '\u{f08ad}'), // 󰢭 ("md_folder_key_network_outline", '\u{f0c80}'), // 󰲀 ("md_folder_key_outline", '\u{f10ec}'), // 󱃬 ("md_folder_lock", '\u{f0250}'), // 󰉐 ("md_folder_lock_open", '\u{f0251}'), // 󰉑 ("md_folder_lock_open_outline", '\u{f1aa7}'), // 󱪧 ("md_folder_lock_outline", '\u{f1aa8}'), // 󱪨 ("md_folder_marker", '\u{f126d}'), // 󱉭 ("md_folder_marker_outline", '\u{f126e}'), // 󱉮 ("md_folder_move", '\u{f0252}'), // 󰉒 ("md_folder_move_outline", '\u{f1246}'), // 󱉆 ("md_folder_multiple", '\u{f0253}'), // 󰉓 ("md_folder_multiple_image", '\u{f0254}'), // 󰉔 ("md_folder_multiple_outline", '\u{f0255}'), // 󰉕 ("md_folder_multiple_plus", '\u{f147e}'), // 󱑾 ("md_folder_multiple_plus_outline", '\u{f147f}'), // 󱑿 ("md_folder_music", '\u{f1359}'), // 󱍙 ("md_folder_music_outline", '\u{f135a}'), // 󱍚 ("md_folder_network", '\u{f0870}'), // 󰡰 ("md_folder_network_outline", '\u{f0c81}'), // 󰲁 ("md_folder_off", '\u{f19f8}'), // 󱧸 ("md_folder_off_outline", '\u{f19f9}'), // 󱧹 ("md_folder_open", '\u{f0770}'), // 󰝰 ("md_folder_open_outline", '\u{f0dcf}'), // 󰷏 ("md_folder_outline", '\u{f0256}'), // 󰉖 ("md_folder_play", '\u{f19fa}'), // 󱧺 ("md_folder_play_outline", '\u{f19fb}'), // 󱧻 ("md_folder_plus", '\u{f0257}'), // 󰉗 ("md_folder_plus_outline", '\u{f0b9d}'), // 󰮝 ("md_folder_pound", '\u{f0d09}'), // 󰴉 ("md_folder_pound_outline", '\u{f0d0a}'), // 󰴊 ("md_folder_question", '\u{f19ca}'), // 󱧊 ("md_folder_question_outline", '\u{f19cb}'), // 󱧋 ("md_folder_refresh", '\u{f0749}'), // 󰝉 ("md_folder_refresh_outline", '\u{f0542}'), // 󰕂 ("md_folder_remove", '\u{f0258}'), // 󰉘 ("md_folder_remove_outline", '\u{f0b9e}'), // 󰮞 ("md_folder_search", '\u{f0968}'), // 󰥨 ("md_folder_search_outline", '\u{f0969}'), // 󰥩 ("md_folder_settings", '\u{f107d}'), // 󱁽 ("md_folder_settings_outline", '\u{f107e}'), // 󱁾 ("md_folder_star", '\u{f069d}'), // 󰚝 ("md_folder_star_multiple", '\u{f13d3}'), // 󱏓 ("md_folder_star_multiple_outline", '\u{f13d4}'), // 󱏔 ("md_folder_star_outline", '\u{f0b9f}'), // 󰮟 ("md_folder_swap", '\u{f0fb6}'), // 󰾶 ("md_folder_swap_outline", '\u{f0fb7}'), // 󰾷 ("md_folder_sync", '\u{f0d0b}'), // 󰴋 ("md_folder_sync_outline", '\u{f0d0c}'), // 󰴌 ("md_folder_table", '\u{f12e3}'), // 󱋣 ("md_folder_table_outline", '\u{f12e4}'), // 󱋤 ("md_folder_text", '\u{f0c82}'), // 󰲂 ("md_folder_text_outline", '\u{f0c83}'), // 󰲃 ("md_folder_upload", '\u{f0259}'), // 󰉙 ("md_folder_upload_outline", '\u{f10ed}'), // 󱃭 ("md_folder_wrench", '\u{f19fc}'), // 󱧼 ("md_folder_wrench_outline", '\u{f19fd}'), // 󱧽 ("md_folder_zip", '\u{f06eb}'), // 󰛫 ("md_folder_zip_outline", '\u{f07b9}'), // 󰞹 ("md_font_awesome", '\u{f003a}'), // 󰀺 ("md_food", '\u{f025a}'), // 󰉚 ("md_food_apple", '\u{f025b}'), // 󰉛 ("md_food_apple_outline", '\u{f0c84}'), // 󰲄 ("md_food_croissant", '\u{f07c8}'), // 󰟈 ("md_food_drumstick", '\u{f141f}'), // 󱐟 ("md_food_drumstick_off", '\u{f1468}'), // 󱑨 ("md_food_drumstick_off_outline", '\u{f1469}'), // 󱑩 ("md_food_drumstick_outline", '\u{f1420}'), // 󱐠 ("md_food_fork_drink", '\u{f05f2}'), // 󰗲 ("md_food_halal", '\u{f1572}'), // 󱕲 ("md_food_hot_dog", '\u{f184b}'), // 󱡋 ("md_food_kosher", '\u{f1573}'), // 󱕳 ("md_food_off", '\u{f05f3}'), // 󰗳 ("md_food_off_outline", '\u{f1915}'), // 󱤕 ("md_food_outline", '\u{f1916}'), // 󱤖 ("md_food_steak", '\u{f146a}'), // 󱑪 ("md_food_steak_off", '\u{f146b}'), // 󱑫 ("md_food_takeout_box", '\u{f1836}'), // 󱠶 ("md_food_takeout_box_outline", '\u{f1837}'), // 󱠷 ("md_food_turkey", '\u{f171c}'), // 󱜜 ("md_food_variant", '\u{f025c}'), // 󰉜 ("md_food_variant_off", '\u{f13e5}'), // 󱏥 ("md_foot_print", '\u{f0f52}'), // 󰽒 ("md_football", '\u{f025d}'), // 󰉝 ("md_football_australian", '\u{f025e}'), // 󰉞 ("md_football_helmet", '\u{f025f}'), // 󰉟 ("md_forest", '\u{f1897}'), // 󱢗 ("md_forklift", '\u{f07c9}'), // 󰟉 ("md_form_dropdown", '\u{f1400}'), // 󱐀 ("md_form_select", '\u{f1401}'), // 󱐁 ("md_form_textarea", '\u{f1095}'), // 󱂕 ("md_form_textbox", '\u{f060e}'), // 󰘎 ("md_form_textbox_lock", '\u{f135d}'), // 󱍝 ("md_form_textbox_password", '\u{f07f5}'), // 󰟵 ("md_format_align_bottom", '\u{f0753}'), // 󰝓 ("md_format_align_center", '\u{f0260}'), // 󰉠 ("md_format_align_justify", '\u{f0261}'), // 󰉡 ("md_format_align_left", '\u{f0262}'), // 󰉢 ("md_format_align_middle", '\u{f0754}'), // 󰝔 ("md_format_align_right", '\u{f0263}'), // 󰉣 ("md_format_align_top", '\u{f0755}'), // 󰝕 ("md_format_annotation_minus", '\u{f0abc}'), // 󰪼 ("md_format_annotation_plus", '\u{f0646}'), // 󰙆 ("md_format_bold", '\u{f0264}'), // 󰉤 ("md_format_clear", '\u{f0265}'), // 󰉥 ("md_format_color_fill", '\u{f0266}'), // 󰉦 ("md_format_color_highlight", '\u{f0e31}'), // 󰸱 ("md_format_color_marker_cancel", '\u{f1313}'), // 󱌓 ("md_format_color_text", '\u{f069e}'), // 󰚞 ("md_format_columns", '\u{f08df}'), // 󰣟 ("md_format_float_center", '\u{f0267}'), // 󰉧 ("md_format_float_left", '\u{f0268}'), // 󰉨 ("md_format_float_none", '\u{f0269}'), // 󰉩 ("md_format_float_right", '\u{f026a}'), // 󰉪 ("md_format_font", '\u{f06d6}'), // 󰛖 ("md_format_font_size_decrease", '\u{f09f3}'), // 󰧳 ("md_format_font_size_increase", '\u{f09f4}'), // 󰧴 ("md_format_header_1", '\u{f026b}'), // 󰉫 ("md_format_header_2", '\u{f026c}'), // 󰉬 ("md_format_header_3", '\u{f026d}'), // 󰉭 ("md_format_header_4", '\u{f026e}'), // 󰉮 ("md_format_header_5", '\u{f026f}'), // 󰉯 ("md_format_header_6", '\u{f0270}'), // 󰉰 ("md_format_header_decrease", '\u{f0271}'), // 󰉱 ("md_format_header_equal", '\u{f0272}'), // 󰉲 ("md_format_header_increase", '\u{f0273}'), // 󰉳 ("md_format_header_pound", '\u{f0274}'), // 󰉴 ("md_format_horizontal_align_center", '\u{f061e}'), // 󰘞 ("md_format_horizontal_align_left", '\u{f061f}'), // 󰘟 ("md_format_horizontal_align_right", '\u{f0620}'), // 󰘠 ("md_format_indent_decrease", '\u{f0275}'), // 󰉵 ("md_format_indent_increase", '\u{f0276}'), // 󰉶 ("md_format_italic", '\u{f0277}'), // 󰉷 ("md_format_letter_case", '\u{f0b34}'), // 󰬴 ("md_format_letter_case_lower", '\u{f0b35}'), // 󰬵 ("md_format_letter_case_upper", '\u{f0b36}'), // 󰬶 ("md_format_letter_ends_with", '\u{f0fb8}'), // 󰾸 ("md_format_letter_matches", '\u{f0fb9}'), // 󰾹 ("md_format_letter_spacing", '\u{f1956}'), // 󱥖 ("md_format_letter_starts_with", '\u{f0fba}'), // 󰾺 ("md_format_line_spacing", '\u{f0278}'), // 󰉸 ("md_format_line_style", '\u{f05c8}'), // 󰗈 ("md_format_line_weight", '\u{f05c9}'), // 󰗉 ("md_format_list_bulleted", '\u{f0279}'), // 󰉹 ("md_format_list_bulleted_square", '\u{f0dd0}'), // 󰷐 ("md_format_list_bulleted_triangle", '\u{f0eb2}'), // 󰺲 ("md_format_list_bulleted_type", '\u{f027a}'), // 󰉺 ("md_format_list_checkbox", '\u{f096a}'), // 󰥪 ("md_format_list_checks", '\u{f0756}'), // 󰝖 ("md_format_list_group", '\u{f1860}'), // 󱡠 ("md_format_list_numbered", '\u{f027b}'), // 󰉻 ("md_format_list_numbered_rtl", '\u{f0d0d}'), // 󰴍 ("md_format_list_text", '\u{f126f}'), // 󱉯 ("md_format_overline", '\u{f0eb3}'), // 󰺳 ("md_format_page_break", '\u{f06d7}'), // 󰛗 ("md_format_page_split", '\u{f1917}'), // 󱤗 ("md_format_paint", '\u{f027c}'), // 󰉼 ("md_format_paragraph", '\u{f027d}'), // 󰉽 ("md_format_pilcrow", '\u{f06d8}'), // 󰛘 ("md_format_quote_close", '\u{f027e}'), // 󰉾 ("md_format_quote_close_outline", '\u{f11a8}'), // 󱆨 ("md_format_quote_open", '\u{f0757}'), // 󰝗 ("md_format_quote_open_outline", '\u{f11a7}'), // 󱆧 ("md_format_rotate_90", '\u{f06aa}'), // 󰚪 ("md_format_section", '\u{f069f}'), // 󰚟 ("md_format_size", '\u{f027f}'), // 󰉿 ("md_format_strikethrough", '\u{f0280}'), // 󰊀 ("md_format_strikethrough_variant", '\u{f0281}'), // 󰊁 ("md_format_subscript", '\u{f0282}'), // 󰊂 ("md_format_superscript", '\u{f0283}'), // 󰊃 ("md_format_text", '\u{f0284}'), // 󰊄 ("md_format_text_rotation_angle_down", '\u{f0fbb}'), // 󰾻 ("md_format_text_rotation_angle_up", '\u{f0fbc}'), // 󰾼 ("md_format_text_rotation_down", '\u{f0d73}'), // 󰵳 ("md_format_text_rotation_down_vertical", '\u{f0fbd}'), // 󰾽 ("md_format_text_rotation_none", '\u{f0d74}'), // 󰵴 ("md_format_text_rotation_up", '\u{f0fbe}'), // 󰾾 ("md_format_text_rotation_vertical", '\u{f0fbf}'), // 󰾿 ("md_format_text_variant", '\u{f0e32}'), // 󰸲 ("md_format_text_variant_outline", '\u{f150f}'), // 󱔏 ("md_format_text_wrapping_clip", '\u{f0d0e}'), // 󰴎 ("md_format_text_wrapping_overflow", '\u{f0d0f}'), // 󰴏 ("md_format_text_wrapping_wrap", '\u{f0d10}'), // 󰴐 ("md_format_textbox", '\u{f0d11}'), // 󰴑 ("md_format_textdirection_l_to_r", '\u{f0285}'), // 󰊅 ("md_format_textdirection_r_to_l", '\u{f0286}'), // 󰊆 ("md_format_title", '\u{f05f4}'), // 󰗴 ("md_format_underline", '\u{f0287}'), // 󰊇 ("md_format_underline_wavy", '\u{f18e9}'), // 󱣩 ("md_format_vertical_align_bottom", '\u{f0621}'), // 󰘡 ("md_format_vertical_align_center", '\u{f0622}'), // 󰘢 ("md_format_vertical_align_top", '\u{f0623}'), // 󰘣 ("md_format_wrap_inline", '\u{f0288}'), // 󰊈 ("md_format_wrap_square", '\u{f0289}'), // 󰊉 ("md_format_wrap_tight", '\u{f028a}'), // 󰊊 ("md_format_wrap_top_bottom", '\u{f028b}'), // 󰊋 ("md_forum", '\u{f028c}'), // 󰊌 ("md_forum_minus", '\u{f1aa9}'), // 󱪩 ("md_forum_minus_outline", '\u{f1aaa}'), // 󱪪 ("md_forum_outline", '\u{f0822}'), // 󰠢 ("md_forum_plus", '\u{f1aab}'), // 󱪫 ("md_forum_plus_outline", '\u{f1aac}'), // 󱪬 ("md_forum_remove", '\u{f1aad}'), // 󱪭 ("md_forum_remove_outline", '\u{f1aae}'), // 󱪮 ("md_forward", '\u{f028d}'), // 󰊍 ("md_forwardburger", '\u{f0d75}'), // 󰵵 ("md_fountain", '\u{f096b}'), // 󰥫 ("md_fountain_pen", '\u{f0d12}'), // 󰴒 ("md_fountain_pen_tip", '\u{f0d13}'), // 󰴓 ("md_fraction_one_half", '\u{f1992}'), // 󱦒 ("md_freebsd", '\u{f08e0}'), // 󰣠 ("md_french_fries", '\u{f1957}'), // 󱥗 ("md_frequently_asked_questions", '\u{f0eb4}'), // 󰺴 ("md_fridge", '\u{f0290}'), // 󰊐 ("md_fridge_alert", '\u{f11b1}'), // 󱆱 ("md_fridge_alert_outline", '\u{f11b2}'), // 󱆲 ("md_fridge_bottom", '\u{f0292}'), // 󰊒 ("md_fridge_industrial", '\u{f15ee}'), // 󱗮 ("md_fridge_industrial_alert", '\u{f15ef}'), // 󱗯 ("md_fridge_industrial_alert_outline", '\u{f15f0}'), // 󱗰 ("md_fridge_industrial_off", '\u{f15f1}'), // 󱗱 ("md_fridge_industrial_off_outline", '\u{f15f2}'), // 󱗲 ("md_fridge_industrial_outline", '\u{f15f3}'), // 󱗳 ("md_fridge_off", '\u{f11af}'), // 󱆯 ("md_fridge_off_outline", '\u{f11b0}'), // 󱆰 ("md_fridge_outline", '\u{f028f}'), // 󰊏 ("md_fridge_top", '\u{f0291}'), // 󰊑 ("md_fridge_variant", '\u{f15f4}'), // 󱗴 ("md_fridge_variant_alert", '\u{f15f5}'), // 󱗵 ("md_fridge_variant_alert_outline", '\u{f15f6}'), // 󱗶 ("md_fridge_variant_off", '\u{f15f7}'), // 󱗷 ("md_fridge_variant_off_outline", '\u{f15f8}'), // 󱗸 ("md_fridge_variant_outline", '\u{f15f9}'), // 󱗹 ("md_fruit_cherries", '\u{f1042}'), // 󱁂 ("md_fruit_cherries_off", '\u{f13f8}'), // 󱏸 ("md_fruit_citrus", '\u{f1043}'), // 󱁃 ("md_fruit_citrus_off", '\u{f13f9}'), // 󱏹 ("md_fruit_grapes", '\u{f1044}'), // 󱁄 ("md_fruit_grapes_outline", '\u{f1045}'), // 󱁅 ("md_fruit_pear", '\u{f1a0e}'), // 󱨎 ("md_fruit_pineapple", '\u{f1046}'), // 󱁆 ("md_fruit_watermelon", '\u{f1047}'), // 󱁇 ("md_fuel", '\u{f07ca}'), // 󰟊 ("md_fuel_cell", '\u{f18b5}'), // 󱢵 ("md_fullscreen", '\u{f0293}'), // 󰊓 ("md_fullscreen_exit", '\u{f0294}'), // 󰊔 ("md_function", '\u{f0295}'), // 󰊕 ("md_function_variant", '\u{f0871}'), // 󰡱 ("md_furigana_horizontal", '\u{f1081}'), // 󱂁 ("md_furigana_vertical", '\u{f1082}'), // 󱂂 ("md_fuse", '\u{f0c85}'), // 󰲅 ("md_fuse_alert", '\u{f142d}'), // 󱐭 ("md_fuse_blade", '\u{f0c86}'), // 󰲆 ("md_fuse_off", '\u{f142c}'), // 󱐬 ("md_gamepad", '\u{f0296}'), // 󰊖 ("md_gamepad_circle", '\u{f0e33}'), // 󰸳 ("md_gamepad_circle_down", '\u{f0e34}'), // 󰸴 ("md_gamepad_circle_left", '\u{f0e35}'), // 󰸵 ("md_gamepad_circle_outline", '\u{f0e36}'), // 󰸶 ("md_gamepad_circle_right", '\u{f0e37}'), // 󰸷 ("md_gamepad_circle_up", '\u{f0e38}'), // 󰸸 ("md_gamepad_down", '\u{f0e39}'), // 󰸹 ("md_gamepad_left", '\u{f0e3a}'), // 󰸺 ("md_gamepad_outline", '\u{f1919}'), // 󱤙 ("md_gamepad_right", '\u{f0e3b}'), // 󰸻 ("md_gamepad_round", '\u{f0e3c}'), // 󰸼 ("md_gamepad_round_down", '\u{f0e3d}'), // 󰸽 ("md_gamepad_round_left", '\u{f0e3e}'), // 󰸾 ("md_gamepad_round_outline", '\u{f0e3f}'), // 󰸿 ("md_gamepad_round_right", '\u{f0e40}'), // 󰹀 ("md_gamepad_round_up", '\u{f0e41}'), // 󰹁 ("md_gamepad_square", '\u{f0eb5}'), // 󰺵 ("md_gamepad_square_outline", '\u{f0eb6}'), // 󰺶 ("md_gamepad_up", '\u{f0e42}'), // 󰹂 ("md_gamepad_variant", '\u{f0297}'), // 󰊗 ("md_gamepad_variant_outline", '\u{f0eb7}'), // 󰺷 ("md_gamma", '\u{f10ee}'), // 󱃮 ("md_gantry_crane", '\u{f0dd1}'), // 󰷑 ("md_garage", '\u{f06d9}'), // 󰛙 ("md_garage_alert", '\u{f0872}'), // 󰡲 ("md_garage_alert_variant", '\u{f12d5}'), // 󱋕 ("md_garage_lock", '\u{f17fb}'), // 󱟻 ("md_garage_open", '\u{f06da}'), // 󰛚 ("md_garage_open_variant", '\u{f12d4}'), // 󱋔 ("md_garage_variant", '\u{f12d3}'), // 󱋓 ("md_garage_variant_lock", '\u{f17fc}'), // 󱟼 ("md_gas_burner", '\u{f1a1b}'), // 󱨛 ("md_gas_cylinder", '\u{f0647}'), // 󰙇 ("md_gas_station", '\u{f0298}'), // 󰊘 ("md_gas_station_off", '\u{f1409}'), // 󱐉 ("md_gas_station_off_outline", '\u{f140a}'), // 󱐊 ("md_gas_station_outline", '\u{f0eb8}'), // 󰺸 ("md_gate", '\u{f0299}'), // 󰊙 ("md_gate_alert", '\u{f17f8}'), // 󱟸 ("md_gate_and", '\u{f08e1}'), // 󰣡 ("md_gate_arrow_left", '\u{f17f7}'), // 󱟷 ("md_gate_arrow_right", '\u{f1169}'), // 󱅩 ("md_gate_nand", '\u{f08e2}'), // 󰣢 ("md_gate_nor", '\u{f08e3}'), // 󰣣 ("md_gate_not", '\u{f08e4}'), // 󰣤 ("md_gate_open", '\u{f116a}'), // 󱅪 ("md_gate_or", '\u{f08e5}'), // 󰣥 ("md_gate_xnor", '\u{f08e6}'), // 󰣦 ("md_gate_xor", '\u{f08e7}'), // 󰣧 ("md_gatsby", '\u{f0e43}'), // 󰹃 ("md_gauge", '\u{f029a}'), // 󰊚 ("md_gauge_empty", '\u{f0873}'), // 󰡳 ("md_gauge_full", '\u{f0874}'), // 󰡴 ("md_gauge_low", '\u{f0875}'), // 󰡵 ("md_gavel", '\u{f029b}'), // 󰊛 ("md_gender_female", '\u{f029c}'), // 󰊜 ("md_gender_male", '\u{f029d}'), // 󰊝 ("md_gender_male_female", '\u{f029e}'), // 󰊞 ("md_gender_male_female_variant", '\u{f113f}'), // 󱄿 ("md_gender_non_binary", '\u{f1140}'), // 󱅀 ("md_gender_transgender", '\u{f029f}'), // 󰊟 ("md_gentoo", '\u{f08e8}'), // 󰣨 ("md_gesture", '\u{f07cb}'), // 󰟋 ("md_gesture_double_tap", '\u{f073c}'), // 󰜼 ("md_gesture_pinch", '\u{f0abd}'), // 󰪽 ("md_gesture_spread", '\u{f0abe}'), // 󰪾 ("md_gesture_swipe", '\u{f0d76}'), // 󰵶 ("md_gesture_swipe_down", '\u{f073d}'), // 󰜽 ("md_gesture_swipe_horizontal", '\u{f0abf}'), // 󰪿 ("md_gesture_swipe_left", '\u{f073e}'), // 󰜾 ("md_gesture_swipe_right", '\u{f073f}'), // 󰜿 ("md_gesture_swipe_up", '\u{f0740}'), // 󰝀 ("md_gesture_swipe_vertical", '\u{f0ac0}'), // 󰫀 ("md_gesture_tap", '\u{f0741}'), // 󰝁 ("md_gesture_tap_box", '\u{f12a9}'), // 󱊩 ("md_gesture_tap_button", '\u{f12a8}'), // 󱊨 ("md_gesture_tap_hold", '\u{f0d77}'), // 󰵷 ("md_gesture_two_double_tap", '\u{f0742}'), // 󰝂 ("md_gesture_two_tap", '\u{f0743}'), // 󰝃 ("md_ghost", '\u{f02a0}'), // 󰊠 ("md_ghost_off", '\u{f09f5}'), // 󰧵 ("md_ghost_off_outline", '\u{f165c}'), // 󱙜 ("md_ghost_outline", '\u{f165d}'), // 󱙝 ("md_gift", '\u{f0e44}'), // 󰹄 ("md_gift_off", '\u{f16ef}'), // 󱛯 ("md_gift_off_outline", '\u{f16f0}'), // 󱛰 ("md_gift_open", '\u{f16f1}'), // 󱛱 ("md_gift_open_outline", '\u{f16f2}'), // 󱛲 ("md_gift_outline", '\u{f02a1}'), // 󰊡 ("md_git", '\u{f02a2}'), // 󰊢 ("md_github", '\u{f02a4}'), // 󰊤 ("md_gitlab", '\u{f0ba0}'), // 󰮠 ("md_glass_cocktail", '\u{f0356}'), // 󰍖 ("md_glass_cocktail_off", '\u{f15e6}'), // 󱗦 ("md_glass_flute", '\u{f02a5}'), // 󰊥 ("md_glass_fragile", '\u{f1873}'), // 󱡳 ("md_glass_mug", '\u{f02a6}'), // 󰊦 ("md_glass_mug_off", '\u{f15e7}'), // 󱗧 ("md_glass_mug_variant", '\u{f1116}'), // 󱄖 ("md_glass_mug_variant_off", '\u{f15e8}'), // 󱗨 ("md_glass_pint_outline", '\u{f130d}'), // 󱌍 ("md_glass_stange", '\u{f02a7}'), // 󰊧 ("md_glass_tulip", '\u{f02a8}'), // 󰊨 ("md_glass_wine", '\u{f0876}'), // 󰡶 ("md_glasses", '\u{f02aa}'), // 󰊪 ("md_globe_light", '\u{f12d7}'), // 󱋗 ("md_globe_model", '\u{f08e9}'), // 󰣩 ("md_gmail", '\u{f02ab}'), // 󰊫 ("md_gnome", '\u{f02ac}'), // 󰊬 ("md_go_kart", '\u{f0d79}'), // 󰵹 ("md_go_kart_track", '\u{f0d7a}'), // 󰵺 ("md_gog", '\u{f0ba1}'), // 󰮡 ("md_gold", '\u{f124f}'), // 󱉏 ("md_golf", '\u{f0823}'), // 󰠣 ("md_golf_cart", '\u{f11a4}'), // 󱆤 ("md_golf_tee", '\u{f1083}'), // 󱂃 ("md_gondola", '\u{f0686}'), // 󰚆 ("md_goodreads", '\u{f0d7b}'), // 󰵻 ("md_google", '\u{f02ad}'), // 󰊭 ("md_google_ads", '\u{f0c87}'), // 󰲇 ("md_google_analytics", '\u{f07cc}'), // 󰟌 ("md_google_assistant", '\u{f07cd}'), // 󰟍 ("md_google_cardboard", '\u{f02ae}'), // 󰊮 ("md_google_chrome", '\u{f02af}'), // 󰊯 ("md_google_circles", '\u{f02b0}'), // 󰊰 ("md_google_circles_communities", '\u{f02b1}'), // 󰊱 ("md_google_circles_extended", '\u{f02b2}'), // 󰊲 ("md_google_circles_group", '\u{f02b3}'), // 󰊳 ("md_google_classroom", '\u{f02c0}'), // 󰋀 ("md_google_cloud", '\u{f11f6}'), // 󱇶 ("md_google_controller", '\u{f02b4}'), // 󰊴 ("md_google_controller_off", '\u{f02b5}'), // 󰊵 ("md_google_downasaur", '\u{f1362}'), // 󱍢 ("md_google_drive", '\u{f02b6}'), // 󰊶 ("md_google_earth", '\u{f02b7}'), // 󰊷 ("md_google_fit", '\u{f096c}'), // 󰥬 ("md_google_glass", '\u{f02b8}'), // 󰊸 ("md_google_hangouts", '\u{f02c9}'), // 󰋉 ("md_google_home", '\u{f0824}'), // 󰠤 ("md_google_keep", '\u{f06dc}'), // 󰛜 ("md_google_lens", '\u{f09f6}'), // 󰧶 ("md_google_maps", '\u{f05f5}'), // 󰗵 ("md_google_my_business", '\u{f1048}'), // 󱁈 ("md_google_nearby", '\u{f02b9}'), // 󰊹 ("md_google_play", '\u{f02bc}'), // 󰊼 ("md_google_plus", '\u{f02bd}'), // 󰊽 ("md_google_podcast", '\u{f0eb9}'), // 󰺹 ("md_google_spreadsheet", '\u{f09f7}'), // 󰧷 ("md_google_street_view", '\u{f0c88}'), // 󰲈 ("md_google_translate", '\u{f02bf}'), // 󰊿 ("md_gradient_horizontal", '\u{f174a}'), // 󱝊 ("md_gradient_vertical", '\u{f06a0}'), // 󰚠 ("md_grain", '\u{f0d7c}'), // 󰵼 ("md_graph", '\u{f1049}'), // 󱁉 ("md_graph_outline", '\u{f104a}'), // 󱁊 ("md_graphql", '\u{f0877}'), // 󰡷 ("md_grass", '\u{f1510}'), // 󱔐 ("md_grave_stone", '\u{f0ba2}'), // 󰮢 ("md_grease_pencil", '\u{f0648}'), // 󰙈 ("md_greater_than", '\u{f096d}'), // 󰥭 ("md_greater_than_or_equal", '\u{f096e}'), // 󰥮 ("md_greenhouse", '\u{f002d}'), // 󰀭 ("md_grid", '\u{f02c1}'), // 󰋁 ("md_grid_large", '\u{f0758}'), // 󰝘 ("md_grid_off", '\u{f02c2}'), // 󰋂 ("md_grill", '\u{f0e45}'), // 󰹅 ("md_grill_outline", '\u{f118a}'), // 󱆊 ("md_group", '\u{f02c3}'), // 󰋃 ("md_guitar_acoustic", '\u{f0771}'), // 󰝱 ("md_guitar_electric", '\u{f02c4}'), // 󰋄 ("md_guitar_pick", '\u{f02c5}'), // 󰋅 ("md_guitar_pick_outline", '\u{f02c6}'), // 󰋆 ("md_guy_fawkes_mask", '\u{f0825}'), // 󰠥 ("md_gymnastics", '\u{f1a41}'), // 󱩁 ("md_hail", '\u{f0ac1}'), // 󰫁 ("md_hair_dryer", '\u{f10ef}'), // 󱃯 ("md_hair_dryer_outline", '\u{f10f0}'), // 󱃰 ("md_halloween", '\u{f0ba3}'), // 󰮣 ("md_hamburger", '\u{f0685}'), // 󰚅 ("md_hamburger_check", '\u{f1776}'), // 󱝶 ("md_hamburger_minus", '\u{f1777}'), // 󱝷 ("md_hamburger_off", '\u{f1778}'), // 󱝸 ("md_hamburger_plus", '\u{f1779}'), // 󱝹 ("md_hamburger_remove", '\u{f177a}'), // 󱝺 ("md_hammer", '\u{f08ea}'), // 󰣪 ("md_hammer_screwdriver", '\u{f1322}'), // 󱌢 ("md_hammer_sickle", '\u{f1887}'), // 󱢇 ("md_hammer_wrench", '\u{f1323}'), // 󱌣 ("md_hand_back_left", '\u{f0e46}'), // 󰹆 ("md_hand_back_left_off", '\u{f1830}'), // 󱠰 ("md_hand_back_left_off_outline", '\u{f1832}'), // 󱠲 ("md_hand_back_left_outline", '\u{f182c}'), // 󱠬 ("md_hand_back_right", '\u{f0e47}'), // 󰹇 ("md_hand_back_right_off", '\u{f1831}'), // 󱠱 ("md_hand_back_right_off_outline", '\u{f1833}'), // 󱠳 ("md_hand_back_right_outline", '\u{f182d}'), // 󱠭 ("md_hand_clap", '\u{f194b}'), // 󱥋 ("md_hand_clap_off", '\u{f1a42}'), // 󱩂 ("md_hand_coin", '\u{f188f}'), // 󱢏 ("md_hand_coin_outline", '\u{f1890}'), // 󱢐 ("md_hand_extended", '\u{f18b6}'), // 󱢶 ("md_hand_extended_outline", '\u{f18b7}'), // 󱢷 ("md_hand_front_left", '\u{f182b}'), // 󱠫 ("md_hand_front_left_outline", '\u{f182e}'), // 󱠮 ("md_hand_front_right", '\u{f0a4f}'), // 󰩏 ("md_hand_front_right_outline", '\u{f182f}'), // 󱠯 ("md_hand_heart", '\u{f10f1}'), // 󱃱 ("md_hand_heart_outline", '\u{f157e}'), // 󱕾 ("md_hand_okay", '\u{f0a50}'), // 󰩐 ("md_hand_peace", '\u{f0a51}'), // 󰩑 ("md_hand_peace_variant", '\u{f0a52}'), // 󰩒 ("md_hand_pointing_down", '\u{f0a53}'), // 󰩓 ("md_hand_pointing_left", '\u{f0a54}'), // 󰩔 ("md_hand_pointing_right", '\u{f02c7}'), // 󰋇 ("md_hand_pointing_up", '\u{f0a55}'), // 󰩕 ("md_hand_saw", '\u{f0e48}'), // 󰹈 ("md_hand_wash", '\u{f157f}'), // 󱕿 ("md_hand_wash_outline", '\u{f1580}'), // 󱖀 ("md_hand_water", '\u{f139f}'), // 󱎟 ("md_hand_wave", '\u{f1821}'), // 󱠡 ("md_hand_wave_outline", '\u{f1822}'), // 󱠢 ("md_handball", '\u{f0f53}'), // 󰽓 ("md_handcuffs", '\u{f113e}'), // 󱄾 ("md_hands_pray", '\u{f0579}'), // 󰕹 ("md_handshake", '\u{f1218}'), // 󱈘 ("md_handshake_outline", '\u{f15a1}'), // 󱖡 ("md_hanger", '\u{f02c8}'), // 󰋈 ("md_hard_hat", '\u{f096f}'), // 󰥯 ("md_harddisk", '\u{f02ca}'), // 󰋊 ("md_harddisk_plus", '\u{f104b}'), // 󱁋 ("md_harddisk_remove", '\u{f104c}'), // 󱁌 ("md_hat_fedora", '\u{f0ba4}'), // 󰮤 ("md_hazard_lights", '\u{f0c89}'), // 󰲉 ("md_hdr", '\u{f0d7d}'), // 󰵽 ("md_hdr_off", '\u{f0d7e}'), // 󰵾 ("md_head", '\u{f135e}'), // 󱍞 ("md_head_alert", '\u{f1338}'), // 󱌸 ("md_head_alert_outline", '\u{f1339}'), // 󱌹 ("md_head_check", '\u{f133a}'), // 󱌺 ("md_head_check_outline", '\u{f133b}'), // 󱌻 ("md_head_cog", '\u{f133c}'), // 󱌼 ("md_head_cog_outline", '\u{f133d}'), // 󱌽 ("md_head_dots_horizontal", '\u{f133e}'), // 󱌾 ("md_head_dots_horizontal_outline", '\u{f133f}'), // 󱌿 ("md_head_flash", '\u{f1340}'), // 󱍀 ("md_head_flash_outline", '\u{f1341}'), // 󱍁 ("md_head_heart", '\u{f1342}'), // 󱍂 ("md_head_heart_outline", '\u{f1343}'), // 󱍃 ("md_head_lightbulb", '\u{f1344}'), // 󱍄 ("md_head_lightbulb_outline", '\u{f1345}'), // 󱍅 ("md_head_minus", '\u{f1346}'), // 󱍆 ("md_head_minus_outline", '\u{f1347}'), // 󱍇 ("md_head_outline", '\u{f135f}'), // 󱍟 ("md_head_plus", '\u{f1348}'), // 󱍈 ("md_head_plus_outline", '\u{f1349}'), // 󱍉 ("md_head_question", '\u{f134a}'), // 󱍊 ("md_head_question_outline", '\u{f134b}'), // 󱍋 ("md_head_remove", '\u{f134c}'), // 󱍌 ("md_head_remove_outline", '\u{f134d}'), // 󱍍 ("md_head_snowflake", '\u{f134e}'), // 󱍎 ("md_head_snowflake_outline", '\u{f134f}'), // 󱍏 ("md_head_sync", '\u{f1350}'), // 󱍐 ("md_head_sync_outline", '\u{f1351}'), // 󱍑 ("md_headphones", '\u{f02cb}'), // 󰋋 ("md_headphones_bluetooth", '\u{f0970}'), // 󰥰 ("md_headphones_box", '\u{f02cc}'), // 󰋌 ("md_headphones_off", '\u{f07ce}'), // 󰟎 ("md_headphones_settings", '\u{f02cd}'), // 󰋍 ("md_headset", '\u{f02ce}'), // 󰋎 ("md_headset_dock", '\u{f02cf}'), // 󰋏 ("md_headset_off", '\u{f02d0}'), // 󰋐 ("md_heart", '\u{f02d1}'), // 󰋑 ("md_heart_box", '\u{f02d2}'), // 󰋒 ("md_heart_box_outline", '\u{f02d3}'), // 󰋓 ("md_heart_broken", '\u{f02d4}'), // 󰋔 ("md_heart_broken_outline", '\u{f0d14}'), // 󰴔 ("md_heart_circle", '\u{f0971}'), // 󰥱 ("md_heart_circle_outline", '\u{f0972}'), // 󰥲 ("md_heart_cog", '\u{f1663}'), // 󱙣 ("md_heart_cog_outline", '\u{f1664}'), // 󱙤 ("md_heart_flash", '\u{f0ef9}'), // 󰻹 ("md_heart_half", '\u{f06df}'), // 󰛟 ("md_heart_half_full", '\u{f06de}'), // 󰛞 ("md_heart_half_outline", '\u{f06e0}'), // 󰛠 ("md_heart_minus", '\u{f142f}'), // 󱐯 ("md_heart_minus_outline", '\u{f1432}'), // 󱐲 ("md_heart_multiple", '\u{f0a56}'), // 󰩖 ("md_heart_multiple_outline", '\u{f0a57}'), // 󰩗 ("md_heart_off", '\u{f0759}'), // 󰝙 ("md_heart_off_outline", '\u{f1434}'), // 󱐴 ("md_heart_outline", '\u{f02d5}'), // 󰋕 ("md_heart_plus", '\u{f142e}'), // 󱐮 ("md_heart_plus_outline", '\u{f1431}'), // 󱐱 ("md_heart_pulse", '\u{f05f6}'), // 󰗶 ("md_heart_remove", '\u{f1430}'), // 󱐰 ("md_heart_remove_outline", '\u{f1433}'), // 󱐳 ("md_heart_settings", '\u{f1665}'), // 󱙥 ("md_heart_settings_outline", '\u{f1666}'), // 󱙦 ("md_heat_pump", '\u{f1a43}'), // 󱩃 ("md_heat_pump_outline", '\u{f1a44}'), // 󱩄 ("md_heat_wave", '\u{f1a45}'), // 󱩅 ("md_heating_coil", '\u{f1aaf}'), // 󱪯 ("md_helicopter", '\u{f0ac2}'), // 󰫂 ("md_help", '\u{f02d6}'), // 󰋖 ("md_help_box", '\u{f078b}'), // 󰞋 ("md_help_circle", '\u{f02d7}'), // 󰋗 ("md_help_circle_outline", '\u{f0625}'), // 󰘥 ("md_help_network", '\u{f06f5}'), // 󰛵 ("md_help_network_outline", '\u{f0c8a}'), // 󰲊 ("md_help_rhombus", '\u{f0ba5}'), // 󰮥 ("md_help_rhombus_outline", '\u{f0ba6}'), // 󰮦 ("md_hexadecimal", '\u{f12a7}'), // 󱊧 ("md_hexagon", '\u{f02d8}'), // 󰋘 ("md_hexagon_multiple", '\u{f06e1}'), // 󰛡 ("md_hexagon_multiple_outline", '\u{f10f2}'), // 󱃲 ("md_hexagon_outline", '\u{f02d9}'), // 󰋙 ("md_hexagon_slice_1", '\u{f0ac3}'), // 󰫃 ("md_hexagon_slice_2", '\u{f0ac4}'), // 󰫄 ("md_hexagon_slice_3", '\u{f0ac5}'), // 󰫅 ("md_hexagon_slice_4", '\u{f0ac6}'), // 󰫆 ("md_hexagon_slice_5", '\u{f0ac7}'), // 󰫇 ("md_hexagon_slice_6", '\u{f0ac8}'), // 󰫈 ("md_hexagram", '\u{f0ac9}'), // 󰫉 ("md_hexagram_outline", '\u{f0aca}'), // 󰫊 ("md_high_definition", '\u{f07cf}'), // 󰟏 ("md_high_definition_box", '\u{f0878}'), // 󰡸 ("md_highway", '\u{f05f7}'), // 󰗷 ("md_hiking", '\u{f0d7f}'), // 󰵿 ("md_history", '\u{f02da}'), // 󰋚 ("md_hockey_puck", '\u{f0879}'), // 󰡹 ("md_hockey_sticks", '\u{f087a}'), // 󰡺 ("md_hololens", '\u{f02db}'), // 󰋛 ("md_home", '\u{f02dc}'), // 󰋜 ("md_home_account", '\u{f0826}'), // 󰠦 ("md_home_alert", '\u{f087b}'), // 󰡻 ("md_home_alert_outline", '\u{f15d0}'), // 󱗐 ("md_home_analytics", '\u{f0eba}'), // 󰺺 ("md_home_assistant", '\u{f07d0}'), // 󰟐 ("md_home_automation", '\u{f07d1}'), // 󰟑 ("md_home_battery", '\u{f1901}'), // 󱤁 ("md_home_battery_outline", '\u{f1902}'), // 󱤂 ("md_home_circle", '\u{f07d2}'), // 󰟒 ("md_home_circle_outline", '\u{f104d}'), // 󱁍 ("md_home_city", '\u{f0d15}'), // 󰴕 ("md_home_city_outline", '\u{f0d16}'), // 󰴖 ("md_home_clock", '\u{f1a12}'), // 󱨒 ("md_home_clock_outline", '\u{f1a13}'), // 󱨓 ("md_home_edit", '\u{f1159}'), // 󱅙 ("md_home_edit_outline", '\u{f115a}'), // 󱅚 ("md_home_export_outline", '\u{f0f9b}'), // 󰾛 ("md_home_flood", '\u{f0efa}'), // 󰻺 ("md_home_floor_0", '\u{f0dd2}'), // 󰷒 ("md_home_floor_1", '\u{f0d80}'), // 󰶀 ("md_home_floor_2", '\u{f0d81}'), // 󰶁 ("md_home_floor_3", '\u{f0d82}'), // 󰶂 ("md_home_floor_a", '\u{f0d83}'), // 󰶃 ("md_home_floor_b", '\u{f0d84}'), // 󰶄 ("md_home_floor_g", '\u{f0d85}'), // 󰶅 ("md_home_floor_l", '\u{f0d86}'), // 󰶆 ("md_home_floor_negative_1", '\u{f0dd3}'), // 󰷓 ("md_home_group", '\u{f0dd4}'), // 󰷔 ("md_home_group_minus", '\u{f19c1}'), // 󱧁 ("md_home_group_plus", '\u{f19c0}'), // 󱧀 ("md_home_group_remove", '\u{f19c2}'), // 󱧂 ("md_home_heart", '\u{f0827}'), // 󰠧 ("md_home_import_outline", '\u{f0f9c}'), // 󰾜 ("md_home_lightbulb", '\u{f1251}'), // 󱉑 ("md_home_lightbulb_outline", '\u{f1252}'), // 󱉒 ("md_home_lightning_bolt", '\u{f1903}'), // 󱤃 ("md_home_lightning_bolt_outline", '\u{f1904}'), // 󱤄 ("md_home_lock", '\u{f08eb}'), // 󰣫 ("md_home_lock_open", '\u{f08ec}'), // 󰣬 ("md_home_map_marker", '\u{f05f8}'), // 󰗸 ("md_home_minus", '\u{f0974}'), // 󰥴 ("md_home_minus_outline", '\u{f13d5}'), // 󱏕 ("md_home_modern", '\u{f02dd}'), // 󰋝 ("md_home_off", '\u{f1a46}'), // 󱩆 ("md_home_off_outline", '\u{f1a47}'), // 󱩇 ("md_home_outline", '\u{f06a1}'), // 󰚡 ("md_home_plus", '\u{f0975}'), // 󰥵 ("md_home_plus_outline", '\u{f13d6}'), // 󱏖 ("md_home_remove", '\u{f1247}'), // 󱉇 ("md_home_remove_outline", '\u{f13d7}'), // 󱏗 ("md_home_roof", '\u{f112b}'), // 󱄫 ("md_home_search", '\u{f13b0}'), // 󱎰 ("md_home_search_outline", '\u{f13b1}'), // 󱎱 ("md_home_switch", '\u{f1794}'), // 󱞔 ("md_home_switch_outline", '\u{f1795}'), // 󱞕 ("md_home_thermometer", '\u{f0f54}'), // 󰽔 ("md_home_thermometer_outline", '\u{f0f55}'), // 󰽕 ("md_home_variant", '\u{f02de}'), // 󰋞 ("md_home_variant_outline", '\u{f0ba7}'), // 󰮧 ("md_hook", '\u{f06e2}'), // 󰛢 ("md_hook_off", '\u{f06e3}'), // 󰛣 ("md_hoop_house", '\u{f0e56}'), // 󰹖 ("md_hops", '\u{f02df}'), // 󰋟 ("md_horizontal_rotate_clockwise", '\u{f10f3}'), // 󱃳 ("md_horizontal_rotate_counterclockwise", '\u{f10f4}'), // 󱃴 ("md_horse", '\u{f15bf}'), // 󱖿 ("md_horse_human", '\u{f15c0}'), // 󱗀 ("md_horse_variant", '\u{f15c1}'), // 󱗁 ("md_horse_variant_fast", '\u{f186e}'), // 󱡮 ("md_horseshoe", '\u{f0a58}'), // 󰩘 ("md_hospital", '\u{f0ff6}'), // 󰿶 ("md_hospital_box", '\u{f02e0}'), // 󰋠 ("md_hospital_box_outline", '\u{f0ff7}'), // 󰿷 ("md_hospital_building", '\u{f02e1}'), // 󰋡 ("md_hospital_marker", '\u{f02e2}'), // 󰋢 ("md_hot_tub", '\u{f0828}'), // 󰠨 ("md_hours_24", '\u{f1478}'), // 󱑸 ("md_hubspot", '\u{f0d17}'), // 󰴗 ("md_hulu", '\u{f0829}'), // 󰠩 ("md_human", '\u{f02e6}'), // 󰋦 ("md_human_baby_changing_table", '\u{f138b}'), // 󱎋 ("md_human_cane", '\u{f1581}'), // 󱖁 ("md_human_capacity_decrease", '\u{f159b}'), // 󱖛 ("md_human_capacity_increase", '\u{f159c}'), // 󱖜 ("md_human_child", '\u{f02e7}'), // 󰋧 ("md_human_dolly", '\u{f1980}'), // 󱦀 ("md_human_edit", '\u{f14e8}'), // 󱓨 ("md_human_female", '\u{f0649}'), // 󰙉 ("md_human_female_boy", '\u{f0a59}'), // 󰩙 ("md_human_female_dance", '\u{f15c9}'), // 󱗉 ("md_human_female_female", '\u{f0a5a}'), // 󰩚 ("md_human_female_girl", '\u{f0a5b}'), // 󰩛 ("md_human_greeting", '\u{f17c4}'), // 󱟄 ("md_human_greeting_proximity", '\u{f159d}'), // 󱖝 ("md_human_greeting_variant", '\u{f064a}'), // 󰙊 ("md_human_handsdown", '\u{f064b}'), // 󰙋 ("md_human_handsup", '\u{f064c}'), // 󰙌 ("md_human_male", '\u{f064d}'), // 󰙍 ("md_human_male_board", '\u{f0890}'), // 󰢐 ("md_human_male_board_poll", '\u{f0846}'), // 󰡆 ("md_human_male_boy", '\u{f0a5c}'), // 󰩜 ("md_human_male_child", '\u{f138c}'), // 󱎌 ("md_human_male_female", '\u{f02e8}'), // 󰋨 ("md_human_male_female_child", '\u{f1823}'), // 󱠣 ("md_human_male_girl", '\u{f0a5d}'), // 󰩝 ("md_human_male_height", '\u{f0efb}'), // 󰻻 ("md_human_male_height_variant", '\u{f0efc}'), // 󰻼 ("md_human_male_male", '\u{f0a5e}'), // 󰩞 ("md_human_non_binary", '\u{f1848}'), // 󱡈 ("md_human_pregnant", '\u{f05cf}'), // 󰗏 ("md_human_queue", '\u{f1571}'), // 󱕱 ("md_human_scooter", '\u{f11e9}'), // 󱇩 ("md_human_wheelchair", '\u{f138d}'), // 󱎍 ("md_human_white_cane", '\u{f1981}'), // 󱦁 ("md_humble_bundle", '\u{f0744}'), // 󰝄 ("md_hvac", '\u{f1352}'), // 󱍒 ("md_hvac_off", '\u{f159e}'), // 󱖞 ("md_hydraulic_oil_level", '\u{f1324}'), // 󱌤 ("md_hydraulic_oil_temperature", '\u{f1325}'), // 󱌥 ("md_hydro_power", '\u{f12e5}'), // 󱋥 ("md_hydrogen_station", '\u{f1894}'), // 󱢔 ("md_ice_cream", '\u{f082a}'), // 󰠪 ("md_ice_cream_off", '\u{f0e52}'), // 󰹒 ("md_ice_pop", '\u{f0efd}'), // 󰻽 ("md_id_card", '\u{f0fc0}'), // 󰿀 ("md_identifier", '\u{f0efe}'), // 󰻾 ("md_ideogram_cjk", '\u{f1331}'), // 󱌱 ("md_ideogram_cjk_variant", '\u{f1332}'), // 󱌲 ("md_image", '\u{f02e9}'), // 󰋩 ("md_image_album", '\u{f02ea}'), // 󰋪 ("md_image_area", '\u{f02eb}'), // 󰋫 ("md_image_area_close", '\u{f02ec}'), // 󰋬 ("md_image_auto_adjust", '\u{f0fc1}'), // 󰿁 ("md_image_broken", '\u{f02ed}'), // 󰋭 ("md_image_broken_variant", '\u{f02ee}'), // 󰋮 ("md_image_edit", '\u{f11e3}'), // 󱇣 ("md_image_edit_outline", '\u{f11e4}'), // 󱇤 ("md_image_filter_black_white", '\u{f02f0}'), // 󰋰 ("md_image_filter_center_focus", '\u{f02f1}'), // 󰋱 ("md_image_filter_center_focus_strong", '\u{f0eff}'), // 󰻿 ("md_image_filter_center_focus_strong_outline", '\u{f0f00}'), // 󰼀 ("md_image_filter_center_focus_weak", '\u{f02f2}'), // 󰋲 ("md_image_filter_drama", '\u{f02f3}'), // 󰋳 ("md_image_filter_frames", '\u{f02f4}'), // 󰋴 ("md_image_filter_hdr", '\u{f02f5}'), // 󰋵 ("md_image_filter_none", '\u{f02f6}'), // 󰋶 ("md_image_filter_tilt_shift", '\u{f02f7}'), // 󰋷 ("md_image_filter_vintage", '\u{f02f8}'), // 󰋸 ("md_image_frame", '\u{f0e49}'), // 󰹉 ("md_image_lock", '\u{f1ab0}'), // 󱪰 ("md_image_lock_outline", '\u{f1ab1}'), // 󱪱 ("md_image_marker", '\u{f177b}'), // 󱝻 ("md_image_marker_outline", '\u{f177c}'), // 󱝼 ("md_image_minus", '\u{f1419}'), // 󱐙 ("md_image_move", '\u{f09f8}'), // 󰧸 ("md_image_multiple", '\u{f02f9}'), // 󰋹 ("md_image_multiple_outline", '\u{f02ef}'), // 󰋯 ("md_image_off", '\u{f082b}'), // 󰠫 ("md_image_off_outline", '\u{f11d1}'), // 󱇑 ("md_image_outline", '\u{f0976}'), // 󰥶 ("md_image_plus", '\u{f087c}'), // 󰡼 ("md_image_refresh", '\u{f19fe}'), // 󱧾 ("md_image_refresh_outline", '\u{f19ff}'), // 󱧿 ("md_image_remove", '\u{f1418}'), // 󱐘 ("md_image_search", '\u{f0977}'), // 󰥷 ("md_image_search_outline", '\u{f0978}'), // 󰥸 ("md_image_size_select_actual", '\u{f0c8d}'), // 󰲍 ("md_image_size_select_large", '\u{f0c8e}'), // 󰲎 ("md_image_size_select_small", '\u{f0c8f}'), // 󰲏 ("md_image_sync", '\u{f1a00}'), // 󱨀 ("md_image_sync_outline", '\u{f1a01}'), // 󱨁 ("md_image_text", '\u{f160d}'), // 󱘍 ("md_import", '\u{f02fa}'), // 󰋺 ("md_inbox", '\u{f0687}'), // 󰚇 ("md_inbox_arrow_down", '\u{f02fb}'), // 󰋻 ("md_inbox_arrow_down_outline", '\u{f1270}'), // 󱉰 ("md_inbox_arrow_up", '\u{f03d1}'), // 󰏑 ("md_inbox_arrow_up_outline", '\u{f1271}'), // 󱉱 ("md_inbox_full", '\u{f1272}'), // 󱉲 ("md_inbox_full_outline", '\u{f1273}'), // 󱉳 ("md_inbox_multiple", '\u{f08b0}'), // 󰢰 ("md_inbox_multiple_outline", '\u{f0ba8}'), // 󰮨 ("md_inbox_outline", '\u{f1274}'), // 󱉴 ("md_inbox_remove", '\u{f159f}'), // 󱖟 ("md_inbox_remove_outline", '\u{f15a0}'), // 󱖠 ("md_incognito", '\u{f05f9}'), // 󰗹 ("md_incognito_circle", '\u{f1421}'), // 󱐡 ("md_incognito_circle_off", '\u{f1422}'), // 󱐢 ("md_incognito_off", '\u{f0075}'), // 󰁵 ("md_induction", '\u{f184c}'), // 󱡌 ("md_infinity", '\u{f06e4}'), // 󰛤 ("md_information", '\u{f02fc}'), // 󰋼 ("md_information_off", '\u{f178c}'), // 󱞌 ("md_information_off_outline", '\u{f178d}'), // 󱞍 ("md_information_outline", '\u{f02fd}'), // 󰋽 ("md_information_variant", '\u{f064e}'), // 󰙎 ("md_instagram", '\u{f02fe}'), // 󰋾 ("md_instrument_triangle", '\u{f104e}'), // 󱁎 ("md_integrated_circuit_chip", '\u{f1913}'), // 󱤓 ("md_invert_colors", '\u{f0301}'), // 󰌁 ("md_invert_colors_off", '\u{f0e4a}'), // 󰹊 ("md_iobroker", '\u{f12e8}'), // 󱋨 ("md_ip", '\u{f0a5f}'), // 󰩟 ("md_ip_network", '\u{f0a60}'), // 󰩠 ("md_ip_network_outline", '\u{f0c90}'), // 󰲐 ("md_ip_outline", '\u{f1982}'), // 󱦂 ("md_ipod", '\u{f0c91}'), // 󰲑 ("md_iron", '\u{f1824}'), // 󱠤 ("md_iron_board", '\u{f1838}'), // 󱠸 ("md_iron_outline", '\u{f1825}'), // 󱠥 ("md_island", '\u{f104f}'), // 󱁏 ("md_iv_bag", '\u{f10b9}'), // 󱂹 ("md_jabber", '\u{f0dd5}'), // 󰷕 ("md_jeepney", '\u{f0302}'), // 󰌂 ("md_jellyfish", '\u{f0f01}'), // 󰼁 ("md_jellyfish_outline", '\u{f0f02}'), // 󰼂 ("md_jira", '\u{f0303}'), // 󰌃 ("md_jquery", '\u{f087d}'), // 󰡽 ("md_jsfiddle", '\u{f0304}'), // 󰌄 ("md_jump_rope", '\u{f12ff}'), // 󱋿 ("md_kabaddi", '\u{f0d87}'), // 󰶇 ("md_kangaroo", '\u{f1558}'), // 󱕘 ("md_karate", '\u{f082c}'), // 󰠬 ("md_kayaking", '\u{f08af}'), // 󰢯 ("md_keg", '\u{f0305}'), // 󰌅 ("md_kettle", '\u{f05fa}'), // 󰗺 ("md_kettle_alert", '\u{f1317}'), // 󱌗 ("md_kettle_alert_outline", '\u{f1318}'), // 󱌘 ("md_kettle_off", '\u{f131b}'), // 󱌛 ("md_kettle_off_outline", '\u{f131c}'), // 󱌜 ("md_kettle_outline", '\u{f0f56}'), // 󰽖 ("md_kettle_pour_over", '\u{f173c}'), // 󱜼 ("md_kettle_steam", '\u{f1319}'), // 󱌙 ("md_kettle_steam_outline", '\u{f131a}'), // 󱌚 ("md_kettlebell", '\u{f1300}'), // 󱌀 ("md_key", '\u{f0306}'), // 󰌆 ("md_key_alert", '\u{f1983}'), // 󱦃 ("md_key_alert_outline", '\u{f1984}'), // 󱦄 ("md_key_arrow_right", '\u{f1312}'), // 󱌒 ("md_key_chain", '\u{f1574}'), // 󱕴 ("md_key_chain_variant", '\u{f1575}'), // 󱕵 ("md_key_change", '\u{f0307}'), // 󰌇 ("md_key_link", '\u{f119f}'), // 󱆟 ("md_key_minus", '\u{f0308}'), // 󰌈 ("md_key_outline", '\u{f0dd6}'), // 󰷖 ("md_key_plus", '\u{f0309}'), // 󰌉 ("md_key_remove", '\u{f030a}'), // 󰌊 ("md_key_star", '\u{f119e}'), // 󱆞 ("md_key_variant", '\u{f030b}'), // 󰌋 ("md_key_wireless", '\u{f0fc2}'), // 󰿂 ("md_keyboard", '\u{f030c}'), // 󰌌 ("md_keyboard_backspace", '\u{f030d}'), // 󰌍 ("md_keyboard_caps", '\u{f030e}'), // 󰌎 ("md_keyboard_close", '\u{f030f}'), // 󰌏 ("md_keyboard_esc", '\u{f12b7}'), // 󱊷 ("md_keyboard_f1", '\u{f12ab}'), // 󱊫 ("md_keyboard_f2", '\u{f12ac}'), // 󱊬 ("md_keyboard_f3", '\u{f12ad}'), // 󱊭 ("md_keyboard_f4", '\u{f12ae}'), // 󱊮 ("md_keyboard_f5", '\u{f12af}'), // 󱊯 ("md_keyboard_f6", '\u{f12b0}'), // 󱊰 ("md_keyboard_f7", '\u{f12b1}'), // 󱊱 ("md_keyboard_f8", '\u{f12b2}'), // 󱊲 ("md_keyboard_f9", '\u{f12b3}'), // 󱊳 ("md_keyboard_f10", '\u{f12b4}'), // 󱊴 ("md_keyboard_f11", '\u{f12b5}'), // 󱊵 ("md_keyboard_f12", '\u{f12b6}'), // 󱊶 ("md_keyboard_off", '\u{f0310}'), // 󰌐 ("md_keyboard_off_outline", '\u{f0e4b}'), // 󰹋 ("md_keyboard_outline", '\u{f097b}'), // 󰥻 ("md_keyboard_return", '\u{f0311}'), // 󰌑 ("md_keyboard_settings", '\u{f09f9}'), // 󰧹 ("md_keyboard_settings_outline", '\u{f09fa}'), // 󰧺 ("md_keyboard_space", '\u{f1050}'), // 󱁐 ("md_keyboard_tab", '\u{f0312}'), // 󰌒 ("md_keyboard_tab_reverse", '\u{f0325}'), // 󰌥 ("md_keyboard_variant", '\u{f0313}'), // 󰌓 ("md_khanda", '\u{f10fd}'), // 󱃽 ("md_kickstarter", '\u{f0745}'), // 󰝅 ("md_kite", '\u{f1985}'), // 󱦅 ("md_kite_outline", '\u{f1986}'), // 󱦆 ("md_kitesurfing", '\u{f1744}'), // 󱝄 ("md_klingon", '\u{f135b}'), // 󱍛 ("md_knife", '\u{f09fb}'), // 󰧻 ("md_knife_military", '\u{f09fc}'), // 󰧼 ("md_koala", '\u{f173f}'), // 󱜿 ("md_kodi", '\u{f0314}'), // 󰌔 ("md_kubernetes", '\u{f10fe}'), // 󱃾 ("md_label", '\u{f0315}'), // 󰌕 ("md_label_multiple", '\u{f1375}'), // 󱍵 ("md_label_multiple_outline", '\u{f1376}'), // 󱍶 ("md_label_off", '\u{f0acb}'), // 󰫋 ("md_label_off_outline", '\u{f0acc}'), // 󰫌 ("md_label_outline", '\u{f0316}'), // 󰌖 ("md_label_percent", '\u{f12ea}'), // 󱋪 ("md_label_percent_outline", '\u{f12eb}'), // 󱋫 ("md_label_variant", '\u{f0acd}'), // 󰫍 ("md_label_variant_outline", '\u{f0ace}'), // 󰫎 ("md_ladder", '\u{f15a2}'), // 󱖢 ("md_ladybug", '\u{f082d}'), // 󰠭 ("md_lambda", '\u{f0627}'), // 󰘧 ("md_lamp", '\u{f06b5}'), // 󰚵 ("md_lamp_outline", '\u{f17d0}'), // 󱟐 ("md_lamps", '\u{f1576}'), // 󱕶 ("md_lamps_outline", '\u{f17d1}'), // 󱟑 ("md_lan", '\u{f0317}'), // 󰌗 ("md_lan_check", '\u{f12aa}'), // 󱊪 ("md_lan_connect", '\u{f0318}'), // 󰌘 ("md_lan_disconnect", '\u{f0319}'), // 󰌙 ("md_lan_pending", '\u{f031a}'), // 󰌚 ("md_land_fields", '\u{f1ab2}'), // 󱪲 ("md_land_plots", '\u{f1ab3}'), // 󱪳 ("md_land_plots_circle", '\u{f1ab4}'), // 󱪴 ("md_land_plots_circle_variant", '\u{f1ab5}'), // 󱪵 ("md_land_rows_horizontal", '\u{f1ab6}'), // 󱪶 ("md_land_rows_vertical", '\u{f1ab7}'), // 󱪷 ("md_landslide", '\u{f1a48}'), // 󱩈 ("md_landslide_outline", '\u{f1a49}'), // 󱩉 ("md_language_c", '\u{f0671}'), // 󰙱 ("md_language_cpp", '\u{f0672}'), // 󰙲 ("md_language_csharp", '\u{f031b}'), // 󰌛 ("md_language_css3", '\u{f031c}'), // 󰌜 ("md_language_fortran", '\u{f121a}'), // 󱈚 ("md_language_go", '\u{f07d3}'), // 󰟓 ("md_language_haskell", '\u{f0c92}'), // 󰲒 ("md_language_html5", '\u{f031d}'), // 󰌝 ("md_language_java", '\u{f0b37}'), // 󰬷 ("md_language_javascript", '\u{f031e}'), // 󰌞 ("md_language_kotlin", '\u{f1219}'), // 󱈙 ("md_language_lua", '\u{f08b1}'), // 󰢱 ("md_language_markdown", '\u{f0354}'), // 󰍔 ("md_language_markdown_outline", '\u{f0f5b}'), // 󰽛 ("md_language_php", '\u{f031f}'), // 󰌟 ("md_language_python", '\u{f0320}'), // 󰌠 ("md_language_r", '\u{f07d4}'), // 󰟔 ("md_language_ruby", '\u{f0d2d}'), // 󰴭 ("md_language_ruby_on_rails", '\u{f0acf}'), // 󰫏 ("md_language_rust", '\u{f1617}'), // 󱘗 ("md_language_swift", '\u{f06e5}'), // 󰛥 ("md_language_typescript", '\u{f06e6}'), // 󰛦 ("md_language_xaml", '\u{f0673}'), // 󰙳 ("md_laptop", '\u{f0322}'), // 󰌢 ("md_laptop_account", '\u{f1a4a}'), // 󱩊 ("md_laptop_off", '\u{f06e7}'), // 󰛧 ("md_laravel", '\u{f0ad0}'), // 󰫐 ("md_laser_pointer", '\u{f1484}'), // 󱒄 ("md_lasso", '\u{f0f03}'), // 󰼃 ("md_lastpass", '\u{f0446}'), // 󰑆 ("md_latitude", '\u{f0f57}'), // 󰽗 ("md_launch", '\u{f0327}'), // 󰌧 ("md_lava_lamp", '\u{f07d5}'), // 󰟕 ("md_layers", '\u{f0328}'), // 󰌨 ("md_layers_edit", '\u{f1892}'), // 󱢒 ("md_layers_minus", '\u{f0e4c}'), // 󰹌 ("md_layers_off", '\u{f0329}'), // 󰌩 ("md_layers_off_outline", '\u{f09fd}'), // 󰧽 ("md_layers_outline", '\u{f09fe}'), // 󰧾 ("md_layers_plus", '\u{f0e4d}'), // 󰹍 ("md_layers_remove", '\u{f0e4e}'), // 󰹎 ("md_layers_search", '\u{f1206}'), // 󱈆 ("md_layers_search_outline", '\u{f1207}'), // 󱈇 ("md_layers_triple", '\u{f0f58}'), // 󰽘 ("md_layers_triple_outline", '\u{f0f59}'), // 󰽙 ("md_lead_pencil", '\u{f064f}'), // 󰙏 ("md_leaf", '\u{f032a}'), // 󰌪 ("md_leaf_circle", '\u{f1905}'), // 󱤅 ("md_leaf_circle_outline", '\u{f1906}'), // 󱤆 ("md_leaf_maple", '\u{f0c93}'), // 󰲓 ("md_leaf_maple_off", '\u{f12da}'), // 󱋚 ("md_leaf_off", '\u{f12d9}'), // 󱋙 ("md_leak", '\u{f0dd7}'), // 󰷗 ("md_leak_off", '\u{f0dd8}'), // 󰷘 ("md_lecturn", '\u{f1af0}'), // 󱫰 ("md_led_off", '\u{f032b}'), // 󰌫 ("md_led_on", '\u{f032c}'), // 󰌬 ("md_led_outline", '\u{f032d}'), // 󰌭 ("md_led_strip", '\u{f07d6}'), // 󰟖 ("md_led_strip_variant", '\u{f1051}'), // 󱁑 ("md_led_strip_variant_off", '\u{f1a4b}'), // 󱩋 ("md_led_variant_off", '\u{f032e}'), // 󰌮 ("md_led_variant_on", '\u{f032f}'), // 󰌯 ("md_led_variant_outline", '\u{f0330}'), // 󰌰 ("md_leek", '\u{f117d}'), // 󱅽 ("md_less_than", '\u{f097c}'), // 󰥼 ("md_less_than_or_equal", '\u{f097d}'), // 󰥽 ("md_library", '\u{f0331}'), // 󰌱 ("md_library_outline", '\u{f1a22}'), // 󱨢 ("md_library_shelves", '\u{f0ba9}'), // 󰮩 ("md_license", '\u{f0fc3}'), // 󰿃 ("md_lifebuoy", '\u{f087e}'), // 󰡾 ("md_light_flood_down", '\u{f1987}'), // 󱦇 ("md_light_flood_up", '\u{f1988}'), // 󱦈 ("md_light_recessed", '\u{f179b}'), // 󱞛 ("md_light_switch", '\u{f097e}'), // 󰥾 ("md_light_switch_off", '\u{f1a24}'), // 󱨤 ("md_lightbulb", '\u{f0335}'), // 󰌵 ("md_lightbulb_alert", '\u{f19e1}'), // 󱧡 ("md_lightbulb_alert_outline", '\u{f19e2}'), // 󱧢 ("md_lightbulb_auto", '\u{f1800}'), // 󱠀 ("md_lightbulb_auto_outline", '\u{f1801}'), // 󱠁 ("md_lightbulb_cfl", '\u{f1208}'), // 󱈈 ("md_lightbulb_cfl_off", '\u{f1209}'), // 󱈉 ("md_lightbulb_cfl_spiral", '\u{f1275}'), // 󱉵 ("md_lightbulb_cfl_spiral_off", '\u{f12c3}'), // 󱋃 ("md_lightbulb_fluorescent_tube", '\u{f1804}'), // 󱠄 ("md_lightbulb_fluorescent_tube_outline", '\u{f1805}'), // 󱠅 ("md_lightbulb_group", '\u{f1253}'), // 󱉓 ("md_lightbulb_group_off", '\u{f12cd}'), // 󱋍 ("md_lightbulb_group_off_outline", '\u{f12ce}'), // 󱋎 ("md_lightbulb_group_outline", '\u{f1254}'), // 󱉔 ("md_lightbulb_multiple", '\u{f1255}'), // 󱉕 ("md_lightbulb_multiple_off", '\u{f12cf}'), // 󱋏 ("md_lightbulb_multiple_off_outline", '\u{f12d0}'), // 󱋐 ("md_lightbulb_multiple_outline", '\u{f1256}'), // 󱉖 ("md_lightbulb_night", '\u{f1a4c}'), // 󱩌 ("md_lightbulb_night_outline", '\u{f1a4d}'), // 󱩍 ("md_lightbulb_off", '\u{f0e4f}'), // 󰹏 ("md_lightbulb_off_outline", '\u{f0e50}'), // 󰹐 ("md_lightbulb_on", '\u{f06e8}'), // 󰛨 ("md_lightbulb_on_10", '\u{f1a4e}'), // 󱩎 ("md_lightbulb_on_20", '\u{f1a4f}'), // 󱩏 ("md_lightbulb_on_30", '\u{f1a50}'), // 󱩐 ("md_lightbulb_on_40", '\u{f1a51}'), // 󱩑 ("md_lightbulb_on_50", '\u{f1a52}'), // 󱩒 ("md_lightbulb_on_60", '\u{f1a53}'), // 󱩓 ("md_lightbulb_on_70", '\u{f1a54}'), // 󱩔 ("md_lightbulb_on_80", '\u{f1a55}'), // 󱩕 ("md_lightbulb_on_90", '\u{f1a56}'), // 󱩖 ("md_lightbulb_on_outline", '\u{f06e9}'), // 󰛩 ("md_lightbulb_outline", '\u{f0336}'), // 󰌶 ("md_lightbulb_question", '\u{f19e3}'), // 󱧣 ("md_lightbulb_question_outline", '\u{f19e4}'), // 󱧤 ("md_lightbulb_spot", '\u{f17f4}'), // 󱟴 ("md_lightbulb_spot_off", '\u{f17f5}'), // 󱟵 ("md_lightbulb_variant", '\u{f1802}'), // 󱠂 ("md_lightbulb_variant_outline", '\u{f1803}'), // 󱠃 ("md_lighthouse", '\u{f09ff}'), // 󰧿 ("md_lighthouse_on", '\u{f0a00}'), // 󰨀 ("md_lightning_bolt", '\u{f140b}'), // 󱐋 ("md_lightning_bolt_circle", '\u{f0820}'), // 󰠠 ("md_lightning_bolt_outline", '\u{f140c}'), // 󱐌 ("md_line_scan", '\u{f0624}'), // 󰘤 ("md_lingerie", '\u{f1476}'), // 󱑶 ("md_link", '\u{f0337}'), // 󰌷 ("md_link_box", '\u{f0d1a}'), // 󰴚 ("md_link_box_outline", '\u{f0d1b}'), // 󰴛 ("md_link_box_variant", '\u{f0d1c}'), // 󰴜 ("md_link_box_variant_outline", '\u{f0d1d}'), // 󰴝 ("md_link_lock", '\u{f10ba}'), // 󱂺 ("md_link_off", '\u{f0338}'), // 󰌸 ("md_link_plus", '\u{f0c94}'), // 󰲔 ("md_link_variant", '\u{f0339}'), // 󰌹 ("md_link_variant_minus", '\u{f10ff}'), // 󱃿 ("md_link_variant_off", '\u{f033a}'), // 󰌺 ("md_link_variant_plus", '\u{f1100}'), // 󱄀 ("md_link_variant_remove", '\u{f1101}'), // 󱄁 ("md_linkedin", '\u{f033b}'), // 󰌻 ("md_linux", '\u{f033d}'), // 󰌽 ("md_linux_mint", '\u{f08ed}'), // 󰣭 ("md_lipstick", '\u{f13b5}'), // 󱎵 ("md_liquid_spot", '\u{f1826}'), // 󱠦 ("md_liquor", '\u{f191e}'), // 󱤞 ("md_list_status", '\u{f15ab}'), // 󱖫 ("md_litecoin", '\u{f0a61}'), // 󰩡 ("md_loading", '\u{f0772}'), // 󰝲 ("md_location_enter", '\u{f0fc4}'), // 󰿄 ("md_location_exit", '\u{f0fc5}'), // 󰿅 ("md_lock", '\u{f033e}'), // 󰌾 ("md_lock_alert", '\u{f08ee}'), // 󰣮 ("md_lock_alert_outline", '\u{f15d1}'), // 󱗑 ("md_lock_check", '\u{f139a}'), // 󱎚 ("md_lock_check_outline", '\u{f16a8}'), // 󱚨 ("md_lock_clock", '\u{f097f}'), // 󰥿 ("md_lock_minus", '\u{f16a9}'), // 󱚩 ("md_lock_minus_outline", '\u{f16aa}'), // 󱚪 ("md_lock_off", '\u{f1671}'), // 󱙱 ("md_lock_off_outline", '\u{f1672}'), // 󱙲 ("md_lock_open", '\u{f033f}'), // 󰌿 ("md_lock_open_alert", '\u{f139b}'), // 󱎛 ("md_lock_open_alert_outline", '\u{f15d2}'), // 󱗒 ("md_lock_open_check", '\u{f139c}'), // 󱎜 ("md_lock_open_check_outline", '\u{f16ab}'), // 󱚫 ("md_lock_open_minus", '\u{f16ac}'), // 󱚬 ("md_lock_open_minus_outline", '\u{f16ad}'), // 󱚭 ("md_lock_open_outline", '\u{f0340}'), // 󰍀 ("md_lock_open_plus", '\u{f16ae}'), // 󱚮 ("md_lock_open_plus_outline", '\u{f16af}'), // 󱚯 ("md_lock_open_remove", '\u{f16b0}'), // 󱚰 ("md_lock_open_remove_outline", '\u{f16b1}'), // 󱚱 ("md_lock_open_variant", '\u{f0fc6}'), // 󰿆 ("md_lock_open_variant_outline", '\u{f0fc7}'), // 󰿇 ("md_lock_outline", '\u{f0341}'), // 󰍁 ("md_lock_pattern", '\u{f06ea}'), // 󰛪 ("md_lock_plus", '\u{f05fb}'), // 󰗻 ("md_lock_plus_outline", '\u{f16b2}'), // 󱚲 ("md_lock_question", '\u{f08ef}'), // 󰣯 ("md_lock_remove", '\u{f16b3}'), // 󱚳 ("md_lock_remove_outline", '\u{f16b4}'), // 󱚴 ("md_lock_reset", '\u{f0773}'), // 󰝳 ("md_lock_smart", '\u{f08b2}'), // 󰢲 ("md_locker", '\u{f07d7}'), // 󰟗 ("md_locker_multiple", '\u{f07d8}'), // 󰟘 ("md_login", '\u{f0342}'), // 󰍂 ("md_logout", '\u{f0343}'), // 󰍃 ("md_logout_variant", '\u{f05fd}'), // 󰗽 ("md_longitude", '\u{f0f5a}'), // 󰽚 ("md_looks", '\u{f0344}'), // 󰍄 ("md_lotion", '\u{f1582}'), // 󱖂 ("md_lotion_outline", '\u{f1583}'), // 󱖃 ("md_lotion_plus", '\u{f1584}'), // 󱖄 ("md_lotion_plus_outline", '\u{f1585}'), // 󱖅 ("md_loupe", '\u{f0345}'), // 󰍅 ("md_lumx", '\u{f0346}'), // 󰍆 ("md_lungs", '\u{f1084}'), // 󱂄 ("md_mace", '\u{f1843}'), // 󱡃 ("md_magazine_pistol", '\u{f0324}'), // 󰌤 ("md_magazine_rifle", '\u{f0323}'), // 󰌣 ("md_magic_staff", '\u{f1844}'), // 󱡄 ("md_magnet", '\u{f0347}'), // 󰍇 ("md_magnet_on", '\u{f0348}'), // 󰍈 ("md_magnify", '\u{f0349}'), // 󰍉 ("md_magnify_close", '\u{f0980}'), // 󰦀 ("md_magnify_expand", '\u{f1874}'), // 󱡴 ("md_magnify_minus", '\u{f034a}'), // 󰍊 ("md_magnify_minus_cursor", '\u{f0a62}'), // 󰩢 ("md_magnify_minus_outline", '\u{f06ec}'), // 󰛬 ("md_magnify_plus", '\u{f034b}'), // 󰍋 ("md_magnify_plus_cursor", '\u{f0a63}'), // 󰩣 ("md_magnify_plus_outline", '\u{f06ed}'), // 󰛭 ("md_magnify_remove_cursor", '\u{f120c}'), // 󱈌 ("md_magnify_remove_outline", '\u{f120d}'), // 󱈍 ("md_magnify_scan", '\u{f1276}'), // 󱉶 ("md_mail", '\u{f0ebb}'), // 󰺻 ("md_mailbox", '\u{f06ee}'), // 󰛮 ("md_mailbox_open", '\u{f0d88}'), // 󰶈 ("md_mailbox_open_outline", '\u{f0d89}'), // 󰶉 ("md_mailbox_open_up", '\u{f0d8a}'), // 󰶊 ("md_mailbox_open_up_outline", '\u{f0d8b}'), // 󰶋 ("md_mailbox_outline", '\u{f0d8c}'), // 󰶌 ("md_mailbox_up", '\u{f0d8d}'), // 󰶍 ("md_mailbox_up_outline", '\u{f0d8e}'), // 󰶎 ("md_manjaro", '\u{f160a}'), // 󱘊 ("md_map", '\u{f034d}'), // 󰍍 ("md_map_check", '\u{f0ebc}'), // 󰺼 ("md_map_check_outline", '\u{f0ebd}'), // 󰺽 ("md_map_clock", '\u{f0d1e}'), // 󰴞 ("md_map_clock_outline", '\u{f0d1f}'), // 󰴟 ("md_map_legend", '\u{f0a01}'), // 󰨁 ("md_map_marker", '\u{f034e}'), // 󰍎 ("md_map_marker_account", '\u{f18e3}'), // 󱣣 ("md_map_marker_account_outline", '\u{f18e4}'), // 󱣤 ("md_map_marker_alert", '\u{f0f05}'), // 󰼅 ("md_map_marker_alert_outline", '\u{f0f06}'), // 󰼆 ("md_map_marker_check", '\u{f0c95}'), // 󰲕 ("md_map_marker_check_outline", '\u{f12fb}'), // 󱋻 ("md_map_marker_circle", '\u{f034f}'), // 󰍏 ("md_map_marker_distance", '\u{f08f0}'), // 󰣰 ("md_map_marker_down", '\u{f1102}'), // 󱄂 ("md_map_marker_left", '\u{f12db}'), // 󱋛 ("md_map_marker_left_outline", '\u{f12dd}'), // 󱋝 ("md_map_marker_minus", '\u{f0650}'), // 󰙐 ("md_map_marker_minus_outline", '\u{f12f9}'), // 󱋹 ("md_map_marker_multiple", '\u{f0350}'), // 󰍐 ("md_map_marker_multiple_outline", '\u{f1277}'), // 󱉷 ("md_map_marker_off", '\u{f0351}'), // 󰍑 ("md_map_marker_off_outline", '\u{f12fd}'), // 󱋽 ("md_map_marker_outline", '\u{f07d9}'), // 󰟙 ("md_map_marker_path", '\u{f0d20}'), // 󰴠 ("md_map_marker_plus", '\u{f0651}'), // 󰙑 ("md_map_marker_plus_outline", '\u{f12f8}'), // 󱋸 ("md_map_marker_question", '\u{f0f07}'), // 󰼇 ("md_map_marker_question_outline", '\u{f0f08}'), // 󰼈 ("md_map_marker_radius", '\u{f0352}'), // 󰍒 ("md_map_marker_radius_outline", '\u{f12fc}'), // 󱋼 ("md_map_marker_remove", '\u{f0f09}'), // 󰼉 ("md_map_marker_remove_outline", '\u{f12fa}'), // 󱋺 ("md_map_marker_remove_variant", '\u{f0f0a}'), // 󰼊 ("md_map_marker_right", '\u{f12dc}'), // 󱋜 ("md_map_marker_right_outline", '\u{f12de}'), // 󱋞 ("md_map_marker_star", '\u{f1608}'), // 󱘈 ("md_map_marker_star_outline", '\u{f1609}'), // 󱘉 ("md_map_marker_up", '\u{f1103}'), // 󱄃 ("md_map_minus", '\u{f0981}'), // 󰦁 ("md_map_outline", '\u{f0982}'), // 󰦂 ("md_map_plus", '\u{f0983}'), // 󰦃 ("md_map_search", '\u{f0984}'), // 󰦄 ("md_map_search_outline", '\u{f0985}'), // 󰦅 ("md_mapbox", '\u{f0baa}'), // 󰮪 ("md_margin", '\u{f0353}'), // 󰍓 ("md_marker", '\u{f0652}'), // 󰙒 ("md_marker_cancel", '\u{f0dd9}'), // 󰷙 ("md_marker_check", '\u{f0355}'), // 󰍕 ("md_mastodon", '\u{f0ad1}'), // 󰫑 ("md_material_design", '\u{f0986}'), // 󰦆 ("md_material_ui", '\u{f0357}'), // 󰍗 ("md_math_compass", '\u{f0358}'), // 󰍘 ("md_math_cos", '\u{f0c96}'), // 󰲖 ("md_math_integral", '\u{f0fc8}'), // 󰿈 ("md_math_integral_box", '\u{f0fc9}'), // 󰿉 ("md_math_log", '\u{f1085}'), // 󱂅 ("md_math_norm", '\u{f0fca}'), // 󰿊 ("md_math_norm_box", '\u{f0fcb}'), // 󰿋 ("md_math_sin", '\u{f0c97}'), // 󰲗 ("md_math_tan", '\u{f0c98}'), // 󰲘 ("md_matrix", '\u{f0628}'), // 󰘨 ("md_medal", '\u{f0987}'), // 󰦇 ("md_medal_outline", '\u{f1326}'), // 󱌦 ("md_medical_bag", '\u{f06ef}'), // 󰛯 ("md_medical_cotton_swab", '\u{f1ab8}'), // 󱪸 ("md_meditation", '\u{f117b}'), // 󱅻 ("md_memory", '\u{f035b}'), // 󰍛 ("md_menorah", '\u{f17d4}'), // 󱟔 ("md_menorah_fire", '\u{f17d5}'), // 󱟕 ("md_menu", '\u{f035c}'), // 󰍜 ("md_menu_down", '\u{f035d}'), // 󰍝 ("md_menu_down_outline", '\u{f06b6}'), // 󰚶 ("md_menu_left", '\u{f035e}'), // 󰍞 ("md_menu_left_outline", '\u{f0a02}'), // 󰨂 ("md_menu_open", '\u{f0bab}'), // 󰮫 ("md_menu_right", '\u{f035f}'), // 󰍟 ("md_menu_right_outline", '\u{f0a03}'), // 󰨃 ("md_menu_swap", '\u{f0a64}'), // 󰩤 ("md_menu_swap_outline", '\u{f0a65}'), // 󰩥 ("md_menu_up", '\u{f0360}'), // 󰍠 ("md_menu_up_outline", '\u{f06b7}'), // 󰚷 ("md_merge", '\u{f0f5c}'), // 󰽜 ("md_message", '\u{f0361}'), // 󰍡 ("md_message_alert", '\u{f0362}'), // 󰍢 ("md_message_alert_outline", '\u{f0a04}'), // 󰨄 ("md_message_arrow_left", '\u{f12f2}'), // 󱋲 ("md_message_arrow_left_outline", '\u{f12f3}'), // 󱋳 ("md_message_arrow_right", '\u{f12f4}'), // 󱋴 ("md_message_arrow_right_outline", '\u{f12f5}'), // 󱋵 ("md_message_badge", '\u{f1941}'), // 󱥁 ("md_message_badge_outline", '\u{f1942}'), // 󱥂 ("md_message_bookmark", '\u{f15ac}'), // 󱖬 ("md_message_bookmark_outline", '\u{f15ad}'), // 󱖭 ("md_message_bulleted", '\u{f06a2}'), // 󰚢 ("md_message_bulleted_off", '\u{f06a3}'), // 󰚣 ("md_message_cog", '\u{f06f1}'), // 󰛱 ("md_message_cog_outline", '\u{f1172}'), // 󱅲 ("md_message_draw", '\u{f0363}'), // 󰍣 ("md_message_fast", '\u{f19cc}'), // 󱧌 ("md_message_fast_outline", '\u{f19cd}'), // 󱧍 ("md_message_flash", '\u{f15a9}'), // 󱖩 ("md_message_flash_outline", '\u{f15aa}'), // 󱖪 ("md_message_image", '\u{f0364}'), // 󰍤 ("md_message_image_outline", '\u{f116c}'), // 󱅬 ("md_message_lock", '\u{f0fcc}'), // 󰿌 ("md_message_lock_outline", '\u{f116d}'), // 󱅭 ("md_message_minus", '\u{f116e}'), // 󱅮 ("md_message_minus_outline", '\u{f116f}'), // 󱅯 ("md_message_off", '\u{f164d}'), // 󱙍 ("md_message_off_outline", '\u{f164e}'), // 󱙎 ("md_message_outline", '\u{f0365}'), // 󰍥 ("md_message_plus", '\u{f0653}'), // 󰙓 ("md_message_plus_outline", '\u{f10bb}'), // 󱂻 ("md_message_processing", '\u{f0366}'), // 󰍦 ("md_message_processing_outline", '\u{f1170}'), // 󱅰 ("md_message_question", '\u{f173a}'), // 󱜺 ("md_message_question_outline", '\u{f173b}'), // 󱜻 ("md_message_reply", '\u{f0367}'), // 󰍧 ("md_message_reply_outline", '\u{f173d}'), // 󱜽 ("md_message_reply_text", '\u{f0368}'), // 󰍨 ("md_message_reply_text_outline", '\u{f173e}'), // 󱜾 ("md_message_settings", '\u{f06f0}'), // 󰛰 ("md_message_settings_outline", '\u{f1171}'), // 󱅱 ("md_message_star", '\u{f069a}'), // 󰚚 ("md_message_star_outline", '\u{f1250}'), // 󱉐 ("md_message_text", '\u{f0369}'), // 󰍩 ("md_message_text_clock", '\u{f1173}'), // 󱅳 ("md_message_text_clock_outline", '\u{f1174}'), // 󱅴 ("md_message_text_fast", '\u{f19ce}'), // 󱧎 ("md_message_text_fast_outline", '\u{f19cf}'), // 󱧏 ("md_message_text_lock", '\u{f0fcd}'), // 󰿍 ("md_message_text_lock_outline", '\u{f1175}'), // 󱅵 ("md_message_text_outline", '\u{f036a}'), // 󰍪 ("md_message_video", '\u{f036b}'), // 󰍫 ("md_meteor", '\u{f0629}'), // 󰘩 ("md_meter_electric", '\u{f1a57}'), // 󱩗 ("md_meter_electric_outline", '\u{f1a58}'), // 󱩘 ("md_meter_gas", '\u{f1a59}'), // 󱩙 ("md_meter_gas_outline", '\u{f1a5a}'), // 󱩚 ("md_metronome", '\u{f07da}'), // 󰟚 ("md_metronome_tick", '\u{f07db}'), // 󰟛 ("md_micro_sd", '\u{f07dc}'), // 󰟜 ("md_microphone", '\u{f036c}'), // 󰍬 ("md_microphone_minus", '\u{f08b3}'), // 󰢳 ("md_microphone_off", '\u{f036d}'), // 󰍭 ("md_microphone_outline", '\u{f036e}'), // 󰍮 ("md_microphone_plus", '\u{f08b4}'), // 󰢴 ("md_microphone_question", '\u{f1989}'), // 󱦉 ("md_microphone_question_outline", '\u{f198a}'), // 󱦊 ("md_microphone_settings", '\u{f036f}'), // 󰍯 ("md_microphone_variant", '\u{f0370}'), // 󰍰 ("md_microphone_variant_off", '\u{f0371}'), // 󰍱 ("md_microscope", '\u{f0654}'), // 󰙔 ("md_microsoft", '\u{f0372}'), // 󰍲 ("md_microsoft_access", '\u{f138e}'), // 󱎎 ("md_microsoft_azure", '\u{f0805}'), // 󰠅 ("md_microsoft_azure_devops", '\u{f0fd5}'), // 󰿕 ("md_microsoft_bing", '\u{f00a4}'), // 󰂤 ("md_microsoft_dynamics_365", '\u{f0988}'), // 󰦈 ("md_microsoft_edge", '\u{f01e9}'), // 󰇩 ("md_microsoft_excel", '\u{f138f}'), // 󱎏 ("md_microsoft_internet_explorer", '\u{f0300}'), // 󰌀 ("md_microsoft_office", '\u{f03c6}'), // 󰏆 ("md_microsoft_onedrive", '\u{f03ca}'), // 󰏊 ("md_microsoft_onenote", '\u{f0747}'), // 󰝇 ("md_microsoft_outlook", '\u{f0d22}'), // 󰴢 ("md_microsoft_powerpoint", '\u{f1390}'), // 󱎐 ("md_microsoft_sharepoint", '\u{f1391}'), // 󱎑 ("md_microsoft_teams", '\u{f02bb}'), // 󰊻 ("md_microsoft_visual_studio", '\u{f0610}'), // 󰘐 ("md_microsoft_visual_studio_code", '\u{f0a1e}'), // 󰨞 ("md_microsoft_windows", '\u{f05b3}'), // 󰖳 ("md_microsoft_windows_classic", '\u{f0a21}'), // 󰨡 ("md_microsoft_word", '\u{f1392}'), // 󱎒 ("md_microsoft_xbox", '\u{f05b9}'), // 󰖹 ("md_microsoft_xbox_controller", '\u{f05ba}'), // 󰖺 ("md_microsoft_xbox_controller_battery_alert", '\u{f074b}'), // 󰝋 ("md_microsoft_xbox_controller_battery_charging", '\u{f0a22}'), // 󰨢 ("md_microsoft_xbox_controller_battery_empty", '\u{f074c}'), // 󰝌 ("md_microsoft_xbox_controller_battery_full", '\u{f074d}'), // 󰝍 ("md_microsoft_xbox_controller_battery_low", '\u{f074e}'), // 󰝎 ("md_microsoft_xbox_controller_battery_medium", '\u{f074f}'), // 󰝏 ("md_microsoft_xbox_controller_battery_unknown", '\u{f0750}'), // 󰝐 ("md_microsoft_xbox_controller_menu", '\u{f0e6f}'), // 󰹯 ("md_microsoft_xbox_controller_off", '\u{f05bb}'), // 󰖻 ("md_microsoft_xbox_controller_view", '\u{f0e70}'), // 󰹰 ("md_microwave", '\u{f0c99}'), // 󰲙 ("md_microwave_off", '\u{f1423}'), // 󱐣 ("md_middleware", '\u{f0f5d}'), // 󰽝 ("md_middleware_outline", '\u{f0f5e}'), // 󰽞 ("md_midi", '\u{f08f1}'), // 󰣱 ("md_midi_port", '\u{f08f2}'), // 󰣲 ("md_mine", '\u{f0dda}'), // 󰷚 ("md_minecraft", '\u{f0373}'), // 󰍳 ("md_mini_sd", '\u{f0a05}'), // 󰨅 ("md_minidisc", '\u{f0a06}'), // 󰨆 ("md_minus", '\u{f0374}'), // 󰍴 ("md_minus_box", '\u{f0375}'), // 󰍵 ("md_minus_box_multiple", '\u{f1141}'), // 󱅁 ("md_minus_box_multiple_outline", '\u{f1142}'), // 󱅂 ("md_minus_box_outline", '\u{f06f2}'), // 󰛲 ("md_minus_circle", '\u{f0376}'), // 󰍶 ("md_minus_circle_multiple", '\u{f035a}'), // 󰍚 ("md_minus_circle_multiple_outline", '\u{f0ad3}'), // 󰫓 ("md_minus_circle_off", '\u{f1459}'), // 󱑙 ("md_minus_circle_off_outline", '\u{f145a}'), // 󱑚 ("md_minus_circle_outline", '\u{f0377}'), // 󰍷 ("md_minus_network", '\u{f0378}'), // 󰍸 ("md_minus_network_outline", '\u{f0c9a}'), // 󰲚 ("md_minus_thick", '\u{f1639}'), // 󱘹 ("md_mirror", '\u{f11fd}'), // 󱇽 ("md_mirror_rectangle", '\u{f179f}'), // 󱞟 ("md_mirror_variant", '\u{f17a0}'), // 󱞠 ("md_mixed_martial_arts", '\u{f0d8f}'), // 󰶏 ("md_mixed_reality", '\u{f087f}'), // 󰡿 ("md_molecule", '\u{f0bac}'), // 󰮬 ("md_molecule_co", '\u{f12fe}'), // 󱋾 ("md_molecule_co2", '\u{f07e4}'), // 󰟤 ("md_monitor", '\u{f0379}'), // 󰍹 ("md_monitor_account", '\u{f1a5b}'), // 󱩛 ("md_monitor_arrow_down", '\u{f19d0}'), // 󱧐 ("md_monitor_arrow_down_variant", '\u{f19d1}'), // 󱧑 ("md_monitor_cellphone", '\u{f0989}'), // 󰦉 ("md_monitor_cellphone_star", '\u{f098a}'), // 󰦊 ("md_monitor_dashboard", '\u{f0a07}'), // 󰨇 ("md_monitor_edit", '\u{f12c6}'), // 󱋆 ("md_monitor_eye", '\u{f13b4}'), // 󱎴 ("md_monitor_lock", '\u{f0ddb}'), // 󰷛 ("md_monitor_multiple", '\u{f037a}'), // 󰍺 ("md_monitor_off", '\u{f0d90}'), // 󰶐 ("md_monitor_screenshot", '\u{f0e51}'), // 󰹑 ("md_monitor_share", '\u{f1483}'), // 󱒃 ("md_monitor_shimmer", '\u{f1104}'), // 󱄄 ("md_monitor_small", '\u{f1876}'), // 󱡶 ("md_monitor_speaker", '\u{f0f5f}'), // 󰽟 ("md_monitor_speaker_off", '\u{f0f60}'), // 󰽠 ("md_monitor_star", '\u{f0ddc}'), // 󰷜 ("md_moon_first_quarter", '\u{f0f61}'), // 󰽡 ("md_moon_full", '\u{f0f62}'), // 󰽢 ("md_moon_last_quarter", '\u{f0f63}'), // 󰽣 ("md_moon_new", '\u{f0f64}'), // 󰽤 ("md_moon_waning_crescent", '\u{f0f65}'), // 󰽥 ("md_moon_waning_gibbous", '\u{f0f66}'), // 󰽦 ("md_moon_waxing_crescent", '\u{f0f67}'), // 󰽧 ("md_moon_waxing_gibbous", '\u{f0f68}'), // 󰽨 ("md_moped", '\u{f1086}'), // 󱂆 ("md_moped_electric", '\u{f15b7}'), // 󱖷 ("md_moped_electric_outline", '\u{f15b8}'), // 󱖸 ("md_moped_outline", '\u{f15b9}'), // 󱖹 ("md_more", '\u{f037b}'), // 󰍻 ("md_mortar_pestle", '\u{f1748}'), // 󱝈 ("md_mortar_pestle_plus", '\u{f03f1}'), // 󰏱 ("md_mosque", '\u{f1827}'), // 󱠧 ("md_mother_heart", '\u{f1314}'), // 󱌔 ("md_mother_nurse", '\u{f0d21}'), // 󰴡 ("md_motion", '\u{f15b2}'), // 󱖲 ("md_motion_outline", '\u{f15b3}'), // 󱖳 ("md_motion_pause", '\u{f1590}'), // 󱖐 ("md_motion_pause_outline", '\u{f1592}'), // 󱖒 ("md_motion_play", '\u{f158f}'), // 󱖏 ("md_motion_play_outline", '\u{f1591}'), // 󱖑 ("md_motion_sensor", '\u{f0d91}'), // 󰶑 ("md_motion_sensor_off", '\u{f1435}'), // 󱐵 ("md_motorbike", '\u{f037c}'), // 󰍼 ("md_motorbike_electric", '\u{f15ba}'), // 󱖺 ("md_mouse", '\u{f037d}'), // 󰍽 ("md_mouse_bluetooth", '\u{f098b}'), // 󰦋 ("md_mouse_move_down", '\u{f1550}'), // 󱕐 ("md_mouse_move_up", '\u{f1551}'), // 󱕑 ("md_mouse_move_vertical", '\u{f1552}'), // 󱕒 ("md_mouse_off", '\u{f037e}'), // 󰍾 ("md_mouse_variant", '\u{f037f}'), // 󰍿 ("md_mouse_variant_off", '\u{f0380}'), // 󰎀 ("md_move_resize", '\u{f0655}'), // 󰙕 ("md_move_resize_variant", '\u{f0656}'), // 󰙖 ("md_movie", '\u{f0381}'), // 󰎁 ("md_movie_check", '\u{f16f3}'), // 󱛳 ("md_movie_check_outline", '\u{f16f4}'), // 󱛴 ("md_movie_cog", '\u{f16f5}'), // 󱛵 ("md_movie_cog_outline", '\u{f16f6}'), // 󱛶 ("md_movie_edit", '\u{f1122}'), // 󱄢 ("md_movie_edit_outline", '\u{f1123}'), // 󱄣 ("md_movie_filter", '\u{f1124}'), // 󱄤 ("md_movie_filter_outline", '\u{f1125}'), // 󱄥 ("md_movie_minus", '\u{f16f7}'), // 󱛷 ("md_movie_minus_outline", '\u{f16f8}'), // 󱛸 ("md_movie_off", '\u{f16f9}'), // 󱛹 ("md_movie_off_outline", '\u{f16fa}'), // 󱛺 ("md_movie_open", '\u{f0fce}'), // 󰿎 ("md_movie_open_check", '\u{f16fb}'), // 󱛻 ("md_movie_open_check_outline", '\u{f16fc}'), // 󱛼 ("md_movie_open_cog", '\u{f16fd}'), // 󱛽 ("md_movie_open_cog_outline", '\u{f16fe}'), // 󱛾 ("md_movie_open_edit", '\u{f16ff}'), // 󱛿 ("md_movie_open_edit_outline", '\u{f1700}'), // 󱜀 ("md_movie_open_minus", '\u{f1701}'), // 󱜁 ("md_movie_open_minus_outline", '\u{f1702}'), // 󱜂 ("md_movie_open_off", '\u{f1703}'), // 󱜃 ("md_movie_open_off_outline", '\u{f1704}'), // 󱜄 ("md_movie_open_outline", '\u{f0fcf}'), // 󰿏 ("md_movie_open_play", '\u{f1705}'), // 󱜅 ("md_movie_open_play_outline", '\u{f1706}'), // 󱜆 ("md_movie_open_plus", '\u{f1707}'), // 󱜇 ("md_movie_open_plus_outline", '\u{f1708}'), // 󱜈 ("md_movie_open_remove", '\u{f1709}'), // 󱜉 ("md_movie_open_remove_outline", '\u{f170a}'), // 󱜊 ("md_movie_open_settings", '\u{f170b}'), // 󱜋 ("md_movie_open_settings_outline", '\u{f170c}'), // 󱜌 ("md_movie_open_star", '\u{f170d}'), // 󱜍 ("md_movie_open_star_outline", '\u{f170e}'), // 󱜎 ("md_movie_outline", '\u{f0ddd}'), // 󰷝 ("md_movie_play", '\u{f170f}'), // 󱜏 ("md_movie_play_outline", '\u{f1710}'), // 󱜐 ("md_movie_plus", '\u{f1711}'), // 󱜑 ("md_movie_plus_outline", '\u{f1712}'), // 󱜒 ("md_movie_remove", '\u{f1713}'), // 󱜓 ("md_movie_remove_outline", '\u{f1714}'), // 󱜔 ("md_movie_roll", '\u{f07de}'), // 󰟞 ("md_movie_search", '\u{f11d2}'), // 󱇒 ("md_movie_search_outline", '\u{f11d3}'), // 󱇓 ("md_movie_settings", '\u{f1715}'), // 󱜕 ("md_movie_settings_outline", '\u{f1716}'), // 󱜖 ("md_movie_star", '\u{f1717}'), // 󱜗 ("md_movie_star_outline", '\u{f1718}'), // 󱜘 ("md_mower", '\u{f166f}'), // 󱙯 ("md_mower_bag", '\u{f1670}'), // 󱙰 ("md_muffin", '\u{f098c}'), // 󰦌 ("md_multicast", '\u{f1893}'), // 󱢓 ("md_multiplication", '\u{f0382}'), // 󰎂 ("md_multiplication_box", '\u{f0383}'), // 󰎃 ("md_mushroom", '\u{f07df}'), // 󰟟 ("md_mushroom_off", '\u{f13fa}'), // 󱏺 ("md_mushroom_off_outline", '\u{f13fb}'), // 󱏻 ("md_mushroom_outline", '\u{f07e0}'), // 󰟠 ("md_music", '\u{f075a}'), // 󰝚 ("md_music_accidental_double_flat", '\u{f0f69}'), // 󰽩 ("md_music_accidental_double_sharp", '\u{f0f6a}'), // 󰽪 ("md_music_accidental_flat", '\u{f0f6b}'), // 󰽫 ("md_music_accidental_natural", '\u{f0f6c}'), // 󰽬 ("md_music_accidental_sharp", '\u{f0f6d}'), // 󰽭 ("md_music_box", '\u{f0384}'), // 󰎄 ("md_music_box_multiple", '\u{f0333}'), // 󰌳 ("md_music_box_multiple_outline", '\u{f0f04}'), // 󰼄 ("md_music_box_outline", '\u{f0385}'), // 󰎅 ("md_music_circle", '\u{f0386}'), // 󰎆 ("md_music_circle_outline", '\u{f0ad4}'), // 󰫔 ("md_music_clef_alto", '\u{f0f6e}'), // 󰽮 ("md_music_clef_bass", '\u{f0f6f}'), // 󰽯 ("md_music_clef_treble", '\u{f0f70}'), // 󰽰 ("md_music_note", '\u{f0387}'), // 󰎇 ("md_music_note_bluetooth", '\u{f05fe}'), // 󰗾 ("md_music_note_bluetooth_off", '\u{f05ff}'), // 󰗿 ("md_music_note_eighth_dotted", '\u{f0f71}'), // 󰽱 ("md_music_note_half", '\u{f0389}'), // 󰎉 ("md_music_note_half_dotted", '\u{f0f72}'), // 󰽲 ("md_music_note_off", '\u{f038a}'), // 󰎊 ("md_music_note_off_outline", '\u{f0f73}'), // 󰽳 ("md_music_note_outline", '\u{f0f74}'), // 󰽴 ("md_music_note_plus", '\u{f0dde}'), // 󰷞 ("md_music_note_quarter", '\u{f038b}'), // 󰎋 ("md_music_note_quarter_dotted", '\u{f0f75}'), // 󰽵 ("md_music_note_sixteenth", '\u{f038c}'), // 󰎌 ("md_music_note_sixteenth_dotted", '\u{f0f76}'), // 󰽶 ("md_music_note_whole", '\u{f038d}'), // 󰎍 ("md_music_note_whole_dotted", '\u{f0f77}'), // 󰽷 ("md_music_off", '\u{f075b}'), // 󰝛 ("md_music_rest_eighth", '\u{f0f78}'), // 󰽸 ("md_music_rest_half", '\u{f0f79}'), // 󰽹 ("md_music_rest_quarter", '\u{f0f7a}'), // 󰽺 ("md_music_rest_sixteenth", '\u{f0f7b}'), // 󰽻 ("md_music_rest_whole", '\u{f0f7c}'), // 󰽼 ("md_mustache", '\u{f15de}'), // 󱗞 ("md_nail", '\u{f0ddf}'), // 󰷟 ("md_nas", '\u{f08f3}'), // 󰣳 ("md_nativescript", '\u{f0880}'), // 󰢀 ("md_nature", '\u{f038e}'), // 󰎎 ("md_nature_people", '\u{f038f}'), // 󰎏 ("md_navigation", '\u{f0390}'), // 󰎐 ("md_navigation_outline", '\u{f1607}'), // 󱘇 ("md_navigation_variant_outline", '\u{f18f1}'), // 󱣱 ("md_near_me", '\u{f05cd}'), // 󰗍 ("md_necklace", '\u{f0f0b}'), // 󰼋 ("md_needle", '\u{f0391}'), // 󰎑 ("md_needle_off", '\u{f19d2}'), // 󱧒 ("md_netflix", '\u{f0746}'), // 󰝆 ("md_network", '\u{f06f3}'), // 󰛳 ("md_network_off", '\u{f0c9b}'), // 󰲛 ("md_network_off_outline", '\u{f0c9c}'), // 󰲜 ("md_network_outline", '\u{f0c9d}'), // 󰲝 ("md_network_pos", '\u{f1acb}'), // 󱫋 ("md_network_strength_1", '\u{f08f4}'), // 󰣴 ("md_network_strength_1_alert", '\u{f08f5}'), // 󰣵 ("md_network_strength_2", '\u{f08f6}'), // 󰣶 ("md_network_strength_2_alert", '\u{f08f7}'), // 󰣷 ("md_network_strength_3", '\u{f08f8}'), // 󰣸 ("md_network_strength_3_alert", '\u{f08f9}'), // 󰣹 ("md_network_strength_4", '\u{f08fa}'), // 󰣺 ("md_network_strength_4_alert", '\u{f08fb}'), // 󰣻 ("md_network_strength_4_cog", '\u{f191a}'), // 󱤚 ("md_network_strength_off", '\u{f08fc}'), // 󰣼 ("md_network_strength_off_outline", '\u{f08fd}'), // 󰣽 ("md_network_strength_outline", '\u{f08fe}'), // 󰣾 ("md_new_box", '\u{f0394}'), // 󰎔 ("md_newspaper", '\u{f0395}'), // 󰎕 ("md_newspaper_check", '\u{f1943}'), // 󱥃 ("md_newspaper_minus", '\u{f0f0c}'), // 󰼌 ("md_newspaper_plus", '\u{f0f0d}'), // 󰼍 ("md_newspaper_remove", '\u{f1944}'), // 󱥄 ("md_newspaper_variant", '\u{f1001}'), // 󱀁 ("md_newspaper_variant_multiple", '\u{f1002}'), // 󱀂 ("md_newspaper_variant_multiple_outline", '\u{f1003}'), // 󱀃 ("md_newspaper_variant_outline", '\u{f1004}'), // 󱀄 ("md_nfc", '\u{f0396}'), // 󰎖 ("md_nfc_search_variant", '\u{f0e53}'), // 󰹓 ("md_nfc_tap", '\u{f0397}'), // 󰎗 ("md_nfc_variant", '\u{f0398}'), // 󰎘 ("md_nfc_variant_off", '\u{f0e54}'), // 󰹔 ("md_ninja", '\u{f0774}'), // 󰝴 ("md_nintendo_game_boy", '\u{f1393}'), // 󱎓 ("md_nintendo_switch", '\u{f07e1}'), // 󰟡 ("md_nintendo_wii", '\u{f05ab}'), // 󰖫 ("md_nintendo_wiiu", '\u{f072d}'), // 󰜭 ("md_nix", '\u{f1105}'), // 󱄅 ("md_nodejs", '\u{f0399}'), // 󰎙 ("md_noodles", '\u{f117e}'), // 󱅾 ("md_not_equal", '\u{f098d}'), // 󰦍 ("md_not_equal_variant", '\u{f098e}'), // 󰦎 ("md_note", '\u{f039a}'), // 󰎚 ("md_note_alert", '\u{f177d}'), // 󱝽 ("md_note_alert_outline", '\u{f177e}'), // 󱝾 ("md_note_check", '\u{f177f}'), // 󱝿 ("md_note_check_outline", '\u{f1780}'), // 󱞀 ("md_note_edit", '\u{f1781}'), // 󱞁 ("md_note_edit_outline", '\u{f1782}'), // 󱞂 ("md_note_minus", '\u{f164f}'), // 󱙏 ("md_note_minus_outline", '\u{f1650}'), // 󱙐 ("md_note_multiple", '\u{f06b8}'), // 󰚸 ("md_note_multiple_outline", '\u{f06b9}'), // 󰚹 ("md_note_off", '\u{f1783}'), // 󱞃 ("md_note_off_outline", '\u{f1784}'), // 󱞄 ("md_note_outline", '\u{f039b}'), // 󰎛 ("md_note_plus", '\u{f039c}'), // 󰎜 ("md_note_plus_outline", '\u{f039d}'), // 󰎝 ("md_note_remove", '\u{f1651}'), // 󱙑 ("md_note_remove_outline", '\u{f1652}'), // 󱙒 ("md_note_search", '\u{f1653}'), // 󱙓 ("md_note_search_outline", '\u{f1654}'), // 󱙔 ("md_note_text", '\u{f039e}'), // 󰎞 ("md_note_text_outline", '\u{f11d7}'), // 󱇗 ("md_notebook", '\u{f082e}'), // 󰠮 ("md_notebook_check", '\u{f14f5}'), // 󱓵 ("md_notebook_check_outline", '\u{f14f6}'), // 󱓶 ("md_notebook_edit", '\u{f14e7}'), // 󱓧 ("md_notebook_edit_outline", '\u{f14e9}'), // 󱓩 ("md_notebook_heart", '\u{f1a0b}'), // 󱨋 ("md_notebook_heart_outline", '\u{f1a0c}'), // 󱨌 ("md_notebook_minus", '\u{f1610}'), // 󱘐 ("md_notebook_minus_outline", '\u{f1611}'), // 󱘑 ("md_notebook_multiple", '\u{f0e55}'), // 󰹕 ("md_notebook_outline", '\u{f0ebf}'), // 󰺿 ("md_notebook_plus", '\u{f1612}'), // 󱘒 ("md_notebook_plus_outline", '\u{f1613}'), // 󱘓 ("md_notebook_remove", '\u{f1614}'), // 󱘔 ("md_notebook_remove_outline", '\u{f1615}'), // 󱘕 ("md_notification_clear_all", '\u{f039f}'), // 󰎟 ("md_npm", '\u{f06f7}'), // 󰛷 ("md_nuke", '\u{f06a4}'), // 󰚤 ("md_null", '\u{f07e2}'), // 󰟢 ("md_numeric", '\u{f03a0}'), // 󰎠 ("md_numeric_0_box", '\u{f03a1}'), // 󰎡 ("md_numeric_0_box_multiple", '\u{f0f0e}'), // 󰼎 ("md_numeric_0_box_multiple_outline", '\u{f03a2}'), // 󰎢 ("md_numeric_0_box_outline", '\u{f03a3}'), // 󰎣 ("md_numeric_1", '\u{f0b3a}'), // 󰬺 ("md_numeric_1_box", '\u{f03a4}'), // 󰎤 ("md_numeric_1_box_multiple", '\u{f0f0f}'), // 󰼏 ("md_numeric_1_box_multiple_outline", '\u{f03a5}'), // 󰎥 ("md_numeric_1_box_outline", '\u{f03a6}'), // 󰎦 ("md_numeric_1_circle", '\u{f0ca0}'), // 󰲠 ("md_numeric_1_circle_outline", '\u{f0ca1}'), // 󰲡 ("md_numeric_2", '\u{f0b3b}'), // 󰬻 ("md_numeric_2_box", '\u{f03a7}'), // 󰎧 ("md_numeric_2_box_multiple", '\u{f0f10}'), // 󰼐 ("md_numeric_2_box_multiple_outline", '\u{f03a8}'), // 󰎨 ("md_numeric_2_box_outline", '\u{f03a9}'), // 󰎩 ("md_numeric_2_circle", '\u{f0ca2}'), // 󰲢 ("md_numeric_2_circle_outline", '\u{f0ca3}'), // 󰲣 ("md_numeric_3", '\u{f0b3c}'), // 󰬼 ("md_numeric_3_box", '\u{f03aa}'), // 󰎪 ("md_numeric_3_box_multiple", '\u{f0f11}'), // 󰼑 ("md_numeric_3_box_multiple_outline", '\u{f03ab}'), // 󰎫 ("md_numeric_3_box_outline", '\u{f03ac}'), // 󰎬 ("md_numeric_3_circle", '\u{f0ca4}'), // 󰲤 ("md_numeric_3_circle_outline", '\u{f0ca5}'), // 󰲥 ("md_numeric_4", '\u{f0b3d}'), // 󰬽 ("md_numeric_4_box", '\u{f03ad}'), // 󰎭 ("md_numeric_4_box_multiple", '\u{f0f12}'), // 󰼒 ("md_numeric_4_box_multiple_outline", '\u{f03b2}'), // 󰎲 ("md_numeric_4_box_outline", '\u{f03ae}'), // 󰎮 ("md_numeric_4_circle", '\u{f0ca6}'), // 󰲦 ("md_numeric_4_circle_outline", '\u{f0ca7}'), // 󰲧 ("md_numeric_5", '\u{f0b3e}'), // 󰬾 ("md_numeric_5_box", '\u{f03b1}'), // 󰎱 ("md_numeric_5_box_multiple", '\u{f0f13}'), // 󰼓 ("md_numeric_5_box_multiple_outline", '\u{f03af}'), // 󰎯 ("md_numeric_5_box_outline", '\u{f03b0}'), // 󰎰 ("md_numeric_5_circle", '\u{f0ca8}'), // 󰲨 ("md_numeric_5_circle_outline", '\u{f0ca9}'), // 󰲩 ("md_numeric_6", '\u{f0b3f}'), // 󰬿 ("md_numeric_6_box", '\u{f03b3}'), // 󰎳 ("md_numeric_6_box_multiple", '\u{f0f14}'), // 󰼔 ("md_numeric_6_box_multiple_outline", '\u{f03b4}'), // 󰎴 ("md_numeric_6_box_outline", '\u{f03b5}'), // 󰎵 ("md_numeric_6_circle", '\u{f0caa}'), // 󰲪 ("md_numeric_6_circle_outline", '\u{f0cab}'), // 󰲫 ("md_numeric_7", '\u{f0b40}'), // 󰭀 ("md_numeric_7_box", '\u{f03b6}'), // 󰎶 ("md_numeric_7_box_multiple", '\u{f0f15}'), // 󰼕 ("md_numeric_7_box_multiple_outline", '\u{f03b7}'), // 󰎷 ("md_numeric_7_box_outline", '\u{f03b8}'), // 󰎸 ("md_numeric_7_circle", '\u{f0cac}'), // 󰲬 ("md_numeric_7_circle_outline", '\u{f0cad}'), // 󰲭 ("md_numeric_8", '\u{f0b41}'), // 󰭁 ("md_numeric_8_box", '\u{f03b9}'), // 󰎹 ("md_numeric_8_box_multiple", '\u{f0f16}'), // 󰼖 ("md_numeric_8_box_multiple_outline", '\u{f03ba}'), // 󰎺 ("md_numeric_8_box_outline", '\u{f03bb}'), // 󰎻 ("md_numeric_8_circle", '\u{f0cae}'), // 󰲮 ("md_numeric_8_circle_outline", '\u{f0caf}'), // 󰲯 ("md_numeric_9", '\u{f0b42}'), // 󰭂 ("md_numeric_9_box", '\u{f03bc}'), // 󰎼 ("md_numeric_9_box_multiple", '\u{f0f17}'), // 󰼗 ("md_numeric_9_box_multiple_outline", '\u{f03bd}'), // 󰎽 ("md_numeric_9_box_outline", '\u{f03be}'), // 󰎾 ("md_numeric_9_circle", '\u{f0cb0}'), // 󰲰 ("md_numeric_9_circle_outline", '\u{f0cb1}'), // 󰲱 ("md_numeric_9_plus", '\u{f0fee}'), // 󰿮 ("md_numeric_9_plus_box", '\u{f03bf}'), // 󰎿 ("md_numeric_9_plus_box_multiple", '\u{f0f18}'), // 󰼘 ("md_numeric_9_plus_box_multiple_outline", '\u{f03c0}'), // 󰏀 ("md_numeric_9_plus_box_outline", '\u{f03c1}'), // 󰏁 ("md_numeric_9_plus_circle", '\u{f0cb2}'), // 󰲲 ("md_numeric_9_plus_circle_outline", '\u{f0cb3}'), // 󰲳 ("md_numeric_10", '\u{f0fe9}'), // 󰿩 ("md_numeric_10_box", '\u{f0f7d}'), // 󰽽 ("md_numeric_10_box_multiple", '\u{f0fea}'), // 󰿪 ("md_numeric_10_box_multiple_outline", '\u{f0feb}'), // 󰿫 ("md_numeric_10_box_outline", '\u{f0f7e}'), // 󰽾 ("md_numeric_10_circle", '\u{f0fec}'), // 󰿬 ("md_numeric_10_circle_outline", '\u{f0fed}'), // 󰿭 ("md_numeric_negative_1", '\u{f1052}'), // 󱁒 ("md_numeric_off", '\u{f19d3}'), // 󱧓 ("md_numeric_positive_1", '\u{f15cb}'), // 󱗋 ("md_nut", '\u{f06f8}'), // 󰛸 ("md_nutrition", '\u{f03c2}'), // 󰏂 ("md_nuxt", '\u{f1106}'), // 󱄆 ("md_oar", '\u{f067c}'), // 󰙼 ("md_ocarina", '\u{f0de0}'), // 󰷠 ("md_oci", '\u{f12e9}'), // 󱋩 ("md_ocr", '\u{f113a}'), // 󱄺 ("md_octagon", '\u{f03c3}'), // 󰏃 ("md_octagon_outline", '\u{f03c4}'), // 󰏄 ("md_octagram", '\u{f06f9}'), // 󰛹 ("md_octagram_outline", '\u{f0775}'), // 󰝵 ("md_octahedron", '\u{f1950}'), // 󱥐 ("md_octahedron_off", '\u{f1951}'), // 󱥑 ("md_odnoklassniki", '\u{f03c5}'), // 󰏅 ("md_offer", '\u{f121b}'), // 󱈛 ("md_office_building", '\u{f0991}'), // 󰦑 ("md_office_building_cog", '\u{f1949}'), // 󱥉 ("md_office_building_cog_outline", '\u{f194a}'), // 󱥊 ("md_office_building_marker", '\u{f1520}'), // 󱔠 ("md_office_building_marker_outline", '\u{f1521}'), // 󱔡 ("md_office_building_outline", '\u{f151f}'), // 󱔟 ("md_oil", '\u{f03c7}'), // 󰏇 ("md_oil_lamp", '\u{f0f19}'), // 󰼙 ("md_oil_level", '\u{f1053}'), // 󱁓 ("md_oil_temperature", '\u{f0ff8}'), // 󰿸 ("md_om", '\u{f0973}'), // 󰥳 ("md_omega", '\u{f03c9}'), // 󰏉 ("md_one_up", '\u{f0bad}'), // 󰮭 ("md_onepassword", '\u{f0881}'), // 󰢁 ("md_opacity", '\u{f05cc}'), // 󰗌 ("md_open_in_app", '\u{f03cb}'), // 󰏋 ("md_open_in_new", '\u{f03cc}'), // 󰏌 ("md_open_source_initiative", '\u{f0bae}'), // 󰮮 ("md_openid", '\u{f03cd}'), // 󰏍 ("md_opera", '\u{f03ce}'), // 󰏎 ("md_orbit", '\u{f0018}'), // 󰀘 ("md_orbit_variant", '\u{f15db}'), // 󱗛 ("md_order_alphabetical_ascending", '\u{f020d}'), // 󰈍 ("md_order_alphabetical_descending", '\u{f0d07}'), // 󰴇 ("md_order_bool_ascending", '\u{f02be}'), // 󰊾 ("md_order_bool_ascending_variant", '\u{f098f}'), // 󰦏 ("md_order_bool_descending", '\u{f1384}'), // 󱎄 ("md_order_bool_descending_variant", '\u{f0990}'), // 󰦐 ("md_order_numeric_ascending", '\u{f0545}'), // 󰕅 ("md_order_numeric_descending", '\u{f0546}'), // 󰕆 ("md_origin", '\u{f0b43}'), // 󰭃 ("md_ornament", '\u{f03cf}'), // 󰏏 ("md_ornament_variant", '\u{f03d0}'), // 󰏐 ("md_outdoor_lamp", '\u{f1054}'), // 󱁔 ("md_overscan", '\u{f1005}'), // 󱀅 ("md_owl", '\u{f03d2}'), // 󰏒 ("md_pac_man", '\u{f0baf}'), // 󰮯 ("md_package", '\u{f03d3}'), // 󰏓 ("md_package_down", '\u{f03d4}'), // 󰏔 ("md_package_up", '\u{f03d5}'), // 󰏕 ("md_package_variant", '\u{f03d6}'), // 󰏖 ("md_package_variant_closed", '\u{f03d7}'), // 󰏗 ("md_package_variant_closed_minus", '\u{f19d4}'), // 󱧔 ("md_package_variant_closed_plus", '\u{f19d5}'), // 󱧕 ("md_package_variant_closed_remove", '\u{f19d6}'), // 󱧖 ("md_package_variant_minus", '\u{f19d7}'), // 󱧗 ("md_package_variant_plus", '\u{f19d8}'), // 󱧘 ("md_package_variant_remove", '\u{f19d9}'), // 󱧙 ("md_page_first", '\u{f0600}'), // 󰘀 ("md_page_last", '\u{f0601}'), // 󰘁 ("md_page_layout_body", '\u{f06fa}'), // 󰛺 ("md_page_layout_footer", '\u{f06fb}'), // 󰛻 ("md_page_layout_header", '\u{f06fc}'), // 󰛼 ("md_page_layout_header_footer", '\u{f0f7f}'), // 󰽿 ("md_page_layout_sidebar_left", '\u{f06fd}'), // 󰛽 ("md_page_layout_sidebar_right", '\u{f06fe}'), // 󰛾 ("md_page_next", '\u{f0bb0}'), // 󰮰 ("md_page_next_outline", '\u{f0bb1}'), // 󰮱 ("md_page_previous", '\u{f0bb2}'), // 󰮲 ("md_page_previous_outline", '\u{f0bb3}'), // 󰮳 ("md_pail", '\u{f1417}'), // 󱐗 ("md_pail_minus", '\u{f1437}'), // 󱐷 ("md_pail_minus_outline", '\u{f143c}'), // 󱐼 ("md_pail_off", '\u{f1439}'), // 󱐹 ("md_pail_off_outline", '\u{f143e}'), // 󱐾 ("md_pail_outline", '\u{f143a}'), // 󱐺 ("md_pail_plus", '\u{f1436}'), // 󱐶 ("md_pail_plus_outline", '\u{f143b}'), // 󱐻 ("md_pail_remove", '\u{f1438}'), // 󱐸 ("md_pail_remove_outline", '\u{f143d}'), // 󱐽 ("md_palette", '\u{f03d8}'), // 󰏘 ("md_palette_advanced", '\u{f03d9}'), // 󰏙 ("md_palette_outline", '\u{f0e0c}'), // 󰸌 ("md_palette_swatch", '\u{f08b5}'), // 󰢵 ("md_palette_swatch_outline", '\u{f135c}'), // 󱍜 ("md_palette_swatch_variant", '\u{f195a}'), // 󱥚 ("md_palm_tree", '\u{f1055}'), // 󱁕 ("md_pan", '\u{f0bb4}'), // 󰮴 ("md_pan_bottom_left", '\u{f0bb5}'), // 󰮵 ("md_pan_bottom_right", '\u{f0bb6}'), // 󰮶 ("md_pan_down", '\u{f0bb7}'), // 󰮷 ("md_pan_horizontal", '\u{f0bb8}'), // 󰮸 ("md_pan_left", '\u{f0bb9}'), // 󰮹 ("md_pan_right", '\u{f0bba}'), // 󰮺 ("md_pan_top_left", '\u{f0bbb}'), // 󰮻 ("md_pan_top_right", '\u{f0bbc}'), // 󰮼 ("md_pan_up", '\u{f0bbd}'), // 󰮽 ("md_pan_vertical", '\u{f0bbe}'), // 󰮾 ("md_panda", '\u{f03da}'), // 󰏚 ("md_pandora", '\u{f03db}'), // 󰏛 ("md_panorama", '\u{f03dc}'), // 󰏜 ("md_panorama_fisheye", '\u{f03dd}'), // 󰏝 ("md_panorama_horizontal", '\u{f1928}'), // 󱤨 ("md_panorama_horizontal_outline", '\u{f03de}'), // 󰏞 ("md_panorama_outline", '\u{f198c}'), // 󱦌 ("md_panorama_sphere", '\u{f198d}'), // 󱦍 ("md_panorama_sphere_outline", '\u{f198e}'), // 󱦎 ("md_panorama_variant", '\u{f198f}'), // 󱦏 ("md_panorama_variant_outline", '\u{f1990}'), // 󱦐 ("md_panorama_vertical", '\u{f1929}'), // 󱤩 ("md_panorama_vertical_outline", '\u{f03df}'), // 󰏟 ("md_panorama_wide_angle", '\u{f195f}'), // 󱥟 ("md_panorama_wide_angle_outline", '\u{f03e0}'), // 󰏠 ("md_paper_cut_vertical", '\u{f03e1}'), // 󰏡 ("md_paper_roll", '\u{f1157}'), // 󱅗 ("md_paper_roll_outline", '\u{f1158}'), // 󱅘 ("md_paperclip", '\u{f03e2}'), // 󰏢 ("md_paperclip_check", '\u{f1ac6}'), // 󱫆 ("md_paperclip_lock", '\u{f19da}'), // 󱧚 ("md_paperclip_minus", '\u{f1ac7}'), // 󱫇 ("md_paperclip_off", '\u{f1ac8}'), // 󱫈 ("md_paperclip_plus", '\u{f1ac9}'), // 󱫉 ("md_paperclip_remove", '\u{f1aca}'), // 󱫊 ("md_parachute", '\u{f0cb4}'), // 󰲴 ("md_parachute_outline", '\u{f0cb5}'), // 󰲵 ("md_paragliding", '\u{f1745}'), // 󱝅 ("md_parking", '\u{f03e3}'), // 󰏣 ("md_party_popper", '\u{f1056}'), // 󱁖 ("md_passport", '\u{f07e3}'), // 󰟣 ("md_passport_biometric", '\u{f0de1}'), // 󰷡 ("md_pasta", '\u{f1160}'), // 󱅠 ("md_patio_heater", '\u{f0f80}'), // 󰾀 ("md_patreon", '\u{f0882}'), // 󰢂 ("md_pause", '\u{f03e4}'), // 󰏤 ("md_pause_circle", '\u{f03e5}'), // 󰏥 ("md_pause_circle_outline", '\u{f03e6}'), // 󰏦 ("md_pause_octagon", '\u{f03e7}'), // 󰏧 ("md_pause_octagon_outline", '\u{f03e8}'), // 󰏨 ("md_paw", '\u{f03e9}'), // 󰏩 ("md_paw_off", '\u{f0657}'), // 󰙗 ("md_paw_off_outline", '\u{f1676}'), // 󱙶 ("md_paw_outline", '\u{f1675}'), // 󱙵 ("md_peace", '\u{f0884}'), // 󰢄 ("md_peanut", '\u{f0ffc}'), // 󰿼 ("md_peanut_off", '\u{f0ffd}'), // 󰿽 ("md_peanut_off_outline", '\u{f0fff}'), // 󰿿 ("md_peanut_outline", '\u{f0ffe}'), // 󰿾 ("md_pen", '\u{f03ea}'), // 󰏪 ("md_pen_lock", '\u{f0de2}'), // 󰷢 ("md_pen_minus", '\u{f0de3}'), // 󰷣 ("md_pen_off", '\u{f0de4}'), // 󰷤 ("md_pen_plus", '\u{f0de5}'), // 󰷥 ("md_pen_remove", '\u{f0de6}'), // 󰷦 ("md_pencil", '\u{f03eb}'), // 󰏫 ("md_pencil_box", '\u{f03ec}'), // 󰏬 ("md_pencil_box_multiple", '\u{f1144}'), // 󱅄 ("md_pencil_box_multiple_outline", '\u{f1145}'), // 󱅅 ("md_pencil_box_outline", '\u{f03ed}'), // 󰏭 ("md_pencil_circle", '\u{f06ff}'), // 󰛿 ("md_pencil_circle_outline", '\u{f0776}'), // 󰝶 ("md_pencil_lock", '\u{f03ee}'), // 󰏮 ("md_pencil_lock_outline", '\u{f0de7}'), // 󰷧 ("md_pencil_minus", '\u{f0de8}'), // 󰷨 ("md_pencil_minus_outline", '\u{f0de9}'), // 󰷩 ("md_pencil_off", '\u{f03ef}'), // 󰏯 ("md_pencil_off_outline", '\u{f0dea}'), // 󰷪 ("md_pencil_outline", '\u{f0cb6}'), // 󰲶 ("md_pencil_plus", '\u{f0deb}'), // 󰷫 ("md_pencil_plus_outline", '\u{f0dec}'), // 󰷬 ("md_pencil_remove", '\u{f0ded}'), // 󰷭 ("md_pencil_remove_outline", '\u{f0dee}'), // 󰷮 ("md_pencil_ruler", '\u{f1353}'), // 󱍓 ("md_penguin", '\u{f0ec0}'), // 󰻀 ("md_pentagon", '\u{f0701}'), // 󰜁 ("md_pentagon_outline", '\u{f0700}'), // 󰜀 ("md_pentagram", '\u{f1667}'), // 󱙧 ("md_percent", '\u{f03f0}'), // 󰏰 ("md_percent_box", '\u{f1a02}'), // 󱨂 ("md_percent_box_outline", '\u{f1a03}'), // 󱨃 ("md_percent_circle", '\u{f1a04}'), // 󱨄 ("md_percent_circle_outline", '\u{f1a05}'), // 󱨅 ("md_percent_outline", '\u{f1278}'), // 󱉸 ("md_periodic_table", '\u{f08b6}'), // 󰢶 ("md_perspective_less", '\u{f0d23}'), // 󰴣 ("md_perspective_more", '\u{f0d24}'), // 󰴤 ("md_ph", '\u{f17c5}'), // 󱟅 ("md_phone", '\u{f03f2}'), // 󰏲 ("md_phone_alert", '\u{f0f1a}'), // 󰼚 ("md_phone_alert_outline", '\u{f118e}'), // 󱆎 ("md_phone_bluetooth", '\u{f03f3}'), // 󰏳 ("md_phone_bluetooth_outline", '\u{f118f}'), // 󱆏 ("md_phone_cancel", '\u{f10bc}'), // 󱂼 ("md_phone_cancel_outline", '\u{f1190}'), // 󱆐 ("md_phone_check", '\u{f11a9}'), // 󱆩 ("md_phone_check_outline", '\u{f11aa}'), // 󱆪 ("md_phone_classic", '\u{f0602}'), // 󰘂 ("md_phone_classic_off", '\u{f1279}'), // 󱉹 ("md_phone_clock", '\u{f19db}'), // 󱧛 ("md_phone_dial", '\u{f1559}'), // 󱕙 ("md_phone_dial_outline", '\u{f155a}'), // 󱕚 ("md_phone_forward", '\u{f03f4}'), // 󰏴 ("md_phone_forward_outline", '\u{f1191}'), // 󱆑 ("md_phone_hangup", '\u{f03f5}'), // 󰏵 ("md_phone_hangup_outline", '\u{f1192}'), // 󱆒 ("md_phone_in_talk", '\u{f03f6}'), // 󰏶 ("md_phone_in_talk_outline", '\u{f1182}'), // 󱆂 ("md_phone_incoming", '\u{f03f7}'), // 󰏷 ("md_phone_incoming_outline", '\u{f1193}'), // 󱆓 ("md_phone_lock", '\u{f03f8}'), // 󰏸 ("md_phone_lock_outline", '\u{f1194}'), // 󱆔 ("md_phone_log", '\u{f03f9}'), // 󰏹 ("md_phone_log_outline", '\u{f1195}'), // 󱆕 ("md_phone_message", '\u{f1196}'), // 󱆖 ("md_phone_message_outline", '\u{f1197}'), // 󱆗 ("md_phone_minus", '\u{f0658}'), // 󰙘 ("md_phone_minus_outline", '\u{f1198}'), // 󱆘 ("md_phone_missed", '\u{f03fa}'), // 󰏺 ("md_phone_missed_outline", '\u{f11a5}'), // 󱆥 ("md_phone_off", '\u{f0def}'), // 󰷯 ("md_phone_off_outline", '\u{f11a6}'), // 󱆦 ("md_phone_outgoing", '\u{f03fb}'), // 󰏻 ("md_phone_outgoing_outline", '\u{f1199}'), // 󱆙 ("md_phone_outline", '\u{f0df0}'), // 󰷰 ("md_phone_paused", '\u{f03fc}'), // 󰏼 ("md_phone_paused_outline", '\u{f119a}'), // 󱆚 ("md_phone_plus", '\u{f0659}'), // 󰙙 ("md_phone_plus_outline", '\u{f119b}'), // 󱆛 ("md_phone_refresh", '\u{f1993}'), // 󱦓 ("md_phone_refresh_outline", '\u{f1994}'), // 󱦔 ("md_phone_remove", '\u{f152f}'), // 󱔯 ("md_phone_remove_outline", '\u{f1530}'), // 󱔰 ("md_phone_return", '\u{f082f}'), // 󰠯 ("md_phone_return_outline", '\u{f119c}'), // 󱆜 ("md_phone_ring", '\u{f11ab}'), // 󱆫 ("md_phone_ring_outline", '\u{f11ac}'), // 󱆬 ("md_phone_rotate_landscape", '\u{f0885}'), // 󰢅 ("md_phone_rotate_portrait", '\u{f0886}'), // 󰢆 ("md_phone_settings", '\u{f03fd}'), // 󰏽 ("md_phone_settings_outline", '\u{f119d}'), // 󱆝 ("md_phone_sync", '\u{f1995}'), // 󱦕 ("md_phone_sync_outline", '\u{f1996}'), // 󱦖 ("md_phone_voip", '\u{f03fe}'), // 󰏾 ("md_pi", '\u{f03ff}'), // 󰏿 ("md_pi_box", '\u{f0400}'), // 󰐀 ("md_pi_hole", '\u{f0df1}'), // 󰷱 ("md_piano", '\u{f067d}'), // 󰙽 ("md_piano_off", '\u{f0698}'), // 󰚘 ("md_pickaxe", '\u{f08b7}'), // 󰢷 ("md_picture_in_picture_bottom_right", '\u{f0e57}'), // 󰹗 ("md_picture_in_picture_bottom_right_outline", '\u{f0e58}'), // 󰹘 ("md_picture_in_picture_top_right", '\u{f0e59}'), // 󰹙 ("md_picture_in_picture_top_right_outline", '\u{f0e5a}'), // 󰹚 ("md_pier", '\u{f0887}'), // 󰢇 ("md_pier_crane", '\u{f0888}'), // 󰢈 ("md_pig", '\u{f0401}'), // 󰐁 ("md_pig_variant", '\u{f1006}'), // 󱀆 ("md_pig_variant_outline", '\u{f1678}'), // 󱙸 ("md_piggy_bank", '\u{f1007}'), // 󱀇 ("md_piggy_bank_outline", '\u{f1679}'), // 󱙹 ("md_pill", '\u{f0402}'), // 󰐂 ("md_pill_off", '\u{f1a5c}'), // 󱩜 ("md_pillar", '\u{f0702}'), // 󰜂 ("md_pin", '\u{f0403}'), // 󰐃 ("md_pin_off", '\u{f0404}'), // 󰐄 ("md_pin_off_outline", '\u{f0930}'), // 󰤰 ("md_pin_outline", '\u{f0931}'), // 󰤱 ("md_pine_tree", '\u{f0405}'), // 󰐅 ("md_pine_tree_box", '\u{f0406}'), // 󰐆 ("md_pine_tree_fire", '\u{f141a}'), // 󱐚 ("md_pinterest", '\u{f0407}'), // 󰐇 ("md_pinwheel", '\u{f0ad5}'), // 󰫕 ("md_pinwheel_outline", '\u{f0ad6}'), // 󰫖 ("md_pipe", '\u{f07e5}'), // 󰟥 ("md_pipe_disconnected", '\u{f07e6}'), // 󰟦 ("md_pipe_leak", '\u{f0889}'), // 󰢉 ("md_pipe_valve", '\u{f184d}'), // 󱡍 ("md_pipe_wrench", '\u{f1354}'), // 󱍔 ("md_pirate", '\u{f0a08}'), // 󰨈 ("md_pistol", '\u{f0703}'), // 󰜃 ("md_piston", '\u{f088a}'), // 󰢊 ("md_pitchfork", '\u{f1553}'), // 󱕓 ("md_pizza", '\u{f0409}'), // 󰐉 ("md_play", '\u{f040a}'), // 󰐊 ("md_play_box", '\u{f127a}'), // 󱉺 ("md_play_box_lock", '\u{f1a16}'), // 󱨖 ("md_play_box_lock_open", '\u{f1a17}'), // 󱨗 ("md_play_box_lock_open_outline", '\u{f1a18}'), // 󱨘 ("md_play_box_lock_outline", '\u{f1a19}'), // 󱨙 ("md_play_box_multiple", '\u{f0d19}'), // 󰴙 ("md_play_box_multiple_outline", '\u{f13e6}'), // 󱏦 ("md_play_box_outline", '\u{f040b}'), // 󰐋 ("md_play_circle", '\u{f040c}'), // 󰐌 ("md_play_circle_outline", '\u{f040d}'), // 󰐍 ("md_play_network", '\u{f088b}'), // 󰢋 ("md_play_network_outline", '\u{f0cb7}'), // 󰲷 ("md_play_outline", '\u{f0f1b}'), // 󰼛 ("md_play_pause", '\u{f040e}'), // 󰐎 ("md_play_protected_content", '\u{f040f}'), // 󰐏 ("md_play_speed", '\u{f08ff}'), // 󰣿 ("md_playlist_check", '\u{f05c7}'), // 󰗇 ("md_playlist_edit", '\u{f0900}'), // 󰤀 ("md_playlist_minus", '\u{f0410}'), // 󰐐 ("md_playlist_music", '\u{f0cb8}'), // 󰲸 ("md_playlist_music_outline", '\u{f0cb9}'), // 󰲹 ("md_playlist_play", '\u{f0411}'), // 󰐑 ("md_playlist_plus", '\u{f0412}'), // 󰐒 ("md_playlist_remove", '\u{f0413}'), // 󰐓 ("md_playlist_star", '\u{f0df2}'), // 󰷲 ("md_plex", '\u{f06ba}'), // 󰚺 ("md_pliers", '\u{f19a4}'), // 󱦤 ("md_plus", '\u{f0415}'), // 󰐕 ("md_plus_box", '\u{f0416}'), // 󰐖 ("md_plus_box_multiple", '\u{f0334}'), // 󰌴 ("md_plus_box_multiple_outline", '\u{f1143}'), // 󱅃 ("md_plus_box_outline", '\u{f0704}'), // 󰜄 ("md_plus_circle", '\u{f0417}'), // 󰐗 ("md_plus_circle_multiple", '\u{f034c}'), // 󰍌 ("md_plus_circle_multiple_outline", '\u{f0418}'), // 󰐘 ("md_plus_circle_outline", '\u{f0419}'), // 󰐙 ("md_plus_lock", '\u{f1a5d}'), // 󱩝 ("md_plus_lock_open", '\u{f1a5e}'), // 󱩞 ("md_plus_minus", '\u{f0992}'), // 󰦒 ("md_plus_minus_box", '\u{f0993}'), // 󰦓 ("md_plus_minus_variant", '\u{f14c9}'), // 󱓉 ("md_plus_network", '\u{f041a}'), // 󰐚 ("md_plus_network_outline", '\u{f0cba}'), // 󰲺 ("md_plus_outline", '\u{f0705}'), // 󰜅 ("md_plus_thick", '\u{f11ec}'), // 󱇬 ("md_podcast", '\u{f0994}'), // 󰦔 ("md_podium", '\u{f0d25}'), // 󰴥 ("md_podium_bronze", '\u{f0d26}'), // 󰴦 ("md_podium_gold", '\u{f0d27}'), // 󰴧 ("md_podium_silver", '\u{f0d28}'), // 󰴨 ("md_point_of_sale", '\u{f0d92}'), // 󰶒 ("md_pokeball", '\u{f041d}'), // 󰐝 ("md_pokemon_go", '\u{f0a09}'), // 󰨉 ("md_poker_chip", '\u{f0830}'), // 󰠰 ("md_polaroid", '\u{f041e}'), // 󰐞 ("md_police_badge", '\u{f1167}'), // 󱅧 ("md_police_badge_outline", '\u{f1168}'), // 󱅨 ("md_police_station", '\u{f1839}'), // 󱠹 ("md_poll", '\u{f041f}'), // 󰐟 ("md_polo", '\u{f14c3}'), // 󱓃 ("md_polymer", '\u{f0421}'), // 󰐡 ("md_pool", '\u{f0606}'), // 󰘆 ("md_pool_thermometer", '\u{f1a5f}'), // 󱩟 ("md_popcorn", '\u{f0422}'), // 󰐢 ("md_post", '\u{f1008}'), // 󱀈 ("md_post_lamp", '\u{f1a60}'), // 󱩠 ("md_post_outline", '\u{f1009}'), // 󱀉 ("md_postage_stamp", '\u{f0cbb}'), // 󰲻 ("md_pot", '\u{f02e5}'), // 󰋥 ("md_pot_mix", '\u{f065b}'), // 󰙛 ("md_pot_mix_outline", '\u{f0677}'), // 󰙷 ("md_pot_outline", '\u{f02ff}'), // 󰋿 ("md_pot_steam", '\u{f065a}'), // 󰙚 ("md_pot_steam_outline", '\u{f0326}'), // 󰌦 ("md_pound", '\u{f0423}'), // 󰐣 ("md_pound_box", '\u{f0424}'), // 󰐤 ("md_pound_box_outline", '\u{f117f}'), // 󱅿 ("md_power", '\u{f0425}'), // 󰐥 ("md_power_cycle", '\u{f0901}'), // 󰤁 ("md_power_off", '\u{f0902}'), // 󰤂 ("md_power_on", '\u{f0903}'), // 󰤃 ("md_power_plug", '\u{f06a5}'), // 󰚥 ("md_power_plug_off", '\u{f06a6}'), // 󰚦 ("md_power_plug_off_outline", '\u{f1424}'), // 󱐤 ("md_power_plug_outline", '\u{f1425}'), // 󱐥 ("md_power_settings", '\u{f0426}'), // 󰐦 ("md_power_sleep", '\u{f0904}'), // 󰤄 ("md_power_socket", '\u{f0427}'), // 󰐧 ("md_power_socket_au", '\u{f0905}'), // 󰤅 ("md_power_socket_ch", '\u{f0fb3}'), // 󰾳 ("md_power_socket_de", '\u{f1107}'), // 󱄇 ("md_power_socket_eu", '\u{f07e7}'), // 󰟧 ("md_power_socket_fr", '\u{f1108}'), // 󱄈 ("md_power_socket_it", '\u{f14ff}'), // 󱓿 ("md_power_socket_jp", '\u{f1109}'), // 󱄉 ("md_power_socket_uk", '\u{f07e8}'), // 󰟨 ("md_power_socket_us", '\u{f07e9}'), // 󰟩 ("md_power_standby", '\u{f0906}'), // 󰤆 ("md_powershell", '\u{f0a0a}'), // 󰨊 ("md_prescription", '\u{f0706}'), // 󰜆 ("md_presentation", '\u{f0428}'), // 󰐨 ("md_presentation_play", '\u{f0429}'), // 󰐩 ("md_pretzel", '\u{f1562}'), // 󱕢 ("md_printer", '\u{f042a}'), // 󰐪 ("md_printer_3d", '\u{f042b}'), // 󰐫 ("md_printer_3d_nozzle", '\u{f0e5b}'), // 󰹛 ("md_printer_3d_nozzle_alert", '\u{f11c0}'), // 󱇀 ("md_printer_3d_nozzle_alert_outline", '\u{f11c1}'), // 󱇁 ("md_printer_3d_nozzle_heat", '\u{f18b8}'), // 󱢸 ("md_printer_3d_nozzle_heat_outline", '\u{f18b9}'), // 󱢹 ("md_printer_3d_nozzle_outline", '\u{f0e5c}'), // 󰹜 ("md_printer_alert", '\u{f042c}'), // 󰐬 ("md_printer_check", '\u{f1146}'), // 󱅆 ("md_printer_eye", '\u{f1458}'), // 󱑘 ("md_printer_off", '\u{f0e5d}'), // 󰹝 ("md_printer_off_outline", '\u{f1785}'), // 󱞅 ("md_printer_outline", '\u{f1786}'), // 󱞆 ("md_printer_pos", '\u{f1057}'), // 󱁗 ("md_printer_search", '\u{f1457}'), // 󱑗 ("md_printer_settings", '\u{f0707}'), // 󰜇 ("md_printer_wireless", '\u{f0a0b}'), // 󰨋 ("md_priority_high", '\u{f0603}'), // 󰘃 ("md_priority_low", '\u{f0604}'), // 󰘄 ("md_professional_hexagon", '\u{f042d}'), // 󰐭 ("md_progress_alert", '\u{f0cbc}'), // 󰲼 ("md_progress_check", '\u{f0995}'), // 󰦕 ("md_progress_clock", '\u{f0996}'), // 󰦖 ("md_progress_close", '\u{f110a}'), // 󱄊 ("md_progress_download", '\u{f0997}'), // 󰦗 ("md_progress_pencil", '\u{f1787}'), // 󱞇 ("md_progress_question", '\u{f1522}'), // 󱔢 ("md_progress_star", '\u{f1788}'), // 󱞈 ("md_progress_upload", '\u{f0998}'), // 󰦘 ("md_progress_wrench", '\u{f0cbd}'), // 󰲽 ("md_projector", '\u{f042e}'), // 󰐮 ("md_projector_off", '\u{f1a23}'), // 󱨣 ("md_projector_screen", '\u{f042f}'), // 󰐯 ("md_projector_screen_off", '\u{f180d}'), // 󱠍 ("md_projector_screen_off_outline", '\u{f180e}'), // 󱠎 ("md_projector_screen_outline", '\u{f1724}'), // 󱜤 ("md_projector_screen_variant", '\u{f180f}'), // 󱠏 ("md_projector_screen_variant_off", '\u{f1810}'), // 󱠐 ("md_projector_screen_variant_off_outline", '\u{f1811}'), // 󱠑 ("md_projector_screen_variant_outline", '\u{f1812}'), // 󱠒 ("md_propane_tank", '\u{f1357}'), // 󱍗 ("md_propane_tank_outline", '\u{f1358}'), // 󱍘 ("md_protocol", '\u{f0fd8}'), // 󰿘 ("md_publish", '\u{f06a7}'), // 󰚧 ("md_publish_off", '\u{f1945}'), // 󱥅 ("md_pulse", '\u{f0430}'), // 󰐰 ("md_pump", '\u{f1402}'), // 󱐂 ("md_pumpkin", '\u{f0bbf}'), // 󰮿 ("md_purse", '\u{f0f1c}'), // 󰼜 ("md_purse_outline", '\u{f0f1d}'), // 󰼝 ("md_puzzle", '\u{f0431}'), // 󰐱 ("md_puzzle_check", '\u{f1426}'), // 󱐦 ("md_puzzle_check_outline", '\u{f1427}'), // 󱐧 ("md_puzzle_edit", '\u{f14d3}'), // 󱓓 ("md_puzzle_edit_outline", '\u{f14d9}'), // 󱓙 ("md_puzzle_heart", '\u{f14d4}'), // 󱓔 ("md_puzzle_heart_outline", '\u{f14da}'), // 󱓚 ("md_puzzle_minus", '\u{f14d1}'), // 󱓑 ("md_puzzle_minus_outline", '\u{f14d7}'), // 󱓗 ("md_puzzle_outline", '\u{f0a66}'), // 󰩦 ("md_puzzle_plus", '\u{f14d0}'), // 󱓐 ("md_puzzle_plus_outline", '\u{f14d6}'), // 󱓖 ("md_puzzle_remove", '\u{f14d2}'), // 󱓒 ("md_puzzle_remove_outline", '\u{f14d8}'), // 󱓘 ("md_puzzle_star", '\u{f14d5}'), // 󱓕 ("md_puzzle_star_outline", '\u{f14db}'), // 󱓛 ("md_pyramid", '\u{f1952}'), // 󱥒 ("md_pyramid_off", '\u{f1953}'), // 󱥓 ("md_qi", '\u{f0999}'), // 󰦙 ("md_qqchat", '\u{f0605}'), // 󰘅 ("md_qrcode", '\u{f0432}'), // 󰐲 ("md_qrcode_edit", '\u{f08b8}'), // 󰢸 ("md_qrcode_minus", '\u{f118c}'), // 󱆌 ("md_qrcode_plus", '\u{f118b}'), // 󱆋 ("md_qrcode_remove", '\u{f118d}'), // 󱆍 ("md_qrcode_scan", '\u{f0433}'), // 󰐳 ("md_quadcopter", '\u{f0434}'), // 󰐴 ("md_quality_high", '\u{f0435}'), // 󰐵 ("md_quality_low", '\u{f0a0c}'), // 󰨌 ("md_quality_medium", '\u{f0a0d}'), // 󰨍 ("md_quora", '\u{f0d29}'), // 󰴩 ("md_rabbit", '\u{f0907}'), // 󰤇 ("md_rabbit_variant", '\u{f1a61}'), // 󱩡 ("md_rabbit_variant_outline", '\u{f1a62}'), // 󱩢 ("md_racing_helmet", '\u{f0d93}'), // 󰶓 ("md_racquetball", '\u{f0d94}'), // 󰶔 ("md_radar", '\u{f0437}'), // 󰐷 ("md_radiator", '\u{f0438}'), // 󰐸 ("md_radiator_disabled", '\u{f0ad7}'), // 󰫗 ("md_radiator_off", '\u{f0ad8}'), // 󰫘 ("md_radio", '\u{f0439}'), // 󰐹 ("md_radio_am", '\u{f0cbe}'), // 󰲾 ("md_radio_fm", '\u{f0cbf}'), // 󰲿 ("md_radio_handheld", '\u{f043a}'), // 󰐺 ("md_radio_off", '\u{f121c}'), // 󱈜 ("md_radio_tower", '\u{f043b}'), // 󰐻 ("md_radioactive", '\u{f043c}'), // 󰐼 ("md_radioactive_circle", '\u{f185d}'), // 󱡝 ("md_radioactive_circle_outline", '\u{f185e}'), // 󱡞 ("md_radioactive_off", '\u{f0ec1}'), // 󰻁 ("md_radiobox_marked", '\u{f043e}'), // 󰐾 ("md_radiology_box", '\u{f14c5}'), // 󱓅 ("md_radiology_box_outline", '\u{f14c6}'), // 󱓆 ("md_radius", '\u{f0cc0}'), // 󰳀 ("md_radius_outline", '\u{f0cc1}'), // 󰳁 ("md_railroad_light", '\u{f0f1e}'), // 󰼞 ("md_rake", '\u{f1544}'), // 󱕄 ("md_raspberry_pi", '\u{f043f}'), // 󰐿 ("md_raw", '\u{f1a0f}'), // 󱨏 ("md_raw_off", '\u{f1a10}'), // 󱨐 ("md_ray_end", '\u{f0440}'), // 󰑀 ("md_ray_end_arrow", '\u{f0441}'), // 󰑁 ("md_ray_start", '\u{f0442}'), // 󰑂 ("md_ray_start_arrow", '\u{f0443}'), // 󰑃 ("md_ray_start_end", '\u{f0444}'), // 󰑄 ("md_ray_start_vertex_end", '\u{f15d8}'), // 󱗘 ("md_ray_vertex", '\u{f0445}'), // 󰑅 ("md_razor_double_edge", '\u{f1997}'), // 󱦗 ("md_razor_single_edge", '\u{f1998}'), // 󱦘 ("md_react", '\u{f0708}'), // 󰜈 ("md_read", '\u{f0447}'), // 󰑇 ("md_receipt", '\u{f0449}'), // 󰑉 ("md_receipt_outline", '\u{f19dc}'), // 󱧜 ("md_receipt_text_check", '\u{f1a63}'), // 󱩣 ("md_receipt_text_check_outline", '\u{f1a64}'), // 󱩤 ("md_receipt_text_minus", '\u{f1a65}'), // 󱩥 ("md_receipt_text_minus_outline", '\u{f1a66}'), // 󱩦 ("md_receipt_text_plus", '\u{f1a67}'), // 󱩧 ("md_receipt_text_plus_outline", '\u{f1a68}'), // 󱩨 ("md_receipt_text_remove", '\u{f1a69}'), // 󱩩 ("md_receipt_text_remove_outline", '\u{f1a6a}'), // 󱩪 ("md_record", '\u{f044a}'), // 󰑊 ("md_record_circle", '\u{f0ec2}'), // 󰻂 ("md_record_circle_outline", '\u{f0ec3}'), // 󰻃 ("md_record_player", '\u{f099a}'), // 󰦚 ("md_record_rec", '\u{f044b}'), // 󰑋 ("md_rectangle", '\u{f0e5e}'), // 󰹞 ("md_rectangle_outline", '\u{f0e5f}'), // 󰹟 ("md_recycle", '\u{f044c}'), // 󰑌 ("md_recycle_variant", '\u{f139d}'), // 󱎝 ("md_reddit", '\u{f044d}'), // 󰑍 ("md_redhat", '\u{f111b}'), // 󱄛 ("md_redo", '\u{f044e}'), // 󰑎 ("md_redo_variant", '\u{f044f}'), // 󰑏 ("md_reflect_horizontal", '\u{f0a0e}'), // 󰨎 ("md_reflect_vertical", '\u{f0a0f}'), // 󰨏 ("md_refresh", '\u{f0450}'), // 󰑐 ("md_refresh_auto", '\u{f18f2}'), // 󱣲 ("md_refresh_circle", '\u{f1377}'), // 󱍷 ("md_regex", '\u{f0451}'), // 󰑑 ("md_registered_trademark", '\u{f0a67}'), // 󰩧 ("md_reiterate", '\u{f1588}'), // 󱖈 ("md_relation_many_to_many", '\u{f1496}'), // 󱒖 ("md_relation_many_to_one", '\u{f1497}'), // 󱒗 ("md_relation_many_to_one_or_many", '\u{f1498}'), // 󱒘 ("md_relation_many_to_only_one", '\u{f1499}'), // 󱒙 ("md_relation_many_to_zero_or_many", '\u{f149a}'), // 󱒚 ("md_relation_many_to_zero_or_one", '\u{f149b}'), // 󱒛 ("md_relation_one_or_many_to_many", '\u{f149c}'), // 󱒜 ("md_relation_one_or_many_to_one", '\u{f149d}'), // 󱒝 ("md_relation_one_or_many_to_one_or_many", '\u{f149e}'), // 󱒞 ("md_relation_one_or_many_to_only_one", '\u{f149f}'), // 󱒟 ("md_relation_one_or_many_to_zero_or_many", '\u{f14a0}'), // 󱒠 ("md_relation_one_or_many_to_zero_or_one", '\u{f14a1}'), // 󱒡 ("md_relation_one_to_many", '\u{f14a2}'), // 󱒢 ("md_relation_one_to_one", '\u{f14a3}'), // 󱒣 ("md_relation_one_to_one_or_many", '\u{f14a4}'), // 󱒤 ("md_relation_one_to_only_one", '\u{f14a5}'), // 󱒥 ("md_relation_one_to_zero_or_many", '\u{f14a6}'), // 󱒦 ("md_relation_one_to_zero_or_one", '\u{f14a7}'), // 󱒧 ("md_relation_only_one_to_many", '\u{f14a8}'), // 󱒨 ("md_relation_only_one_to_one", '\u{f14a9}'), // 󱒩 ("md_relation_only_one_to_one_or_many", '\u{f14aa}'), // 󱒪 ("md_relation_only_one_to_only_one", '\u{f14ab}'), // 󱒫 ("md_relation_only_one_to_zero_or_many", '\u{f14ac}'), // 󱒬 ("md_relation_only_one_to_zero_or_one", '\u{f14ad}'), // 󱒭 ("md_relation_zero_or_many_to_many", '\u{f14ae}'), // 󱒮 ("md_relation_zero_or_many_to_one", '\u{f14af}'), // 󱒯 ("md_relation_zero_or_many_to_one_or_many", '\u{f14b0}'), // 󱒰 ("md_relation_zero_or_many_to_only_one", '\u{f14b1}'), // 󱒱 ("md_relation_zero_or_many_to_zero_or_many", '\u{f14b2}'), // 󱒲 ("md_relation_zero_or_many_to_zero_or_one", '\u{f14b3}'), // 󱒳 ("md_relation_zero_or_one_to_many", '\u{f14b4}'), // 󱒴 ("md_relation_zero_or_one_to_one", '\u{f14b5}'), // 󱒵 ("md_relation_zero_or_one_to_one_or_many", '\u{f14b6}'), // 󱒶 ("md_relation_zero_or_one_to_only_one", '\u{f14b7}'), // 󱒷 ("md_relation_zero_or_one_to_zero_or_many", '\u{f14b8}'), // 󱒸 ("md_relation_zero_or_one_to_zero_or_one", '\u{f14b9}'), // 󱒹 ("md_relative_scale", '\u{f0452}'), // 󰑒 ("md_reload", '\u{f0453}'), // 󰑓 ("md_reload_alert", '\u{f110b}'), // 󱄋 ("md_reminder", '\u{f088c}'), // 󰢌 ("md_remote", '\u{f0454}'), // 󰑔 ("md_remote_desktop", '\u{f08b9}'), // 󰢹 ("md_remote_off", '\u{f0ec4}'), // 󰻄 ("md_remote_tv", '\u{f0ec5}'), // 󰻅 ("md_remote_tv_off", '\u{f0ec6}'), // 󰻆 ("md_rename_box", '\u{f0455}'), // 󰑕 ("md_reorder_horizontal", '\u{f0688}'), // 󰚈 ("md_reorder_vertical", '\u{f0689}'), // 󰚉 ("md_repeat", '\u{f0456}'), // 󰑖 ("md_repeat_off", '\u{f0457}'), // 󰑗 ("md_repeat_once", '\u{f0458}'), // 󰑘 ("md_repeat_variant", '\u{f0547}'), // 󰕇 ("md_replay", '\u{f0459}'), // 󰑙 ("md_reply", '\u{f045a}'), // 󰑚 ("md_reply_all", '\u{f045b}'), // 󰑛 ("md_reply_all_outline", '\u{f0f1f}'), // 󰼟 ("md_reply_circle", '\u{f11ae}'), // 󱆮 ("md_reply_outline", '\u{f0f20}'), // 󰼠 ("md_reproduction", '\u{f045c}'), // 󰑜 ("md_resistor", '\u{f0b44}'), // 󰭄 ("md_resistor_nodes", '\u{f0b45}'), // 󰭅 ("md_resize", '\u{f0a68}'), // 󰩨 ("md_resize_bottom_right", '\u{f045d}'), // 󰑝 ("md_responsive", '\u{f045e}'), // 󰑞 ("md_restart", '\u{f0709}'), // 󰜉 ("md_restart_alert", '\u{f110c}'), // 󱄌 ("md_restart_off", '\u{f0d95}'), // 󰶕 ("md_restore", '\u{f099b}'), // 󰦛 ("md_restore_alert", '\u{f110d}'), // 󱄍 ("md_rewind", '\u{f045f}'), // 󰑟 ("md_rewind_5", '\u{f11f9}'), // 󱇹 ("md_rewind_10", '\u{f0d2a}'), // 󰴪 ("md_rewind_15", '\u{f1946}'), // 󱥆 ("md_rewind_30", '\u{f0d96}'), // 󰶖 ("md_rewind_60", '\u{f160c}'), // 󱘌 ("md_rewind_outline", '\u{f070a}'), // 󰜊 ("md_rhombus", '\u{f070b}'), // 󰜋 ("md_rhombus_medium", '\u{f0a10}'), // 󰨐 ("md_rhombus_medium_outline", '\u{f14dc}'), // 󱓜 ("md_rhombus_outline", '\u{f070c}'), // 󰜌 ("md_rhombus_split", '\u{f0a11}'), // 󰨑 ("md_rhombus_split_outline", '\u{f14dd}'), // 󱓝 ("md_ribbon", '\u{f0460}'), // 󰑠 ("md_rice", '\u{f07ea}'), // 󰟪 ("md_rickshaw", '\u{f15bb}'), // 󱖻 ("md_rickshaw_electric", '\u{f15bc}'), // 󱖼 ("md_ring", '\u{f07eb}'), // 󰟫 ("md_rivet", '\u{f0e60}'), // 󰹠 ("md_road", '\u{f0461}'), // 󰑡 ("md_road_variant", '\u{f0462}'), // 󰑢 ("md_robber", '\u{f1058}'), // 󱁘 ("md_robot", '\u{f06a9}'), // 󰚩 ("md_robot_angry", '\u{f169d}'), // 󱚝 ("md_robot_angry_outline", '\u{f169e}'), // 󱚞 ("md_robot_confused", '\u{f169f}'), // 󱚟 ("md_robot_confused_outline", '\u{f16a0}'), // 󱚠 ("md_robot_dead", '\u{f16a1}'), // 󱚡 ("md_robot_dead_outline", '\u{f16a2}'), // 󱚢 ("md_robot_excited", '\u{f16a3}'), // 󱚣 ("md_robot_excited_outline", '\u{f16a4}'), // 󱚤 ("md_robot_happy", '\u{f1719}'), // 󱜙 ("md_robot_happy_outline", '\u{f171a}'), // 󱜚 ("md_robot_industrial", '\u{f0b46}'), // 󰭆 ("md_robot_industrial_outline", '\u{f1a1a}'), // 󱨚 ("md_robot_love", '\u{f16a5}'), // 󱚥 ("md_robot_love_outline", '\u{f16a6}'), // 󱚦 ("md_robot_mower", '\u{f11f7}'), // 󱇷 ("md_robot_mower_outline", '\u{f11f3}'), // 󱇳 ("md_robot_off", '\u{f16a7}'), // 󱚧 ("md_robot_off_outline", '\u{f167b}'), // 󱙻 ("md_robot_outline", '\u{f167a}'), // 󱙺 ("md_robot_vacuum", '\u{f070d}'), // 󰜍 ("md_robot_vacuum_variant", '\u{f0908}'), // 󰤈 ("md_rocket", '\u{f0463}'), // 󰑣 ("md_rocket_launch", '\u{f14de}'), // 󱓞 ("md_rocket_launch_outline", '\u{f14df}'), // 󱓟 ("md_rocket_outline", '\u{f13af}'), // 󱎯 ("md_rodent", '\u{f1327}'), // 󱌧 ("md_roller_shade", '\u{f1a6b}'), // 󱩫 ("md_roller_shade_closed", '\u{f1a6c}'), // 󱩬 ("md_roller_skate", '\u{f0d2b}'), // 󰴫 ("md_roller_skate_off", '\u{f0145}'), // 󰅅 ("md_rollerblade", '\u{f0d2c}'), // 󰴬 ("md_rollerblade_off", '\u{f002e}'), // 󰀮 ("md_rollupjs", '\u{f0bc0}'), // 󰯀 ("md_rolodex", '\u{f1ab9}'), // 󱪹 ("md_rolodex_outline", '\u{f1aba}'), // 󱪺 ("md_roman_numeral_2", '\u{f1089}'), // 󱂉 ("md_roman_numeral_3", '\u{f108a}'), // 󱂊 ("md_roman_numeral_4", '\u{f108b}'), // 󱂋 ("md_roman_numeral_6", '\u{f108d}'), // 󱂍 ("md_roman_numeral_7", '\u{f108e}'), // 󱂎 ("md_roman_numeral_8", '\u{f108f}'), // 󱂏 ("md_roman_numeral_9", '\u{f1090}'), // 󱂐 ("md_room_service", '\u{f088d}'), // 󰢍 ("md_room_service_outline", '\u{f0d97}'), // 󰶗 ("md_rotate_360", '\u{f1999}'), // 󱦙 ("md_rotate_3d", '\u{f0ec7}'), // 󰻇 ("md_rotate_3d_variant", '\u{f0464}'), // 󰑤 ("md_rotate_left", '\u{f0465}'), // 󰑥 ("md_rotate_left_variant", '\u{f0466}'), // 󰑦 ("md_rotate_orbit", '\u{f0d98}'), // 󰶘 ("md_rotate_right", '\u{f0467}'), // 󰑧 ("md_rotate_right_variant", '\u{f0468}'), // 󰑨 ("md_rounded_corner", '\u{f0607}'), // 󰘇 ("md_router", '\u{f11e2}'), // 󱇢 ("md_router_network", '\u{f1087}'), // 󱂇 ("md_router_wireless", '\u{f0469}'), // 󰑩 ("md_router_wireless_off", '\u{f15a3}'), // 󱖣 ("md_router_wireless_settings", '\u{f0a69}'), // 󰩩 ("md_routes", '\u{f046a}'), // 󰑪 ("md_routes_clock", '\u{f1059}'), // 󱁙 ("md_rowing", '\u{f0608}'), // 󰘈 ("md_rss", '\u{f046b}'), // 󰑫 ("md_rss_box", '\u{f046c}'), // 󰑬 ("md_rss_off", '\u{f0f21}'), // 󰼡 ("md_rug", '\u{f1475}'), // 󱑵 ("md_rugby", '\u{f0d99}'), // 󰶙 ("md_ruler", '\u{f046d}'), // 󰑭 ("md_ruler_square", '\u{f0cc2}'), // 󰳂 ("md_ruler_square_compass", '\u{f0ebe}'), // 󰺾 ("md_run", '\u{f070e}'), // 󰜎 ("md_run_fast", '\u{f046e}'), // 󰑮 ("md_rv_truck", '\u{f11d4}'), // 󱇔 ("md_sack", '\u{f0d2e}'), // 󰴮 ("md_sack_percent", '\u{f0d2f}'), // 󰴯 ("md_safe", '\u{f0a6a}'), // 󰩪 ("md_safe_square", '\u{f127c}'), // 󱉼 ("md_safe_square_outline", '\u{f127d}'), // 󱉽 ("md_safety_goggles", '\u{f0d30}'), // 󰴰 ("md_sail_boat", '\u{f0ec8}'), // 󰻈 ("md_sail_boat_sink", '\u{f1aef}'), // 󱫯 ("md_sale", '\u{f046f}'), // 󰑯 ("md_sale_outline", '\u{f1a06}'), // 󱨆 ("md_salesforce", '\u{f088e}'), // 󰢎 ("md_sass", '\u{f07ec}'), // 󰟬 ("md_satellite", '\u{f0470}'), // 󰑰 ("md_satellite_uplink", '\u{f0909}'), // 󰤉 ("md_satellite_variant", '\u{f0471}'), // 󰑱 ("md_sausage", '\u{f08ba}'), // 󰢺 ("md_sausage_off", '\u{f1789}'), // 󱞉 ("md_saw_blade", '\u{f0e61}'), // 󰹡 ("md_sawtooth_wave", '\u{f147a}'), // 󱑺 ("md_saxophone", '\u{f0609}'), // 󰘉 ("md_scale", '\u{f0472}'), // 󰑲 ("md_scale_balance", '\u{f05d1}'), // 󰗑 ("md_scale_bathroom", '\u{f0473}'), // 󰑳 ("md_scale_off", '\u{f105a}'), // 󱁚 ("md_scale_unbalanced", '\u{f19b8}'), // 󱦸 ("md_scan_helper", '\u{f13d8}'), // 󱏘 ("md_scanner", '\u{f06ab}'), // 󰚫 ("md_scanner_off", '\u{f090a}'), // 󰤊 ("md_scatter_plot", '\u{f0ec9}'), // 󰻉 ("md_scatter_plot_outline", '\u{f0eca}'), // 󰻊 ("md_scent", '\u{f1958}'), // 󱥘 ("md_scent_off", '\u{f1959}'), // 󱥙 ("md_school", '\u{f0474}'), // 󰑴 ("md_school_outline", '\u{f1180}'), // 󱆀 ("md_scissors_cutting", '\u{f0a6b}'), // 󰩫 ("md_scooter", '\u{f15bd}'), // 󱖽 ("md_scooter_electric", '\u{f15be}'), // 󱖾 ("md_scoreboard", '\u{f127e}'), // 󱉾 ("md_scoreboard_outline", '\u{f127f}'), // 󱉿 ("md_screen_rotation", '\u{f0475}'), // 󰑵 ("md_screen_rotation_lock", '\u{f0478}'), // 󰑸 ("md_screw_flat_top", '\u{f0df3}'), // 󰷳 ("md_screw_lag", '\u{f0df4}'), // 󰷴 ("md_screw_machine_flat_top", '\u{f0df5}'), // 󰷵 ("md_screw_machine_round_top", '\u{f0df6}'), // 󰷶 ("md_screw_round_top", '\u{f0df7}'), // 󰷷 ("md_screwdriver", '\u{f0476}'), // 󰑶 ("md_script", '\u{f0bc1}'), // 󰯁 ("md_script_outline", '\u{f0477}'), // 󰑷 ("md_script_text", '\u{f0bc2}'), // 󰯂 ("md_script_text_key", '\u{f1725}'), // 󱜥 ("md_script_text_key_outline", '\u{f1726}'), // 󱜦 ("md_script_text_outline", '\u{f0bc3}'), // 󰯃 ("md_script_text_play", '\u{f1727}'), // 󱜧 ("md_script_text_play_outline", '\u{f1728}'), // 󱜨 ("md_sd", '\u{f0479}'), // 󰑹 ("md_seal", '\u{f047a}'), // 󰑺 ("md_seal_variant", '\u{f0fd9}'), // 󰿙 ("md_search_web", '\u{f070f}'), // 󰜏 ("md_seat", '\u{f0cc3}'), // 󰳃 ("md_seat_flat", '\u{f047b}'), // 󰑻 ("md_seat_flat_angled", '\u{f047c}'), // 󰑼 ("md_seat_individual_suite", '\u{f047d}'), // 󰑽 ("md_seat_legroom_extra", '\u{f047e}'), // 󰑾 ("md_seat_legroom_normal", '\u{f047f}'), // 󰑿 ("md_seat_legroom_reduced", '\u{f0480}'), // 󰒀 ("md_seat_outline", '\u{f0cc4}'), // 󰳄 ("md_seat_passenger", '\u{f1249}'), // 󱉉 ("md_seat_recline_extra", '\u{f0481}'), // 󰒁 ("md_seat_recline_normal", '\u{f0482}'), // 󰒂 ("md_seatbelt", '\u{f0cc5}'), // 󰳅 ("md_security", '\u{f0483}'), // 󰒃 ("md_security_network", '\u{f0484}'), // 󰒄 ("md_seed", '\u{f0e62}'), // 󰹢 ("md_seed_off", '\u{f13fd}'), // 󱏽 ("md_seed_off_outline", '\u{f13fe}'), // 󱏾 ("md_seed_outline", '\u{f0e63}'), // 󰹣 ("md_seed_plus", '\u{f1a6d}'), // 󱩭 ("md_seed_plus_outline", '\u{f1a6e}'), // 󱩮 ("md_seesaw", '\u{f15a4}'), // 󱖤 ("md_segment", '\u{f0ecb}'), // 󰻋 ("md_select", '\u{f0485}'), // 󰒅 ("md_select_all", '\u{f0486}'), // 󰒆 ("md_select_color", '\u{f0d31}'), // 󰴱 ("md_select_compare", '\u{f0ad9}'), // 󰫙 ("md_select_drag", '\u{f0a6c}'), // 󰩬 ("md_select_group", '\u{f0f82}'), // 󰾂 ("md_select_inverse", '\u{f0487}'), // 󰒇 ("md_select_marker", '\u{f1280}'), // 󱊀 ("md_select_multiple", '\u{f1281}'), // 󱊁 ("md_select_multiple_marker", '\u{f1282}'), // 󱊂 ("md_select_off", '\u{f0488}'), // 󰒈 ("md_select_place", '\u{f0fda}'), // 󰿚 ("md_select_remove", '\u{f17c1}'), // 󱟁 ("md_select_search", '\u{f1204}'), // 󱈄 ("md_selection", '\u{f0489}'), // 󰒉 ("md_selection_drag", '\u{f0a6d}'), // 󰩭 ("md_selection_ellipse", '\u{f0d32}'), // 󰴲 ("md_selection_ellipse_arrow_inside", '\u{f0f22}'), // 󰼢 ("md_selection_ellipse_remove", '\u{f17c2}'), // 󱟂 ("md_selection_marker", '\u{f1283}'), // 󱊃 ("md_selection_multiple", '\u{f1285}'), // 󱊅 ("md_selection_multiple_marker", '\u{f1284}'), // 󱊄 ("md_selection_off", '\u{f0777}'), // 󰝷 ("md_selection_remove", '\u{f17c3}'), // 󱟃 ("md_selection_search", '\u{f1205}'), // 󱈅 ("md_semantic_web", '\u{f1316}'), // 󱌖 ("md_send", '\u{f048a}'), // 󰒊 ("md_send_check", '\u{f1161}'), // 󱅡 ("md_send_check_outline", '\u{f1162}'), // 󱅢 ("md_send_circle", '\u{f0df8}'), // 󰷸 ("md_send_circle_outline", '\u{f0df9}'), // 󰷹 ("md_send_clock", '\u{f1163}'), // 󱅣 ("md_send_clock_outline", '\u{f1164}'), // 󱅤 ("md_send_lock", '\u{f07ed}'), // 󰟭 ("md_send_lock_outline", '\u{f1166}'), // 󱅦 ("md_send_outline", '\u{f1165}'), // 󱅥 ("md_serial_port", '\u{f065c}'), // 󰙜 ("md_server", '\u{f048b}'), // 󰒋 ("md_server_minus", '\u{f048c}'), // 󰒌 ("md_server_network", '\u{f048d}'), // 󰒍 ("md_server_network_off", '\u{f048e}'), // 󰒎 ("md_server_off", '\u{f048f}'), // 󰒏 ("md_server_plus", '\u{f0490}'), // 󰒐 ("md_server_remove", '\u{f0491}'), // 󰒑 ("md_server_security", '\u{f0492}'), // 󰒒 ("md_set_all", '\u{f0778}'), // 󰝸 ("md_set_center", '\u{f0779}'), // 󰝹 ("md_set_center_right", '\u{f077a}'), // 󰝺 ("md_set_left", '\u{f077b}'), // 󰝻 ("md_set_left_center", '\u{f077c}'), // 󰝼 ("md_set_left_right", '\u{f077d}'), // 󰝽 ("md_set_merge", '\u{f14e0}'), // 󱓠 ("md_set_none", '\u{f077e}'), // 󰝾 ("md_set_right", '\u{f077f}'), // 󰝿 ("md_set_split", '\u{f14e1}'), // 󱓡 ("md_set_square", '\u{f145d}'), // 󱑝 ("md_set_top_box", '\u{f099f}'), // 󰦟 ("md_settings_helper", '\u{f0a6e}'), // 󰩮 ("md_shaker", '\u{f110e}'), // 󱄎 ("md_shaker_outline", '\u{f110f}'), // 󱄏 ("md_shape", '\u{f0831}'), // 󰠱 ("md_shape_circle_plus", '\u{f065d}'), // 󰙝 ("md_shape_outline", '\u{f0832}'), // 󰠲 ("md_shape_oval_plus", '\u{f11fa}'), // 󱇺 ("md_shape_plus", '\u{f0495}'), // 󰒕 ("md_shape_polygon_plus", '\u{f065e}'), // 󰙞 ("md_shape_rectangle_plus", '\u{f065f}'), // 󰙟 ("md_shape_square_plus", '\u{f0660}'), // 󰙠 ("md_shape_square_rounded_plus", '\u{f14fa}'), // 󱓺 ("md_share", '\u{f0496}'), // 󰒖 ("md_share_all", '\u{f11f4}'), // 󱇴 ("md_share_all_outline", '\u{f11f5}'), // 󱇵 ("md_share_circle", '\u{f11ad}'), // 󱆭 ("md_share_off", '\u{f0f23}'), // 󰼣 ("md_share_off_outline", '\u{f0f24}'), // 󰼤 ("md_share_outline", '\u{f0932}'), // 󰤲 ("md_share_variant", '\u{f0497}'), // 󰒗 ("md_share_variant_outline", '\u{f1514}'), // 󱔔 ("md_shark", '\u{f18ba}'), // 󱢺 ("md_shark_fin", '\u{f1673}'), // 󱙳 ("md_shark_fin_outline", '\u{f1674}'), // 󱙴 ("md_shark_off", '\u{f18bb}'), // 󱢻 ("md_sheep", '\u{f0cc6}'), // 󰳆 ("md_shield", '\u{f0498}'), // 󰒘 ("md_shield_account", '\u{f088f}'), // 󰢏 ("md_shield_account_outline", '\u{f0a12}'), // 󰨒 ("md_shield_account_variant", '\u{f15a7}'), // 󱖧 ("md_shield_account_variant_outline", '\u{f15a8}'), // 󱖨 ("md_shield_airplane", '\u{f06bb}'), // 󰚻 ("md_shield_airplane_outline", '\u{f0cc7}'), // 󰳇 ("md_shield_alert", '\u{f0ecc}'), // 󰻌 ("md_shield_alert_outline", '\u{f0ecd}'), // 󰻍 ("md_shield_bug", '\u{f13da}'), // 󱏚 ("md_shield_bug_outline", '\u{f13db}'), // 󱏛 ("md_shield_car", '\u{f0f83}'), // 󰾃 ("md_shield_check", '\u{f0565}'), // 󰕥 ("md_shield_check_outline", '\u{f0cc8}'), // 󰳈 ("md_shield_cross", '\u{f0cc9}'), // 󰳉 ("md_shield_cross_outline", '\u{f0cca}'), // 󰳊 ("md_shield_crown", '\u{f18bc}'), // 󱢼 ("md_shield_crown_outline", '\u{f18bd}'), // 󱢽 ("md_shield_edit", '\u{f11a0}'), // 󱆠 ("md_shield_edit_outline", '\u{f11a1}'), // 󱆡 ("md_shield_half", '\u{f1360}'), // 󱍠 ("md_shield_half_full", '\u{f0780}'), // 󰞀 ("md_shield_home", '\u{f068a}'), // 󰚊 ("md_shield_home_outline", '\u{f0ccb}'), // 󰳋 ("md_shield_key", '\u{f0bc4}'), // 󰯄 ("md_shield_key_outline", '\u{f0bc5}'), // 󰯅 ("md_shield_link_variant", '\u{f0d33}'), // 󰴳 ("md_shield_link_variant_outline", '\u{f0d34}'), // 󰴴 ("md_shield_lock", '\u{f099d}'), // 󰦝 ("md_shield_lock_open", '\u{f199a}'), // 󱦚 ("md_shield_lock_open_outline", '\u{f199b}'), // 󱦛 ("md_shield_lock_outline", '\u{f0ccc}'), // 󰳌 ("md_shield_moon", '\u{f1828}'), // 󱠨 ("md_shield_moon_outline", '\u{f1829}'), // 󱠩 ("md_shield_off", '\u{f099e}'), // 󰦞 ("md_shield_off_outline", '\u{f099c}'), // 󰦜 ("md_shield_outline", '\u{f0499}'), // 󰒙 ("md_shield_plus", '\u{f0ada}'), // 󰫚 ("md_shield_plus_outline", '\u{f0adb}'), // 󰫛 ("md_shield_refresh", '\u{f00aa}'), // 󰂪 ("md_shield_refresh_outline", '\u{f01e0}'), // 󰇠 ("md_shield_remove", '\u{f0adc}'), // 󰫜 ("md_shield_remove_outline", '\u{f0add}'), // 󰫝 ("md_shield_search", '\u{f0d9a}'), // 󰶚 ("md_shield_star", '\u{f113b}'), // 󱄻 ("md_shield_star_outline", '\u{f113c}'), // 󱄼 ("md_shield_sun", '\u{f105d}'), // 󱁝 ("md_shield_sun_outline", '\u{f105e}'), // 󱁞 ("md_shield_sword", '\u{f18be}'), // 󱢾 ("md_shield_sword_outline", '\u{f18bf}'), // 󱢿 ("md_shield_sync", '\u{f11a2}'), // 󱆢 ("md_shield_sync_outline", '\u{f11a3}'), // 󱆣 ("md_shimmer", '\u{f1545}'), // 󱕅 ("md_ship_wheel", '\u{f0833}'), // 󰠳 ("md_shipping_pallet", '\u{f184e}'), // 󱡎 ("md_shoe_ballet", '\u{f15ca}'), // 󱗊 ("md_shoe_cleat", '\u{f15c7}'), // 󱗇 ("md_shoe_formal", '\u{f0b47}'), // 󰭇 ("md_shoe_heel", '\u{f0b48}'), // 󰭈 ("md_shoe_print", '\u{f0dfa}'), // 󰷺 ("md_shoe_sneaker", '\u{f15c8}'), // 󱗈 ("md_shopping", '\u{f049a}'), // 󰒚 ("md_shopping_music", '\u{f049b}'), // 󰒛 ("md_shopping_outline", '\u{f11d5}'), // 󱇕 ("md_shopping_search", '\u{f0f84}'), // 󰾄 ("md_shopping_search_outline", '\u{f1a6f}'), // 󱩯 ("md_shore", '\u{f14f9}'), // 󱓹 ("md_shovel", '\u{f0710}'), // 󰜐 ("md_shovel_off", '\u{f0711}'), // 󰜑 ("md_shower", '\u{f09a0}'), // 󰦠 ("md_shower_head", '\u{f09a1}'), // 󰦡 ("md_shredder", '\u{f049c}'), // 󰒜 ("md_shuffle", '\u{f049d}'), // 󰒝 ("md_shuffle_disabled", '\u{f049e}'), // 󰒞 ("md_shuffle_variant", '\u{f049f}'), // 󰒟 ("md_shuriken", '\u{f137f}'), // 󱍿 ("md_sickle", '\u{f18c0}'), // 󱣀 ("md_sigma", '\u{f04a0}'), // 󰒠 ("md_sigma_lower", '\u{f062b}'), // 󰘫 ("md_sign_caution", '\u{f04a1}'), // 󰒡 ("md_sign_direction", '\u{f0781}'), // 󰞁 ("md_sign_direction_minus", '\u{f1000}'), // 󱀀 ("md_sign_direction_plus", '\u{f0fdc}'), // 󰿜 ("md_sign_direction_remove", '\u{f0fdd}'), // 󰿝 ("md_sign_pole", '\u{f14f8}'), // 󱓸 ("md_sign_real_estate", '\u{f1118}'), // 󱄘 ("md_sign_text", '\u{f0782}'), // 󰞂 ("md_signal", '\u{f04a2}'), // 󰒢 ("md_signal_2g", '\u{f0712}'), // 󰜒 ("md_signal_3g", '\u{f0713}'), // 󰜓 ("md_signal_4g", '\u{f0714}'), // 󰜔 ("md_signal_5g", '\u{f0a6f}'), // 󰩯 ("md_signal_cellular_1", '\u{f08bc}'), // 󰢼 ("md_signal_cellular_2", '\u{f08bd}'), // 󰢽 ("md_signal_cellular_3", '\u{f08be}'), // 󰢾 ("md_signal_cellular_outline", '\u{f08bf}'), // 󰢿 ("md_signal_distance_variant", '\u{f0e64}'), // 󰹤 ("md_signal_hspa", '\u{f0715}'), // 󰜕 ("md_signal_hspa_plus", '\u{f0716}'), // 󰜖 ("md_signal_off", '\u{f0783}'), // 󰞃 ("md_signal_variant", '\u{f060a}'), // 󰘊 ("md_signature", '\u{f0dfb}'), // 󰷻 ("md_signature_freehand", '\u{f0dfc}'), // 󰷼 ("md_signature_image", '\u{f0dfd}'), // 󰷽 ("md_signature_text", '\u{f0dfe}'), // 󰷾 ("md_silo", '\u{f0b49}'), // 󰭉 ("md_silverware", '\u{f04a3}'), // 󰒣 ("md_silverware_clean", '\u{f0fde}'), // 󰿞 ("md_silverware_fork", '\u{f04a4}'), // 󰒤 ("md_silverware_fork_knife", '\u{f0a70}'), // 󰩰 ("md_silverware_spoon", '\u{f04a5}'), // 󰒥 ("md_silverware_variant", '\u{f04a6}'), // 󰒦 ("md_sim", '\u{f04a7}'), // 󰒧 ("md_sim_alert", '\u{f04a8}'), // 󰒨 ("md_sim_alert_outline", '\u{f15d3}'), // 󱗓 ("md_sim_off", '\u{f04a9}'), // 󰒩 ("md_sim_off_outline", '\u{f15d4}'), // 󱗔 ("md_sim_outline", '\u{f15d5}'), // 󱗕 ("md_simple_icons", '\u{f131d}'), // 󱌝 ("md_sina_weibo", '\u{f0adf}'), // 󰫟 ("md_sine_wave", '\u{f095b}'), // 󰥛 ("md_sitemap", '\u{f04aa}'), // 󰒪 ("md_sitemap_outline", '\u{f199c}'), // 󱦜 ("md_size_m", '\u{f13a5}'), // 󱎥 ("md_size_s", '\u{f13a4}'), // 󱎤 ("md_size_xl", '\u{f13a7}'), // 󱎧 ("md_size_xs", '\u{f13a3}'), // 󱎣 ("md_size_xxl", '\u{f13a8}'), // 󱎨 ("md_size_xxs", '\u{f13a2}'), // 󱎢 ("md_size_xxxl", '\u{f13a9}'), // 󱎩 ("md_skate", '\u{f0d35}'), // 󰴵 ("md_skate_off", '\u{f0699}'), // 󰚙 ("md_skateboard", '\u{f14c2}'), // 󱓂 ("md_skateboarding", '\u{f0501}'), // 󰔁 ("md_skew_less", '\u{f0d36}'), // 󰴶 ("md_skew_more", '\u{f0d37}'), // 󰴷 ("md_ski", '\u{f1304}'), // 󱌄 ("md_ski_cross_country", '\u{f1305}'), // 󱌅 ("md_ski_water", '\u{f1306}'), // 󱌆 ("md_skip_backward", '\u{f04ab}'), // 󰒫 ("md_skip_backward_outline", '\u{f0f25}'), // 󰼥 ("md_skip_forward", '\u{f04ac}'), // 󰒬 ("md_skip_forward_outline", '\u{f0f26}'), // 󰼦 ("md_skip_next", '\u{f04ad}'), // 󰒭 ("md_skip_next_circle", '\u{f0661}'), // 󰙡 ("md_skip_next_circle_outline", '\u{f0662}'), // 󰙢 ("md_skip_next_outline", '\u{f0f27}'), // 󰼧 ("md_skip_previous", '\u{f04ae}'), // 󰒮 ("md_skip_previous_circle", '\u{f0663}'), // 󰙣 ("md_skip_previous_circle_outline", '\u{f0664}'), // 󰙤 ("md_skip_previous_outline", '\u{f0f28}'), // 󰼨 ("md_skull", '\u{f068c}'), // 󰚌 ("md_skull_crossbones", '\u{f0bc6}'), // 󰯆 ("md_skull_crossbones_outline", '\u{f0bc7}'), // 󰯇 ("md_skull_outline", '\u{f0bc8}'), // 󰯈 ("md_skull_scan", '\u{f14c7}'), // 󱓇 ("md_skull_scan_outline", '\u{f14c8}'), // 󱓈 ("md_skype", '\u{f04af}'), // 󰒯 ("md_skype_business", '\u{f04b0}'), // 󰒰 ("md_slack", '\u{f04b1}'), // 󰒱 ("md_slash_forward", '\u{f0fdf}'), // 󰿟 ("md_slash_forward_box", '\u{f0fe0}'), // 󰿠 ("md_sledding", '\u{f041b}'), // 󰐛 ("md_sleep", '\u{f04b2}'), // 󰒲 ("md_sleep_off", '\u{f04b3}'), // 󰒳 ("md_slide", '\u{f15a5}'), // 󱖥 ("md_slope_downhill", '\u{f0dff}'), // 󰷿 ("md_slope_uphill", '\u{f0e00}'), // 󰸀 ("md_slot_machine", '\u{f1114}'), // 󱄔 ("md_slot_machine_outline", '\u{f1115}'), // 󱄕 ("md_smart_card", '\u{f10bd}'), // 󱂽 ("md_smart_card_off", '\u{f18f7}'), // 󱣷 ("md_smart_card_off_outline", '\u{f18f8}'), // 󱣸 ("md_smart_card_outline", '\u{f10be}'), // 󱂾 ("md_smart_card_reader", '\u{f10bf}'), // 󱂿 ("md_smart_card_reader_outline", '\u{f10c0}'), // 󱃀 ("md_smog", '\u{f0a71}'), // 󰩱 ("md_smoke", '\u{f1799}'), // 󱞙 ("md_smoke_detector", '\u{f0392}'), // 󰎒 ("md_smoke_detector_alert", '\u{f192e}'), // 󱤮 ("md_smoke_detector_alert_outline", '\u{f192f}'), // 󱤯 ("md_smoke_detector_off", '\u{f1809}'), // 󱠉 ("md_smoke_detector_off_outline", '\u{f180a}'), // 󱠊 ("md_smoke_detector_outline", '\u{f1808}'), // 󱠈 ("md_smoke_detector_variant", '\u{f180b}'), // 󱠋 ("md_smoke_detector_variant_alert", '\u{f1930}'), // 󱤰 ("md_smoke_detector_variant_off", '\u{f180c}'), // 󱠌 ("md_smoking", '\u{f04b4}'), // 󰒴 ("md_smoking_off", '\u{f04b5}'), // 󰒵 ("md_smoking_pipe", '\u{f140d}'), // 󱐍 ("md_smoking_pipe_off", '\u{f1428}'), // 󱐨 ("md_snail", '\u{f1677}'), // 󱙷 ("md_snake", '\u{f150e}'), // 󱔎 ("md_snapchat", '\u{f04b6}'), // 󰒶 ("md_snowboard", '\u{f1307}'), // 󱌇 ("md_snowflake", '\u{f0717}'), // 󰜗 ("md_snowflake_alert", '\u{f0f29}'), // 󰼩 ("md_snowflake_check", '\u{f1a70}'), // 󱩰 ("md_snowflake_melt", '\u{f12cb}'), // 󱋋 ("md_snowflake_off", '\u{f14e3}'), // 󱓣 ("md_snowflake_thermometer", '\u{f1a71}'), // 󱩱 ("md_snowflake_variant", '\u{f0f2a}'), // 󰼪 ("md_snowman", '\u{f04b7}'), // 󰒷 ("md_snowmobile", '\u{f06dd}'), // 󰛝 ("md_snowshoeing", '\u{f1a72}'), // 󱩲 ("md_soccer", '\u{f04b8}'), // 󰒸 ("md_soccer_field", '\u{f0834}'), // 󰠴 ("md_social_distance_2_meters", '\u{f1579}'), // 󱕹 ("md_social_distance_6_feet", '\u{f157a}'), // 󱕺 ("md_sofa", '\u{f04b9}'), // 󰒹 ("md_sofa_outline", '\u{f156d}'), // 󱕭 ("md_sofa_single", '\u{f156e}'), // 󱕮 ("md_sofa_single_outline", '\u{f156f}'), // 󱕯 ("md_solar_panel", '\u{f0d9b}'), // 󰶛 ("md_solar_panel_large", '\u{f0d9c}'), // 󰶜 ("md_solar_power", '\u{f0a72}'), // 󰩲 ("md_solar_power_variant", '\u{f1a73}'), // 󱩳 ("md_solar_power_variant_outline", '\u{f1a74}'), // 󱩴 ("md_soldering_iron", '\u{f1092}'), // 󱂒 ("md_solid", '\u{f068d}'), // 󰚍 ("md_sony_playstation", '\u{f0414}'), // 󰐔 ("md_sort", '\u{f04ba}'), // 󰒺 ("md_sort_alphabetical_ascending", '\u{f05bd}'), // 󰖽 ("md_sort_alphabetical_ascending_variant", '\u{f1148}'), // 󱅈 ("md_sort_alphabetical_descending", '\u{f05bf}'), // 󰖿 ("md_sort_alphabetical_descending_variant", '\u{f1149}'), // 󱅉 ("md_sort_alphabetical_variant", '\u{f04bb}'), // 󰒻 ("md_sort_ascending", '\u{f04bc}'), // 󰒼 ("md_sort_bool_ascending", '\u{f1385}'), // 󱎅 ("md_sort_bool_ascending_variant", '\u{f1386}'), // 󱎆 ("md_sort_bool_descending", '\u{f1387}'), // 󱎇 ("md_sort_bool_descending_variant", '\u{f1388}'), // 󱎈 ("md_sort_calendar_ascending", '\u{f1547}'), // 󱕇 ("md_sort_calendar_descending", '\u{f1548}'), // 󱕈 ("md_sort_clock_ascending", '\u{f1549}'), // 󱕉 ("md_sort_clock_ascending_outline", '\u{f154a}'), // 󱕊 ("md_sort_clock_descending", '\u{f154b}'), // 󱕋 ("md_sort_clock_descending_outline", '\u{f154c}'), // 󱕌 ("md_sort_descending", '\u{f04bd}'), // 󰒽 ("md_sort_numeric_ascending", '\u{f1389}'), // 󱎉 ("md_sort_numeric_ascending_variant", '\u{f090d}'), // 󰤍 ("md_sort_numeric_descending", '\u{f138a}'), // 󱎊 ("md_sort_numeric_descending_variant", '\u{f0ad2}'), // 󰫒 ("md_sort_numeric_variant", '\u{f04be}'), // 󰒾 ("md_sort_reverse_variant", '\u{f033c}'), // 󰌼 ("md_sort_variant", '\u{f04bf}'), // 󰒿 ("md_sort_variant_lock", '\u{f0ccd}'), // 󰳍 ("md_sort_variant_lock_open", '\u{f0cce}'), // 󰳎 ("md_sort_variant_off", '\u{f1abb}'), // 󱪻 ("md_sort_variant_remove", '\u{f1147}'), // 󱅇 ("md_soundbar", '\u{f17db}'), // 󱟛 ("md_soundcloud", '\u{f04c0}'), // 󰓀 ("md_source_branch", '\u{f062c}'), // 󰘬 ("md_source_branch_check", '\u{f14cf}'), // 󱓏 ("md_source_branch_minus", '\u{f14cb}'), // 󱓋 ("md_source_branch_plus", '\u{f14ca}'), // 󱓊 ("md_source_branch_refresh", '\u{f14cd}'), // 󱓍 ("md_source_branch_remove", '\u{f14cc}'), // 󱓌 ("md_source_branch_sync", '\u{f14ce}'), // 󱓎 ("md_source_commit", '\u{f0718}'), // 󰜘 ("md_source_commit_end", '\u{f0719}'), // 󰜙 ("md_source_commit_end_local", '\u{f071a}'), // 󰜚 ("md_source_commit_local", '\u{f071b}'), // 󰜛 ("md_source_commit_next_local", '\u{f071c}'), // 󰜜 ("md_source_commit_start", '\u{f071d}'), // 󰜝 ("md_source_commit_start_next_local", '\u{f071e}'), // 󰜞 ("md_source_fork", '\u{f04c1}'), // 󰓁 ("md_source_merge", '\u{f062d}'), // 󰘭 ("md_source_pull", '\u{f04c2}'), // 󰓂 ("md_source_repository", '\u{f0ccf}'), // 󰳏 ("md_source_repository_multiple", '\u{f0cd0}'), // 󰳐 ("md_soy_sauce", '\u{f07ee}'), // 󰟮 ("md_soy_sauce_off", '\u{f13fc}'), // 󱏼 ("md_spa", '\u{f0cd1}'), // 󰳑 ("md_spa_outline", '\u{f0cd2}'), // 󰳒 ("md_space_invaders", '\u{f0bc9}'), // 󰯉 ("md_space_station", '\u{f1383}'), // 󱎃 ("md_spade", '\u{f0e65}'), // 󰹥 ("md_speaker", '\u{f04c3}'), // 󰓃 ("md_speaker_bluetooth", '\u{f09a2}'), // 󰦢 ("md_speaker_multiple", '\u{f0d38}'), // 󰴸 ("md_speaker_off", '\u{f04c4}'), // 󰓄 ("md_speaker_wireless", '\u{f071f}'), // 󰜟 ("md_spear", '\u{f1845}'), // 󱡅 ("md_speedometer", '\u{f04c5}'), // 󰓅 ("md_speedometer_medium", '\u{f0f85}'), // 󰾅 ("md_speedometer_slow", '\u{f0f86}'), // 󰾆 ("md_spellcheck", '\u{f04c6}'), // 󰓆 ("md_sphere", '\u{f1954}'), // 󱥔 ("md_sphere_off", '\u{f1955}'), // 󱥕 ("md_spider", '\u{f11ea}'), // 󱇪 ("md_spider_thread", '\u{f11eb}'), // 󱇫 ("md_spider_web", '\u{f0bca}'), // 󰯊 ("md_spirit_level", '\u{f14f1}'), // 󱓱 ("md_spoon_sugar", '\u{f1429}'), // 󱐩 ("md_spotify", '\u{f04c7}'), // 󰓇 ("md_spotlight", '\u{f04c8}'), // 󰓈 ("md_spotlight_beam", '\u{f04c9}'), // 󰓉 ("md_spray", '\u{f0665}'), // 󰙥 ("md_spray_bottle", '\u{f0ae0}'), // 󰫠 ("md_sprinkler", '\u{f105f}'), // 󱁟 ("md_sprinkler_fire", '\u{f199d}'), // 󱦝 ("md_sprinkler_variant", '\u{f1060}'), // 󱁠 ("md_sprout", '\u{f0e66}'), // 󰹦 ("md_sprout_outline", '\u{f0e67}'), // 󰹧 ("md_square", '\u{f0764}'), // 󰝤 ("md_square_circle", '\u{f1500}'), // 󱔀 ("md_square_edit_outline", '\u{f090c}'), // 󰤌 ("md_square_medium", '\u{f0a13}'), // 󰨓 ("md_square_medium_outline", '\u{f0a14}'), // 󰨔 ("md_square_off", '\u{f12ee}'), // 󱋮 ("md_square_off_outline", '\u{f12ef}'), // 󱋯 ("md_square_opacity", '\u{f1854}'), // 󱡔 ("md_square_outline", '\u{f0763}'), // 󰝣 ("md_square_root", '\u{f0784}'), // 󰞄 ("md_square_root_box", '\u{f09a3}'), // 󰦣 ("md_square_rounded", '\u{f14fb}'), // 󱓻 ("md_square_rounded_badge", '\u{f1a07}'), // 󱨇 ("md_square_rounded_badge_outline", '\u{f1a08}'), // 󱨈 ("md_square_rounded_outline", '\u{f14fc}'), // 󱓼 ("md_square_small", '\u{f0a15}'), // 󰨕 ("md_square_wave", '\u{f147b}'), // 󱑻 ("md_squeegee", '\u{f0ae1}'), // 󰫡 ("md_ssh", '\u{f08c0}'), // 󰣀 ("md_stack_exchange", '\u{f060b}'), // 󰘋 ("md_stack_overflow", '\u{f04cc}'), // 󰓌 ("md_stackpath", '\u{f0359}'), // 󰍙 ("md_stadium", '\u{f0ff9}'), // 󰿹 ("md_stadium_variant", '\u{f0720}'), // 󰜠 ("md_stairs", '\u{f04cd}'), // 󰓍 ("md_stairs_box", '\u{f139e}'), // 󱎞 ("md_stairs_down", '\u{f12be}'), // 󱊾 ("md_stairs_up", '\u{f12bd}'), // 󱊽 ("md_stamper", '\u{f0d39}'), // 󰴹 ("md_standard_definition", '\u{f07ef}'), // 󰟯 ("md_star", '\u{f04ce}'), // 󰓎 ("md_star_box", '\u{f0a73}'), // 󰩳 ("md_star_box_multiple", '\u{f1286}'), // 󱊆 ("md_star_box_multiple_outline", '\u{f1287}'), // 󱊇 ("md_star_box_outline", '\u{f0a74}'), // 󰩴 ("md_star_check", '\u{f1566}'), // 󱕦 ("md_star_check_outline", '\u{f156a}'), // 󱕪 ("md_star_circle", '\u{f04cf}'), // 󰓏 ("md_star_circle_outline", '\u{f09a4}'), // 󰦤 ("md_star_cog", '\u{f1668}'), // 󱙨 ("md_star_cog_outline", '\u{f1669}'), // 󱙩 ("md_star_crescent", '\u{f0979}'), // 󰥹 ("md_star_david", '\u{f097a}'), // 󰥺 ("md_star_face", '\u{f09a5}'), // 󰦥 ("md_star_four_points", '\u{f0ae2}'), // 󰫢 ("md_star_four_points_outline", '\u{f0ae3}'), // 󰫣 ("md_star_half", '\u{f0246}'), // 󰉆 ("md_star_half_full", '\u{f04d0}'), // 󰓐 ("md_star_minus", '\u{f1564}'), // 󱕤 ("md_star_minus_outline", '\u{f1568}'), // 󱕨 ("md_star_off", '\u{f04d1}'), // 󰓑 ("md_star_off_outline", '\u{f155b}'), // 󱕛 ("md_star_outline", '\u{f04d2}'), // 󰓒 ("md_star_plus", '\u{f1563}'), // 󱕣 ("md_star_plus_outline", '\u{f1567}'), // 󱕧 ("md_star_remove", '\u{f1565}'), // 󱕥 ("md_star_remove_outline", '\u{f1569}'), // 󱕩 ("md_star_settings", '\u{f166a}'), // 󱙪 ("md_star_settings_outline", '\u{f166b}'), // 󱙫 ("md_star_shooting", '\u{f1741}'), // 󱝁 ("md_star_shooting_outline", '\u{f1742}'), // 󱝂 ("md_star_three_points", '\u{f0ae4}'), // 󰫤 ("md_star_three_points_outline", '\u{f0ae5}'), // 󰫥 ("md_state_machine", '\u{f11ef}'), // 󱇯 ("md_steam", '\u{f04d3}'), // 󰓓 ("md_steering", '\u{f04d4}'), // 󰓔 ("md_steering_off", '\u{f090e}'), // 󰤎 ("md_step_backward", '\u{f04d5}'), // 󰓕 ("md_step_backward_2", '\u{f04d6}'), // 󰓖 ("md_step_forward", '\u{f04d7}'), // 󰓗 ("md_step_forward_2", '\u{f04d8}'), // 󰓘 ("md_stethoscope", '\u{f04d9}'), // 󰓙 ("md_sticker", '\u{f1364}'), // 󱍤 ("md_sticker_alert", '\u{f1365}'), // 󱍥 ("md_sticker_alert_outline", '\u{f1366}'), // 󱍦 ("md_sticker_check", '\u{f1367}'), // 󱍧 ("md_sticker_check_outline", '\u{f1368}'), // 󱍨 ("md_sticker_circle_outline", '\u{f05d0}'), // 󰗐 ("md_sticker_emoji", '\u{f0785}'), // 󰞅 ("md_sticker_minus", '\u{f1369}'), // 󱍩 ("md_sticker_minus_outline", '\u{f136a}'), // 󱍪 ("md_sticker_outline", '\u{f136b}'), // 󱍫 ("md_sticker_plus", '\u{f136c}'), // 󱍬 ("md_sticker_plus_outline", '\u{f136d}'), // 󱍭 ("md_sticker_remove", '\u{f136e}'), // 󱍮 ("md_sticker_remove_outline", '\u{f136f}'), // 󱍯 ("md_sticker_text", '\u{f178e}'), // 󱞎 ("md_sticker_text_outline", '\u{f178f}'), // 󱞏 ("md_stocking", '\u{f04da}'), // 󰓚 ("md_stomach", '\u{f1093}'), // 󱂓 ("md_stool", '\u{f195d}'), // 󱥝 ("md_stool_outline", '\u{f195e}'), // 󱥞 ("md_stop", '\u{f04db}'), // 󰓛 ("md_stop_circle", '\u{f0666}'), // 󰙦 ("md_stop_circle_outline", '\u{f0667}'), // 󰙧 ("md_storage_tank", '\u{f1a75}'), // 󱩵 ("md_storage_tank_outline", '\u{f1a76}'), // 󱩶 ("md_store", '\u{f04dc}'), // 󰓜 ("md_store_24_hour", '\u{f04dd}'), // 󰓝 ("md_store_alert", '\u{f18c1}'), // 󱣁 ("md_store_alert_outline", '\u{f18c2}'), // 󱣂 ("md_store_check", '\u{f18c3}'), // 󱣃 ("md_store_check_outline", '\u{f18c4}'), // 󱣄 ("md_store_clock", '\u{f18c5}'), // 󱣅 ("md_store_clock_outline", '\u{f18c6}'), // 󱣆 ("md_store_cog", '\u{f18c7}'), // 󱣇 ("md_store_cog_outline", '\u{f18c8}'), // 󱣈 ("md_store_edit", '\u{f18c9}'), // 󱣉 ("md_store_edit_outline", '\u{f18ca}'), // 󱣊 ("md_store_marker", '\u{f18cb}'), // 󱣋 ("md_store_marker_outline", '\u{f18cc}'), // 󱣌 ("md_store_minus", '\u{f165e}'), // 󱙞 ("md_store_minus_outline", '\u{f18cd}'), // 󱣍 ("md_store_off", '\u{f18ce}'), // 󱣎 ("md_store_off_outline", '\u{f18cf}'), // 󱣏 ("md_store_outline", '\u{f1361}'), // 󱍡 ("md_store_plus", '\u{f165f}'), // 󱙟 ("md_store_plus_outline", '\u{f18d0}'), // 󱣐 ("md_store_remove", '\u{f1660}'), // 󱙠 ("md_store_remove_outline", '\u{f18d1}'), // 󱣑 ("md_store_search", '\u{f18d2}'), // 󱣒 ("md_store_search_outline", '\u{f18d3}'), // 󱣓 ("md_store_settings", '\u{f18d4}'), // 󱣔 ("md_store_settings_outline", '\u{f18d5}'), // 󱣕 ("md_storefront", '\u{f07c7}'), // 󰟇 ("md_storefront_outline", '\u{f10c1}'), // 󱃁 ("md_stove", '\u{f04de}'), // 󰓞 ("md_strategy", '\u{f11d6}'), // 󱇖 ("md_stretch_to_page", '\u{f0f2b}'), // 󰼫 ("md_stretch_to_page_outline", '\u{f0f2c}'), // 󰼬 ("md_string_lights", '\u{f12ba}'), // 󱊺 ("md_string_lights_off", '\u{f12bb}'), // 󱊻 ("md_subdirectory_arrow_left", '\u{f060c}'), // 󰘌 ("md_subdirectory_arrow_right", '\u{f060d}'), // 󰘍 ("md_submarine", '\u{f156c}'), // 󱕬 ("md_subtitles", '\u{f0a16}'), // 󰨖 ("md_subtitles_outline", '\u{f0a17}'), // 󰨗 ("md_subway", '\u{f06ac}'), // 󰚬 ("md_subway_alert_variant", '\u{f0d9d}'), // 󰶝 ("md_subway_variant", '\u{f04df}'), // 󰓟 ("md_summit", '\u{f0786}'), // 󰞆 ("md_sun_clock", '\u{f1a77}'), // 󱩷 ("md_sun_clock_outline", '\u{f1a78}'), // 󱩸 ("md_sun_compass", '\u{f19a5}'), // 󱦥 ("md_sun_snowflake", '\u{f1796}'), // 󱞖 ("md_sun_snowflake_variant", '\u{f1a79}'), // 󱩹 ("md_sun_thermometer", '\u{f18d6}'), // 󱣖 ("md_sun_thermometer_outline", '\u{f18d7}'), // 󱣗 ("md_sun_wireless", '\u{f17fe}'), // 󱟾 ("md_sun_wireless_outline", '\u{f17ff}'), // 󱟿 ("md_sunglasses", '\u{f04e0}'), // 󰓠 ("md_surfing", '\u{f1746}'), // 󱝆 ("md_surround_sound", '\u{f05c5}'), // 󰗅 ("md_surround_sound_2_0", '\u{f07f0}'), // 󰟰 ("md_surround_sound_2_1", '\u{f1729}'), // 󱜩 ("md_surround_sound_3_1", '\u{f07f1}'), // 󰟱 ("md_surround_sound_5_1", '\u{f07f2}'), // 󰟲 ("md_surround_sound_5_1_2", '\u{f172a}'), // 󱜪 ("md_surround_sound_7_1", '\u{f07f3}'), // 󰟳 ("md_svg", '\u{f0721}'), // 󰜡 ("md_swap_horizontal", '\u{f04e1}'), // 󰓡 ("md_swap_horizontal_bold", '\u{f0bcd}'), // 󰯍 ("md_swap_horizontal_circle", '\u{f0fe1}'), // 󰿡 ("md_swap_horizontal_circle_outline", '\u{f0fe2}'), // 󰿢 ("md_swap_horizontal_variant", '\u{f08c1}'), // 󰣁 ("md_swap_vertical", '\u{f04e2}'), // 󰓢 ("md_swap_vertical_bold", '\u{f0bce}'), // 󰯎 ("md_swap_vertical_circle", '\u{f0fe3}'), // 󰿣 ("md_swap_vertical_circle_outline", '\u{f0fe4}'), // 󰿤 ("md_swap_vertical_variant", '\u{f08c2}'), // 󰣂 ("md_swim", '\u{f04e3}'), // 󰓣 ("md_switch", '\u{f04e4}'), // 󰓤 ("md_sword", '\u{f04e5}'), // 󰓥 ("md_sword_cross", '\u{f0787}'), // 󰞇 ("md_syllabary_hangul", '\u{f1333}'), // 󱌳 ("md_syllabary_hiragana", '\u{f1334}'), // 󱌴 ("md_syllabary_katakana", '\u{f1335}'), // 󱌵 ("md_syllabary_katakana_halfwidth", '\u{f1336}'), // 󱌶 ("md_symbol", '\u{f1501}'), // 󱔁 ("md_symfony", '\u{f0ae6}'), // 󰫦 ("md_sync", '\u{f04e6}'), // 󰓦 ("md_sync_alert", '\u{f04e7}'), // 󰓧 ("md_sync_circle", '\u{f1378}'), // 󱍸 ("md_sync_off", '\u{f04e8}'), // 󰓨 ("md_tab", '\u{f04e9}'), // 󰓩 ("md_tab_minus", '\u{f0b4b}'), // 󰭋 ("md_tab_plus", '\u{f075c}'), // 󰝜 ("md_tab_remove", '\u{f0b4c}'), // 󰭌 ("md_tab_search", '\u{f199e}'), // 󱦞 ("md_tab_unselected", '\u{f04ea}'), // 󰓪 ("md_table", '\u{f04eb}'), // 󰓫 ("md_table_account", '\u{f13b9}'), // 󱎹 ("md_table_alert", '\u{f13ba}'), // 󱎺 ("md_table_arrow_down", '\u{f13bb}'), // 󱎻 ("md_table_arrow_left", '\u{f13bc}'), // 󱎼 ("md_table_arrow_right", '\u{f13bd}'), // 󱎽 ("md_table_arrow_up", '\u{f13be}'), // 󱎾 ("md_table_border", '\u{f0a18}'), // 󰨘 ("md_table_cancel", '\u{f13bf}'), // 󱎿 ("md_table_chair", '\u{f1061}'), // 󱁡 ("md_table_check", '\u{f13c0}'), // 󱏀 ("md_table_clock", '\u{f13c1}'), // 󱏁 ("md_table_cog", '\u{f13c2}'), // 󱏂 ("md_table_column", '\u{f0835}'), // 󰠵 ("md_table_column_plus_after", '\u{f04ec}'), // 󰓬 ("md_table_column_plus_before", '\u{f04ed}'), // 󰓭 ("md_table_column_remove", '\u{f04ee}'), // 󰓮 ("md_table_column_width", '\u{f04ef}'), // 󰓯 ("md_table_edit", '\u{f04f0}'), // 󰓰 ("md_table_eye", '\u{f1094}'), // 󱂔 ("md_table_eye_off", '\u{f13c3}'), // 󱏃 ("md_table_furniture", '\u{f05bc}'), // 󰖼 ("md_table_headers_eye", '\u{f121d}'), // 󱈝 ("md_table_headers_eye_off", '\u{f121e}'), // 󱈞 ("md_table_heart", '\u{f13c4}'), // 󱏄 ("md_table_key", '\u{f13c5}'), // 󱏅 ("md_table_large", '\u{f04f1}'), // 󰓱 ("md_table_large_plus", '\u{f0f87}'), // 󰾇 ("md_table_large_remove", '\u{f0f88}'), // 󰾈 ("md_table_lock", '\u{f13c6}'), // 󱏆 ("md_table_merge_cells", '\u{f09a6}'), // 󰦦 ("md_table_minus", '\u{f13c7}'), // 󱏇 ("md_table_multiple", '\u{f13c8}'), // 󱏈 ("md_table_network", '\u{f13c9}'), // 󱏉 ("md_table_of_contents", '\u{f0836}'), // 󰠶 ("md_table_off", '\u{f13ca}'), // 󱏊 ("md_table_picnic", '\u{f1743}'), // 󱝃 ("md_table_pivot", '\u{f183c}'), // 󱠼 ("md_table_plus", '\u{f0a75}'), // 󰩵 ("md_table_refresh", '\u{f13a0}'), // 󱎠 ("md_table_remove", '\u{f0a76}'), // 󰩶 ("md_table_row", '\u{f0837}'), // 󰠷 ("md_table_row_height", '\u{f04f2}'), // 󰓲 ("md_table_row_plus_after", '\u{f04f3}'), // 󰓳 ("md_table_row_plus_before", '\u{f04f4}'), // 󰓴 ("md_table_row_remove", '\u{f04f5}'), // 󰓵 ("md_table_search", '\u{f090f}'), // 󰤏 ("md_table_settings", '\u{f0838}'), // 󰠸 ("md_table_split_cell", '\u{f142a}'), // 󱐪 ("md_table_star", '\u{f13cb}'), // 󱏋 ("md_table_sync", '\u{f13a1}'), // 󱎡 ("md_table_tennis", '\u{f0e68}'), // 󰹨 ("md_tablet", '\u{f04f6}'), // 󰓶 ("md_tablet_android", '\u{f04f7}'), // 󰓷 ("md_tablet_cellphone", '\u{f09a7}'), // 󰦧 ("md_tablet_dashboard", '\u{f0ece}'), // 󰻎 ("md_taco", '\u{f0762}'), // 󰝢 ("md_tag", '\u{f04f9}'), // 󰓹 ("md_tag_arrow_down", '\u{f172b}'), // 󱜫 ("md_tag_arrow_down_outline", '\u{f172c}'), // 󱜬 ("md_tag_arrow_left", '\u{f172d}'), // 󱜭 ("md_tag_arrow_left_outline", '\u{f172e}'), // 󱜮 ("md_tag_arrow_right", '\u{f172f}'), // 󱜯 ("md_tag_arrow_right_outline", '\u{f1730}'), // 󱜰 ("md_tag_arrow_up", '\u{f1731}'), // 󱜱 ("md_tag_arrow_up_outline", '\u{f1732}'), // 󱜲 ("md_tag_check", '\u{f1a7a}'), // 󱩺 ("md_tag_check_outline", '\u{f1a7b}'), // 󱩻 ("md_tag_faces", '\u{f04fa}'), // 󰓺 ("md_tag_heart", '\u{f068b}'), // 󰚋 ("md_tag_heart_outline", '\u{f0bcf}'), // 󰯏 ("md_tag_minus", '\u{f0910}'), // 󰤐 ("md_tag_minus_outline", '\u{f121f}'), // 󱈟 ("md_tag_multiple", '\u{f04fb}'), // 󰓻 ("md_tag_multiple_outline", '\u{f12f7}'), // 󱋷 ("md_tag_off", '\u{f1220}'), // 󱈠 ("md_tag_off_outline", '\u{f1221}'), // 󱈡 ("md_tag_outline", '\u{f04fc}'), // 󰓼 ("md_tag_plus", '\u{f0722}'), // 󰜢 ("md_tag_plus_outline", '\u{f1222}'), // 󱈢 ("md_tag_remove", '\u{f0723}'), // 󰜣 ("md_tag_remove_outline", '\u{f1223}'), // 󱈣 ("md_tag_search", '\u{f1907}'), // 󱤇 ("md_tag_search_outline", '\u{f1908}'), // 󱤈 ("md_tag_text", '\u{f1224}'), // 󱈤 ("md_tag_text_outline", '\u{f04fd}'), // 󰓽 ("md_tailwind", '\u{f13ff}'), // 󱏿 ("md_tally_mark_1", '\u{f1abc}'), // 󱪼 ("md_tally_mark_2", '\u{f1abd}'), // 󱪽 ("md_tally_mark_3", '\u{f1abe}'), // 󱪾 ("md_tally_mark_4", '\u{f1abf}'), // 󱪿 ("md_tally_mark_5", '\u{f1ac0}'), // 󱫀 ("md_tangram", '\u{f04f8}'), // 󰓸 ("md_tank", '\u{f0d3a}'), // 󰴺 ("md_tanker_truck", '\u{f0fe5}'), // 󰿥 ("md_tape_drive", '\u{f16df}'), // 󱛟 ("md_tape_measure", '\u{f0b4d}'), // 󰭍 ("md_target", '\u{f04fe}'), // 󰓾 ("md_target_account", '\u{f0bd0}'), // 󰯐 ("md_target_variant", '\u{f0a77}'), // 󰩷 ("md_taxi", '\u{f04ff}'), // 󰓿 ("md_tea", '\u{f0d9e}'), // 󰶞 ("md_tea_outline", '\u{f0d9f}'), // 󰶟 ("md_teamviewer", '\u{f0500}'), // 󰔀 ("md_teddy_bear", '\u{f18fb}'), // 󱣻 ("md_telescope", '\u{f0b4e}'), // 󰭎 ("md_television", '\u{f0502}'), // 󰔂 ("md_television_ambient_light", '\u{f1356}'), // 󱍖 ("md_television_box", '\u{f0839}'), // 󰠹 ("md_television_classic", '\u{f07f4}'), // 󰟴 ("md_television_classic_off", '\u{f083a}'), // 󰠺 ("md_television_guide", '\u{f0503}'), // 󰔃 ("md_television_off", '\u{f083b}'), // 󰠻 ("md_television_pause", '\u{f0f89}'), // 󰾉 ("md_television_play", '\u{f0ecf}'), // 󰻏 ("md_television_shimmer", '\u{f1110}'), // 󱄐 ("md_television_stop", '\u{f0f8a}'), // 󰾊 ("md_temperature_celsius", '\u{f0504}'), // 󰔄 ("md_temperature_fahrenheit", '\u{f0505}'), // 󰔅 ("md_temperature_kelvin", '\u{f0506}'), // 󰔆 ("md_tennis", '\u{f0da0}'), // 󰶠 ("md_tennis_ball", '\u{f0507}'), // 󰔇 ("md_tent", '\u{f0508}'), // 󰔈 ("md_terraform", '\u{f1062}'), // 󱁢 ("md_test_tube", '\u{f0668}'), // 󰙨 ("md_test_tube_empty", '\u{f0911}'), // 󰤑 ("md_test_tube_off", '\u{f0912}'), // 󰤒 ("md_text", '\u{f09a8}'), // 󰦨 ("md_text_account", '\u{f1570}'), // 󱕰 ("md_text_box", '\u{f021a}'), // 󰈚 ("md_text_box_check", '\u{f0ea6}'), // 󰺦 ("md_text_box_check_outline", '\u{f0ea7}'), // 󰺧 ("md_text_box_edit", '\u{f1a7c}'), // 󱩼 ("md_text_box_edit_outline", '\u{f1a7d}'), // 󱩽 ("md_text_box_minus", '\u{f0ea8}'), // 󰺨 ("md_text_box_minus_outline", '\u{f0ea9}'), // 󰺩 ("md_text_box_multiple", '\u{f0ab7}'), // 󰪷 ("md_text_box_multiple_outline", '\u{f0ab8}'), // 󰪸 ("md_text_box_outline", '\u{f09ed}'), // 󰧭 ("md_text_box_plus", '\u{f0eaa}'), // 󰺪 ("md_text_box_plus_outline", '\u{f0eab}'), // 󰺫 ("md_text_box_remove", '\u{f0eac}'), // 󰺬 ("md_text_box_remove_outline", '\u{f0ead}'), // 󰺭 ("md_text_box_search", '\u{f0eae}'), // 󰺮 ("md_text_box_search_outline", '\u{f0eaf}'), // 󰺯 ("md_text_long", '\u{f09aa}'), // 󰦪 ("md_text_recognition", '\u{f113d}'), // 󱄽 ("md_text_search", '\u{f13b8}'), // 󱎸 ("md_text_search_variant", '\u{f1a7e}'), // 󱩾 ("md_text_shadow", '\u{f0669}'), // 󰙩 ("md_text_short", '\u{f09a9}'), // 󰦩 ("md_text_to_speech", '\u{f050a}'), // 󰔊 ("md_text_to_speech_off", '\u{f050b}'), // 󰔋 ("md_texture", '\u{f050c}'), // 󰔌 ("md_texture_box", '\u{f0fe6}'), // 󰿦 ("md_theater", '\u{f050d}'), // 󰔍 ("md_theme_light_dark", '\u{f050e}'), // 󰔎 ("md_thermometer", '\u{f050f}'), // 󰔏 ("md_thermometer_alert", '\u{f0e01}'), // 󰸁 ("md_thermometer_bluetooth", '\u{f1895}'), // 󱢕 ("md_thermometer_check", '\u{f1a7f}'), // 󱩿 ("md_thermometer_chevron_down", '\u{f0e02}'), // 󰸂 ("md_thermometer_chevron_up", '\u{f0e03}'), // 󰸃 ("md_thermometer_high", '\u{f10c2}'), // 󱃂 ("md_thermometer_lines", '\u{f0510}'), // 󰔐 ("md_thermometer_low", '\u{f10c3}'), // 󱃃 ("md_thermometer_minus", '\u{f0e04}'), // 󰸄 ("md_thermometer_off", '\u{f1531}'), // 󱔱 ("md_thermometer_plus", '\u{f0e05}'), // 󰸅 ("md_thermometer_water", '\u{f1a80}'), // 󱪀 ("md_thermostat", '\u{f0393}'), // 󰎓 ("md_thermostat_box", '\u{f0891}'), // 󰢑 ("md_thought_bubble", '\u{f07f6}'), // 󰟶 ("md_thought_bubble_outline", '\u{f07f7}'), // 󰟷 ("md_thumb_down", '\u{f0511}'), // 󰔑 ("md_thumb_down_outline", '\u{f0512}'), // 󰔒 ("md_thumb_up", '\u{f0513}'), // 󰔓 ("md_thumb_up_outline", '\u{f0514}'), // 󰔔 ("md_thumbs_up_down", '\u{f0515}'), // 󰔕 ("md_thumbs_up_down_outline", '\u{f1914}'), // 󱤔 ("md_ticket", '\u{f0516}'), // 󰔖 ("md_ticket_account", '\u{f0517}'), // 󰔗 ("md_ticket_confirmation", '\u{f0518}'), // 󰔘 ("md_ticket_confirmation_outline", '\u{f13aa}'), // 󱎪 ("md_ticket_outline", '\u{f0913}'), // 󰤓 ("md_ticket_percent", '\u{f0724}'), // 󰜤 ("md_ticket_percent_outline", '\u{f142b}'), // 󱐫 ("md_tie", '\u{f0519}'), // 󰔙 ("md_tilde", '\u{f0725}'), // 󰜥 ("md_tilde_off", '\u{f18f3}'), // 󱣳 ("md_timelapse", '\u{f051a}'), // 󰔚 ("md_timeline", '\u{f0bd1}'), // 󰯑 ("md_timeline_alert", '\u{f0f95}'), // 󰾕 ("md_timeline_alert_outline", '\u{f0f98}'), // 󰾘 ("md_timeline_check", '\u{f1532}'), // 󱔲 ("md_timeline_check_outline", '\u{f1533}'), // 󱔳 ("md_timeline_clock", '\u{f11fb}'), // 󱇻 ("md_timeline_clock_outline", '\u{f11fc}'), // 󱇼 ("md_timeline_help", '\u{f0f99}'), // 󰾙 ("md_timeline_help_outline", '\u{f0f9a}'), // 󰾚 ("md_timeline_minus", '\u{f1534}'), // 󱔴 ("md_timeline_minus_outline", '\u{f1535}'), // 󱔵 ("md_timeline_outline", '\u{f0bd2}'), // 󰯒 ("md_timeline_plus", '\u{f0f96}'), // 󰾖 ("md_timeline_plus_outline", '\u{f0f97}'), // 󰾗 ("md_timeline_remove", '\u{f1536}'), // 󱔶 ("md_timeline_remove_outline", '\u{f1537}'), // 󱔷 ("md_timeline_text", '\u{f0bd3}'), // 󰯓 ("md_timeline_text_outline", '\u{f0bd4}'), // 󰯔 ("md_timer", '\u{f13ab}'), // 󱎫 ("md_timer_3", '\u{f051d}'), // 󰔝 ("md_timer_10", '\u{f051c}'), // 󰔜 ("md_timer_alert", '\u{f1acc}'), // 󱫌 ("md_timer_alert_outline", '\u{f1acd}'), // 󱫍 ("md_timer_cancel", '\u{f1ace}'), // 󱫎 ("md_timer_cancel_outline", '\u{f1acf}'), // 󱫏 ("md_timer_check", '\u{f1ad0}'), // 󱫐 ("md_timer_check_outline", '\u{f1ad1}'), // 󱫑 ("md_timer_cog", '\u{f1925}'), // 󱤥 ("md_timer_cog_outline", '\u{f1926}'), // 󱤦 ("md_timer_edit", '\u{f1ad2}'), // 󱫒 ("md_timer_edit_outline", '\u{f1ad3}'), // 󱫓 ("md_timer_lock", '\u{f1ad4}'), // 󱫔 ("md_timer_lock_open", '\u{f1ad5}'), // 󱫕 ("md_timer_lock_open_outline", '\u{f1ad6}'), // 󱫖 ("md_timer_lock_outline", '\u{f1ad7}'), // 󱫗 ("md_timer_marker", '\u{f1ad8}'), // 󱫘 ("md_timer_marker_outline", '\u{f1ad9}'), // 󱫙 ("md_timer_minus", '\u{f1ada}'), // 󱫚 ("md_timer_minus_outline", '\u{f1adb}'), // 󱫛 ("md_timer_music", '\u{f1adc}'), // 󱫜 ("md_timer_music_outline", '\u{f1add}'), // 󱫝 ("md_timer_off", '\u{f13ac}'), // 󱎬 ("md_timer_off_outline", '\u{f051e}'), // 󰔞 ("md_timer_outline", '\u{f051b}'), // 󰔛 ("md_timer_pause", '\u{f1ade}'), // 󱫞 ("md_timer_pause_outline", '\u{f1adf}'), // 󱫟 ("md_timer_play", '\u{f1ae0}'), // 󱫠 ("md_timer_play_outline", '\u{f1ae1}'), // 󱫡 ("md_timer_plus", '\u{f1ae2}'), // 󱫢 ("md_timer_plus_outline", '\u{f1ae3}'), // 󱫣 ("md_timer_refresh", '\u{f1ae4}'), // 󱫤 ("md_timer_refresh_outline", '\u{f1ae5}'), // 󱫥 ("md_timer_remove", '\u{f1ae6}'), // 󱫦 ("md_timer_remove_outline", '\u{f1ae7}'), // 󱫧 ("md_timer_sand", '\u{f051f}'), // 󰔟 ("md_timer_sand_complete", '\u{f199f}'), // 󱦟 ("md_timer_sand_empty", '\u{f06ad}'), // 󰚭 ("md_timer_sand_full", '\u{f078c}'), // 󰞌 ("md_timer_sand_paused", '\u{f19a0}'), // 󱦠 ("md_timer_settings", '\u{f1923}'), // 󱤣 ("md_timer_settings_outline", '\u{f1924}'), // 󱤤 ("md_timer_star", '\u{f1ae8}'), // 󱫨 ("md_timer_star_outline", '\u{f1ae9}'), // 󱫩 ("md_timer_stop", '\u{f1aea}'), // 󱫪 ("md_timer_stop_outline", '\u{f1aeb}'), // 󱫫 ("md_timer_sync", '\u{f1aec}'), // 󱫬 ("md_timer_sync_outline", '\u{f1aed}'), // 󱫭 ("md_timetable", '\u{f0520}'), // 󰔠 ("md_tire", '\u{f1896}'), // 󱢖 ("md_toaster", '\u{f1063}'), // 󱁣 ("md_toaster_off", '\u{f11b7}'), // 󱆷 ("md_toaster_oven", '\u{f0cd3}'), // 󰳓 ("md_toggle_switch", '\u{f0521}'), // 󰔡 ("md_toggle_switch_off", '\u{f0522}'), // 󰔢 ("md_toggle_switch_off_outline", '\u{f0a19}'), // 󰨙 ("md_toggle_switch_outline", '\u{f0a1a}'), // 󰨚 ("md_toggle_switch_variant", '\u{f1a25}'), // 󱨥 ("md_toggle_switch_variant_off", '\u{f1a26}'), // 󱨦 ("md_toilet", '\u{f09ab}'), // 󰦫 ("md_toolbox", '\u{f09ac}'), // 󰦬 ("md_toolbox_outline", '\u{f09ad}'), // 󰦭 ("md_tools", '\u{f1064}'), // 󱁤 ("md_tooltip", '\u{f0523}'), // 󰔣 ("md_tooltip_account", '\u{f000c}'), // 󰀌 ("md_tooltip_cellphone", '\u{f183b}'), // 󱠻 ("md_tooltip_check", '\u{f155c}'), // 󱕜 ("md_tooltip_check_outline", '\u{f155d}'), // 󱕝 ("md_tooltip_edit", '\u{f0524}'), // 󰔤 ("md_tooltip_edit_outline", '\u{f12c5}'), // 󱋅 ("md_tooltip_image", '\u{f0525}'), // 󰔥 ("md_tooltip_image_outline", '\u{f0bd5}'), // 󰯕 ("md_tooltip_minus", '\u{f155e}'), // 󱕞 ("md_tooltip_minus_outline", '\u{f155f}'), // 󱕟 ("md_tooltip_outline", '\u{f0526}'), // 󰔦 ("md_tooltip_plus", '\u{f0bd6}'), // 󰯖 ("md_tooltip_plus_outline", '\u{f0527}'), // 󰔧 ("md_tooltip_remove", '\u{f1560}'), // 󱕠 ("md_tooltip_remove_outline", '\u{f1561}'), // 󱕡 ("md_tooltip_text", '\u{f0528}'), // 󰔨 ("md_tooltip_text_outline", '\u{f0bd7}'), // 󰯗 ("md_tooth", '\u{f08c3}'), // 󰣃 ("md_tooth_outline", '\u{f0529}'), // 󰔩 ("md_toothbrush", '\u{f1129}'), // 󱄩 ("md_toothbrush_electric", '\u{f112c}'), // 󱄬 ("md_toothbrush_paste", '\u{f112a}'), // 󱄪 ("md_torch", '\u{f1606}'), // 󱘆 ("md_tortoise", '\u{f0d3b}'), // 󰴻 ("md_toslink", '\u{f12b8}'), // 󱊸 ("md_tournament", '\u{f09ae}'), // 󰦮 ("md_tow_truck", '\u{f083c}'), // 󰠼 ("md_tower_beach", '\u{f0681}'), // 󰚁 ("md_tower_fire", '\u{f0682}'), // 󰚂 ("md_town_hall", '\u{f1875}'), // 󱡵 ("md_toy_brick", '\u{f1288}'), // 󱊈 ("md_toy_brick_marker", '\u{f1289}'), // 󱊉 ("md_toy_brick_marker_outline", '\u{f128a}'), // 󱊊 ("md_toy_brick_minus", '\u{f128b}'), // 󱊋 ("md_toy_brick_minus_outline", '\u{f128c}'), // 󱊌 ("md_toy_brick_outline", '\u{f128d}'), // 󱊍 ("md_toy_brick_plus", '\u{f128e}'), // 󱊎 ("md_toy_brick_plus_outline", '\u{f128f}'), // 󱊏 ("md_toy_brick_remove", '\u{f1290}'), // 󱊐 ("md_toy_brick_remove_outline", '\u{f1291}'), // 󱊑 ("md_toy_brick_search", '\u{f1292}'), // 󱊒 ("md_toy_brick_search_outline", '\u{f1293}'), // 󱊓 ("md_track_light", '\u{f0914}'), // 󰤔 ("md_trackpad", '\u{f07f8}'), // 󰟸 ("md_trackpad_lock", '\u{f0933}'), // 󰤳 ("md_tractor", '\u{f0892}'), // 󰢒 ("md_tractor_variant", '\u{f14c4}'), // 󱓄 ("md_trademark", '\u{f0a78}'), // 󰩸 ("md_traffic_cone", '\u{f137c}'), // 󱍼 ("md_traffic_light", '\u{f052b}'), // 󰔫 ("md_traffic_light_outline", '\u{f182a}'), // 󱠪 ("md_train", '\u{f052c}'), // 󰔬 ("md_train_car", '\u{f0bd8}'), // 󰯘 ("md_train_car_passenger", '\u{f1733}'), // 󱜳 ("md_train_car_passenger_door", '\u{f1734}'), // 󱜴 ("md_train_car_passenger_door_open", '\u{f1735}'), // 󱜵 ("md_train_car_passenger_variant", '\u{f1736}'), // 󱜶 ("md_train_variant", '\u{f08c4}'), // 󰣄 ("md_tram", '\u{f052d}'), // 󰔭 ("md_tram_side", '\u{f0fe7}'), // 󰿧 ("md_transcribe", '\u{f052e}'), // 󰔮 ("md_transcribe_close", '\u{f052f}'), // 󰔯 ("md_transfer", '\u{f1065}'), // 󱁥 ("md_transfer_down", '\u{f0da1}'), // 󰶡 ("md_transfer_left", '\u{f0da2}'), // 󰶢 ("md_transfer_right", '\u{f0530}'), // 󰔰 ("md_transfer_up", '\u{f0da3}'), // 󰶣 ("md_transit_connection", '\u{f0d3c}'), // 󰴼 ("md_transit_connection_horizontal", '\u{f1546}'), // 󱕆 ("md_transit_connection_variant", '\u{f0d3d}'), // 󰴽 ("md_transit_detour", '\u{f0f8b}'), // 󰾋 ("md_transit_skip", '\u{f1515}'), // 󱔕 ("md_transit_transfer", '\u{f06ae}'), // 󰚮 ("md_transition", '\u{f0915}'), // 󰤕 ("md_transition_masked", '\u{f0916}'), // 󰤖 ("md_translate", '\u{f05ca}'), // 󰗊 ("md_translate_off", '\u{f0e06}'), // 󰸆 ("md_transmission_tower", '\u{f0d3e}'), // 󰴾 ("md_transmission_tower_export", '\u{f192c}'), // 󱤬 ("md_transmission_tower_import", '\u{f192d}'), // 󱤭 ("md_transmission_tower_off", '\u{f19dd}'), // 󱧝 ("md_trash_can", '\u{f0a79}'), // 󰩹 ("md_trash_can_outline", '\u{f0a7a}'), // 󰩺 ("md_tray", '\u{f1294}'), // 󱊔 ("md_tray_alert", '\u{f1295}'), // 󱊕 ("md_tray_arrow_down", '\u{f0120}'), // 󰄠 ("md_tray_arrow_up", '\u{f011d}'), // 󰄝 ("md_tray_full", '\u{f1296}'), // 󱊖 ("md_tray_minus", '\u{f1297}'), // 󱊗 ("md_tray_plus", '\u{f1298}'), // 󱊘 ("md_tray_remove", '\u{f1299}'), // 󱊙 ("md_treasure_chest", '\u{f0726}'), // 󰜦 ("md_tree", '\u{f0531}'), // 󰔱 ("md_tree_outline", '\u{f0e69}'), // 󰹩 ("md_trello", '\u{f0532}'), // 󰔲 ("md_trending_down", '\u{f0533}'), // 󰔳 ("md_trending_neutral", '\u{f0534}'), // 󰔴 ("md_trending_up", '\u{f0535}'), // 󰔵 ("md_triangle", '\u{f0536}'), // 󰔶 ("md_triangle_outline", '\u{f0537}'), // 󰔷 ("md_triangle_small_down", '\u{f1a09}'), // 󱨉 ("md_triangle_small_up", '\u{f1a0a}'), // 󱨊 ("md_triangle_wave", '\u{f147c}'), // 󱑼 ("md_triforce", '\u{f0bd9}'), // 󰯙 ("md_trophy", '\u{f0538}'), // 󰔸 ("md_trophy_award", '\u{f0539}'), // 󰔹 ("md_trophy_broken", '\u{f0da4}'), // 󰶤 ("md_trophy_outline", '\u{f053a}'), // 󰔺 ("md_trophy_variant", '\u{f053b}'), // 󰔻 ("md_trophy_variant_outline", '\u{f053c}'), // 󰔼 ("md_truck", '\u{f053d}'), // 󰔽 ("md_truck_alert", '\u{f19de}'), // 󱧞 ("md_truck_alert_outline", '\u{f19df}'), // 󱧟 ("md_truck_cargo_container", '\u{f18d8}'), // 󱣘 ("md_truck_check", '\u{f0cd4}'), // 󰳔 ("md_truck_check_outline", '\u{f129a}'), // 󱊚 ("md_truck_delivery", '\u{f053e}'), // 󰔾 ("md_truck_delivery_outline", '\u{f129b}'), // 󱊛 ("md_truck_fast", '\u{f0788}'), // 󰞈 ("md_truck_fast_outline", '\u{f129c}'), // 󱊜 ("md_truck_flatbed", '\u{f1891}'), // 󱢑 ("md_truck_minus", '\u{f19ae}'), // 󱦮 ("md_truck_minus_outline", '\u{f19bd}'), // 󱦽 ("md_truck_outline", '\u{f129d}'), // 󱊝 ("md_truck_plus", '\u{f19ad}'), // 󱦭 ("md_truck_plus_outline", '\u{f19bc}'), // 󱦼 ("md_truck_remove", '\u{f19af}'), // 󱦯 ("md_truck_remove_outline", '\u{f19be}'), // 󱦾 ("md_truck_snowflake", '\u{f19a6}'), // 󱦦 ("md_truck_trailer", '\u{f0727}'), // 󰜧 ("md_trumpet", '\u{f1096}'), // 󱂖 ("md_tshirt_crew", '\u{f0a7b}'), // 󰩻 ("md_tshirt_crew_outline", '\u{f053f}'), // 󰔿 ("md_tshirt_v", '\u{f0a7c}'), // 󰩼 ("md_tshirt_v_outline", '\u{f0540}'), // 󰕀 ("md_tsunami", '\u{f1a81}'), // 󱪁 ("md_tumble_dryer", '\u{f0917}'), // 󰤗 ("md_tumble_dryer_alert", '\u{f11ba}'), // 󱆺 ("md_tumble_dryer_off", '\u{f11bb}'), // 󱆻 ("md_tune", '\u{f062e}'), // 󰘮 ("md_tune_variant", '\u{f1542}'), // 󱕂 ("md_tune_vertical", '\u{f066a}'), // 󰙪 ("md_tune_vertical_variant", '\u{f1543}'), // 󱕃 ("md_tunnel", '\u{f183d}'), // 󱠽 ("md_tunnel_outline", '\u{f183e}'), // 󱠾 ("md_turbine", '\u{f1a82}'), // 󱪂 ("md_turkey", '\u{f171b}'), // 󱜛 ("md_turnstile", '\u{f0cd5}'), // 󰳕 ("md_turnstile_outline", '\u{f0cd6}'), // 󰳖 ("md_turtle", '\u{f0cd7}'), // 󰳗 ("md_twitch", '\u{f0543}'), // 󰕃 ("md_twitter", '\u{f0544}'), // 󰕄 ("md_two_factor_authentication", '\u{f09af}'), // 󰦯 ("md_typewriter", '\u{f0f2d}'), // 󰼭 ("md_ubisoft", '\u{f0bda}'), // 󰯚 ("md_ubuntu", '\u{f0548}'), // 󰕈 ("md_ufo", '\u{f10c4}'), // 󱃄 ("md_ufo_outline", '\u{f10c5}'), // 󱃅 ("md_ultra_high_definition", '\u{f07f9}'), // 󰟹 ("md_umbraco", '\u{f0549}'), // 󰕉 ("md_umbrella", '\u{f054a}'), // 󰕊 ("md_umbrella_beach", '\u{f188a}'), // 󱢊 ("md_umbrella_beach_outline", '\u{f188b}'), // 󱢋 ("md_umbrella_closed", '\u{f09b0}'), // 󰦰 ("md_umbrella_closed_outline", '\u{f13e2}'), // 󱏢 ("md_umbrella_closed_variant", '\u{f13e1}'), // 󱏡 ("md_umbrella_outline", '\u{f054b}'), // 󰕋 ("md_undo", '\u{f054c}'), // 󰕌 ("md_undo_variant", '\u{f054d}'), // 󰕍 ("md_unfold_less_horizontal", '\u{f054e}'), // 󰕎 ("md_unfold_less_vertical", '\u{f0760}'), // 󰝠 ("md_unfold_more_horizontal", '\u{f054f}'), // 󰕏 ("md_unfold_more_vertical", '\u{f0761}'), // 󰝡 ("md_ungroup", '\u{f0550}'), // 󰕐 ("md_unicode", '\u{f0ed0}'), // 󰻐 ("md_unicorn", '\u{f15c2}'), // 󱗂 ("md_unicorn_variant", '\u{f15c3}'), // 󱗃 ("md_unicycle", '\u{f15e5}'), // 󱗥 ("md_unity", '\u{f06af}'), // 󰚯 ("md_unreal", '\u{f09b1}'), // 󰦱 ("md_update", '\u{f06b0}'), // 󰚰 ("md_upload", '\u{f0552}'), // 󰕒 ("md_upload_lock", '\u{f1373}'), // 󱍳 ("md_upload_lock_outline", '\u{f1374}'), // 󱍴 ("md_upload_multiple", '\u{f083d}'), // 󰠽 ("md_upload_network", '\u{f06f6}'), // 󰛶 ("md_upload_network_outline", '\u{f0cd8}'), // 󰳘 ("md_upload_off", '\u{f10c6}'), // 󱃆 ("md_upload_off_outline", '\u{f10c7}'), // 󱃇 ("md_upload_outline", '\u{f0e07}'), // 󰸇 ("md_usb", '\u{f0553}'), // 󰕓 ("md_usb_flash_drive", '\u{f129e}'), // 󱊞 ("md_usb_flash_drive_outline", '\u{f129f}'), // 󱊟 ("md_usb_port", '\u{f11f0}'), // 󱇰 ("md_vacuum", '\u{f19a1}'), // 󱦡 ("md_vacuum_outline", '\u{f19a2}'), // 󱦢 ("md_valve", '\u{f1066}'), // 󱁦 ("md_valve_closed", '\u{f1067}'), // 󱁧 ("md_valve_open", '\u{f1068}'), // 󱁨 ("md_van_passenger", '\u{f07fa}'), // 󰟺 ("md_van_utility", '\u{f07fb}'), // 󰟻 ("md_vanish", '\u{f07fc}'), // 󰟼 ("md_vanish_quarter", '\u{f1554}'), // 󱕔 ("md_vanity_light", '\u{f11e1}'), // 󱇡 ("md_variable", '\u{f0ae7}'), // 󰫧 ("md_variable_box", '\u{f1111}'), // 󱄑 ("md_vector_arrange_above", '\u{f0554}'), // 󰕔 ("md_vector_arrange_below", '\u{f0555}'), // 󰕕 ("md_vector_bezier", '\u{f0ae8}'), // 󰫨 ("md_vector_circle", '\u{f0556}'), // 󰕖 ("md_vector_circle_variant", '\u{f0557}'), // 󰕗 ("md_vector_combine", '\u{f0558}'), // 󰕘 ("md_vector_curve", '\u{f0559}'), // 󰕙 ("md_vector_difference", '\u{f055a}'), // 󰕚 ("md_vector_difference_ab", '\u{f055b}'), // 󰕛 ("md_vector_difference_ba", '\u{f055c}'), // 󰕜 ("md_vector_ellipse", '\u{f0893}'), // 󰢓 ("md_vector_intersection", '\u{f055d}'), // 󰕝 ("md_vector_line", '\u{f055e}'), // 󰕞 ("md_vector_link", '\u{f0fe8}'), // 󰿨 ("md_vector_point", '\u{f055f}'), // 󰕟 ("md_vector_polygon", '\u{f0560}'), // 󰕠 ("md_vector_polygon_variant", '\u{f1856}'), // 󱡖 ("md_vector_polyline", '\u{f0561}'), // 󰕡 ("md_vector_polyline_edit", '\u{f1225}'), // 󱈥 ("md_vector_polyline_minus", '\u{f1226}'), // 󱈦 ("md_vector_polyline_plus", '\u{f1227}'), // 󱈧 ("md_vector_polyline_remove", '\u{f1228}'), // 󱈨 ("md_vector_radius", '\u{f074a}'), // 󰝊 ("md_vector_rectangle", '\u{f05c6}'), // 󰗆 ("md_vector_selection", '\u{f0562}'), // 󰕢 ("md_vector_square", '\u{f0001}'), // 󰀁 ("md_vector_square_close", '\u{f1857}'), // 󱡗 ("md_vector_square_edit", '\u{f18d9}'), // 󱣙 ("md_vector_square_minus", '\u{f18da}'), // 󱣚 ("md_vector_square_open", '\u{f1858}'), // 󱡘 ("md_vector_square_plus", '\u{f18db}'), // 󱣛 ("md_vector_square_remove", '\u{f18dc}'), // 󱣜 ("md_vector_triangle", '\u{f0563}'), // 󰕣 ("md_vector_union", '\u{f0564}'), // 󰕤 ("md_vhs", '\u{f0a1b}'), // 󰨛 ("md_vibrate", '\u{f0566}'), // 󰕦 ("md_vibrate_off", '\u{f0cd9}'), // 󰳙 ("md_video", '\u{f0567}'), // 󰕧 ("md_video_2d", '\u{f1a1c}'), // 󱨜 ("md_video_3d", '\u{f07fd}'), // 󰟽 ("md_video_3d_off", '\u{f13d9}'), // 󱏙 ("md_video_3d_variant", '\u{f0ed1}'), // 󰻑 ("md_video_4k_box", '\u{f083e}'), // 󰠾 ("md_video_account", '\u{f0919}'), // 󰤙 ("md_video_box", '\u{f00fd}'), // 󰃽 ("md_video_box_off", '\u{f00fe}'), // 󰃾 ("md_video_check", '\u{f1069}'), // 󱁩 ("md_video_check_outline", '\u{f106a}'), // 󱁪 ("md_video_high_definition", '\u{f152e}'), // 󱔮 ("md_video_image", '\u{f091a}'), // 󰤚 ("md_video_input_antenna", '\u{f083f}'), // 󰠿 ("md_video_input_component", '\u{f0840}'), // 󰡀 ("md_video_input_hdmi", '\u{f0841}'), // 󰡁 ("md_video_input_scart", '\u{f0f8c}'), // 󰾌 ("md_video_input_svideo", '\u{f0842}'), // 󰡂 ("md_video_marker", '\u{f19a9}'), // 󱦩 ("md_video_marker_outline", '\u{f19aa}'), // 󱦪 ("md_video_minus", '\u{f09b2}'), // 󰦲 ("md_video_minus_outline", '\u{f02ba}'), // 󰊺 ("md_video_off", '\u{f0568}'), // 󰕨 ("md_video_off_outline", '\u{f0bdb}'), // 󰯛 ("md_video_outline", '\u{f0bdc}'), // 󰯜 ("md_video_plus", '\u{f09b3}'), // 󰦳 ("md_video_plus_outline", '\u{f01d3}'), // 󰇓 ("md_video_stabilization", '\u{f091b}'), // 󰤛 ("md_video_switch", '\u{f0569}'), // 󰕩 ("md_video_switch_outline", '\u{f0790}'), // 󰞐 ("md_video_vintage", '\u{f0a1c}'), // 󰨜 ("md_video_wireless", '\u{f0ed2}'), // 󰻒 ("md_video_wireless_outline", '\u{f0ed3}'), // 󰻓 ("md_view_agenda", '\u{f056a}'), // 󰕪 ("md_view_agenda_outline", '\u{f11d8}'), // 󱇘 ("md_view_array", '\u{f056b}'), // 󰕫 ("md_view_array_outline", '\u{f1485}'), // 󱒅 ("md_view_carousel", '\u{f056c}'), // 󰕬 ("md_view_carousel_outline", '\u{f1486}'), // 󱒆 ("md_view_column", '\u{f056d}'), // 󰕭 ("md_view_column_outline", '\u{f1487}'), // 󱒇 ("md_view_comfy", '\u{f0e6a}'), // 󰹪 ("md_view_comfy_outline", '\u{f1488}'), // 󱒈 ("md_view_compact", '\u{f0e6b}'), // 󰹫 ("md_view_compact_outline", '\u{f0e6c}'), // 󰹬 ("md_view_dashboard", '\u{f056e}'), // 󰕮 ("md_view_dashboard_edit", '\u{f1947}'), // 󱥇 ("md_view_dashboard_edit_outline", '\u{f1948}'), // 󱥈 ("md_view_dashboard_outline", '\u{f0a1d}'), // 󰨝 ("md_view_dashboard_variant", '\u{f0843}'), // 󰡃 ("md_view_dashboard_variant_outline", '\u{f1489}'), // 󱒉 ("md_view_day", '\u{f056f}'), // 󰕯 ("md_view_day_outline", '\u{f148a}'), // 󱒊 ("md_view_gallery", '\u{f1888}'), // 󱢈 ("md_view_gallery_outline", '\u{f1889}'), // 󱢉 ("md_view_grid", '\u{f0570}'), // 󰕰 ("md_view_grid_outline", '\u{f11d9}'), // 󱇙 ("md_view_grid_plus", '\u{f0f8d}'), // 󰾍 ("md_view_grid_plus_outline", '\u{f11da}'), // 󱇚 ("md_view_headline", '\u{f0571}'), // 󰕱 ("md_view_list", '\u{f0572}'), // 󰕲 ("md_view_list_outline", '\u{f148b}'), // 󱒋 ("md_view_module", '\u{f0573}'), // 󰕳 ("md_view_module_outline", '\u{f148c}'), // 󱒌 ("md_view_parallel", '\u{f0728}'), // 󰜨 ("md_view_parallel_outline", '\u{f148d}'), // 󱒍 ("md_view_quilt", '\u{f0574}'), // 󰕴 ("md_view_quilt_outline", '\u{f148e}'), // 󱒎 ("md_view_sequential", '\u{f0729}'), // 󰜩 ("md_view_sequential_outline", '\u{f148f}'), // 󱒏 ("md_view_split_horizontal", '\u{f0bcb}'), // 󰯋 ("md_view_split_vertical", '\u{f0bcc}'), // 󰯌 ("md_view_stream", '\u{f0575}'), // 󰕵 ("md_view_stream_outline", '\u{f1490}'), // 󱒐 ("md_view_week", '\u{f0576}'), // 󰕶 ("md_view_week_outline", '\u{f1491}'), // 󱒑 ("md_vimeo", '\u{f0577}'), // 󰕷 ("md_violin", '\u{f060f}'), // 󰘏 ("md_virtual_reality", '\u{f0894}'), // 󰢔 ("md_virus", '\u{f13b6}'), // 󱎶 ("md_virus_off", '\u{f18e1}'), // 󱣡 ("md_virus_off_outline", '\u{f18e2}'), // 󱣢 ("md_virus_outline", '\u{f13b7}'), // 󱎷 ("md_vlc", '\u{f057c}'), // 󰕼 ("md_voicemail", '\u{f057d}'), // 󰕽 ("md_volcano", '\u{f1a83}'), // 󱪃 ("md_volcano_outline", '\u{f1a84}'), // 󱪄 ("md_volleyball", '\u{f09b4}'), // 󰦴 ("md_volume_high", '\u{f057e}'), // 󰕾 ("md_volume_low", '\u{f057f}'), // 󰕿 ("md_volume_medium", '\u{f0580}'), // 󰖀 ("md_volume_minus", '\u{f075e}'), // 󰝞 ("md_volume_mute", '\u{f075f}'), // 󰝟 ("md_volume_off", '\u{f0581}'), // 󰖁 ("md_volume_plus", '\u{f075d}'), // 󰝝 ("md_volume_source", '\u{f1120}'), // 󱄠 ("md_volume_variant_off", '\u{f0e08}'), // 󰸈 ("md_volume_vibrate", '\u{f1121}'), // 󱄡 ("md_vote", '\u{f0a1f}'), // 󰨟 ("md_vote_outline", '\u{f0a20}'), // 󰨠 ("md_vpn", '\u{f0582}'), // 󰖂 ("md_vuejs", '\u{f0844}'), // 󰡄 ("md_vuetify", '\u{f0e6d}'), // 󰹭 ("md_walk", '\u{f0583}'), // 󰖃 ("md_wall", '\u{f07fe}'), // 󰟾 ("md_wall_fire", '\u{f1a11}'), // 󱨑 ("md_wall_sconce", '\u{f091c}'), // 󰤜 ("md_wall_sconce_flat", '\u{f091d}'), // 󰤝 ("md_wall_sconce_flat_outline", '\u{f17c9}'), // 󱟉 ("md_wall_sconce_flat_variant", '\u{f041c}'), // 󰐜 ("md_wall_sconce_flat_variant_outline", '\u{f17ca}'), // 󱟊 ("md_wall_sconce_outline", '\u{f17cb}'), // 󱟋 ("md_wall_sconce_round", '\u{f0748}'), // 󰝈 ("md_wall_sconce_round_outline", '\u{f17cc}'), // 󱟌 ("md_wall_sconce_round_variant", '\u{f091e}'), // 󰤞 ("md_wall_sconce_round_variant_outline", '\u{f17cd}'), // 󱟍 ("md_wallet", '\u{f0584}'), // 󰖄 ("md_wallet_giftcard", '\u{f0585}'), // 󰖅 ("md_wallet_membership", '\u{f0586}'), // 󰖆 ("md_wallet_outline", '\u{f0bdd}'), // 󰯝 ("md_wallet_plus", '\u{f0f8e}'), // 󰾎 ("md_wallet_plus_outline", '\u{f0f8f}'), // 󰾏 ("md_wallet_travel", '\u{f0587}'), // 󰖇 ("md_wallpaper", '\u{f0e09}'), // 󰸉 ("md_wan", '\u{f0588}'), // 󰖈 ("md_wardrobe", '\u{f0f90}'), // 󰾐 ("md_wardrobe_outline", '\u{f0f91}'), // 󰾑 ("md_warehouse", '\u{f0f81}'), // 󰾁 ("md_washing_machine", '\u{f072a}'), // 󰜪 ("md_washing_machine_alert", '\u{f11bc}'), // 󱆼 ("md_washing_machine_off", '\u{f11bd}'), // 󱆽 ("md_watch", '\u{f0589}'), // 󰖉 ("md_watch_export", '\u{f058a}'), // 󰖊 ("md_watch_export_variant", '\u{f0895}'), // 󰢕 ("md_watch_import", '\u{f058b}'), // 󰖋 ("md_watch_import_variant", '\u{f0896}'), // 󰢖 ("md_watch_variant", '\u{f0897}'), // 󰢗 ("md_watch_vibrate", '\u{f06b1}'), // 󰚱 ("md_watch_vibrate_off", '\u{f0cda}'), // 󰳚 ("md_water", '\u{f058c}'), // 󰖌 ("md_water_alert", '\u{f1502}'), // 󱔂 ("md_water_alert_outline", '\u{f1503}'), // 󱔃 ("md_water_boiler", '\u{f0f92}'), // 󰾒 ("md_water_boiler_alert", '\u{f11b3}'), // 󱆳 ("md_water_boiler_off", '\u{f11b4}'), // 󱆴 ("md_water_check", '\u{f1504}'), // 󱔄 ("md_water_check_outline", '\u{f1505}'), // 󱔅 ("md_water_circle", '\u{f1806}'), // 󱠆 ("md_water_minus", '\u{f1506}'), // 󱔆 ("md_water_minus_outline", '\u{f1507}'), // 󱔇 ("md_water_off", '\u{f058d}'), // 󰖍 ("md_water_off_outline", '\u{f1508}'), // 󱔈 ("md_water_opacity", '\u{f1855}'), // 󱡕 ("md_water_outline", '\u{f0e0a}'), // 󰸊 ("md_water_percent", '\u{f058e}'), // 󰖎 ("md_water_percent_alert", '\u{f1509}'), // 󱔉 ("md_water_plus", '\u{f150a}'), // 󱔊 ("md_water_plus_outline", '\u{f150b}'), // 󱔋 ("md_water_polo", '\u{f12a0}'), // 󱊠 ("md_water_pump", '\u{f058f}'), // 󰖏 ("md_water_pump_off", '\u{f0f93}'), // 󰾓 ("md_water_remove", '\u{f150c}'), // 󱔌 ("md_water_remove_outline", '\u{f150d}'), // 󱔍 ("md_water_sync", '\u{f17c6}'), // 󱟆 ("md_water_thermometer", '\u{f1a85}'), // 󱪅 ("md_water_thermometer_outline", '\u{f1a86}'), // 󱪆 ("md_water_well", '\u{f106b}'), // 󱁫 ("md_water_well_outline", '\u{f106c}'), // 󱁬 ("md_waterfall", '\u{f1849}'), // 󱡉 ("md_watering_can", '\u{f1481}'), // 󱒁 ("md_watering_can_outline", '\u{f1482}'), // 󱒂 ("md_watermark", '\u{f0612}'), // 󰘒 ("md_wave", '\u{f0f2e}'), // 󰼮 ("md_waveform", '\u{f147d}'), // 󱑽 ("md_waves", '\u{f078d}'), // 󰞍 ("md_waves_arrow_left", '\u{f1859}'), // 󱡙 ("md_waves_arrow_right", '\u{f185a}'), // 󱡚 ("md_waves_arrow_up", '\u{f185b}'), // 󱡛 ("md_waze", '\u{f0bde}'), // 󰯞 ("md_weather_cloudy", '\u{f0590}'), // 󰖐 ("md_weather_cloudy_alert", '\u{f0f2f}'), // 󰼯 ("md_weather_cloudy_arrow_right", '\u{f0e6e}'), // 󰹮 ("md_weather_cloudy_clock", '\u{f18f6}'), // 󱣶 ("md_weather_fog", '\u{f0591}'), // 󰖑 ("md_weather_hail", '\u{f0592}'), // 󰖒 ("md_weather_hazy", '\u{f0f30}'), // 󰼰 ("md_weather_hurricane", '\u{f0898}'), // 󰢘 ("md_weather_lightning", '\u{f0593}'), // 󰖓 ("md_weather_lightning_rainy", '\u{f067e}'), // 󰙾 ("md_weather_night", '\u{f0594}'), // 󰖔 ("md_weather_night_partly_cloudy", '\u{f0f31}'), // 󰼱 ("md_weather_partly_cloudy", '\u{f0595}'), // 󰖕 ("md_weather_partly_lightning", '\u{f0f32}'), // 󰼲 ("md_weather_partly_rainy", '\u{f0f33}'), // 󰼳 ("md_weather_partly_snowy", '\u{f0f34}'), // 󰼴 ("md_weather_partly_snowy_rainy", '\u{f0f35}'), // 󰼵 ("md_weather_pouring", '\u{f0596}'), // 󰖖 ("md_weather_rainy", '\u{f0597}'), // 󰖗 ("md_weather_snowy", '\u{f0598}'), // 󰖘 ("md_weather_snowy_heavy", '\u{f0f36}'), // 󰼶 ("md_weather_snowy_rainy", '\u{f067f}'), // 󰙿 ("md_weather_sunny", '\u{f0599}'), // 󰖙 ("md_weather_sunny_alert", '\u{f0f37}'), // 󰼷 ("md_weather_sunny_off", '\u{f14e4}'), // 󱓤 ("md_weather_sunset", '\u{f059a}'), // 󰖚 ("md_weather_sunset_down", '\u{f059b}'), // 󰖛 ("md_weather_sunset_up", '\u{f059c}'), // 󰖜 ("md_weather_tornado", '\u{f0f38}'), // 󰼸 ("md_weather_windy", '\u{f059d}'), // 󰖝 ("md_weather_windy_variant", '\u{f059e}'), // 󰖞 ("md_web", '\u{f059f}'), // 󰖟 ("md_web_box", '\u{f0f94}'), // 󰾔 ("md_web_cancel", '\u{f1790}'), // 󱞐 ("md_web_check", '\u{f0789}'), // 󰞉 ("md_web_clock", '\u{f124a}'), // 󱉊 ("md_web_minus", '\u{f10a0}'), // 󱂠 ("md_web_off", '\u{f0a8e}'), // 󰪎 ("md_web_plus", '\u{f0033}'), // 󰀳 ("md_web_refresh", '\u{f1791}'), // 󱞑 ("md_web_remove", '\u{f0551}'), // 󰕑 ("md_web_sync", '\u{f1792}'), // 󱞒 ("md_webcam", '\u{f05a0}'), // 󰖠 ("md_webcam_off", '\u{f1737}'), // 󱜷 ("md_webhook", '\u{f062f}'), // 󰘯 ("md_webpack", '\u{f072b}'), // 󰜫 ("md_webrtc", '\u{f1248}'), // 󱉈 ("md_wechat", '\u{f0611}'), // 󰘑 ("md_weight", '\u{f05a1}'), // 󰖡 ("md_weight_gram", '\u{f0d3f}'), // 󰴿 ("md_weight_kilogram", '\u{f05a2}'), // 󰖢 ("md_weight_lifter", '\u{f115d}'), // 󱅝 ("md_weight_pound", '\u{f09b5}'), // 󰦵 ("md_whatsapp", '\u{f05a3}'), // 󰖣 ("md_wheel_barrow", '\u{f14f2}'), // 󱓲 ("md_wheelchair", '\u{f1a87}'), // 󱪇 ("md_wheelchair_accessibility", '\u{f05a4}'), // 󰖤 ("md_whistle", '\u{f09b6}'), // 󰦶 ("md_whistle_outline", '\u{f12bc}'), // 󱊼 ("md_white_balance_auto", '\u{f05a5}'), // 󰖥 ("md_white_balance_incandescent", '\u{f05a6}'), // 󰖦 ("md_white_balance_iridescent", '\u{f05a7}'), // 󰖧 ("md_white_balance_sunny", '\u{f05a8}'), // 󰖨 ("md_widgets", '\u{f072c}'), // 󰜬 ("md_widgets_outline", '\u{f1355}'), // 󱍕 ("md_wifi", '\u{f05a9}'), // 󰖩 ("md_wifi_alert", '\u{f16b5}'), // 󱚵 ("md_wifi_arrow_down", '\u{f16b6}'), // 󱚶 ("md_wifi_arrow_left", '\u{f16b7}'), // 󱚷 ("md_wifi_arrow_left_right", '\u{f16b8}'), // 󱚸 ("md_wifi_arrow_right", '\u{f16b9}'), // 󱚹 ("md_wifi_arrow_up", '\u{f16ba}'), // 󱚺 ("md_wifi_arrow_up_down", '\u{f16bb}'), // 󱚻 ("md_wifi_cancel", '\u{f16bc}'), // 󱚼 ("md_wifi_check", '\u{f16bd}'), // 󱚽 ("md_wifi_cog", '\u{f16be}'), // 󱚾 ("md_wifi_lock", '\u{f16bf}'), // 󱚿 ("md_wifi_lock_open", '\u{f16c0}'), // 󱛀 ("md_wifi_marker", '\u{f16c1}'), // 󱛁 ("md_wifi_minus", '\u{f16c2}'), // 󱛂 ("md_wifi_off", '\u{f05aa}'), // 󰖪 ("md_wifi_plus", '\u{f16c3}'), // 󱛃 ("md_wifi_refresh", '\u{f16c4}'), // 󱛄 ("md_wifi_remove", '\u{f16c5}'), // 󱛅 ("md_wifi_settings", '\u{f16c6}'), // 󱛆 ("md_wifi_star", '\u{f0e0b}'), // 󰸋 ("md_wifi_strength_1", '\u{f091f}'), // 󰤟 ("md_wifi_strength_1_alert", '\u{f0920}'), // 󰤠 ("md_wifi_strength_1_lock", '\u{f0921}'), // 󰤡 ("md_wifi_strength_1_lock_open", '\u{f16cb}'), // 󱛋 ("md_wifi_strength_2", '\u{f0922}'), // 󰤢 ("md_wifi_strength_2_alert", '\u{f0923}'), // 󰤣 ("md_wifi_strength_2_lock", '\u{f0924}'), // 󰤤 ("md_wifi_strength_2_lock_open", '\u{f16cc}'), // 󱛌 ("md_wifi_strength_3", '\u{f0925}'), // 󰤥 ("md_wifi_strength_3_alert", '\u{f0926}'), // 󰤦 ("md_wifi_strength_3_lock", '\u{f0927}'), // 󰤧 ("md_wifi_strength_3_lock_open", '\u{f16cd}'), // 󱛍 ("md_wifi_strength_4", '\u{f0928}'), // 󰤨 ("md_wifi_strength_4_alert", '\u{f0929}'), // 󰤩 ("md_wifi_strength_4_lock", '\u{f092a}'), // 󰤪 ("md_wifi_strength_4_lock_open", '\u{f16ce}'), // 󱛎 ("md_wifi_strength_alert_outline", '\u{f092b}'), // 󰤫 ("md_wifi_strength_lock_open_outline", '\u{f16cf}'), // 󱛏 ("md_wifi_strength_lock_outline", '\u{f092c}'), // 󰤬 ("md_wifi_strength_off", '\u{f092d}'), // 󰤭 ("md_wifi_strength_off_outline", '\u{f092e}'), // 󰤮 ("md_wifi_strength_outline", '\u{f092f}'), // 󰤯 ("md_wifi_sync", '\u{f16c7}'), // 󱛇 ("md_wikipedia", '\u{f05ac}'), // 󰖬 ("md_wind_power", '\u{f1a88}'), // 󱪈 ("md_wind_power_outline", '\u{f1a89}'), // 󱪉 ("md_wind_turbine", '\u{f0da5}'), // 󰶥 ("md_wind_turbine_alert", '\u{f19ab}'), // 󱦫 ("md_wind_turbine_check", '\u{f19ac}'), // 󱦬 ("md_window_close", '\u{f05ad}'), // 󰖭 ("md_window_closed", '\u{f05ae}'), // 󰖮 ("md_window_closed_variant", '\u{f11db}'), // 󱇛 ("md_window_maximize", '\u{f05af}'), // 󰖯 ("md_window_minimize", '\u{f05b0}'), // 󰖰 ("md_window_open", '\u{f05b1}'), // 󰖱 ("md_window_open_variant", '\u{f11dc}'), // 󱇜 ("md_window_restore", '\u{f05b2}'), // 󰖲 ("md_window_shutter", '\u{f111c}'), // 󱄜 ("md_window_shutter_alert", '\u{f111d}'), // 󱄝 ("md_window_shutter_cog", '\u{f1a8a}'), // 󱪊 ("md_window_shutter_open", '\u{f111e}'), // 󱄞 ("md_window_shutter_settings", '\u{f1a8b}'), // 󱪋 ("md_windsock", '\u{f15fa}'), // 󱗺 ("md_wiper", '\u{f0ae9}'), // 󰫩 ("md_wiper_wash", '\u{f0da6}'), // 󰶦 ("md_wiper_wash_alert", '\u{f18df}'), // 󱣟 ("md_wizard_hat", '\u{f1477}'), // 󱑷 ("md_wordpress", '\u{f05b4}'), // 󰖴 ("md_wrap", '\u{f05b6}'), // 󰖶 ("md_wrap_disabled", '\u{f0bdf}'), // 󰯟 ("md_wrench", '\u{f05b7}'), // 󰖷 ("md_wrench_clock", '\u{f19a3}'), // 󱦣 ("md_wrench_outline", '\u{f0be0}'), // 󰯠 ("md_xamarin", '\u{f0845}'), // 󰡅 ("md_xml", '\u{f05c0}'), // 󰗀 ("md_xmpp", '\u{f07ff}'), // 󰟿 ("md_yahoo", '\u{f0b4f}'), // 󰭏 ("md_yeast", '\u{f05c1}'), // 󰗁 ("md_yin_yang", '\u{f0680}'), // 󰚀 ("md_yoga", '\u{f117c}'), // 󱅼 ("md_youtube", '\u{f05c3}'), // 󰗃 ("md_youtube_gaming", '\u{f0848}'), // 󰡈 ("md_youtube_studio", '\u{f0847}'), // 󰡇 ("md_youtube_subscription", '\u{f0d40}'), // 󰵀 ("md_youtube_tv", '\u{f0448}'), // 󰑈 ("md_yurt", '\u{f1516}'), // 󱔖 ("md_z_wave", '\u{f0aea}'), // 󰫪 ("md_zend", '\u{f0aeb}'), // 󰫫 ("md_zigbee", '\u{f0d41}'), // 󰵁 ("md_zip_box", '\u{f05c4}'), // 󰗄 ("md_zip_box_outline", '\u{f0ffa}'), // 󰿺 ("md_zip_disk", '\u{f0a23}'), // 󰨣 ("md_zodiac_aquarius", '\u{f0a7d}'), // 󰩽 ("md_zodiac_aries", '\u{f0a7e}'), // 󰩾 ("md_zodiac_cancer", '\u{f0a7f}'), // 󰩿 ("md_zodiac_capricorn", '\u{f0a80}'), // 󰪀 ("md_zodiac_gemini", '\u{f0a81}'), // 󰪁 ("md_zodiac_leo", '\u{f0a82}'), // 󰪂 ("md_zodiac_libra", '\u{f0a83}'), // 󰪃 ("md_zodiac_pisces", '\u{f0a84}'), // 󰪄 ("md_zodiac_sagittarius", '\u{f0a85}'), // 󰪅 ("md_zodiac_scorpio", '\u{f0a86}'), // 󰪆 ("md_zodiac_taurus", '\u{f0a87}'), // 󰪇 ("md_zodiac_virgo", '\u{f0a88}'), // 󰪈 ("oct_accessibility", '\u{f406}'), //  ("oct_accessibility_inset", '\u{f40b}'), //  ("oct_alert", '\u{f421}'), //  ("oct_alert_fill", '\u{f40c}'), //  ("oct_apps", '\u{f40e}'), //  ("oct_archive", '\u{f411}'), //  ("oct_arrow_both", '\u{f416}'), //  ("oct_arrow_down", '\u{f433}'), //  ("oct_arrow_down_left", '\u{f424}'), //  ("oct_arrow_down_right", '\u{f43e}'), //  ("oct_arrow_left", '\u{f434}'), //  ("oct_arrow_right", '\u{f432}'), //  ("oct_arrow_switch", '\u{f443}'), //  ("oct_arrow_up", '\u{f431}'), //  ("oct_arrow_up_left", '\u{f45c}'), //  ("oct_arrow_up_right", '\u{f46c}'), //  ("oct_beaker", '\u{f499}'), //  ("oct_bell", '\u{f49a}'), //  ("oct_bell_fill", '\u{f476}'), //  ("oct_bell_slash", '\u{f478}'), //  ("oct_blocked", '\u{f479}'), //  ("oct_bold", '\u{f49d}'), //  ("oct_book", '\u{f405}'), //  ("oct_bookmark", '\u{f461}'), //  ("oct_bookmark_fill", '\u{f47a}'), //  ("oct_bookmark_slash", '\u{f533}'), //  ("oct_bookmark_slash_fill", '\u{f493}'), //  ("oct_briefcase", '\u{f491}'), //  ("oct_broadcast", '\u{f43c}'), //  ("oct_browser", '\u{f488}'), //  ("oct_bug", '\u{f46f}'), //  ("oct_cache", '\u{f49b}'), //  ("oct_calendar", '\u{f455}'), //  ("oct_check", '\u{f42e}'), //  ("oct_check_circle", '\u{f49e}'), //  ("oct_check_circle_fill", '\u{f4a4}'), //  ("oct_checkbox", '\u{f4a7}'), //  ("oct_checklist", '\u{f45e}'), //  ("oct_chevron_down", '\u{f47c}'), //  ("oct_chevron_left", '\u{f47d}'), //  ("oct_chevron_right", '\u{f460}'), //  ("oct_chevron_up", '\u{f47b}'), //  ("oct_circle", '\u{f4aa}'), //  ("oct_circle_slash", '\u{f468}'), //  ("oct_clock", '\u{f43a}'), //  ("oct_clock_fill", '\u{f4ab}'), //  ("oct_cloud", '\u{f4ac}'), //  ("oct_cloud_offline", '\u{f4ad}'), //  ("oct_code", '\u{f44f}'), //  ("oct_code_of_conduct", '\u{f4ae}'), //  ("oct_code_review", '\u{f4af}'), //  ("oct_code_square", '\u{f4b0}'), //  ("oct_codescan", '\u{f4b1}'), //  ("oct_codescan_checkmark", '\u{f4b2}'), //  ("oct_codespaces", '\u{f4b3}'), //  ("oct_columns", '\u{f4b4}'), //  ("oct_command_palette", '\u{f4b5}'), //  ("oct_comment", '\u{f41f}'), //  ("oct_comment_discussion", '\u{f442}'), //  ("oct_commit", '\u{f4b6}'), //  ("oct_container", '\u{f4b7}'), //  ("oct_copilot", '\u{f4b8}'), //  ("oct_copilot_error", '\u{f4b9}'), //  ("oct_copilot_warning", '\u{f4ba}'), //  ("oct_copy", '\u{f4bb}'), //  ("oct_cpu", '\u{f4bc}'), //  ("oct_credit_card", '\u{f439}'), //  ("oct_cross_reference", '\u{f4bd}'), //  ("oct_dash", '\u{f48b}'), //  ("oct_database", '\u{f472}'), //  ("oct_dependabot", '\u{f4be}'), //  ("oct_desktop_download", '\u{f498}'), //  ("oct_device_camera", '\u{f446}'), //  ("oct_device_camera_video", '\u{f447}'), //  ("oct_device_desktop", '\u{f4a9}'), //  ("oct_device_mobile", '\u{f42c}'), //  ("oct_diamond", '\u{f4bf}'), //  ("oct_diff", '\u{f440}'), //  ("oct_diff_added", '\u{f457}'), //  ("oct_diff_ignored", '\u{f474}'), //  ("oct_diff_modified", '\u{f459}'), //  ("oct_diff_removed", '\u{f458}'), //  ("oct_diff_renamed", '\u{f45a}'), //  ("oct_discussion_closed", '\u{f4c0}'), //  ("oct_discussion_duplicate", '\u{f4c1}'), //  ("oct_discussion_outdated", '\u{f4c2}'), //  ("oct_dot", '\u{f4c3}'), //  ("oct_dot_fill", '\u{f444}'), //  ("oct_download", '\u{f409}'), //  ("oct_duplicate", '\u{f4c4}'), //  ("oct_ellipsis", '\u{f475}'), //  ("oct_eye", '\u{f441}'), //  ("oct_eye_closed", '\u{f4c5}'), //  ("oct_feed_discussion", '\u{f4c6}'), //  ("oct_feed_forked", '\u{f4c7}'), //  ("oct_feed_heart", '\u{f4c8}'), //  ("oct_feed_merged", '\u{f4c9}'), //  ("oct_feed_person", '\u{f4ca}'), //  ("oct_feed_repo", '\u{f4cb}'), //  ("oct_feed_rocket", '\u{f4cc}'), //  ("oct_feed_star", '\u{f4cd}'), //  ("oct_feed_tag", '\u{f4ce}'), //  ("oct_feed_trophy", '\u{f4cf}'), //  ("oct_file", '\u{f4a5}'), //  ("oct_file_added", '\u{f4d0}'), //  ("oct_file_badge", '\u{f4d1}'), //  ("oct_file_binary", '\u{f471}'), //  ("oct_file_code", '\u{f40d}'), //  ("oct_file_diff", '\u{f4d2}'), //  ("oct_file_directory", '\u{f413}'), //  ("oct_file_directory_fill", '\u{f4d3}'), //  ("oct_file_directory_open_fill", '\u{f4d4}'), //  ("oct_file_media", '\u{f40f}'), //  ("oct_file_moved", '\u{f4d5}'), //  ("oct_file_removed", '\u{f4d6}'), //  ("oct_file_submodule", '\u{f414}'), //  ("oct_file_symlink_directory", '\u{f482}'), //  ("oct_file_symlink_file", '\u{f481}'), //  ("oct_file_zip", '\u{f410}'), //  ("oct_filter", '\u{f4d7}'), //  ("oct_fiscal_host", '\u{f4d8}'), //  ("oct_flame", '\u{f490}'), //  ("oct_fold", '\u{f48c}'), //  ("oct_fold_down", '\u{f4d9}'), //  ("oct_fold_up", '\u{f4da}'), //  ("oct_gear", '\u{f423}'), //  ("oct_gift", '\u{f436}'), //  ("oct_git_branch", '\u{f418}'), //  ("oct_git_commit", '\u{f417}'), //  ("oct_git_compare", '\u{f47f}'), //  ("oct_git_merge", '\u{f419}'), //  ("oct_git_merge_queue", '\u{f4db}'), //  ("oct_git_pull_request", '\u{f407}'), //  ("oct_git_pull_request_closed", '\u{f4dc}'), //  ("oct_git_pull_request_draft", '\u{f4dd}'), //  ("oct_globe", '\u{f484}'), //  ("oct_goal", '\u{f4de}'), //  ("oct_grabber", '\u{f4a6}'), //  ("oct_graph", '\u{f437}'), //  ("oct_hash", '\u{f4df}'), //  ("oct_heading", '\u{f4e0}'), //  ("oct_heart", '\u{2665}'), // ♥ ("oct_heart_fill", '\u{f4e1}'), //  ("oct_history", '\u{f464}'), //  ("oct_home", '\u{f46d}'), //  ("oct_home_fill", '\u{f4e2}'), //  ("oct_horizontal_rule", '\u{f45b}'), //  ("oct_hourglass", '\u{f4e3}'), //  ("oct_hubot", '\u{f477}'), //  ("oct_id_badge", '\u{f4e4}'), //  ("oct_image", '\u{f4e5}'), //  ("oct_inbox", '\u{f48d}'), //  ("oct_infinity", '\u{f4e6}'), //  ("oct_info", '\u{f449}'), //  ("oct_issue_closed", '\u{f41d}'), //  ("oct_issue_draft", '\u{f4e7}'), //  ("oct_issue_opened", '\u{f41b}'), //  ("oct_issue_reopened", '\u{f41c}'), //  ("oct_issue_tracked_by", '\u{f4e8}'), //  ("oct_issue_tracks", '\u{f4e9}'), //  ("oct_italic", '\u{f49f}'), //  ("oct_iterations", '\u{f4ea}'), //  ("oct_kebab_horizontal", '\u{f4eb}'), //  ("oct_key", '\u{f43d}'), //  ("oct_key_asterisk", '\u{f4ec}'), //  ("oct_law", '\u{f495}'), //  ("oct_light_bulb", '\u{f400}'), //  ("oct_link", '\u{f44c}'), //  ("oct_link_external", '\u{f465}'), //  ("oct_list_ordered", '\u{f452}'), //  ("oct_list_unordered", '\u{f451}'), //  ("oct_location", '\u{f450}'), //  ("oct_lock", '\u{f456}'), //  ("oct_log", '\u{f4ed}'), //  ("oct_logo_gist", '\u{f480}'), //  ("oct_logo_github", '\u{f470}'), //  ("oct_mail", '\u{f42f}'), //  ("oct_mark_github", '\u{f408}'), //  ("oct_markdown", '\u{f48a}'), //  ("oct_megaphone", '\u{f45f}'), //  ("oct_mention", '\u{f486}'), //  ("oct_meter", '\u{f463}'), //  ("oct_milestone", '\u{f45d}'), //  ("oct_mirror", '\u{f41a}'), //  ("oct_moon", '\u{f4ee}'), //  ("oct_mortar_board", '\u{f494}'), //  ("oct_move_to_bottom", '\u{f4ef}'), //  ("oct_move_to_end", '\u{f4f0}'), //  ("oct_move_to_start", '\u{f4f1}'), //  ("oct_move_to_top", '\u{f4f2}'), //  ("oct_multi_select", '\u{f4f3}'), //  ("oct_mute", '\u{f466}'), //  ("oct_no_entry", '\u{f4f4}'), //  ("oct_north_star", '\u{f4f5}'), //  ("oct_note", '\u{f4f6}'), //  ("oct_number", '\u{f4f7}'), //  ("oct_organization", '\u{f42b}'), //  ("oct_package", '\u{f487}'), //  ("oct_package_dependencies", '\u{f4f8}'), //  ("oct_package_dependents", '\u{f4f9}'), //  ("oct_paintbrush", '\u{f48f}'), //  ("oct_paper_airplane", '\u{f4fa}'), //  ("oct_paperclip", '\u{f4fb}'), //  ("oct_passkey_fill", '\u{f4fc}'), //  ("oct_paste", '\u{f429}'), //  ("oct_pencil", '\u{f448}'), //  ("oct_people", '\u{f4fd}'), //  ("oct_person", '\u{f415}'), //  ("oct_person_add", '\u{f4fe}'), //  ("oct_person_fill", '\u{f4ff}'), //  ("oct_pin", '\u{f435}'), //  ("oct_play", '\u{f500}'), //  ("oct_plug", '\u{f492}'), //  ("oct_plus", '\u{f44d}'), //  ("oct_plus_circle", '\u{f501}'), //  ("oct_project", '\u{f502}'), //  ("oct_project_roadmap", '\u{f503}'), //  ("oct_project_symlink", '\u{f504}'), //  ("oct_project_template", '\u{f505}'), //  ("oct_pulse", '\u{f469}'), //  ("oct_question", '\u{f420}'), //  ("oct_quote", '\u{f453}'), //  ("oct_read", '\u{f430}'), //  ("oct_rel_file_path", '\u{f506}'), //  ("oct_reply", '\u{f4a8}'), //  ("oct_repo", '\u{f401}'), //  ("oct_repo_clone", '\u{f43f}'), //  ("oct_repo_deleted", '\u{f507}'), //  ("oct_repo_forked", '\u{f402}'), //  ("oct_repo_locked", '\u{f508}'), //  ("oct_repo_pull", '\u{f404}'), //  ("oct_repo_push", '\u{f403}'), //  ("oct_repo_template", '\u{f509}'), //  ("oct_report", '\u{f50a}'), //  ("oct_rocket", '\u{f427}'), //  ("oct_rows", '\u{f50b}'), //  ("oct_rss", '\u{f428}'), //  ("oct_ruby", '\u{f43b}'), //  ("oct_screen_full", '\u{f50c}'), //  ("oct_screen_normal", '\u{f50d}'), //  ("oct_search", '\u{f422}'), //  ("oct_server", '\u{f473}'), //  ("oct_share", '\u{f50e}'), //  ("oct_share_android", '\u{f50f}'), //  ("oct_shield", '\u{f49c}'), //  ("oct_shield_check", '\u{f510}'), //  ("oct_shield_lock", '\u{f511}'), //  ("oct_shield_slash", '\u{f512}'), //  ("oct_shield_x", '\u{f513}'), //  ("oct_sidebar_collapse", '\u{f514}'), //  ("oct_sidebar_expand", '\u{f515}'), //  ("oct_sign_in", '\u{f42a}'), //  ("oct_sign_out", '\u{f426}'), //  ("oct_single_select", '\u{f516}'), //  ("oct_skip", '\u{f517}'), //  ("oct_skip_fill", '\u{f518}'), //  ("oct_sliders", '\u{f462}'), //  ("oct_smiley", '\u{f4a2}'), //  ("oct_sort_asc", '\u{f519}'), //  ("oct_sort_desc", '\u{f51a}'), //  ("oct_sparkle_fill", '\u{f51b}'), //  ("oct_sponsor_tiers", '\u{f51c}'), //  ("oct_square", '\u{f51d}'), //  ("oct_square_fill", '\u{f445}'), //  ("oct_squirrel", '\u{f483}'), //  ("oct_stack", '\u{f51e}'), //  ("oct_star", '\u{f41e}'), //  ("oct_star_fill", '\u{f51f}'), //  ("oct_stop", '\u{f46e}'), //  ("oct_stopwatch", '\u{f520}'), //  ("oct_strikethrough", '\u{f521}'), //  ("oct_sun", '\u{f522}'), //  ("oct_sync", '\u{f46a}'), //  ("oct_tab", '\u{f523}'), //  ("oct_tab_external", '\u{f524}'), //  ("oct_table", '\u{f525}'), //  ("oct_tag", '\u{f412}'), //  ("oct_tasklist", '\u{f4a0}'), //  ("oct_telescope", '\u{f46b}'), //  ("oct_telescope_fill", '\u{f526}'), //  ("oct_terminal", '\u{f489}'), //  ("oct_three_bars", '\u{f44e}'), //  ("oct_thumbsdown", '\u{f497}'), //  ("oct_thumbsup", '\u{f496}'), //  ("oct_tools", '\u{f425}'), //  ("oct_trash", '\u{f48e}'), //  ("oct_triangle_down", '\u{f44b}'), //  ("oct_triangle_left", '\u{f438}'), //  ("oct_triangle_right", '\u{f44a}'), //  ("oct_triangle_up", '\u{f47e}'), //  ("oct_trophy", '\u{f527}'), //  ("oct_typography", '\u{f528}'), //  ("oct_unfold", '\u{f42d}'), //  ("oct_unlink", '\u{f529}'), //  ("oct_unlock", '\u{f52a}'), //  ("oct_unmute", '\u{f485}'), //  ("oct_unread", '\u{f52b}'), //  ("oct_unverified", '\u{f4a3}'), //  ("oct_upload", '\u{f40a}'), //  ("oct_verified", '\u{f4a1}'), //  ("oct_versions", '\u{f454}'), //  ("oct_video", '\u{f52c}'), //  ("oct_webhook", '\u{f52d}'), //  ("oct_workflow", '\u{f52e}'), //  ("oct_x", '\u{f467}'), //  ("oct_x_circle", '\u{f52f}'), //  ("oct_x_circle_fill", '\u{f530}'), //  ("oct_zap", '\u{26a1}'), // ⚡ ("oct_zoom_in", '\u{f531}'), //  ("oct_zoom_out", '\u{f532}'), //  ("pl_branch", '\u{e0a0}'), //  ("pl_current_line", '\u{e0a1}'), //  ("pl_hostname", '\u{e0a2}'), //  ("pl_left_hard_divider", '\u{e0b0}'), //  ("pl_left_soft_divider", '\u{e0b1}'), //  ("pl_line_number", '\u{e0a1}'), //  ("pl_readonly", '\u{e0a2}'), //  ("pl_right_hard_divider", '\u{e0b2}'), //  ("pl_right_soft_divider", '\u{e0b3}'), //  ("ple_backslash_separator", '\u{e0b9}'), //  ("ple_backslash_separator_redundant", '\u{e0bf}'), //  ("ple_column_number", '\u{e0a3}'), //  ("ple_current_column", '\u{e0a3}'), //  ("ple_flame_thick", '\u{e0c0}'), //  ("ple_flame_thick_mirrored", '\u{e0c2}'), //  ("ple_flame_thin", '\u{e0c1}'), //  ("ple_flame_thin_mirrored", '\u{e0c3}'), //  ("ple_forwardslash_separator", '\u{e0bb}'), //  ("ple_forwardslash_separator_redundant", '\u{e0bd}'), //  ("ple_honeycomb", '\u{e0cc}'), //  ("ple_honeycomb_outline", '\u{e0cd}'), //  ("ple_ice_waveform", '\u{e0c8}'), //  ("ple_ice_waveform_mirrored", '\u{e0ca}'), //  ("ple_left_half_circle_thick", '\u{e0b6}'), //  ("ple_left_half_circle_thin", '\u{e0b7}'), //  ("ple_left_hard_divider_inverse", '\u{e0d7}'), //  ("ple_lego_block_facing", '\u{e0d0}'), //  ("ple_lego_block_sideways", '\u{e0d1}'), //  ("ple_lego_separator", '\u{e0ce}'), //  ("ple_lego_separator_thin", '\u{e0cf}'), //  ("ple_lower_left_triangle", '\u{e0b8}'), //  ("ple_lower_right_triangle", '\u{e0ba}'), //  ("ple_pixelated_squares_big", '\u{e0c6}'), //  ("ple_pixelated_squares_big_mirrored", '\u{e0c7}'), //  ("ple_pixelated_squares_small", '\u{e0c4}'), //  ("ple_pixelated_squares_small_mirrored", '\u{e0c5}'), //  ("ple_right_half_circle_thick", '\u{e0b4}'), //  ("ple_right_half_circle_thin", '\u{e0b5}'), //  ("ple_right_hard_divider_inverse", '\u{e0d6}'), //  ("ple_trapezoid_top_bottom", '\u{e0d2}'), //  ("ple_trapezoid_top_bottom_mirrored", '\u{e0d4}'), //  ("ple_upper_left_triangle", '\u{e0bc}'), //  ("ple_upper_right_triangle", '\u{e0be}'), //  ("pom_away", '\u{e007}'), //  ("pom_clean_code", '\u{e000}'), //  ("pom_external_interruption", '\u{e00a}'), //  ("pom_internal_interruption", '\u{e009}'), //  ("pom_long_pause", '\u{e006}'), //  ("pom_pair_programming", '\u{e008}'), //  ("pom_pomodoro_done", '\u{e001}'), //  ("pom_pomodoro_estimated", '\u{e002}'), //  ("pom_pomodoro_squashed", '\u{e004}'), //  ("pom_pomodoro_ticking", '\u{e003}'), //  ("pom_short_pause", '\u{e005}'), //  ("seti_apple", '\u{e635}'), //  ("seti_argdown", '\u{e636}'), //  ("seti_asm", '\u{e637}'), //  ("seti_audio", '\u{e638}'), //  ("seti_babel", '\u{e639}'), //  ("seti_bazel", '\u{e63a}'), //  ("seti_bicep", '\u{e63b}'), //  ("seti_bower", '\u{e61a}'), //  ("seti_bsl", '\u{e63c}'), //  ("seti_c", '\u{e649}'), //  ("seti_c_sharp", '\u{e648}'), //  ("seti_cake", '\u{e63e}'), //  ("seti_cake_php", '\u{e63d}'), //  ("seti_checkbox", '\u{e63f}'), //  ("seti_checkbox_unchecked", '\u{e640}'), //  ("seti_cjsx", '\u{e61b}'), //  ("seti_clock", '\u{e641}'), //  ("seti_clojure", '\u{e642}'), //  ("seti_code_climate", '\u{e643}'), //  ("seti_code_search", '\u{e644}'), //  ("seti_coffee", '\u{e61b}'), //  ("seti_coldfusion", '\u{e645}'), //  ("seti_config", '\u{e615}'), //  ("seti_cpp", '\u{e646}'), //  ("seti_crystal", '\u{e62f}'), //  ("seti_crystal_embedded", '\u{e647}'), //  ("seti_css", '\u{e614}'), //  ("seti_csv", '\u{e64a}'), //  ("seti_cu", '\u{e64b}'), //  ("seti_d", '\u{e651}'), //  ("seti_dart", '\u{e64c}'), //  ("seti_db", '\u{e64d}'), //  ("seti_default", '\u{e64e}'), //  ("seti_deprecation_cop", '\u{e64f}'), //  ("seti_docker", '\u{e650}'), //  ("seti_editorconfig", '\u{e652}'), //  ("seti_ejs", '\u{e618}'), //  ("seti_elixir", '\u{e62d}'), //  ("seti_elixir_script", '\u{e653}'), //  ("seti_elm", '\u{e62c}'), //  ("seti_error", '\u{e654}'), //  ("seti_eslint", '\u{e655}'), //  ("seti_ethereum", '\u{e656}'), //  ("seti_f_sharp", '\u{e65a}'), //  ("seti_favicon", '\u{e623}'), //  ("seti_firebase", '\u{e657}'), //  ("seti_firefox", '\u{e658}'), //  ("seti_folder", '\u{e613}'), //  ("seti_font", '\u{e659}'), //  ("seti_git", '\u{e65d}'), //  ("seti_git_folder", '\u{e65d}'), //  ("seti_git_ignore", '\u{e65d}'), //  ("seti_github", '\u{e65b}'), //  ("seti_gitlab", '\u{e65c}'), //  ("seti_go", '\u{e627}'), //  ("seti_go2", '\u{e65e}'), //  ("seti_godot", '\u{e65f}'), //  ("seti_gradle", '\u{e660}'), //  ("seti_grails", '\u{e661}'), //  ("seti_graphql", '\u{e662}'), //  ("seti_grunt", '\u{e611}'), //  ("seti_gulp", '\u{e610}'), //  ("seti_hacklang", '\u{e663}'), //  ("seti_haml", '\u{e664}'), //  ("seti_happenings", '\u{e665}'), //  ("seti_haskell", '\u{e61f}'), //  ("seti_haxe", '\u{e666}'), //  ("seti_heroku", '\u{e607}'), //  ("seti_hex", '\u{e667}'), //  ("seti_home", '\u{e617}'), //  ("seti_html", '\u{e60e}'), //  ("seti_ignored", '\u{e668}'), //  ("seti_illustrator", '\u{e669}'), //  ("seti_image", '\u{e60d}'), //  ("seti_info", '\u{e66a}'), //  ("seti_ionic", '\u{e66b}'), //  ("seti_jade", '\u{e66c}'), //  ("seti_java", '\u{e66d}'), //  ("seti_javascript", '\u{e60c}'), //  ("seti_jenkins", '\u{e66e}'), //  ("seti_jinja", '\u{e66f}'), //  ("seti_json", '\u{e60b}'), //  ("seti_julia", '\u{e624}'), //  ("seti_karma", '\u{e622}'), //  ("seti_kotlin", '\u{e634}'), //  ("seti_less", '\u{e60b}'), //  ("seti_license", '\u{e60a}'), //  ("seti_liquid", '\u{e670}'), //  ("seti_livescript", '\u{e671}'), //  ("seti_lock", '\u{e672}'), //  ("seti_lua", '\u{e620}'), //  ("seti_makefile", '\u{e673}'), //  ("seti_markdown", '\u{e609}'), //  ("seti_maven", '\u{e674}'), //  ("seti_mdo", '\u{e675}'), //  ("seti_mustache", '\u{e60f}'), //  ("seti_new_file", '\u{e676}'), //  ("seti_nim", '\u{e677}'), //  ("seti_notebook", '\u{e678}'), //  ("seti_npm", '\u{e616}'), //  ("seti_npm_ignored", '\u{e616}'), //  ("seti_nunjucks", '\u{e679}'), //  ("seti_ocaml", '\u{e67a}'), //  ("seti_odata", '\u{e67b}'), //  ("seti_pddl", '\u{e67c}'), //  ("seti_pdf", '\u{e67d}'), //  ("seti_perl", '\u{e67e}'), //  ("seti_photoshop", '\u{e67f}'), //  ("seti_php", '\u{e608}'), //  ("seti_pipeline", '\u{e680}'), //  ("seti_plan", '\u{e681}'), //  ("seti_platformio", '\u{e682}'), //  ("seti_play_arrow", '\u{e602}'), //  ("seti_powershell", '\u{e683}'), //  ("seti_prisma", '\u{e684}'), //  ("seti_project", '\u{e601}'), //  ("seti_prolog", '\u{e685}'), //  ("seti_pug", '\u{e686}'), //  ("seti_puppet", '\u{e631}'), //  ("seti_purescript", '\u{e630}'), //  ("seti_python", '\u{e606}'), //  ("seti_r", '\u{e68a}'), //  ("seti_rails", '\u{e604}'), //  ("seti_react", '\u{e625}'), //  ("seti_reasonml", '\u{e687}'), //  ("seti_rescript", '\u{e688}'), //  ("seti_rollup", '\u{e689}'), //  ("seti_ruby", '\u{e605}'), //  ("seti_rust", '\u{e68b}'), //  ("seti_salesforce", '\u{e68c}'), //  ("seti_sass", '\u{e603}'), //  ("seti_sbt", '\u{e68d}'), //  ("seti_scala", '\u{e68e}'), //  ("seti_search", '\u{e68f}'), //  ("seti_settings", '\u{e690}'), //  ("seti_shell", '\u{e691}'), //  ("seti_slim", '\u{e692}'), //  ("seti_smarty", '\u{e693}'), //  ("seti_spring", '\u{e694}'), //  ("seti_stylelint", '\u{e695}'), //  ("seti_stylus", '\u{e600}'), //  ("seti_sublime", '\u{e696}'), //  ("seti_svelte", '\u{e697}'), //  ("seti_svg", '\u{e698}'), //  ("seti_swift", '\u{e699}'), //  ("seti_terraform", '\u{e69a}'), //  ("seti_tex", '\u{e69b}'), //  ("seti_text", '\u{e64e}'), //  ("seti_time_cop", '\u{e641}'), //  ("seti_todo", '\u{e69c}'), //  ("seti_tsconfig", '\u{e69d}'), //  ("seti_twig", '\u{e61c}'), //  ("seti_typescript", '\u{e628}'), //  ("seti_vala", '\u{e69e}'), //  ("seti_video", '\u{e69f}'), //  ("seti_vue", '\u{e6a0}'), //  ("seti_wasm", '\u{e6a1}'), //  ("seti_wat", '\u{e6a2}'), //  ("seti_webpack", '\u{e6a3}'), //  ("seti_wgt", '\u{e6a4}'), //  ("seti_word", '\u{e6a5}'), //  ("seti_xls", '\u{e6a6}'), //  ("seti_xml", '\u{e619}'), //  ("seti_yarn", '\u{e6a7}'), //  ("seti_yml", '\u{e6a8}'), //  ("seti_zig", '\u{e6a9}'), //  ("seti_zip", '\u{e6aa}'), //  ("weather_alien", '\u{e36e}'), //  ("weather_aliens", '\u{e345}'), //  ("weather_barometer", '\u{e372}'), //  ("weather_celsius", '\u{e339}'), //  ("weather_cloud", '\u{e33d}'), //  ("weather_cloud_down", '\u{e33a}'), //  ("weather_cloud_refresh", '\u{e33b}'), //  ("weather_cloud_up", '\u{e33c}'), //  ("weather_cloudy", '\u{e312}'), //  ("weather_cloudy_gusts", '\u{e310}'), //  ("weather_cloudy_windy", '\u{e311}'), //  ("weather_day_cloudy", '\u{e302}'), //  ("weather_day_cloudy_gusts", '\u{e300}'), //  ("weather_day_cloudy_high", '\u{e376}'), //  ("weather_day_cloudy_windy", '\u{e301}'), //  ("weather_day_fog", '\u{e303}'), //  ("weather_day_hail", '\u{e304}'), //  ("weather_day_haze", '\u{e3ae}'), //  ("weather_day_light_wind", '\u{e3bc}'), //  ("weather_day_lightning", '\u{e305}'), //  ("weather_day_rain", '\u{e308}'), //  ("weather_day_rain_mix", '\u{e306}'), //  ("weather_day_rain_wind", '\u{e307}'), //  ("weather_day_showers", '\u{e309}'), //  ("weather_day_sleet", '\u{e3aa}'), //  ("weather_day_sleet_storm", '\u{e362}'), //  ("weather_day_snow", '\u{e30a}'), //  ("weather_day_snow_thunderstorm", '\u{e365}'), //  ("weather_day_snow_wind", '\u{e35f}'), //  ("weather_day_sprinkle", '\u{e30b}'), //  ("weather_day_storm_showers", '\u{e30e}'), //  ("weather_day_sunny", '\u{e30d}'), //  ("weather_day_sunny_overcast", '\u{e30c}'), //  ("weather_day_thunderstorm", '\u{e30f}'), //  ("weather_day_windy", '\u{e37d}'), //  ("weather_degrees", '\u{e33e}'), //  ("weather_direction_down", '\u{e340}'), //  ("weather_direction_down_left", '\u{e33f}'), //  ("weather_direction_down_right", '\u{e380}'), //  ("weather_direction_left", '\u{e344}'), //  ("weather_direction_right", '\u{e349}'), //  ("weather_direction_up", '\u{e353}'), //  ("weather_direction_up_left", '\u{e37f}'), //  ("weather_direction_up_right", '\u{e352}'), //  ("weather_dust", '\u{e35d}'), //  ("weather_earthquake", '\u{e3be}'), //  ("weather_fahrenheit", '\u{e341}'), //  ("weather_fire", '\u{e3bf}'), //  ("weather_flood", '\u{e375}'), //  ("weather_fog", '\u{e313}'), //  ("weather_gale_warning", '\u{e3c5}'), //  ("weather_hail", '\u{e314}'), //  ("weather_horizon", '\u{e343}'), //  ("weather_horizon_alt", '\u{e342}'), //  ("weather_hot", '\u{e36b}'), //  ("weather_humidity", '\u{e373}'), //  ("weather_hurricane", '\u{e36c}'), //  ("weather_hurricane_warning", '\u{e3c7}'), //  ("weather_lightning", '\u{e315}'), //  ("weather_lunar_eclipse", '\u{e369}'), //  ("weather_meteor", '\u{e36a}'), //  ("weather_moon_alt_first_quarter", '\u{e3ce}'), //  ("weather_moon_alt_full", '\u{e3d5}'), //  ("weather_moon_alt_new", '\u{e3e3}'), //  ("weather_moon_alt_third_quarter", '\u{e3dc}'), //  ("weather_moon_alt_waning_crescent_1", '\u{e3dd}'), //  ("weather_moon_alt_waning_crescent_2", '\u{e3de}'), //  ("weather_moon_alt_waning_crescent_3", '\u{e3df}'), //  ("weather_moon_alt_waning_crescent_4", '\u{e3e0}'), //  ("weather_moon_alt_waning_crescent_5", '\u{e3e1}'), //  ("weather_moon_alt_waning_crescent_6", '\u{e3e2}'), //  ("weather_moon_alt_waning_gibbous_1", '\u{e3d6}'), //  ("weather_moon_alt_waning_gibbous_2", '\u{e3d7}'), //  ("weather_moon_alt_waning_gibbous_3", '\u{e3d8}'), //  ("weather_moon_alt_waning_gibbous_4", '\u{e3d9}'), //  ("weather_moon_alt_waning_gibbous_5", '\u{e3da}'), //  ("weather_moon_alt_waning_gibbous_6", '\u{e3db}'), //  ("weather_moon_alt_waxing_crescent_1", '\u{e3c8}'), //  ("weather_moon_alt_waxing_crescent_2", '\u{e3c9}'), //  ("weather_moon_alt_waxing_crescent_3", '\u{e3ca}'), //  ("weather_moon_alt_waxing_crescent_4", '\u{e3cb}'), //  ("weather_moon_alt_waxing_crescent_5", '\u{e3cc}'), //  ("weather_moon_alt_waxing_crescent_6", '\u{e3cd}'), //  ("weather_moon_alt_waxing_gibbous_1", '\u{e3cf}'), //  ("weather_moon_alt_waxing_gibbous_2", '\u{e3d0}'), //  ("weather_moon_alt_waxing_gibbous_3", '\u{e3d1}'), //  ("weather_moon_alt_waxing_gibbous_4", '\u{e3d2}'), //  ("weather_moon_alt_waxing_gibbous_5", '\u{e3d3}'), //  ("weather_moon_alt_waxing_gibbous_6", '\u{e3d4}'), //  ("weather_moon_first_quarter", '\u{e394}'), //  ("weather_moon_full", '\u{e39b}'), //  ("weather_moon_new", '\u{e38d}'), //  ("weather_moon_third_quarter", '\u{e3a2}'), //  ("weather_moon_waning_crescent_1", '\u{e3a3}'), //  ("weather_moon_waning_crescent_2", '\u{e3a4}'), //  ("weather_moon_waning_crescent_3", '\u{e3a5}'), //  ("weather_moon_waning_crescent_4", '\u{e3a6}'), //  ("weather_moon_waning_crescent_5", '\u{e3a7}'), //  ("weather_moon_waning_crescent_6", '\u{e3a8}'), //  ("weather_moon_waning_gibbous_1", '\u{e39c}'), //  ("weather_moon_waning_gibbous_2", '\u{e39d}'), //  ("weather_moon_waning_gibbous_3", '\u{e39e}'), //  ("weather_moon_waning_gibbous_4", '\u{e39f}'), //  ("weather_moon_waning_gibbous_5", '\u{e3a0}'), //  ("weather_moon_waning_gibbous_6", '\u{e3a1}'), //  ("weather_moon_waxing_crescent_1", '\u{e38e}'), //  ("weather_moon_waxing_crescent_2", '\u{e38f}'), //  ("weather_moon_waxing_crescent_3", '\u{e390}'), //  ("weather_moon_waxing_crescent_4", '\u{e391}'), //  ("weather_moon_waxing_crescent_5", '\u{e392}'), //  ("weather_moon_waxing_crescent_6", '\u{e393}'), //  ("weather_moon_waxing_gibbous_1", '\u{e395}'), //  ("weather_moon_waxing_gibbous_2", '\u{e396}'), //  ("weather_moon_waxing_gibbous_3", '\u{e397}'), //  ("weather_moon_waxing_gibbous_4", '\u{e398}'), //  ("weather_moon_waxing_gibbous_5", '\u{e399}'), //  ("weather_moon_waxing_gibbous_6", '\u{e39a}'), //  ("weather_moonrise", '\u{e3c1}'), //  ("weather_moonset", '\u{e3c2}'), //  ("weather_na", '\u{e374}'), //  ("weather_night_alt_cloudy", '\u{e37e}'), //  ("weather_night_alt_cloudy_gusts", '\u{e31f}'), //  ("weather_night_alt_cloudy_high", '\u{e377}'), //  ("weather_night_alt_cloudy_windy", '\u{e320}'), //  ("weather_night_alt_hail", '\u{e321}'), //  ("weather_night_alt_lightning", '\u{e322}'), //  ("weather_night_alt_partly_cloudy", '\u{e379}'), //  ("weather_night_alt_rain", '\u{e325}'), //  ("weather_night_alt_rain_mix", '\u{e323}'), //  ("weather_night_alt_rain_wind", '\u{e324}'), //  ("weather_night_alt_showers", '\u{e326}'), //  ("weather_night_alt_sleet", '\u{e3ac}'), //  ("weather_night_alt_sleet_storm", '\u{e364}'), //  ("weather_night_alt_snow", '\u{e327}'), //  ("weather_night_alt_snow_thunderstorm", '\u{e367}'), //  ("weather_night_alt_snow_wind", '\u{e361}'), //  ("weather_night_alt_sprinkle", '\u{e328}'), //  ("weather_night_alt_storm_showers", '\u{e329}'), //  ("weather_night_alt_thunderstorm", '\u{e32a}'), //  ("weather_night_clear", '\u{e32b}'), //  ("weather_night_cloudy", '\u{e32e}'), //  ("weather_night_cloudy_gusts", '\u{e32c}'), //  ("weather_night_cloudy_high", '\u{e378}'), //  ("weather_night_cloudy_windy", '\u{e32d}'), //  ("weather_night_fog", '\u{e346}'), //  ("weather_night_hail", '\u{e32f}'), //  ("weather_night_lightning", '\u{e330}'), //  ("weather_night_partly_cloudy", '\u{e37b}'), //  ("weather_night_rain", '\u{e333}'), //  ("weather_night_rain_mix", '\u{e331}'), //  ("weather_night_rain_wind", '\u{e332}'), //  ("weather_night_showers", '\u{e334}'), //  ("weather_night_sleet", '\u{e3ab}'), //  ("weather_night_sleet_storm", '\u{e363}'), //  ("weather_night_snow", '\u{e335}'), //  ("weather_night_snow_thunderstorm", '\u{e366}'), //  ("weather_night_snow_wind", '\u{e360}'), //  ("weather_night_sprinkle", '\u{e336}'), //  ("weather_night_storm_showers", '\u{e337}'), //  ("weather_night_thunderstorm", '\u{e338}'), //  ("weather_rain", '\u{e318}'), //  ("weather_rain_mix", '\u{e316}'), //  ("weather_rain_wind", '\u{e317}'), //  ("weather_raindrop", '\u{e371}'), //  ("weather_raindrops", '\u{e34a}'), //  ("weather_refresh", '\u{e348}'), //  ("weather_refresh_alt", '\u{e347}'), //  ("weather_sandstorm", '\u{e37a}'), //  ("weather_showers", '\u{e319}'), //  ("weather_sleet", '\u{e3ad}'), //  ("weather_small_craft_advisory", '\u{e3c4}'), //  ("weather_smog", '\u{e36d}'), //  ("weather_smoke", '\u{e35c}'), //  ("weather_snow", '\u{e31a}'), //  ("weather_snow_wind", '\u{e35e}'), //  ("weather_snowflake_cold", '\u{e36f}'), //  ("weather_solar_eclipse", '\u{e368}'), //  ("weather_sprinkle", '\u{e31b}'), //  ("weather_stars", '\u{e370}'), //  ("weather_storm_showers", '\u{e31c}'), //  ("weather_storm_warning", '\u{e3c6}'), //  ("weather_strong_wind", '\u{e34b}'), //  ("weather_sunrise", '\u{e34c}'), //  ("weather_sunset", '\u{e34d}'), //  ("weather_thermometer", '\u{e350}'), //  ("weather_thermometer_exterior", '\u{e34e}'), //  ("weather_thermometer_internal", '\u{e34f}'), //  ("weather_thunderstorm", '\u{e31d}'), //  ("weather_time_1", '\u{e382}'), //  ("weather_time_2", '\u{e383}'), //  ("weather_time_3", '\u{e384}'), //  ("weather_time_4", '\u{e385}'), //  ("weather_time_5", '\u{e386}'), //  ("weather_time_6", '\u{e387}'), //  ("weather_time_7", '\u{e388}'), //  ("weather_time_8", '\u{e389}'), //  ("weather_time_9", '\u{e38a}'), //  ("weather_time_10", '\u{e38b}'), //  ("weather_time_11", '\u{e38c}'), //  ("weather_time_12", '\u{e381}'), //  ("weather_tornado", '\u{e351}'), //  ("weather_train", '\u{e3c3}'), //  ("weather_tsunami", '\u{e3bd}'), //  ("weather_umbrella", '\u{e37c}'), //  ("weather_volcano", '\u{e3c0}'), //  ("weather_wind_beaufort_0", '\u{e3af}'), //  ("weather_wind_beaufort_1", '\u{e3b0}'), //  ("weather_wind_beaufort_2", '\u{e3b1}'), //  ("weather_wind_beaufort_3", '\u{e3b2}'), //  ("weather_wind_beaufort_4", '\u{e3b3}'), //  ("weather_wind_beaufort_5", '\u{e3b4}'), //  ("weather_wind_beaufort_6", '\u{e3b5}'), //  ("weather_wind_beaufort_7", '\u{e3b6}'), //  ("weather_wind_beaufort_8", '\u{e3b7}'), //  ("weather_wind_beaufort_9", '\u{e3b8}'), //  ("weather_wind_beaufort_10", '\u{e3b9}'), //  ("weather_wind_beaufort_11", '\u{e3ba}'), //  ("weather_wind_beaufort_12", '\u{e3bb}'), //  ("weather_wind_direction", '\u{e3a9}'), //  ("weather_wind_east", '\u{e35b}'), //  ("weather_wind_north", '\u{e35a}'), //  ("weather_wind_north_east", '\u{e359}'), //  ("weather_wind_north_west", '\u{e358}'), //  ("weather_wind_south", '\u{e357}'), //  ("weather_wind_south_east", '\u{e356}'), //  ("weather_wind_south_west", '\u{e355}'), //  ("weather_wind_west", '\u{e354}'), //  ("weather_windy", '\u{e31e}'), //  ]; termwiz-0.23.3/src/readbuf.rs000064400000000000000000000026541046102023000141660ustar 00000000000000use memmem::{Searcher, TwoWaySearcher}; /// This is a simple, small, read buffer that always has the buffer /// contents available as a contiguous slice. #[derive(Debug)] pub struct ReadBuffer { storage: Vec, } impl ReadBuffer { pub fn new() -> Self { Self { storage: Vec::with_capacity(16), } } pub fn as_slice(&self) -> &[u8] { self.storage.as_slice() } pub fn is_empty(&self) -> bool { self.storage.is_empty() } pub fn len(&self) -> usize { self.storage.len() } /// Mark `len` bytes as consumed, discarding them and shunting /// the contents of the buffer such that the remainder of the /// bytes are available at the front of the buffer. pub fn advance(&mut self, len: usize) { let remain = self.storage.len() - len; self.storage.rotate_left(len); self.storage.truncate(remain); } /// Append the contents of the slice to the read buffer pub fn extend_with(&mut self, slice: &[u8]) { self.storage.extend_from_slice(slice); } /// Search for `needle` starting at `offset`. Returns its offset /// into the buffer if found, else None. pub fn find_subsequence(&self, offset: usize, needle: &[u8]) -> Option { let needle = TwoWaySearcher::new(needle); let haystack = &self.storage[offset..]; needle.search_in(haystack).map(|x| x + offset) } } termwiz-0.23.3/src/render/mod.rs000064400000000000000000000003241046102023000146040ustar 00000000000000pub mod terminfo; #[cfg(windows)] pub mod windows; pub trait RenderTty: std::io::Write { /// Returns the (cols, rows) for the terminal fn get_size_in_cells(&mut self) -> crate::Result<(usize, usize)>; } termwiz-0.23.3/src/render/terminfo.rs000064400000000000000000001426001046102023000156540ustar 00000000000000//! Rendering of Changes using terminfo use crate::caps::{Capabilities, ColorLevel}; use crate::cell::{AttributeChange, Blink, CellAttributes, Intensity, Underline}; use crate::color::{ColorAttribute, ColorSpec}; use crate::escape::csi::{Cursor, Edit, EraseInDisplay, EraseInLine, Sgr, CSI}; use crate::escape::esc::EscCode; use crate::escape::osc::{ITermDimension, ITermFileData, ITermProprietary, OperatingSystemCommand}; use crate::escape::{Esc, OneBased}; use crate::image::{ImageDataType, TextureCoordinate}; use crate::render::RenderTty; use crate::surface::{Change, CursorShape, CursorVisibility, LineAttribute, Position}; use crate::Result; use std::io::Write; use terminfo::{capability as cap, Capability as TermInfoCapability}; pub struct TerminfoRenderer { caps: Capabilities, current_attr: CellAttributes, pending_attr: Option, /* TODO: we should record cursor position, shape and color here * so that we can optimize updating them on screen. */ } impl TerminfoRenderer { pub fn new(caps: Capabilities) -> Self { Self { caps, current_attr: CellAttributes::default(), pending_attr: None, } } fn get_capability<'a, T: TermInfoCapability<'a>>(&'a self) -> Option { self.caps.terminfo_db().and_then(|db| db.get::()) } fn attr_apply(&mut self, func: F) { self.pending_attr = Some(match self.pending_attr.take() { Some(mut attr) => { func(&mut attr); attr } None => { let mut attr = self.current_attr.clone(); func(&mut attr); attr } }); } #[allow(clippy::cognitive_complexity)] fn flush_pending_attr(&mut self, out: &mut W) -> Result<()> { macro_rules! attr_on { ($cap:ident, $sgr:expr) => {{ let cap = if self.caps.force_terminfo_render_to_use_ansi_sgr() { None } else { self.get_capability::() }; if let Some(attr) = cap { attr.expand().to(out.by_ref())?; } else { write!(out, "{}", CSI::Sgr($sgr))?; } }}; ($sgr:expr) => { write!(out, "{}", CSI::Sgr($sgr))?; }; } if let Some(attr) = self.pending_attr.take() { let mut current_foreground = self.current_attr.foreground(); let mut current_background = self.current_attr.background(); if !attr.attribute_bits_equal(&self.current_attr) { // Updating the attribute bits also resets the colors. current_foreground = ColorAttribute::Default; current_background = ColorAttribute::Default; let sgr = if self.caps.force_terminfo_render_to_use_ansi_sgr() { None } else { self.get_capability::() }; // The SetAttributes capability can only handle single underline and slow blink. if let Some(sgr) = sgr { sgr.expand() .bold(attr.intensity() == Intensity::Bold) .dim(attr.intensity() == Intensity::Half) .underline(attr.underline() == Underline::Single) .blink(attr.blink() == Blink::Slow) .reverse(attr.reverse()) .invisible(attr.invisible()) .to(out.by_ref())?; } else { attr_on!(ExitAttributeMode, Sgr::Reset); match attr.intensity() { Intensity::Bold => attr_on!(EnterBoldMode, Sgr::Intensity(Intensity::Bold)), Intensity::Half => attr_on!(EnterDimMode, Sgr::Intensity(Intensity::Half)), _ => {} } if attr.underline() == Underline::Single { attr_on!(Sgr::Underline(Underline::Single)); } if attr.blink() == Blink::Slow { attr_on!(Sgr::Blink(Blink::Slow)); } if attr.reverse() { attr_on!(EnterReverseMode, Sgr::Inverse(true)); } if attr.invisible() { attr_on!(Sgr::Invisible(true)); } } if attr.underline() == Underline::Double { attr_on!(Sgr::Underline(Underline::Double)); } if attr.blink() == Blink::Rapid { attr_on!(Sgr::Blink(Blink::Rapid)); } if attr.italic() { attr_on!(EnterItalicsMode, Sgr::Italic(true)); } if attr.strikethrough() { attr_on!(Sgr::StrikeThrough(true)); } } let has_true_color = self.caps.color_level() == ColorLevel::TrueColor; // Whether to use terminfo to render 256 colors. If this is too large (ex. 16777216 from xterm-direct), // then setaf expects the index to be true color, in which case we cannot use it to render 256 (or even 16) colors. let terminfo_256_color: i32 = match self.get_capability::() { Some(cap::MaxColors(n)) => { if n > 256 { 0 } else { n } } None => 0, }; if attr.foreground() != current_foreground && self.caps.color_level() != ColorLevel::MonoChrome { match (has_true_color, attr.foreground()) { (true, ColorAttribute::TrueColorWithPaletteFallback(tc, _)) | (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => { write!( out, "{}", CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor(tc))) )?; } (false, ColorAttribute::TrueColorWithDefaultFallback(_)) | (_, ColorAttribute::Default) => { // Terminfo doesn't define a reset color to default, so // we use the ANSI code. write!(out, "{}", CSI::Sgr(Sgr::Foreground(ColorSpec::Default)))?; } (false, ColorAttribute::TrueColorWithPaletteFallback(_, idx)) | (_, ColorAttribute::PaletteIndex(idx)) => { match self.get_capability::() { Some(set) if (idx as i32) < terminfo_256_color => { set.expand().color(idx).to(out.by_ref())?; } _ => { write!( out, "{}", CSI::Sgr(Sgr::Foreground(ColorSpec::PaletteIndex(idx))) )?; } } } } } if attr.background() != current_background && self.caps.color_level() != ColorLevel::MonoChrome { match (has_true_color, attr.background()) { (true, ColorAttribute::TrueColorWithPaletteFallback(tc, _)) | (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => { write!( out, "{}", CSI::Sgr(Sgr::Background(ColorSpec::TrueColor(tc))) )?; } (false, ColorAttribute::TrueColorWithDefaultFallback(_)) | (_, ColorAttribute::Default) => { // Terminfo doesn't define a reset color to default, so // we use the ANSI code. write!(out, "{}", CSI::Sgr(Sgr::Background(ColorSpec::Default)))?; } (false, ColorAttribute::TrueColorWithPaletteFallback(_, idx)) | (_, ColorAttribute::PaletteIndex(idx)) => { match self.get_capability::() { Some(set) if (idx as i32) < terminfo_256_color => { set.expand().color(idx).to(out.by_ref())?; } _ => { write!( out, "{}", CSI::Sgr(Sgr::Background(ColorSpec::PaletteIndex(idx))) )?; } } } } } if self.caps.hyperlinks() { if let Some(link) = attr.hyperlink() { let osc = OperatingSystemCommand::SetHyperlink(Some((**link).clone())); write!(out, "{}", osc)?; } else if self.current_attr.hyperlink().is_some() { // Close out the old hyperlink let osc = OperatingSystemCommand::SetHyperlink(None); write!(out, "{}", osc)?; } } self.current_attr = attr; } Ok(()) } fn cursor_up(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Up(n)))?; } } Ok(()) } fn cursor_down(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Down(n)))?; } } Ok(()) } fn cursor_y_relative(&mut self, y: isize, out: &mut W) -> Result<()> { if y > 0 { self.cursor_down(y as u32, out) } else { self.cursor_up(-y as u32, out) } } fn cursor_left(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Left(n)))?; } } Ok(()) } fn cursor_right(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Right(n)))?; } } Ok(()) } fn cursor_x_relative(&mut self, x: isize, out: &mut W) -> Result<()> { if x > 0 { self.cursor_right(x as u32, out) } else { self.cursor_left(-x as u32, out) } } fn move_cursor_absolute( &mut self, x: u32, y: u32, out: &mut W, ) -> Result<()> { if x == 0 && y == 0 { if let Some(attr) = self.get_capability::() { attr.expand().to(out.by_ref())?; return Ok(()); } } if let Some(attr) = self.get_capability::() { // terminfo expansion automatically converts coordinates to 1-based, // so we can pass in the 0-based coordinates as-is attr.expand().x(x).y(y).to(out.by_ref())?; } else { // We need to manually convert to 1-based as the CSI representation // requires it and there's no automatic conversion. write!( out, "{}", CSI::Cursor(Cursor::Position { line: OneBased::from_zero_based(x), col: OneBased::from_zero_based(y), }) )?; } Ok(()) } #[allow(clippy::cyclomatic_complexity, clippy::cognitive_complexity)] pub fn render_to( &mut self, changes: &[Change], out: &mut W, ) -> Result<()> { macro_rules! record { ($accesor:ident, $value:expr) => { self.attr_apply(|attr| { attr.$accesor(*$value); }); }; } for change in changes { match change { Change::ClearScreen(color) => { // ClearScreen implicitly resets all to default let defaults = CellAttributes::default().set_background(*color).clone(); if self.current_attr != defaults { self.pending_attr = Some(defaults); self.flush_pending_attr(out)?; } self.pending_attr = None; if self.current_attr.background() == ColorAttribute::Default || self.caps.bce() { // The erase operation respects "background color erase", // or we're clearing to the default background color, so we can // simply emit a clear screen op. if let Some(clr) = self.get_capability::() { clr.expand().to(out.by_ref())?; } else { self.move_cursor_absolute(0, 0, out)?; write!( out, "{}", CSI::Edit(Edit::EraseInDisplay(EraseInDisplay::EraseDisplay)) )?; } } else { // We're setting the background to a specific color, so we get to // paint the whole thing. self.move_cursor_absolute(0, 0, out)?; let (cols, rows) = out.get_size_in_cells()?; let num_spaces = cols * rows; let mut buf = Vec::with_capacity(num_spaces); buf.resize(num_spaces, b' '); out.write_all(buf.as_slice())?; } } Change::ClearToEndOfLine(color) => { // ClearScreen implicitly resets all to default let defaults = CellAttributes::default().set_background(*color).clone(); if self.current_attr != defaults { self.pending_attr = Some(defaults); self.flush_pending_attr(out)?; } self.pending_attr = None; // FIXME: this doesn't behave correctly for terminals without bce. // If we knew the current cursor position, we would be able to // emit the correctly colored background for that case. if let Some(clr) = self.get_capability::() { clr.expand().to(out.by_ref())?; } else { write!( out, "{}", CSI::Edit(Edit::EraseInLine(EraseInLine::EraseToEndOfLine)) )?; } } Change::ClearToEndOfScreen(color) => { // ClearScreen implicitly resets all to default let defaults = CellAttributes::default().set_background(*color).clone(); if self.current_attr != defaults { self.pending_attr = Some(defaults); self.flush_pending_attr(out)?; } self.pending_attr = None; // FIXME: this doesn't behave correctly for terminals without bce. // If we knew the current cursor position, we would be able to // emit the correctly colored background for that case. if let Some(clr) = self.get_capability::() { clr.expand().to(out.by_ref())?; } else { write!( out, "{}", CSI::Edit(Edit::EraseInDisplay(EraseInDisplay::EraseToEndOfDisplay)) )?; } } Change::Attribute(AttributeChange::Intensity(value)) => { record!(set_intensity, value); } Change::Attribute(AttributeChange::Italic(value)) => { record!(set_italic, value); } Change::Attribute(AttributeChange::Reverse(value)) => { record!(set_reverse, value); } Change::Attribute(AttributeChange::StrikeThrough(value)) => { record!(set_strikethrough, value); } Change::Attribute(AttributeChange::Blink(value)) => { record!(set_blink, value); } Change::Attribute(AttributeChange::Invisible(value)) => { record!(set_invisible, value); } Change::Attribute(AttributeChange::Underline(value)) => { record!(set_underline, value); } Change::Attribute(AttributeChange::Foreground(col)) => { self.attr_apply(|attr| { attr.set_foreground(*col); }); } Change::Attribute(AttributeChange::Background(col)) => { self.attr_apply(|attr| { attr.set_background(*col); }); } Change::Attribute(AttributeChange::Hyperlink(link)) => { self.attr_apply(|attr| { attr.set_hyperlink(link.clone()); }); } Change::AllAttributes(all) => { self.pending_attr = Some(all.clone()); } Change::Text(text) => { self.flush_pending_attr(out)?; out.by_ref().write_all(text.as_bytes())?; } Change::CursorPosition { x, y } => { // Note: we use `cursor_up(screen_height)` to move the cursor all the way to // the top of the screen when we need to absolutely position only y. match (x, y) { (Position::Relative(0), Position::Relative(0)) => {} (Position::Absolute(0), Position::Relative(1)) => { out.by_ref().write_all(b"\r\n")?; } (Position::Absolute(x), Position::Relative(y)) => { self.cursor_y_relative(*y, out)?; out.by_ref().write_all(b"\r")?; self.cursor_right(*x as u32, out)?; } (Position::Relative(x), Position::EndRelative(y)) => { let (_cols, rows) = out.get_size_in_cells()?; self.cursor_up(rows as u32, out)?; self.cursor_down(rows.saturating_sub(y + 1) as u32, out)?; self.cursor_x_relative(*x, out)?; } (Position::Relative(x), Position::Relative(y)) => { self.cursor_y_relative(*y, out)?; self.cursor_x_relative(*x, out)?; } (Position::EndRelative(x), Position::Relative(y)) => { self.cursor_y_relative(*y, out)?; let (cols, _rows) = out.get_size_in_cells()?; out.by_ref().write_all(b"\r")?; self.cursor_right(cols.saturating_sub(x + 1) as u32, out)?; } (Position::Absolute(x), Position::Absolute(y)) => { self.move_cursor_absolute(*x as u32, *y as u32, out)?; } (Position::Absolute(x), Position::EndRelative(y)) => { let (_cols, rows) = out.get_size_in_cells()?; self.move_cursor_absolute( *x as u32, rows.saturating_sub(y + 1) as u32, out, )?; } (Position::EndRelative(x), Position::EndRelative(y)) => { let (cols, rows) = out.get_size_in_cells()?; self.move_cursor_absolute( cols.saturating_sub(x + 1) as u32, rows.saturating_sub(y + 1) as u32, out, )?; } (Position::Relative(x), Position::Absolute(y)) => { let (_cols, rows) = out.get_size_in_cells()?; self.cursor_up(rows as u32, out)?; self.cursor_down(*y as u32, out)?; self.cursor_x_relative(*x, out)?; } (Position::EndRelative(x), Position::Absolute(y)) => { let (cols, _rows) = out.get_size_in_cells()?; self.move_cursor_absolute( cols.saturating_sub(x + 1) as u32, *y as u32, out, )?; } } } Change::CursorColor(_color) => { // TODO: this isn't spec'd by terminfo, but some terminals // support it. Add this to capabilities? } Change::CursorShape(shape) => match shape { CursorShape::Default => { if let Some(normal) = self.get_capability::() { normal.expand().to(out.by_ref())?; } if let Some(reset) = self.get_capability::() { reset.expand().to(out.by_ref())?; } } _ => { let param = match shape { CursorShape::Default => unreachable!(), CursorShape::BlinkingBlock => 1, CursorShape::SteadyBlock => 2, CursorShape::BlinkingUnderline => 3, CursorShape::SteadyUnderline => 4, CursorShape::BlinkingBar => 5, CursorShape::SteadyBar => 6, }; if let Some(set) = self.get_capability::() { set.expand().kind(param).to(out.by_ref())?; } } }, Change::CursorVisibility(visibility) => match visibility { CursorVisibility::Visible => { if let Some(show) = self.get_capability::() { show.expand().to(out.by_ref())?; } } CursorVisibility::Hidden => { if let Some(hide) = self.get_capability::() { hide.expand().to(out.by_ref())?; } } }, Change::Image(image) => { if self.caps.iterm2_image() { let data = if image.top_left == TextureCoordinate::new_f32(0.0, 0.0) && image.bottom_right == TextureCoordinate::new_f32(1.0, 1.0) { // The whole image is requested, so we can send the // original image bytes over match &*image.image.data() { ImageDataType::EncodedFile(data) => data.to_vec(), ImageDataType::EncodedLease(lease) => lease.get_data()?, ImageDataType::AnimRgba8 { .. } | ImageDataType::Rgba8 { .. } => { unimplemented!() } } } else { // TODO: slice out the requested region of the image, // and encode as a PNG. unimplemented!(); }; let file = ITermFileData { name: None, size: Some(data.len()), width: ITermDimension::Cells(image.width as i64), height: ITermDimension::Cells(image.height as i64), preserve_aspect_ratio: true, inline: true, do_not_move_cursor: false, data, }; let osc = OperatingSystemCommand::ITermProprietary(ITermProprietary::File( Box::new(file), )); write!(out, "{}", osc)?; // TODO: } else if self.caps.sixel() { } else { // Blank out the cells and move the cursor to the right spot for y in 0..image.height { for _ in 0..image.width { write!(out, " ")?; } if y != image.height - 1 { writeln!(out)?; self.cursor_left(image.width as u32, out)?; } } self.cursor_up(image.height as u32, out)?; } } Change::ScrollRegionUp { first_row, region_size, scroll_count, } => { if *region_size > 0 { if let Some(csr) = self.get_capability::() { let top = *first_row as u32; let bottom = (*first_row + *region_size - 1) as u32; let scroll_count = *scroll_count as u32; csr.expand().top(top).bottom(bottom).to(out.by_ref())?; if scroll_count > 0 { if let Some(scroll) = self.get_capability::() { scroll.expand().count(scroll_count).to(out.by_ref())? } else { let scroll = self.get_capability::(); let set_position = self.get_capability::(); if let (Some(scroll), Some(set_position)) = (scroll, set_position) { set_position.expand().x(0).y(bottom).to(out.by_ref())?; for _ in 0..scroll_count { scroll.expand().to(out.by_ref())? } } } } } } } Change::ScrollRegionDown { first_row, region_size, scroll_count, } => { if *region_size > 0 { if let Some(csr) = self.get_capability::() { let top = *first_row as u32; let bottom = (*first_row + *region_size - 1) as u32; let scroll_count = *scroll_count as u32; csr.expand().top(top).bottom(bottom).to(out.by_ref())?; if scroll_count > 0 { if let Some(scroll) = self.get_capability::() { scroll.expand().count(scroll_count).to(out.by_ref())? } else { let scroll = self.get_capability::(); let set_position = self.get_capability::(); if let (Some(scroll), Some(set_position)) = (scroll, set_position) { set_position.expand().x(0).y(top).to(out.by_ref())?; for _ in 0..scroll_count { scroll.expand().to(out.by_ref())? } } } } } } } Change::Title(text) => { let osc = OperatingSystemCommand::SetWindowTitle(text.to_string()); write!(out, "{}", osc)?; } Change::LineAttribute(attr) => { let esc = Esc::Code(match attr { LineAttribute::DoubleHeightTopHalfLine => { EscCode::DecDoubleHeightTopHalfLine } LineAttribute::DoubleHeightBottomHalfLine => { EscCode::DecDoubleHeightBottomHalfLine } LineAttribute::DoubleWidthLine => EscCode::DecDoubleWidthLine, LineAttribute::SingleWidthLine => EscCode::DecSingleWidthLine, }); write!(out, "{esc}")?; } } } self.flush_pending_attr(out)?; out.flush()?; Ok(()) } } #[cfg(all(test, unix))] mod test { use super::*; use crate::bail; use crate::caps::ProbeHints; use crate::color::{AnsiColor, ColorAttribute}; use crate::escape::parser::Parser; use crate::escape::{Action, Esc, EscCode}; use crate::input::InputEvent; use crate::terminal::unix::{Purge, SetAttributeWhen, UnixTty}; use crate::terminal::{cast, ScreenSize, Terminal, TerminalWaker}; use libc::winsize; use std::io::{Error as IoError, ErrorKind, Read, Result as IoResult, Write}; use std::mem; use std::time::Duration; use terminfo; use termios::Termios; /// Return Capabilities loaded from the included xterm terminfo data fn xterm_terminfo() -> Capabilities { xterm_terminfo_with_hints(ProbeHints::default()) } fn xterm_terminfo_with_hints(hints: ProbeHints) -> Capabilities { // Load our own compiled data so that the tests have an // environment that doesn't vary machine by machine. let data = include_bytes!("../../data/xterm-256color"); Capabilities::new_with_hints(hints.terminfo_db(Some( terminfo::Database::from_buffer(data.as_ref()).unwrap(), ))) .unwrap() } fn no_terminfo_all_enabled() -> Capabilities { Capabilities::new_with_hints(ProbeHints::default().color_level(Some(ColorLevel::TrueColor))) .unwrap() } struct FakeTty { buf: Vec, size: winsize, termios: Termios, } impl FakeTty { fn new_with_size(width: usize, height: usize) -> Self { let size = winsize { ws_col: cast(width).unwrap(), ws_row: cast(height).unwrap(), ws_xpixel: 0, ws_ypixel: 0, }; let buf = Vec::new(); Self { size, buf, termios: unsafe { mem::zeroed() }, } } } impl RenderTty for FakeTty { fn get_size_in_cells(&mut self) -> Result<(usize, usize)> { Ok((self.size.ws_col as usize, self.size.ws_row as usize)) } } impl UnixTty for FakeTty { fn get_size(&mut self) -> Result { Ok(self.size.clone()) } fn set_size(&mut self, size: winsize) -> Result<()> { self.size = size.clone(); Ok(()) } fn get_termios(&mut self) -> Result { Ok(self.termios.clone()) } fn set_termios(&mut self, termios: &Termios, _when: SetAttributeWhen) -> Result<()> { self.termios = termios.clone(); Ok(()) } /// Waits until all written data has been transmitted. fn drain(&mut self) -> Result<()> { Ok(()) } fn purge(&mut self, _purge: Purge) -> Result<()> { Ok(()) } } impl Read for FakeTty { fn read(&mut self, _buf: &mut [u8]) -> std::result::Result { Err(IoError::new(ErrorKind::Other, "not implemented")) } } impl Write for FakeTty { fn write(&mut self, buf: &[u8]) -> IoResult { self.buf.write(buf) } fn flush(&mut self) -> IoResult<()> { self.buf.flush() } } struct FakeTerm { write: FakeTty, renderer: TerminfoRenderer, } impl FakeTerm { fn new(caps: Capabilities) -> Self { Self::new_with_size(caps, 80, 24) } fn new_with_size(caps: Capabilities, width: usize, height: usize) -> Self { let write = FakeTty::new_with_size(width, height); let renderer = TerminfoRenderer::new(caps); Self { write, renderer } } fn parse(&self) -> Vec { let mut p = Parser::new(); p.parse_as_vec(&self.write.buf) } } impl Terminal for FakeTerm { fn set_raw_mode(&mut self) -> Result<()> { bail!("not implemented"); } fn set_cooked_mode(&mut self) -> Result<()> { bail!("not implemented"); } fn enter_alternate_screen(&mut self) -> Result<()> { bail!("not implemented"); } fn exit_alternate_screen(&mut self) -> Result<()> { bail!("not implemented"); } fn render(&mut self, changes: &[Change]) -> Result<()> { self.renderer.render_to(changes, &mut self.write) } fn get_screen_size(&mut self) -> Result { let size = self.write.get_size()?; Ok(ScreenSize { rows: cast(size.ws_row)?, cols: cast(size.ws_col)?, xpixel: cast(size.ws_xpixel)?, ypixel: cast(size.ws_ypixel)?, }) } fn set_screen_size(&mut self, size: ScreenSize) -> Result<()> { let size = winsize { ws_row: cast(size.rows)?, ws_col: cast(size.cols)?, ws_xpixel: cast(size.xpixel)?, ws_ypixel: cast(size.ypixel)?, }; self.write.set_size(size) } fn flush(&mut self) -> Result<()> { Ok(()) } fn poll_input(&mut self, _wait: Option) -> Result> { bail!("not implemented"); } fn waker(&self) -> TerminalWaker { unimplemented!(); } } #[test] fn empty_render() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[]).unwrap(); assert_eq!("", String::from_utf8(out.write.buf).unwrap()); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn basic_text() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[Change::Text("foo".into())]).unwrap(); assert_eq!("foo", String::from_utf8(out.write.buf).unwrap()); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn bold_text() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Text("not ".into()), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("foo".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Print('n'), Action::Print('o'), Action::Print('t'), Action::Print(' '), Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('f'), Action::Print('o'), Action::Print('o'), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .clone() ); } #[test] // Sanity that force_terminfo_render_to_use_ansi_sgr does something. fn bold_text_force_ansi_sgr() { let mut out = FakeTerm::new(xterm_terminfo_with_hints( ProbeHints::default().force_terminfo_render_to_use_ansi_sgr(Some(true)), )); out.render(&[ Change::Text("not ".into()), AttributeChange::Intensity(Intensity::Bold).into(), Change::Text("foo".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ // Same as bold_text() above, but without the "(B" from srg/sgr0. Action::Print('n'), Action::Print('o'), Action::Print('t'), Action::Print(' '), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('f'), Action::Print('o'), Action::Print('o'), ], ); } #[test] fn clear_screen() { let mut out = FakeTerm::new_with_size(xterm_terminfo(), 4, 3); out.render(&[Change::ClearScreen(ColorAttribute::default())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), Action::CSI(CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseDisplay, ))), ] ); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn clear_screen_bce() { let mut out = FakeTerm::new_with_size(xterm_terminfo(), 4, 3); out.render(&[Change::ClearScreen(AnsiColor::Maroon.into())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Background(AnsiColor::Maroon.into()))), Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), Action::CSI(CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseDisplay, ))), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_background(AnsiColor::Maroon) .clone() ); } #[test] fn clear_screen_no_terminfo() { let mut out = FakeTerm::new_with_size(no_terminfo_all_enabled(), 4, 3); out.render(&[Change::ClearScreen(ColorAttribute::default())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), Action::CSI(CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseDisplay, ))), ] ); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn clear_screen_bce_no_terminfo() { let mut out = FakeTerm::new_with_size(no_terminfo_all_enabled(), 4, 3); out.render(&[Change::ClearScreen(AnsiColor::Maroon.into())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Background(AnsiColor::Maroon.into()))), Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), // bce is not known to be available, so we emit a bunch of spaces. // TODO: could we use ECMA-48 REP for this? Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_background(AnsiColor::Maroon) .clone() ); } #[test] fn bold_text_no_terminfo() { let mut out = FakeTerm::new(no_terminfo_all_enabled()); out.render(&[ Change::Text("not ".into()), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("foo".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Print('n'), Action::Print('o'), Action::Print('t'), Action::Print(' '), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('f'), Action::Print('o'), Action::Print('o'), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .clone() ); } #[test] fn red_bold_text() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("red".into()), Change::Attribute(AttributeChange::Foreground(AnsiColor::Red.into())), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), // Note that the render code rearranges (red,bold) to (bold,red) Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('r'), Action::Print('e'), Action::Print('d'), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Red.into()))), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .set_foreground(AnsiColor::Red) .clone() ); } #[test] fn red_bold_text_no_terminfo() { let mut out = FakeTerm::new(no_terminfo_all_enabled()); out.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("red".into()), Change::Attribute(AttributeChange::Foreground(AnsiColor::Red.into())), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Reset)), // Note that the render code rearranges (red,bold) to (bold,red) Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('r'), Action::Print('e'), Action::Print('d'), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Red.into()))), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .set_foreground(AnsiColor::Red) .clone() ); } #[test] fn color_after_attribute_change() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("red".into()), Change::Attribute(AttributeChange::Intensity(Intensity::Normal)), Change::Text("2".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), // Note that the render code rearranges (red,bold) to (bold,red) Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('r'), Action::Print('e'), Action::Print('d'), // Turning off bold is translated into reset and set red again Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('2'), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_foreground(AnsiColor::Maroon) .clone() ); } #[test] fn truecolor() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Attribute(AttributeChange::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), )), Change::Text("A".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), ))), Action::Print('A'), ] ); } #[test] fn truecolor_no_terminfo() { let mut out = FakeTerm::new(no_terminfo_all_enabled()); out.render(&[ Change::Attribute(AttributeChange::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), )), Change::Text("A".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), ))), Action::Print('A'), ] ); } } termwiz-0.23.3/src/render/windows.rs000064400000000000000000000376461046102023000155400ustar 00000000000000//! A Renderer for windows consoles use crate::caps::{Capabilities, ColorLevel}; use crate::cell::{AttributeChange, CellAttributes, Underline}; use crate::color::{AnsiColor, ColorAttribute}; use crate::surface::{Change, Position}; use crate::terminal::windows::ConsoleOutputHandle; use crate::Result; use num_traits::FromPrimitive; use std::io::Write; use winapi::shared::minwindef::WORD; use winapi::um::wincon::{ BACKGROUND_BLUE, BACKGROUND_GREEN, BACKGROUND_INTENSITY, BACKGROUND_RED, CHAR_INFO, COMMON_LVB_REVERSE_VIDEO, COMMON_LVB_UNDERSCORE, FOREGROUND_BLUE, FOREGROUND_GREEN, FOREGROUND_INTENSITY, FOREGROUND_RED, }; pub struct WindowsConsoleRenderer { pending_attr: CellAttributes, capabilities: Capabilities, } impl WindowsConsoleRenderer { pub fn new(capabilities: Capabilities) -> Self { Self { pending_attr: CellAttributes::default(), capabilities, } } } fn to_attr_word(capabilities: &Capabilities, attr: &CellAttributes) -> u16 { macro_rules! ansi_colors_impl { ($idx:expr, $default:ident, $red:ident, $green:ident, $blue:ident, $bright:ident, $( ($variant:ident, $bits:expr) ),*) =>{ match FromPrimitive::from_u8($idx).unwrap_or(AnsiColor::$default) { $( AnsiColor::$variant => $bits, )* } } } macro_rules! ansi_colors { ($idx:expr, $default:ident, $red:ident, $green:ident, $blue:ident, $bright:ident) => { ansi_colors_impl!( $idx, $default, $red, $green, $blue, $bright, (Black, 0), (Maroon, $red), (Green, $green), (Olive, $red | $green), (Navy, $blue), (Purple, $red | $blue), (Teal, $green | $blue), (Silver, $red | $green | $blue), (Grey, $bright), (Red, $bright | $red), (Lime, $bright | $green), (Yellow, $bright | $red | $green), (Blue, $bright | $blue), (Fuchsia, $bright | $red | $blue), (Aqua, $bright | $green | $blue), (White, $bright | $red | $green | $blue) ) }; } let reverse = if attr.reverse() { COMMON_LVB_REVERSE_VIDEO } else { 0 }; let underline = if attr.underline() != Underline::None { COMMON_LVB_UNDERSCORE } else { 0 }; if capabilities.color_level() == ColorLevel::MonoChrome { return reverse | underline; } let fg = match attr.foreground() { ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => { FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN } ColorAttribute::TrueColorWithPaletteFallback(_, idx) | ColorAttribute::PaletteIndex(idx) => ansi_colors!( idx, White, FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_BLUE, FOREGROUND_INTENSITY ), }; let bg = match attr.background() { ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => 0, ColorAttribute::TrueColorWithPaletteFallback(_, idx) | ColorAttribute::PaletteIndex(idx) => ansi_colors!( idx, Black, BACKGROUND_RED, BACKGROUND_GREEN, BACKGROUND_BLUE, BACKGROUND_INTENSITY ), }; bg | fg | reverse | underline } struct ScreenBuffer { buf: Vec, dirty: bool, rows: usize, cols: usize, cursor_x: usize, cursor_y: usize, pending_attr: WORD, } impl ScreenBuffer { fn cursor_idx(&self) -> usize { let idx = (self.cursor_y * self.cols) + self.cursor_x; assert!( idx < self.rows * self.cols, "idx={}, cursor:({},{}) rows={}, cols={}.", idx, self.cursor_x, self.cursor_y, self.rows, self.cols ); idx } fn fill(&mut self, c: char, attr: WORD, x: usize, y: usize, num_elements: usize) -> usize { let idx = (y * self.cols) + x; let max = self.rows * self.cols; let end = (idx + num_elements).min(max); let c = c as u16; for cell in &mut self.buf[idx..end] { cell.Attributes = attr; unsafe { *cell.Char.UnicodeChar_mut() = c; } } self.dirty = true; end } fn do_cursor_y_scroll(&mut self, out: &mut B) -> Result<()> { if self.cursor_y >= self.rows { self.dirty = true; let lines_to_scroll = self.cursor_y.saturating_sub(self.rows) + 1; self.scroll(0, self.rows, -1 * lines_to_scroll as isize, out)?; self.dirty = true; self.cursor_y -= lines_to_scroll; assert!(self.cursor_y < self.rows); } Ok(()) } fn set_cursor( &mut self, x: usize, y: usize, out: &mut B, ) -> Result<()> { self.cursor_x = x; self.cursor_y = y; self.do_cursor_y_scroll(out)?; // Make sure we mark dirty after we've scrolled! self.dirty = true; assert!(self.cursor_x < self.cols); assert!(self.cursor_y < self.rows); Ok(()) } fn write_text( &mut self, t: &str, attr: WORD, out: &mut B, ) -> Result<()> { for c in t.chars() { match c { '\r' => { self.cursor_x = 0; } '\n' => { self.cursor_y += 1; self.do_cursor_y_scroll(out)?; } c => { if self.cursor_x == self.cols { self.cursor_y += 1; self.cursor_x = 0; } self.do_cursor_y_scroll(out)?; let idx = self.cursor_idx(); let cell = &mut self.buf[idx]; cell.Attributes = attr; unsafe { *cell.Char.UnicodeChar_mut() = c as u16; } self.cursor_x += 1; self.dirty = true; } } } Ok(()) } fn flush(&mut self, out: &mut B) -> Result<()> { self.flush_screen(out)?; let info = out.get_buffer_info()?; out.set_cursor_position( self.cursor_x as i16, self.cursor_y as i16 + info.srWindow.Top, )?; out.set_attr(self.pending_attr)?; out.flush()?; Ok(()) } fn flush_screen(&mut self, out: &mut B) -> Result<()> { if self.dirty { out.flush()?; out.set_buffer_contents(&self.buf)?; out.flush()?; self.dirty = false; } Ok(()) } fn reread_buffer(&mut self, out: &mut B) -> Result<()> { self.buf = out.get_buffer_contents()?; self.dirty = false; Ok(()) } fn scroll( &mut self, first_row: usize, region_size: usize, scroll_count: isize, out: &mut B, ) -> Result<()> { if region_size > 0 && scroll_count != 0 { self.flush_screen(out)?; let info = out.get_buffer_info()?; // Scroll the full width of the window, always. let left = 0; let right = info.dwSize.X - 1; // We're only doing vertical scrolling let dx = 0; let dy = scroll_count as i16; if first_row == 0 && region_size == self.rows { // We're scrolling the whole screen, so let it scroll // up into the scrollback out.set_viewport( info.srWindow.Left, info.srWindow.Top - dy, info.srWindow.Right, info.srWindow.Bottom - dy, )?; } else { // We're just scrolling a region within the window let top = info.srWindow.Top + first_row as i16; let bottom = top + region_size.saturating_sub(1) as i16; out.scroll_region(left, top, right, bottom, dx, dy, self.pending_attr)?; } self.reread_buffer(out)?; } Ok(()) } } impl WindowsConsoleRenderer { pub fn render_to( &mut self, changes: &[Change], out: &mut B, ) -> Result<()> { out.flush()?; let info = out.get_buffer_info()?; let cols = info.dwSize.X as usize; let rows = 1 + info.srWindow.Bottom as usize - info.srWindow.Top as usize; let mut buffer = ScreenBuffer { buf: out.get_buffer_contents()?, cursor_x: info.dwCursorPosition.X as usize, cursor_y: (info.dwCursorPosition.Y as usize).saturating_sub(info.srWindow.Top as usize), dirty: false, rows, cols, pending_attr: to_attr_word(&self.capabilities, &CellAttributes::default()), }; for change in changes { match change { Change::ClearScreen(color) => { let attr = CellAttributes::default() .set_background(color.clone()) .clone(); buffer.fill( ' ', to_attr_word(&self.capabilities, &attr), 0, 0, cols * rows, ); buffer.set_cursor(0, 0, out)?; } Change::ClearToEndOfLine(color) => { let attr = CellAttributes::default() .set_background(color.clone()) .clone(); buffer.fill( ' ', to_attr_word(&self.capabilities, &attr), buffer.cursor_x, buffer.cursor_y, cols.saturating_sub(buffer.cursor_x), ); } Change::ClearToEndOfScreen(color) => { let attr = CellAttributes::default() .set_background(color.clone()) .clone(); buffer.fill( ' ', to_attr_word(&self.capabilities, &attr), buffer.cursor_x, buffer.cursor_y, cols * rows, ); } Change::Text(text) => { buffer.write_text( &text, to_attr_word(&self.capabilities, &self.pending_attr), out, )?; } Change::CursorPosition { x, y } => { let x = match x { Position::Absolute(x) => *x as usize, Position::Relative(delta) => { (buffer.cursor_x as isize).saturating_sub(-*delta) as usize } Position::EndRelative(delta) => cols.saturating_sub(*delta), }; // For vertical cursor movement, we constrain the movement to // the viewport. let y = match y { Position::Absolute(y) => *y as usize, Position::Relative(delta) => { (buffer.cursor_y as isize).saturating_sub(-*delta) as usize } Position::EndRelative(delta) => rows.saturating_sub(*delta), }; buffer.set_cursor(x, y, out)?; } Change::Attribute(AttributeChange::Intensity(value)) => { self.pending_attr.set_intensity(*value); } Change::Attribute(AttributeChange::Italic(value)) => { self.pending_attr.set_italic(*value); } Change::Attribute(AttributeChange::Reverse(value)) => { self.pending_attr.set_reverse(*value); } Change::Attribute(AttributeChange::StrikeThrough(value)) => { self.pending_attr.set_strikethrough(*value); } Change::Attribute(AttributeChange::Blink(value)) => { self.pending_attr.set_blink(*value); } Change::Attribute(AttributeChange::Invisible(value)) => { self.pending_attr.set_invisible(*value); } Change::Attribute(AttributeChange::Underline(value)) => { self.pending_attr.set_underline(*value); } Change::Attribute(AttributeChange::Foreground(col)) => { self.pending_attr.set_foreground(*col); } Change::Attribute(AttributeChange::Background(col)) => { self.pending_attr.set_background(*col); } Change::Attribute(AttributeChange::Hyperlink(link)) => { self.pending_attr.set_hyperlink(link.clone()); } Change::AllAttributes(all) => { self.pending_attr = all.clone(); } Change::CursorColor(_color) => {} Change::CursorShape(_shape) => {} Change::CursorVisibility(_visibility) => {} Change::Image(image) => { // Images are not supported, so just blank out the cells and // move the cursor to the right spot for y in 0..image.height { buffer.fill( ' ', 0, buffer.cursor_x, y + buffer.cursor_y, image.width as usize, ); } buffer.set_cursor(buffer.cursor_x + image.width, buffer.cursor_y, out)?; } Change::ScrollRegionUp { first_row, region_size, scroll_count, } => { buffer.scroll(*first_row, *region_size, -1 * *scroll_count as isize, out)?; } Change::ScrollRegionDown { first_row, region_size, scroll_count, } => { buffer.scroll(*first_row, *region_size, *scroll_count as isize, out)?; } Change::Title(_text) => { // Don't actually render this for now. // The primary purpose of Change::Title at the time of // writing is to transfer tab titles across domains // in the wezterm multiplexer model. It's not clear // that it would be a good idea to unilaterally output // eg: a title change escape sequence here in the // renderer because we might be composing multiple widgets // together, each with its own title. } Change::LineAttribute(_) => { // Ignore line attributes } } } buffer.flush(out)?; Ok(()) } } termwiz-0.23.3/src/surface/change.rs000064400000000000000000000265751046102023000154430ustar 00000000000000use crate::cell::{unicode_column_width, AttributeChange, CellAttributes}; use crate::color::ColorAttribute; pub use crate::image::{ImageData, TextureCoordinate}; use crate::surface::{CursorShape, CursorVisibility, Position}; use finl_unicode::grapheme_clusters::Graphemes; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::sync::Arc; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub enum LineAttribute { DoubleHeightTopHalfLine, DoubleHeightBottomHalfLine, DoubleWidthLine, SingleWidthLine, } /// `Change` describes an update operation to be applied to a `Surface`. /// Changes to the active attributes (color, style), moving the cursor /// and outputting text are examples of some of the values. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub enum Change { /// Change a single attribute Attribute(AttributeChange), /// Change all possible attributes to the given set of values AllAttributes(CellAttributes), /// Add printable text. /// Control characters are rendered inert by transforming them /// to space. CR and LF characters are interpreted by moving /// the cursor position. CR moves the cursor to the start of /// the line and LF moves the cursor down to the next line. /// You typically want to use both together when sending in /// a line break. Text(String), /// Clear the screen to the specified color. /// Implicitly clears all attributes prior to clearing the screen. /// Moves the cursor to the home position (top left). ClearScreen(ColorAttribute), /// Clear from the current cursor X position to the rightmost /// edge of the screen. The background color is set to the /// provided color. The cursor position remains unchanged. ClearToEndOfLine(ColorAttribute), /// Clear from the current cursor X position to the rightmost /// edge of the screen on the current line. Clear all of the /// lines below the current cursor Y position. The background /// color is set ot the provided color. The cursor position /// remains unchanged. ClearToEndOfScreen(ColorAttribute), /// Move the cursor to the specified `Position`. CursorPosition { x: Position, y: Position }, /// Change the cursor color. CursorColor(ColorAttribute), /// Change the cursor shape CursorShape(CursorShape), /// Change the cursor visibility CursorVisibility(CursorVisibility), /// Place an image at the current cursor position. /// The image defines the dimensions in cells. /// TODO: check iterm rendering behavior when the image is larger than the width of the screen. /// If the image is taller than the remaining space at the bottom /// of the screen, the screen will scroll up. /// The cursor Y position is unchanged by rendering the Image. /// The cursor X position will be incremented by `Image::width` cells. Image(Image), /// Scroll the `region_size` lines starting at `first_row` upwards /// by `scroll_count` lines. The `scroll_count` lines at the top of /// the region are overwritten. The `scroll_count` lines at the /// bottom of the region will become blank. /// /// After a region is scrolled, the cursor position is undefined, /// and the terminal's scroll region is set to the range specified. /// To restore scrolling behaviour to the full terminal window, an /// additional `Change::ScrollRegionUp { first_row: 0, region_size: /// height, scroll_count: 0 }`, where `height` is the height of the /// terminal, should be emitted. ScrollRegionUp { first_row: usize, region_size: usize, scroll_count: usize, }, /// Scroll the `region_size` lines starting at `first_row` downwards /// by `scroll_count` lines. The `scroll_count` lines at the bottom /// the region are overwritten. The `scroll_count` lines at the top /// of the region will become blank. /// /// After a region is scrolled, the cursor position is undefined, /// and the terminal's scroll region is set to the range specified. /// To restore scrolling behaviour to the full terminal window, an /// additional `Change::ScrollRegionDown { first_row: 0, /// region_size: height, scroll_count: 0 }`, where `height` is the /// height of the terminal, should be emitted. ScrollRegionDown { first_row: usize, region_size: usize, scroll_count: usize, }, /// Change the title of the window in which the surface will be /// rendered. Title(String), /// Adjust the current line attributes, such as double height or width LineAttribute(LineAttribute), } impl Change { pub fn is_text(&self) -> bool { matches!(self, Change::Text(_)) } pub fn text(&self) -> &str { match self { Change::Text(text) => text, _ => panic!("you must use Change::is_text() to guard calls to Change::text()"), } } } impl> From for Change { fn from(s: S) -> Self { Change::Text(s.into()) } } impl From for Change { fn from(c: AttributeChange) -> Self { Change::Attribute(c) } } impl From for Change { fn from(attr: LineAttribute) -> Self { Change::LineAttribute(attr) } } /// Keeps track of a run of changes and allows reasoning about the cursor /// position and the extent of the screen that the sequence will affect. /// This is useful for example when implementing something like a LineEditor /// where you don't want to take control over the entire surface but do want /// to be able to emit a dynamically sized output relative to the cursor /// position at the time that the editor is invoked. pub struct ChangeSequence { changes: Vec, screen_rows: usize, screen_cols: usize, pub(crate) cursor_x: usize, pub(crate) cursor_y: isize, render_y_max: isize, render_y_min: isize, } impl ChangeSequence { pub fn new(rows: usize, cols: usize) -> Self { Self { changes: vec![], screen_rows: rows, screen_cols: cols, cursor_x: 0, cursor_y: 0, render_y_max: 0, render_y_min: 0, } } pub fn consume(self) -> Vec { self.changes } /// Returns the cursor position, (x, y). pub fn current_cursor_position(&self) -> (usize, isize) { (self.cursor_x, self.cursor_y) } pub fn move_to(&mut self, (cursor_x, cursor_y): (usize, isize)) { self.add(Change::CursorPosition { x: Position::Relative(cursor_x as isize - self.cursor_x as isize), y: Position::Relative(cursor_y - self.cursor_y), }); } /// Returns the total number of rows affected pub fn render_height(&self) -> usize { (self.render_y_max - self.render_y_min).max(0).abs() as usize } fn update_render_height(&mut self) { self.render_y_max = self.render_y_max.max(self.cursor_y); self.render_y_min = self.render_y_min.min(self.cursor_y); } pub fn add_changes(&mut self, changes: Vec) { for change in changes { self.add(change); } } pub fn add>(&mut self, change: C) { let change = change.into(); match &change { Change::AllAttributes(_) | Change::Attribute(_) | Change::CursorColor(_) | Change::CursorShape(_) | Change::CursorVisibility(_) | Change::ClearToEndOfLine(_) | Change::Title(_) | Change::LineAttribute(_) | Change::ClearToEndOfScreen(_) => {} Change::Text(t) => { for g in Graphemes::new(t.as_str()) { if self.cursor_x == self.screen_cols { self.cursor_y += 1; self.cursor_x = 0; } if g == "\n" { self.cursor_y += 1; } else if g == "\r" { self.cursor_x = 0; } else if g == "\r\n" { self.cursor_y += 1; self.cursor_x = 0; } else { let len = unicode_column_width(g, None); self.cursor_x += len; } } self.update_render_height(); } Change::Image(im) => { self.cursor_x += im.width; self.render_y_max = self.render_y_max.max(self.cursor_y + im.height as isize); } Change::ClearScreen(_) => { self.cursor_x = 0; self.cursor_y = 0; } Change::CursorPosition { x, y } => { self.cursor_x = match x { Position::Relative(x) => { ((self.cursor_x as isize + x) % self.screen_cols as isize) as usize } Position::Absolute(x) => x % self.screen_cols, Position::EndRelative(x) => (self.screen_cols - x) % self.screen_cols, }; self.cursor_y = match y { Position::Relative(y) => { (self.cursor_y as isize + y) % self.screen_rows as isize } Position::Absolute(y) => (y % self.screen_rows) as isize, Position::EndRelative(y) => { ((self.screen_rows - y) % self.screen_rows) as isize } }; self.update_render_height(); } Change::ScrollRegionUp { .. } | Change::ScrollRegionDown { .. } => { // The resultant cursor position is undefined by // the renderer! // We just pick something. self.cursor_x = 0; self.cursor_y = 0; } } self.changes.push(change); } } /// The `Image` `Change` needs to support adding an image that spans multiple /// rows and columns, as well as model the content for just one of those cells. /// For instance, if some of the cells inside an image are replaced by textual /// content, and the screen is scrolled, computing the diff change stream needs /// to be able to express that a single cell holds a slice from a larger image. /// The `Image` struct expresses its dimensions in cells and references a region /// in the shared source image data using texture coordinates. /// A 4x3 cell image would set `width=3`, `height=3`, `top_left=(0,0)`, `bottom_right=(1,1)`. /// The top left cell from that image, if it were to be included in a diff, /// would be recorded as `width=1`, `height=1`, `top_left=(0,0)`, `bottom_right=(1/4,1/3)`. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub struct Image { /// measured in cells pub width: usize, /// measure in cells pub height: usize, /// Texture coordinate for the top left of this image block. /// (0,0) is the top left of the ImageData. (1, 1) is /// the bottom right. pub top_left: TextureCoordinate, /// Texture coordinates for the bottom right of this image block. pub bottom_right: TextureCoordinate, /// the image data pub image: Arc, } termwiz-0.23.3/src/surface/line/cellref.rs000064400000000000000000000040301046102023000165370ustar 00000000000000use crate::cell::{Cell, CellAttributes}; use crate::emoji::Presentation; use std::hash::{Hash, Hasher}; #[derive(Debug, Clone, Copy)] pub enum CellRef<'a> { CellRef { cell_index: usize, cell: &'a Cell, }, ClusterRef { cell_index: usize, text: &'a str, width: usize, attrs: &'a CellAttributes, }, } impl<'a> CellRef<'a> { pub fn cell_index(&self) -> usize { match self { Self::ClusterRef { cell_index, .. } | Self::CellRef { cell_index, .. } => *cell_index, } } pub fn str(&self) -> &str { match self { Self::CellRef { cell, .. } => cell.str(), Self::ClusterRef { text, .. } => text, } } pub fn width(&self) -> usize { match self { Self::CellRef { cell, .. } => cell.width(), Self::ClusterRef { width, .. } => *width, } } pub fn attrs(&self) -> &CellAttributes { match self { Self::CellRef { cell, .. } => cell.attrs(), Self::ClusterRef { attrs, .. } => attrs, } } pub fn presentation(&self) -> Presentation { match self { Self::CellRef { cell, .. } => cell.presentation(), Self::ClusterRef { text, .. } => match Presentation::for_grapheme(text) { (_, Some(variation)) => variation, (presentation, None) => presentation, }, } } pub fn as_cell(&self) -> Cell { match self { Self::CellRef { cell, .. } => (*cell).clone(), Self::ClusterRef { text, width, attrs, .. } => Cell::new_grapheme_with_width(text, *width, (*attrs).clone()), } } pub fn same_contents(&self, other: &Self) -> bool { self.str() == other.str() && self.width() == other.width() && self.attrs() == other.attrs() } pub fn compute_shape_hash(&self, hasher: &mut H) { self.str().hash(hasher); self.attrs().compute_shape_hash(hasher); } } termwiz-0.23.3/src/surface/line/clusterline.rs000064400000000000000000000271261046102023000174670ustar 00000000000000use crate::cell::{Cell, CellAttributes}; use crate::surface::line::CellRef; use finl_unicode::grapheme_clusters::Graphemes; use fixedbitset::FixedBitSet; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::convert::TryInto; use std::num::NonZeroU8; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] struct Cluster { cell_width: u16, attrs: CellAttributes, } /// Stores line data as a contiguous string and a series of /// clusters of attribute data describing attributed ranges /// within the line #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub(crate) struct ClusteredLine { pub text: String, #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_bitset", serialize_with = "serialize_bitset" ) )] is_double_wide: Option>, clusters: Vec, /// Length, measured in cells len: u32, last_cell_width: Option, } #[cfg(feature = "use_serde")] fn deserialize_bitset<'de, D>(deserializer: D) -> Result>, D::Error> where D: Deserializer<'de>, { let wide_indices = >::deserialize(deserializer)?; if wide_indices.is_empty() { Ok(None) } else { let max_idx = wide_indices.iter().max().unwrap_or(&1); let mut bitset = FixedBitSet::with_capacity(max_idx + 1); for idx in wide_indices { bitset.set(idx, true); } Ok(Some(Box::new(bitset))) } } /// Serialize the bitset as a vector of the indices of just the 1 bits; /// the thesis is that most of the cells on a given line are single width. /// That may not be strictly true for users that heavily use asian scripts, /// but we'll start with this and see if we need to improve it. #[cfg(feature = "use_serde")] fn serialize_bitset(value: &Option>, serializer: S) -> Result where S: Serializer, { let mut wide_indices: Vec = vec![]; if let Some(bits) = value { for idx in bits.ones() { wide_indices.push(idx); } } wide_indices.serialize(serializer) } impl ClusteredLine { pub fn new() -> Self { Self { text: String::with_capacity(80), is_double_wide: None, clusters: vec![], len: 0, last_cell_width: None, } } pub fn to_cell_vec(&self) -> Vec { let mut cells = vec![]; for c in self.iter() { cells.push(c.as_cell()); for _ in 1..c.width() { cells.push(Cell::blank_with_attrs(c.attrs().clone())); } } cells } pub fn from_cell_vec<'a>(hint: usize, iter: impl Iterator>) -> Self { let mut last_cluster: Option = None; let mut is_double_wide = FixedBitSet::with_capacity(hint); let mut text = String::new(); let mut clusters = vec![]; let mut any_double = false; let mut len = 0; let mut last_cell_width = None; for cell in iter { len += cell.width(); last_cell_width = NonZeroU8::new(1); if cell.width() > 1 { any_double = true; is_double_wide.set(cell.cell_index(), true); } text.push_str(cell.str()); last_cluster = match last_cluster.take() { None => Some(Cluster { cell_width: cell.width() as u16, attrs: cell.attrs().clone(), }), Some(cluster) if cluster.attrs != *cell.attrs() => { clusters.push(cluster); Some(Cluster { cell_width: cell.width() as u16, attrs: cell.attrs().clone(), }) } Some(mut cluster) => { cluster.cell_width += cell.width() as u16; Some(cluster) } }; } if let Some(cluster) = last_cluster.take() { clusters.push(cluster); } Self { text, is_double_wide: if any_double { Some(Box::new(is_double_wide)) } else { None }, clusters, len: len.try_into().unwrap(), last_cell_width, } } pub fn len(&self) -> usize { self.len as usize } fn is_double_wide(&self, cell_index: usize) -> bool { match &self.is_double_wide { Some(bitset) => bitset.contains(cell_index), None => false, } } pub fn iter(&self) -> ClusterLineCellIter { let mut clusters = self.clusters.iter(); let cluster = clusters.next(); ClusterLineCellIter { graphemes: Graphemes::new(&self.text), clusters, cluster, idx: 0, cluster_total: 0, line: self, } } pub fn append_grapheme(&mut self, text: &str, cell_width: usize, attrs: CellAttributes) { let cell_width = cell_width as u16; let new_cluster = match self.clusters.last() { Some(cluster) => { if cluster.attrs != attrs { true } else { // If we overflow the max length of a run, // then we need a new cluster let (_, did_overflow) = cluster.cell_width.overflowing_add(cell_width); did_overflow } } None => true, }; let new_cell_index = self.len as usize; if new_cluster { self.clusters.push(Cluster { attrs, cell_width }); } else if let Some(cluster) = self.clusters.last_mut() { cluster.cell_width += cell_width; } self.text.push_str(text); if cell_width > 1 { let bitset = match self.is_double_wide.take() { Some(mut bitset) => { bitset.grow(new_cell_index + 1); bitset.set(new_cell_index, true); bitset } None => { let mut bitset = FixedBitSet::with_capacity(new_cell_index + 1); bitset.set(new_cell_index, true); Box::new(bitset) } }; self.is_double_wide.replace(bitset); } self.last_cell_width = NonZeroU8::new(cell_width as u8); self.len += cell_width as u32; } pub fn append(&mut self, cell: Cell) { let cell_width = cell.width() as u16; let new_cluster = match self.clusters.last() { Some(cluster) => { if cluster.attrs != *cell.attrs() { true } else { // If we overflow the max length of a run, // then we need a new cluster let (_, did_overflow) = cluster.cell_width.overflowing_add(cell_width); did_overflow } } None => true, }; let new_cell_index = self.len as usize; if new_cluster { self.clusters.push(Cluster { attrs: (*cell.attrs()).clone(), cell_width, }); } else if let Some(cluster) = self.clusters.last_mut() { cluster.cell_width += cell_width; } self.text.push_str(cell.str()); if cell_width > 1 { let bitset = match self.is_double_wide.take() { Some(mut bitset) => { bitset.grow(new_cell_index + 1); bitset.set(new_cell_index, true); bitset } None => { let mut bitset = FixedBitSet::with_capacity(new_cell_index + 1); bitset.set(new_cell_index, true); Box::new(bitset) } }; self.is_double_wide.replace(bitset); } self.last_cell_width = NonZeroU8::new(cell_width as u8); self.len += cell_width as u32; } pub fn prune_trailing_blanks(&mut self) -> bool { let num_spaces = self.text.chars().rev().take_while(|&c| c == ' ').count(); if num_spaces == 0 { return false; } let blank = CellAttributes::blank(); let mut pruned = false; for _ in 0..num_spaces { let mut need_pop = false; if let Some(cluster) = self.clusters.last_mut() { if cluster.attrs != blank { break; } cluster.cell_width -= 1; self.text.pop(); self.len -= 1; self.last_cell_width.take(); pruned = true; if cluster.cell_width == 0 { need_pop = true; } } if need_pop { self.clusters.pop(); } } pruned } fn compute_last_cell_width(&mut self) -> Option { if self.last_cell_width.is_none() { if let Some(last_cell) = self.iter().last() { self.last_cell_width = NonZeroU8::new(last_cell.width() as u8); } } self.last_cell_width } pub fn set_last_cell_was_wrapped(&mut self, wrapped: bool) { if let Some(width) = self.compute_last_cell_width() { let width = width.get() as u16; if let Some(last_cluster) = self.clusters.last_mut() { let mut attrs = last_cluster.attrs.clone(); attrs.set_wrapped(wrapped); if last_cluster.cell_width == width { // Re-purpose final cluster last_cluster.attrs = attrs; } else { last_cluster.cell_width -= width; self.clusters.push(Cluster { cell_width: width, attrs, }); } } } } } pub(crate) struct ClusterLineCellIter<'a> { graphemes: Graphemes<'a>, clusters: std::slice::Iter<'a, Cluster>, cluster: Option<&'a Cluster>, idx: usize, cluster_total: usize, line: &'a ClusteredLine, } impl<'a> Iterator for ClusterLineCellIter<'a> { type Item = CellRef<'a>; fn next(&mut self) -> Option> { let text = self.graphemes.next()?; let cell_index = self.idx; let width = if self.line.is_double_wide(cell_index) { 2 } else { 1 }; self.idx += width; self.cluster_total += width; let attrs = &self.cluster.as_ref()?.attrs; if self.cluster_total >= self.cluster.as_ref()?.cell_width as usize { self.cluster = self.clusters.next(); self.cluster_total = 0; } Some(CellRef::ClusterRef { cell_index, width, text, attrs, }) } } #[cfg(test)] mod test { use super::*; #[test] #[cfg(target_pointer_width = "64")] fn memory_usage() { assert_eq!(std::mem::size_of::(), 64); assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::>(), 24); assert_eq!(std::mem::size_of::>>(), 8); assert_eq!(std::mem::size_of::>(), 1); } } termwiz-0.23.3/src/surface/line/line.rs000064400000000000000000001224121046102023000160570ustar 00000000000000use crate::cell::{Cell, CellAttributes, SemanticType, UnicodeVersion}; use crate::cellcluster::CellCluster; use crate::hyperlink::Rule; use crate::surface::line::cellref::CellRef; use crate::surface::line::clusterline::ClusteredLine; use crate::surface::line::linebits::LineBits; use crate::surface::line::storage::{CellStorage, VisibleCellIter}; use crate::surface::line::vecstorage::{VecStorage, VecStorageIter}; use crate::surface::{Change, SequenceNo, SEQ_ZERO}; use finl_unicode::grapheme_clusters::Graphemes; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use siphasher::sip128::{Hasher128, SipHasher}; use std::any::Any; use std::borrow::Cow; use std::hash::Hash; use std::ops::Range; use std::sync::{Arc, Mutex, Weak}; use wezterm_bidi::{Direction, ParagraphDirectionHint}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct ZoneRange { pub semantic_type: SemanticType, pub range: Range, } #[derive(Debug, Clone, PartialEq)] pub enum DoubleClickRange { Range(Range), RangeWithWrap(Range), } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug)] pub struct Line { pub(crate) cells: CellStorage, zones: Vec, seqno: SequenceNo, bits: LineBits, #[cfg_attr(feature = "use_serde", serde(skip))] appdata: Mutex>>, } impl Clone for Line { fn clone(&self) -> Self { Self { cells: self.cells.clone(), zones: self.zones.clone(), seqno: self.seqno, bits: self.bits, appdata: Mutex::new(self.appdata.lock().unwrap().clone()), } } } impl PartialEq for Line { fn eq(&self, other: &Self) -> bool { self.seqno == other.seqno && self.bits == other.bits && self.cells == other.cells } } impl Line { pub fn with_width_and_cell(width: usize, cell: Cell, seqno: SequenceNo) -> Self { let mut cells = Vec::with_capacity(width); cells.resize(width, cell.clone()); let bits = LineBits::NONE; Self { bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn from_cells(cells: Vec, seqno: SequenceNo) -> Self { let bits = LineBits::NONE; Self { bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } /// Create a new line using cluster storage, optimized for appending /// and lower memory utilization. /// The line will automatically switch to cell storage when necessary /// to apply edits. pub fn new(seqno: SequenceNo) -> Self { Self { bits: LineBits::NONE, cells: CellStorage::C(ClusteredLine::new()), seqno, zones: vec![], appdata: Mutex::new(None), } } /// Computes a hash over the line that will change if the way that /// the line contents are shaped would change. /// This is independent of the seqno and is based purely on the /// content of the line. /// /// Line doesn't implement Hash in terms of this function as compute_shape_hash /// doesn't every possible bit of internal state, and we don't want to /// encourage using Line directly as a hash key. pub fn compute_shape_hash(&self) -> [u8; 16] { let mut hasher = SipHasher::new(); self.bits.bits().hash(&mut hasher); for cell in self.visible_cells() { cell.compute_shape_hash(&mut hasher); } hasher.finish128().as_bytes() } pub fn with_width(width: usize, seqno: SequenceNo) -> Self { let mut cells = Vec::with_capacity(width); cells.resize_with(width, Cell::blank); let bits = LineBits::NONE; Self { bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn from_text( s: &str, attrs: &CellAttributes, seqno: SequenceNo, unicode_version: Option, ) -> Line { let mut cells = Vec::new(); for sub in Graphemes::new(s) { let cell = Cell::new_grapheme(sub, attrs.clone(), unicode_version); let width = cell.width(); cells.push(cell); for _ in 1..width { cells.push(Cell::new(' ', attrs.clone())); } } Line { cells: CellStorage::V(VecStorage::new(cells)), bits: LineBits::NONE, seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn from_text_with_wrapped_last_col( s: &str, attrs: &CellAttributes, seqno: SequenceNo, ) -> Line { let mut line = Self::from_text(s, attrs, seqno, None); line.cells_mut() .last_mut() .map(|cell| cell.attrs_mut().set_wrapped(true)); line } pub fn resize_and_clear( &mut self, width: usize, seqno: SequenceNo, blank_attr: CellAttributes, ) { { let cells = self.coerce_vec_storage(); for c in cells.iter_mut() { *c = Cell::blank_with_attrs(blank_attr.clone()); } cells.resize_with(width, || Cell::blank_with_attrs(blank_attr.clone())); cells.shrink_to_fit(); } self.update_last_change_seqno(seqno); self.invalidate_zones(); self.bits = LineBits::NONE; } pub fn resize(&mut self, width: usize, seqno: SequenceNo) { self.coerce_vec_storage().resize_with(width, Cell::blank); self.update_last_change_seqno(seqno); self.invalidate_zones(); } /// Wrap the line so that it fits within the provided width. /// Returns the list of resultant line(s) pub fn wrap(self, width: usize, seqno: SequenceNo) -> Vec { let mut cells: Vec = self.visible_cells().collect(); if let Some(end_idx) = cells.iter().rposition(|c| c.str() != " ") { cells.truncate(end_idx + 1); let mut lines: Vec = vec![]; let mut delta = 0; for cell in cells { let need_new_line = lines .last_mut() .map(|line| line.len() + cell.width() > width) .unwrap_or(true); if need_new_line { lines .last_mut() .map(|line| line.set_last_cell_was_wrapped(true, seqno)); lines.push(Line::new(seqno)); delta = cell.cell_index(); } let line = lines.last_mut().unwrap(); line.set_cell_grapheme( cell.cell_index() - delta, cell.str(), cell.width(), (*cell.attrs()).clone(), seqno, ); } lines } else { vec![self] } } /// Set arbitrary application specific data for the line. /// Only one piece of appdata can be tracked per line, /// so this is only suitable for the overall application /// and not for use by "middleware" crates. /// A Weak reference is stored. /// `get_appdata` is used to retrieve a previously stored reference. pub fn set_appdata(&self, appdata: Arc) { let appdata: Arc = appdata; self.appdata .lock() .unwrap() .replace(Arc::downgrade(&appdata)); } pub fn clear_appdata(&self) { self.appdata.lock().unwrap().take(); } /// Retrieve the appdata for the line, if any. /// This may return None in the case where the underlying data has /// been released: Line only stores a Weak reference to it. pub fn get_appdata(&self) -> Option> { self.appdata .lock() .unwrap() .as_ref() .and_then(|data| data.upgrade()) } /// Returns true if the line's last changed seqno is more recent /// than the provided seqno parameter pub fn changed_since(&self, seqno: SequenceNo) -> bool { self.seqno == SEQ_ZERO || self.seqno > seqno } pub fn current_seqno(&self) -> SequenceNo { self.seqno } /// Annotate the line with the sequence number of a change. /// This can be used together with Line::changed_since to /// manage caching and rendering #[inline] pub fn update_last_change_seqno(&mut self, seqno: SequenceNo) { self.seqno = self.seqno.max(seqno); } /// Check whether the line is single-width. #[inline] pub fn is_single_width(&self) -> bool { (self.bits & (LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_TOP | LineBits::DOUBLE_HEIGHT_BOTTOM)) == LineBits::NONE } /// Force single-width. This also implicitly sets /// double-height-(top/bottom) and dirty. #[inline] pub fn set_single_width(&mut self, seqno: SequenceNo) { self.bits.remove(LineBits::DOUBLE_WIDTH_HEIGHT_MASK); self.update_last_change_seqno(seqno); } /// Check whether the line is double-width and not double-height. #[inline] pub fn is_double_width(&self) -> bool { (self.bits & LineBits::DOUBLE_WIDTH_HEIGHT_MASK) == LineBits::DOUBLE_WIDTH } /// Force double-width. This also implicitly sets /// double-height-(top/bottom) and dirty. #[inline] pub fn set_double_width(&mut self, seqno: SequenceNo) { self.bits .remove(LineBits::DOUBLE_HEIGHT_TOP | LineBits::DOUBLE_HEIGHT_BOTTOM); self.bits.insert(LineBits::DOUBLE_WIDTH); self.update_last_change_seqno(seqno); } /// Check whether the line is double-height-top. #[inline] pub fn is_double_height_top(&self) -> bool { (self.bits & LineBits::DOUBLE_WIDTH_HEIGHT_MASK) == LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_TOP } /// Force double-height top-half. This also implicitly sets /// double-width and dirty. #[inline] pub fn set_double_height_top(&mut self, seqno: SequenceNo) { self.bits.remove(LineBits::DOUBLE_HEIGHT_BOTTOM); self.bits .insert(LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_TOP); self.update_last_change_seqno(seqno); } /// Check whether the line is double-height-bottom. #[inline] pub fn is_double_height_bottom(&self) -> bool { (self.bits & LineBits::DOUBLE_WIDTH_HEIGHT_MASK) == LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_BOTTOM } /// Force double-height bottom-half. This also implicitly sets /// double-width and dirty. #[inline] pub fn set_double_height_bottom(&mut self, seqno: SequenceNo) { self.bits.remove(LineBits::DOUBLE_HEIGHT_TOP); self.bits .insert(LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_BOTTOM); self.update_last_change_seqno(seqno); } /// Set a flag the indicate whether the line should have the bidi /// algorithm applied during rendering pub fn set_bidi_enabled(&mut self, enabled: bool, seqno: SequenceNo) { self.bits.set(LineBits::BIDI_ENABLED, enabled); self.update_last_change_seqno(seqno); } /// Set the bidi direction for the line. /// This affects both the bidi algorithm (if enabled via set_bidi_enabled) /// and the layout direction of the line. /// `auto_detect` specifies whether the direction should be auto-detected /// before falling back to the specified direction. pub fn set_direction(&mut self, direction: Direction, auto_detect: bool, seqno: SequenceNo) { self.bits .set(LineBits::RTL, direction == Direction::LeftToRight); self.bits.set(LineBits::AUTO_DETECT_DIRECTION, auto_detect); self.update_last_change_seqno(seqno); } pub fn set_bidi_info( &mut self, enabled: bool, direction: ParagraphDirectionHint, seqno: SequenceNo, ) { self.bits.set(LineBits::BIDI_ENABLED, enabled); let (auto, rtl) = match direction { ParagraphDirectionHint::AutoRightToLeft => (true, true), ParagraphDirectionHint::AutoLeftToRight => (true, false), ParagraphDirectionHint::LeftToRight => (false, false), ParagraphDirectionHint::RightToLeft => (false, true), }; self.bits.set(LineBits::AUTO_DETECT_DIRECTION, auto); self.bits.set(LineBits::RTL, rtl); self.update_last_change_seqno(seqno); } /// Returns a tuple of (BIDI_ENABLED, Direction), indicating whether /// the line should have the bidi algorithm applied and its base /// direction, respectively. pub fn bidi_info(&self) -> (bool, ParagraphDirectionHint) { ( self.bits.contains(LineBits::BIDI_ENABLED), match ( self.bits.contains(LineBits::AUTO_DETECT_DIRECTION), self.bits.contains(LineBits::RTL), ) { (true, true) => ParagraphDirectionHint::AutoRightToLeft, (false, true) => ParagraphDirectionHint::RightToLeft, (true, false) => ParagraphDirectionHint::AutoLeftToRight, (false, false) => ParagraphDirectionHint::LeftToRight, }, ) } fn invalidate_zones(&mut self) { self.zones.clear(); } fn compute_zones(&mut self) { let blank_cell = Cell::blank(); let mut last_cell: Option = None; let mut current_zone: Option = None; let mut zones = vec![]; // Rows may have trailing space+Output cells interleaved // with other zones as a result of clear-to-eol and // clear-to-end-of-screen sequences. We don't want // those to affect the zones that we compute here let mut last_non_blank = self.len(); for cell in self.visible_cells() { if cell.str() != blank_cell.str() || cell.attrs() != blank_cell.attrs() { last_non_blank = cell.cell_index(); } } for cell in self.visible_cells() { if cell.cell_index() > last_non_blank { break; } let grapheme_idx = cell.cell_index() as u16; let semantic_type = cell.attrs().semantic_type(); let new_zone = match last_cell { None => true, Some(ref c) => c.attrs().semantic_type() != semantic_type, }; if new_zone { if let Some(zone) = current_zone.take() { zones.push(zone); } current_zone.replace(ZoneRange { range: grapheme_idx..grapheme_idx + 1, semantic_type, }); } if let Some(zone) = current_zone.as_mut() { zone.range.end = grapheme_idx; } last_cell.replace(cell); } if let Some(zone) = current_zone.take() { zones.push(zone); } self.zones = zones; } pub fn semantic_zone_ranges(&mut self) -> &[ZoneRange] { if self.zones.is_empty() { self.compute_zones(); } &self.zones } /// If we have any cells with an implicit hyperlink, remove the hyperlink /// from the cell attributes but leave the remainder of the attributes alone. #[inline] pub fn invalidate_implicit_hyperlinks(&mut self, seqno: SequenceNo) { if (self.bits & (LineBits::SCANNED_IMPLICIT_HYPERLINKS | LineBits::HAS_IMPLICIT_HYPERLINKS)) == LineBits::NONE { return; } self.bits &= !LineBits::SCANNED_IMPLICIT_HYPERLINKS; if (self.bits & LineBits::HAS_IMPLICIT_HYPERLINKS) == LineBits::NONE { return; } self.invalidate_implicit_hyperlinks_impl(seqno); } fn invalidate_implicit_hyperlinks_impl(&mut self, seqno: SequenceNo) { let cells = self.coerce_vec_storage(); for cell in cells.iter_mut() { let replace = match cell.attrs().hyperlink() { Some(ref link) if link.is_implicit() => Some(Cell::new_grapheme( cell.str(), cell.attrs().clone().set_hyperlink(None).clone(), None, )), _ => None, }; if let Some(replace) = replace { *cell = replace; } } self.bits &= !LineBits::HAS_IMPLICIT_HYPERLINKS; self.update_last_change_seqno(seqno); } /// Scan through the line and look for sequences that match the provided /// rules. Matching sequences are considered to be implicit hyperlinks /// and will have a hyperlink attribute associated with them. /// This function will only make changes if the line has been invalidated /// since the last time this function was called. /// This function does not remember the values of the `rules` slice, so it /// is the responsibility of the caller to call `invalidate_implicit_hyperlinks` /// if it wishes to call this function with different `rules`. pub fn scan_and_create_hyperlinks(&mut self, rules: &[Rule]) { if (self.bits & LineBits::SCANNED_IMPLICIT_HYPERLINKS) == LineBits::SCANNED_IMPLICIT_HYPERLINKS { // Has not changed since last time we scanned return; } // FIXME: let's build a string and a byte-to-cell map here, and // use this as an opportunity to rebuild HAS_HYPERLINK, skip matching // cells with existing non-implicit hyperlinks, and avoid matching // text with zero-width cells. self.bits |= LineBits::SCANNED_IMPLICIT_HYPERLINKS; self.bits &= !LineBits::HAS_IMPLICIT_HYPERLINKS; let line = self.as_str(); let matches = Rule::match_hyperlinks(&line, rules); if matches.is_empty() { return; } let line = line.into_owned(); let cells = self.coerce_vec_storage(); if cells.scan_and_create_hyperlinks(&line, matches) { self.bits |= LineBits::HAS_IMPLICIT_HYPERLINKS; } } /// Scan through a logical line that is comprised of an array of /// physical lines and look for sequences that match the provided /// rules. Matching sequences are considered to be implicit hyperlinks /// and will have a hyperlink attribute associated with them. /// This function will only make changes if the line has been invalidated /// since the last time this function was called. /// This function does not remember the values of the `rules` slice, so it /// is the responsibility of the caller to call `invalidate_implicit_hyperlinks` /// if it wishes to call this function with different `rules`. /// /// This function will call Line::clear_appdata on lines where /// hyperlinks are adjusted. pub fn apply_hyperlink_rules(rules: &[Rule], logical_line: &mut [&mut Line]) { if rules.is_empty() || logical_line.is_empty() { return; } let mut need_scan = false; for line in logical_line.iter() { if !line.bits.contains(LineBits::SCANNED_IMPLICIT_HYPERLINKS) { need_scan = true; break; } } if !need_scan { return; } let mut logical = logical_line[0].clone(); for line in &logical_line[1..] { let seqno = logical.current_seqno().max(line.current_seqno()); logical.append_line((**line).clone(), seqno); } let seq = logical.current_seqno(); logical.invalidate_implicit_hyperlinks(seq); logical.scan_and_create_hyperlinks(rules); if !logical.has_hyperlink() { for line in logical_line.iter_mut() { line.bits.set(LineBits::SCANNED_IMPLICIT_HYPERLINKS, true); line.clear_appdata(); } return; } // Re-compute the physical lines that comprise this logical line for phys in logical_line.iter_mut() { let wrapped = phys.last_cell_was_wrapped(); let is_cluster = matches!(&phys.cells, CellStorage::C(_)); let len = phys.len(); let remainder = logical.split_off(len, seq); **phys = logical; logical = remainder; phys.set_last_cell_was_wrapped(wrapped, seq); phys.clear_appdata(); if is_cluster { phys.compress_for_scrollback(); } } } /// Returns true if the line contains a hyperlink #[inline] pub fn has_hyperlink(&self) -> bool { (self.bits & (LineBits::HAS_HYPERLINK | LineBits::HAS_IMPLICIT_HYPERLINKS)) != LineBits::NONE } /// Recompose line into the corresponding utf8 string. pub fn as_str(&self) -> Cow { match &self.cells { CellStorage::V(_) => { let mut s = String::new(); for cell in self.visible_cells() { s.push_str(cell.str()); } Cow::Owned(s) } CellStorage::C(cl) => Cow::Borrowed(&cl.text), } } pub fn split_off(&mut self, idx: usize, seqno: SequenceNo) -> Self { let my_cells = self.coerce_vec_storage(); // Clamp to avoid out of bounds panic if the line is shorter // than the requested split point // let idx = idx.min(my_cells.len()); let cells = my_cells.split_off(idx); Self { bits: self.bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn compute_double_click_range bool>( &self, click_col: usize, is_word: F, ) -> DoubleClickRange { let len = self.len(); if click_col >= len { return DoubleClickRange::Range(click_col..click_col); } let mut lower = click_col; let mut upper = click_col; // TODO: look back and look ahead for cells that are hidden by // a preceding multi-wide cell let cells = self.visible_cells().collect::>(); for cell in &cells { if cell.cell_index() < click_col { continue; } if !is_word(cell.str()) { break; } upper = cell.cell_index() + 1; } for cell in cells.iter().rev() { if cell.cell_index() > click_col { continue; } if !is_word(cell.str()) { break; } lower = cell.cell_index(); } if upper > lower && upper >= len && cells .last() .map(|cell| cell.attrs().wrapped()) .unwrap_or(false) { DoubleClickRange::RangeWithWrap(lower..upper) } else { DoubleClickRange::Range(lower..upper) } } /// Returns a substring from the line. pub fn columns_as_str(&self, range: Range) -> String { let mut s = String::new(); for c in self.visible_cells() { if c.cell_index() < range.start { continue; } if c.cell_index() >= range.end { break; } s.push_str(c.str()); } s } pub fn columns_as_line(&self, range: Range) -> Self { let mut cells = vec![]; for c in self.visible_cells() { if c.cell_index() < range.start { continue; } if c.cell_index() >= range.end { break; } cells.push(c.as_cell()); } Self { bits: LineBits::NONE, cells: CellStorage::V(VecStorage::new(cells)), seqno: self.current_seqno(), zones: vec![], appdata: Mutex::new(None), } } /// If we're about to modify a cell obscured by a double-width /// character ahead of that cell, we need to nerf that sequence /// of cells to avoid partial rendering concerns. /// Similarly, when we assign a cell, we need to blank out those /// occluded successor cells. pub fn set_cell(&mut self, idx: usize, cell: Cell, seqno: SequenceNo) { self.set_cell_impl(idx, cell, false, seqno); } /// Assign a cell using grapheme text with a known width and attributes. /// This is a micro-optimization over first constructing a Cell from /// the grapheme info. If assigning this particular cell can be optimized /// to an append to the interal clustered storage then the cost of /// constructing and dropping the Cell can be avoided. pub fn set_cell_grapheme( &mut self, idx: usize, text: &str, width: usize, attr: CellAttributes, seqno: SequenceNo, ) { if attr.hyperlink().is_some() { self.bits |= LineBits::HAS_HYPERLINK; } if let CellStorage::C(cl) = &mut self.cells { if idx > cl.len() && text == " " && attr == CellAttributes::blank() { // Appending blank beyond end of line; is already // implicitly blank return; } while cl.len() < idx { // Fill out any implied blanks until we can append // their intended cell content cl.append_grapheme(" ", 1, CellAttributes::blank()); } if idx == cl.len() { cl.append_grapheme(text, width, attr); self.invalidate_implicit_hyperlinks(seqno); self.invalidate_zones(); self.update_last_change_seqno(seqno); return; } } self.set_cell(idx, Cell::new_grapheme_with_width(text, width, attr), seqno); } pub fn set_cell_clearing_image_placements( &mut self, idx: usize, cell: Cell, seqno: SequenceNo, ) { self.set_cell_impl(idx, cell, true, seqno) } fn raw_set_cell(&mut self, idx: usize, cell: Cell, clear: bool) { let cells = self.coerce_vec_storage(); cells.set_cell(idx, cell, clear); } fn set_cell_impl(&mut self, idx: usize, cell: Cell, clear: bool, seqno: SequenceNo) { // The .max(1) stuff is here in case we get called with a // zero-width cell. That shouldn't happen: those sequences // should get filtered out in the terminal parsing layer, // but in case one does sneak through, we need to ensure that // we grow the cells array to hold this bogus entry. // https://github.com/wezterm/wezterm/issues/768 let width = cell.width().max(1); self.invalidate_implicit_hyperlinks(seqno); self.invalidate_zones(); self.update_last_change_seqno(seqno); if cell.attrs().hyperlink().is_some() { self.bits |= LineBits::HAS_HYPERLINK; } if let CellStorage::C(cl) = &mut self.cells { if idx > cl.len() && cell == Cell::blank() { // Appending blank beyond end of line; is already // implicitly blank return; } while cl.len() < idx { // Fill out any implied blanks until we can append // their intended cell content cl.append_grapheme(" ", 1, CellAttributes::blank()); } if idx == cl.len() { cl.append(cell); return; } /* log::info!( "cannot append {cell:?} to {:?} as idx={idx} and cl.len is {}", cl, cl.len ); */ } // if the line isn't wide enough, pad it out with the default attributes. { let cells = self.coerce_vec_storage(); if idx + width > cells.len() { cells.resize_with(idx + width, Cell::blank); } } self.invalidate_grapheme_at_or_before(idx); // For double-wide or wider chars, ensure that the cells that // are overlapped by this one are blanked out. for i in 1..=width.saturating_sub(1) { self.raw_set_cell(idx + i, Cell::blank_with_attrs(cell.attrs().clone()), clear); } self.raw_set_cell(idx, cell, clear); } /// Place text starting at the specified column index. /// Each grapheme of the text run has the same attributes. pub fn overlay_text_with_attribute( &mut self, mut start_idx: usize, text: &str, attr: CellAttributes, seqno: SequenceNo, ) { for (i, c) in Graphemes::new(text).enumerate() { let cell = Cell::new_grapheme(c, attr.clone(), None); let width = cell.width(); self.set_cell(i + start_idx, cell, seqno); // Compensate for required spacing/placement of // double width characters start_idx += width.saturating_sub(1); } } fn invalidate_grapheme_at_or_before(&mut self, idx: usize) { // Assumption: that the width of a grapheme is never > 2. // This constrains the amount of look-back that we need to do here. if idx > 0 { let prior = idx - 1; let cells = self.coerce_vec_storage(); let width = cells[prior].width(); if width > 1 { let attrs = cells[prior].attrs().clone(); for nerf in prior..prior + width { cells[nerf] = Cell::blank_with_attrs(attrs.clone()); } } } } pub fn insert_cell(&mut self, x: usize, cell: Cell, right_margin: usize, seqno: SequenceNo) { self.invalidate_implicit_hyperlinks(seqno); let cells = self.coerce_vec_storage(); if right_margin <= cells.len() { cells.remove(right_margin - 1); } if x >= cells.len() { cells.resize_with(x, Cell::blank); } // If we're inserting a wide cell, we should also insert the overlapped cells. // We insert them first so that the grapheme winds up left-most. let width = cell.width(); for _ in 1..=width.saturating_sub(1) { cells.insert(x, Cell::blank_with_attrs(cell.attrs().clone())); } cells.insert(x, cell); self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn erase_cell(&mut self, x: usize, seqno: SequenceNo) { if x >= self.len() { // Already implicitly erased return; } self.invalidate_implicit_hyperlinks(seqno); self.invalidate_grapheme_at_or_before(x); { let cells = self.coerce_vec_storage(); cells.remove(x); cells.push(Cell::default()); } self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn remove_cell(&mut self, x: usize, seqno: SequenceNo) { if x >= self.len() { // Already implicitly removed return; } self.invalidate_implicit_hyperlinks(seqno); self.invalidate_grapheme_at_or_before(x); self.coerce_vec_storage().remove(x); self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn erase_cell_with_margin( &mut self, x: usize, right_margin: usize, seqno: SequenceNo, blank_attr: CellAttributes, ) { self.invalidate_implicit_hyperlinks(seqno); if x < self.len() { self.invalidate_grapheme_at_or_before(x); self.coerce_vec_storage().remove(x); } if right_margin <= self.len() + 1 /* we just removed one */ { self.coerce_vec_storage() .insert(right_margin - 1, Cell::blank_with_attrs(blank_attr)); } self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn prune_trailing_blanks(&mut self, seqno: SequenceNo) { if let CellStorage::C(cl) = &mut self.cells { if cl.prune_trailing_blanks() { self.update_last_change_seqno(seqno); self.invalidate_zones(); } return; } let def_attr = CellAttributes::blank(); let cells = self.coerce_vec_storage(); if let Some(end_idx) = cells .iter() .rposition(|c| c.str() != " " || c.attrs() != &def_attr) { cells.resize_with(end_idx + 1, Cell::blank); self.update_last_change_seqno(seqno); self.invalidate_zones(); } } pub fn fill_range(&mut self, cols: Range, cell: &Cell, seqno: SequenceNo) { if self.len() == 0 && *cell == Cell::blank() { // We would be filling it with blanks only to prune // them all away again before we return; NOP return; } for x in cols { // FIXME: we can skip the look-back for second and subsequent iterations self.set_cell_impl(x, cell.clone(), true, seqno); } self.prune_trailing_blanks(seqno); } pub fn len(&self) -> usize { match &self.cells { CellStorage::V(cells) => cells.len(), CellStorage::C(cl) => cl.len(), } } /// Iterates the visible cells, respecting the width of the cell. /// For instance, a double-width cell overlaps the following (blank) /// cell, so that blank cell is omitted from the iterator results. /// The iterator yields (column_index, Cell). Column index is the /// index into Self::cells, and due to the possibility of skipping /// the characters that follow wide characters, the column index may /// skip some positions. It is returned as a convenience to the consumer /// as using .enumerate() on this iterator wouldn't be as useful. pub fn visible_cells<'a>(&'a self) -> impl Iterator> { match &self.cells { CellStorage::V(cells) => VisibleCellIter::V(VecStorageIter { cells: cells.iter(), idx: 0, skip_width: 0, }), CellStorage::C(cl) => VisibleCellIter::C(cl.iter()), } } pub fn get_cell(&self, cell_index: usize) -> Option { self.visible_cells() .find(|cell| cell.cell_index() == cell_index) } pub fn cluster(&self, bidi_hint: Option) -> Vec { CellCluster::make_cluster(self.len(), self.visible_cells(), bidi_hint) } fn make_cells(&mut self) { let cells = match &self.cells { CellStorage::V(_) => return, CellStorage::C(cl) => cl.to_cell_vec(), }; // log::info!("make_cells\n{:?}", backtrace::Backtrace::new()); self.cells = CellStorage::V(VecStorage::new(cells)); } pub(crate) fn coerce_vec_storage(&mut self) -> &mut VecStorage { self.make_cells(); match &mut self.cells { CellStorage::V(c) => return c, CellStorage::C(_) => unreachable!(), } } /// Adjusts the internal storage so that it occupies less /// space. Subsequent mutations will incur some overhead to /// re-materialize the storage in a form that is suitable /// for mutation. pub fn compress_for_scrollback(&mut self) { let cv = match &self.cells { CellStorage::V(v) => ClusteredLine::from_cell_vec(v.len(), self.visible_cells()), CellStorage::C(_) => return, }; self.cells = CellStorage::C(cv); } pub fn cells_mut(&mut self) -> &mut [Cell] { self.coerce_vec_storage().as_mut_slice() } /// Return true if the line consists solely of whitespace cells pub fn is_whitespace(&self) -> bool { self.visible_cells().all(|c| c.str() == " ") } /// Return true if the last cell in the line has the wrapped attribute, /// indicating that the following line is logically a part of this one. pub fn last_cell_was_wrapped(&self) -> bool { self.visible_cells() .last() .map(|c| c.attrs().wrapped()) .unwrap_or(false) } /// Adjust the value of the wrapped attribute on the last cell of this /// line. pub fn set_last_cell_was_wrapped(&mut self, wrapped: bool, seqno: SequenceNo) { self.update_last_change_seqno(seqno); if let CellStorage::C(cl) = &mut self.cells { if cl.len() == 0 { // Need to mark that implicit space as wrapped, so // explicitly add it cl.append(Cell::blank()); } cl.set_last_cell_was_wrapped(wrapped); return; } let cells = self.coerce_vec_storage(); if let Some(cell) = cells.last_mut() { cell.attrs_mut().set_wrapped(wrapped); } } /// Concatenate the cells from other with this line, appending them /// to this line. /// This function is used by rewrapping logic when joining wrapped /// lines back together. pub fn append_line(&mut self, other: Line, seqno: SequenceNo) { match &mut self.cells { CellStorage::V(cells) => { for cell in other.visible_cells() { cells.push(cell.as_cell()); for _ in 1..cell.width() { cells.push(Cell::new(' ', cell.attrs().clone())); } } } CellStorage::C(cl) => { for cell in other.visible_cells() { cl.append(cell.as_cell()); } } } self.update_last_change_seqno(seqno); self.invalidate_zones(); } /// mutable access the cell data, but the caller must take care /// to only mutate attributes rather than the cell textual content. /// Use set_cell if you need to modify the textual content of the /// cell, so that important invariants are upheld. pub fn cells_mut_for_attr_changes_only(&mut self) -> &mut [Cell] { self.coerce_vec_storage().as_mut_slice() } /// Given a starting attribute value, produce a series of Change /// entries to recreate the current line pub fn changes(&self, start_attr: &CellAttributes) -> Vec { let mut result = Vec::new(); let mut attr = start_attr.clone(); let mut text_run = String::new(); for cell in self.visible_cells() { if *cell.attrs() == attr { text_run.push_str(cell.str()); } else { // flush out the current text run if !text_run.is_empty() { result.push(Change::Text(text_run.clone())); text_run.clear(); } attr = cell.attrs().clone(); result.push(Change::AllAttributes(attr.clone())); text_run.push_str(cell.str()); } } // flush out any remaining text run if !text_run.is_empty() { // if this is just spaces then it is likely cheaper // to emit ClearToEndOfLine instead. if attr == CellAttributes::default() .set_background(attr.background()) .clone() { let left = text_run.trim_end_matches(' ').to_string(); let num_trailing_spaces = text_run.len() - left.len(); if num_trailing_spaces > 0 { if !left.is_empty() { result.push(Change::Text(left)); } else if result.len() == 1 { // if the only queued result prior to clearing // to the end of the line is an attribute change, // we can prune it out and return just the line // clearing operation if let Change::AllAttributes(_) = result[0] { result.clear() } } // Since this function is only called in the full repaint // case, and we always emit a clear screen with the default // background color, we don't need to emit an instruction // to clear the remainder of the line unless it has a different // background color. if attr.background() != Default::default() { result.push(Change::ClearToEndOfLine(attr.background())); } } else { result.push(Change::Text(text_run)); } } else { result.push(Change::Text(text_run)); } } result } } impl<'a> From<&'a str> for Line { fn from(s: &str) -> Line { Line::from_text(s, &CellAttributes::default(), SEQ_ZERO, None) } } termwiz-0.23.3/src/surface/line/linebits.rs000064400000000000000000000040241046102023000167370ustar 00000000000000use bitflags::bitflags; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; bitflags! { #[cfg_attr(feature="use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq)] pub(crate) struct LineBits : u16 { const NONE = 0; /// The line contains 1+ cells with explicit hyperlinks set const HAS_HYPERLINK = 1<<1; /// true if we have scanned for implicit hyperlinks const SCANNED_IMPLICIT_HYPERLINKS = 1<<2; /// true if we found implicit hyperlinks in the last scan const HAS_IMPLICIT_HYPERLINKS = 1<<3; /// true if this line should be displayed with /// in double-width const DOUBLE_WIDTH = 1<<4; /// true if this line should be displayed /// as double-height top-half const DOUBLE_HEIGHT_TOP = 1<<5; /// true if this line should be displayed /// as double-height bottom-half const DOUBLE_HEIGHT_BOTTOM = 1<<6; const DOUBLE_WIDTH_HEIGHT_MASK = Self::DOUBLE_WIDTH.bits() | Self::DOUBLE_HEIGHT_TOP.bits() | Self::DOUBLE_HEIGHT_BOTTOM.bits(); /// true if the line should have the bidi algorithm /// applied as part of presentation. /// This corresponds to the "implicit" bidi modes /// described in /// const BIDI_ENABLED = 1<<0; /// true if the line base direction is RTL. /// When BIDI_ENABLED is also true, this is passed to the bidi algorithm. /// When rendering, the line will be rendered from RTL. const RTL = 1<<7; /// true if the direction for the line should be auto-detected /// when BIDI_ENABLED is also true. /// If false, the direction is taken from the RTL bit only. /// Otherwise, the auto-detect direction is used, falling back /// to the direction specified by the RTL bit. const AUTO_DETECT_DIRECTION = 1<<8; } } termwiz-0.23.3/src/surface/line/mod.rs000064400000000000000000000002401046102023000157010ustar 00000000000000mod cellref; mod clusterline; mod line; mod linebits; mod storage; mod test; mod vecstorage; pub use cellref::CellRef; pub use line::{DoubleClickRange, Line}; termwiz-0.23.3/src/surface/line/storage.rs000064400000000000000000000020011046102023000165630ustar 00000000000000use crate::surface::line::cellref::CellRef; use crate::surface::line::clusterline::{ClusterLineCellIter, ClusteredLine}; use crate::surface::line::vecstorage::{VecStorage, VecStorageIter}; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub(crate) enum CellStorage { V(VecStorage), C(ClusteredLine), } pub(crate) enum VisibleCellIter<'a> { V(VecStorageIter<'a>), C(ClusterLineCellIter<'a>), } impl<'a> Iterator for VisibleCellIter<'a> { type Item = CellRef<'a>; fn next(&mut self) -> Option> { match self { Self::V(iter) => iter.next(), Self::C(iter) => iter.next(), } } } #[cfg(test)] mod test { use super::*; #[test] #[cfg(target_pointer_width = "64")] fn memory_usage() { assert_eq!(std::mem::size_of::(), 64); assert_eq!(std::mem::size_of::(), 24); } } termwiz-0.23.3/src/surface/line/test.rs000064400000000000000000000442441046102023000161150ustar 00000000000000#![cfg(test)] use super::*; use crate::cell::{Cell, CellAttributes}; use crate::hyperlink::{Hyperlink, Rule}; use crate::surface::line::clusterline::ClusteredLine; use crate::surface::SEQ_ZERO; use k9::assert_equal as assert_eq; use std::sync::Arc; /// There are 4 double-wide graphemes that occupy 2 cells each. /// When we join the lines, we must preserve the invisible blank /// that is part of the grapheme otherwise our metrics will be /// wrong. /// #[test] fn append_line() { let mut line1: Line = "0123456789".into(); let line2: Line = "グループaa".into(); line1.append_line(line2, SEQ_ZERO); assert_eq!(line1.len(), 20); } #[test] fn hyperlinks() { let text = "❤ 😍🤢 http://example.com \u{1f468}\u{1f3fe}\u{200d}\u{1f9b0} http://example.com"; let rules = vec![ Rule::new(r"\b\w+://(?:[\w.-]+)\.[a-z]{2,15}\S*\b", "$0").unwrap(), Rule::new(r"\b\w+@[\w-]+(\.[\w-]+)+\b", "mailto:$0").unwrap(), ]; let hyperlink = Arc::new(Hyperlink::new_implicit("http://example.com")); let hyperlink_attr = CellAttributes::default() .set_hyperlink(Some(hyperlink.clone())) .clone(); let mut line: Line = text.into(); line.scan_and_create_hyperlinks(&rules); assert!(line.has_hyperlink()); assert_eq!( line.coerce_vec_storage().to_vec(), vec![ Cell::new_grapheme("❤", CellAttributes::default(), None), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new_grapheme("😍", CellAttributes::default(), None), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new_grapheme("🤢", CellAttributes::default(), None), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new(' ', CellAttributes::default()), Cell::new('h', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new(':', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('x', hyperlink_attr.clone()), Cell::new('a', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new('l', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('.', hyperlink_attr.clone()), Cell::new('c', hyperlink_attr.clone()), Cell::new('o', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), Cell::new(' ', CellAttributes::default()), Cell::new_grapheme( // man: dark skin tone, red hair ZWJ emoji grapheme "\u{1f468}\u{1f3fe}\u{200d}\u{1f9b0}", CellAttributes::default(), None, ), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new(' ', CellAttributes::default()), Cell::new('h', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new(':', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('x', hyperlink_attr.clone()), Cell::new('a', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new('l', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('.', hyperlink_attr.clone()), Cell::new('c', hyperlink_attr.clone()), Cell::new('o', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), ] ); } #[test] fn double_click_range_bounds() { let line: Line = "hello".into(); let r = line.compute_double_click_range(200, |_| true); assert_eq!(r, DoubleClickRange::Range(200..200)); } #[test] fn cluster_representation_basic() { let line: Line = "hello".into(); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 5, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_representation_double_width() { let line: Line = "❤ 😍🤢he❤ 😍🤢llo❤ 😍🤢".into(); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "❤ 😍🤢he❤ 😍🤢llo❤ 😍🤢", is_double_wide: Some( FixedBitSet { data: [ 2626580, ], length: 23, }, ), clusters: [ Cluster { cell_width: 23, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 23, last_cell_width: Some( 1, ), }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_representation_empty() { let line = Line::from_cells(vec![], SEQ_ZERO); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "", is_double_wide: None, clusters: [], len: 0, last_cell_width: None, }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_wrap_last() { let mut line: Line = "hello".into(); line.compress_for_scrollback(); line.set_last_cell_was_wrapped(true, 1); k9::snapshot!( line, r#" Line { cells: C( ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 4, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 2048, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: true, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), }, ), zones: [], seqno: 1, bits: LineBits( 0x0, ), appdata: Mutex { data: None, poisoned: false, .. }, } "# ); } fn bold() -> CellAttributes { use crate::cell::Intensity; let mut attr = CellAttributes::default(); attr.set_intensity(Intensity::Bold); attr } #[test] fn cluster_representation_attributes() { let line = Line::from_cells( vec![ Cell::new_grapheme("a", CellAttributes::default(), None), Cell::new_grapheme("b", bold(), None), Cell::new_grapheme("c", CellAttributes::default(), None), Cell::new_grapheme("d", bold(), None), ], SEQ_ZERO, ); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "abcd", is_double_wide: None, clusters: [ Cluster { cell_width: 1, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 4, last_cell_width: Some( 1, ), }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_append() { let mut cl = ClusteredLine::new(); cl.append(Cell::new_grapheme("h", CellAttributes::default(), None)); cl.append(Cell::new_grapheme("e", CellAttributes::default(), None)); cl.append(Cell::new_grapheme("l", bold(), None)); cl.append(Cell::new_grapheme("l", CellAttributes::default(), None)); cl.append(Cell::new_grapheme("o", CellAttributes::default(), None)); k9::snapshot!( cl, r#" ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), } "# ); } #[test] fn cluster_line_new() { let mut line = Line::new(1); line.set_cell( 0, Cell::new_grapheme("h", CellAttributes::default(), None), 1, ); line.set_cell( 1, Cell::new_grapheme("e", CellAttributes::default(), None), 2, ); line.set_cell(2, Cell::new_grapheme("l", bold(), None), 3); line.set_cell( 3, Cell::new_grapheme("l", CellAttributes::default(), None), 4, ); line.set_cell( 4, Cell::new_grapheme("o", CellAttributes::default(), None), 5, ); k9::snapshot!( line, r#" Line { cells: C( ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), }, ), zones: [], seqno: 5, bits: LineBits( 0x0, ), appdata: Mutex { data: None, poisoned: false, .. }, } "# ); } termwiz-0.23.3/src/surface/line/vecstorage.rs000064400000000000000000000061131046102023000172710ustar 00000000000000use crate::cell::Cell; use crate::surface::line::cellref::CellRef; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::sync::Arc; use unicode_segmentation::UnicodeSegmentation; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub(crate) struct VecStorage { cells: Vec, } impl VecStorage { pub(crate) fn new(cells: Vec) -> Self { Self { cells } } pub(crate) fn set_cell(&mut self, idx: usize, mut cell: Cell, clear_image_placement: bool) { if !clear_image_placement { if let Some(images) = self.cells[idx].attrs().images() { for image in images { if image.has_placement_id() { cell.attrs_mut().attach_image(Box::new(image)); } } } } self.cells[idx] = cell; } pub(crate) fn scan_and_create_hyperlinks( &mut self, line: &str, matches: Vec, ) -> bool { // The capture range is measured in bytes but we need to translate // that to the index of the column. This is complicated a bit further // because double wide sequences have a blank column cell after them // in the cells array, but the string we match against excludes that // string. let mut cell_idx = 0; let mut has_implicit_hyperlinks = false; for (byte_idx, _grapheme) in line.grapheme_indices(true) { let cell = &mut self.cells[cell_idx]; let mut matched = false; for m in &matches { if m.range.contains(&byte_idx) { let attrs = cell.attrs_mut(); // Don't replace existing links if attrs.hyperlink().is_none() { attrs.set_hyperlink(Some(Arc::clone(&m.link))); matched = true; } } } cell_idx += cell.width(); if matched { has_implicit_hyperlinks = true; } } has_implicit_hyperlinks } } impl std::ops::Deref for VecStorage { type Target = Vec; fn deref(&self) -> &Vec { &self.cells } } impl std::ops::DerefMut for VecStorage { fn deref_mut(&mut self) -> &mut Vec { &mut self.cells } } /// Iterates over a slice of Cell, yielding only visible cells pub(crate) struct VecStorageIter<'a> { pub cells: std::slice::Iter<'a, Cell>, pub idx: usize, pub skip_width: usize, } impl<'a> Iterator for VecStorageIter<'a> { type Item = CellRef<'a>; fn next(&mut self) -> Option> { while self.skip_width > 0 { self.skip_width -= 1; let _ = self.cells.next()?; self.idx += 1; } let cell = self.cells.next()?; let cell_index = self.idx; self.idx += 1; self.skip_width = cell.width().saturating_sub(1); Some(CellRef::CellRef { cell_index, cell }) } } termwiz-0.23.3/src/surface/mod.rs000064400000000000000000001712071046102023000147660ustar 00000000000000use crate::cell::{Cell, CellAttributes}; use crate::color::ColorAttribute; use crate::image::ImageCell; use crate::surface::line::CellRef; use finl_unicode::grapheme_clusters::Graphemes; use ordered_float::NotNan; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::borrow::Cow; use std::cmp::min; use wezterm_dynamic::{FromDynamic, ToDynamic}; pub mod change; pub mod line; pub use self::change::{Change, Image, LineAttribute, TextureCoordinate}; pub use self::line::Line; /// Position holds 0-based positioning information, where /// Absolute(0) is the start of the line or column, /// Relative(0) is the current position in the line or /// column and EndRelative(0) is the end position in the /// line or column. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum Position { /// Negative values move up, positive values down, 0 means no change Relative(isize), /// Relative to the start of the line or top of the screen Absolute(usize), /// Relative to the end of line or bottom of screen EndRelative(usize), } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Hash, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] pub enum CursorVisibility { Hidden, Visible, } impl Default for CursorVisibility { fn default() -> CursorVisibility { CursorVisibility::Visible } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromDynamic, ToDynamic)] pub enum CursorShape { Default, BlinkingBlock, SteadyBlock, BlinkingUnderline, SteadyUnderline, BlinkingBar, SteadyBar, } impl Default for CursorShape { fn default() -> CursorShape { CursorShape::Default } } impl CursorShape { pub fn is_blinking(self) -> bool { matches!( self, Self::BlinkingBlock | Self::BlinkingUnderline | Self::BlinkingBar ) } } /// SequenceNo indicates a logical position within a stream of changes. /// The sequence is only meaningful within a given `Surface` instance. pub type SequenceNo = usize; pub const SEQ_ZERO: SequenceNo = 0; /// The `Surface` type represents the contents of a terminal screen. /// It is not directly connected to a terminal device. /// It consists of a buffer and a log of changes. You can accumulate /// updates to the screen by adding instances of the `Change` enum /// that describe the updates. /// /// When ready to render the `Surface` to a `Terminal`, you can use /// the `get_changes` method to return an optimized stream of `Change`s /// since the last render and then pass it to an instance of `Renderer`. /// /// `Surface`s can also be composited together; this is useful when /// building up a UI with layers or widgets: each widget can be its /// own `Surface` instance and have its content maintained independently /// from the other widgets on the screen and can then be copied into /// the target `Surface` buffer for rendering. /// /// To support more efficient updates in the composite use case, a /// `draw_from_screen` method is available; the intent is to have one /// `Surface` be hold the data that was last rendered, and a second `Surface` /// of the same size that is repeatedly redrawn from the composite /// of the widgets. `draw_from_screen` is used to extract the smallest /// difference between the updated screen and apply those changes to /// the render target, and then use `get_changes` to render those without /// repainting the world on each update. #[derive(Default, Clone)] pub struct Surface { width: usize, height: usize, lines: Vec, attributes: CellAttributes, xpos: usize, ypos: usize, seqno: SequenceNo, changes: Vec, cursor_shape: Option, cursor_visibility: CursorVisibility, cursor_color: ColorAttribute, title: String, } #[derive(Default)] struct DiffState { changes: Vec, /// Keep track of the cursor position that the change stream /// selects for updates so that we can avoid emitting redundant /// position changes. cursor: Option<(usize, usize)>, /// Similarly, we keep track of the cell attributes that we have /// activated for change stream to avoid over-emitting. /// Tracking the cursor and attributes in this way helps to coalesce /// lines of text into simpler strings. attr: Option, } impl DiffState { #[inline] fn diff_cells(&mut self, col_num: usize, row_num: usize, cell: CellRef, other_cell: CellRef) { if cell.same_contents(&other_cell) { return; } self.set_cell(col_num, row_num, other_cell); } #[inline] fn set_cell(&mut self, col_num: usize, row_num: usize, other_cell: CellRef) { self.cursor = match self.cursor.take() { Some((cursor_row, cursor_col)) if cursor_row == row_num && cursor_col == col_num => { // It is on the current column, so we don't need // to explicitly move it. Move the cursor by the // width of the text we're about to add. Some((row_num, col_num + other_cell.width())) } _ => { // Need to explicitly move the cursor self.changes.push(Change::CursorPosition { y: Position::Absolute(row_num), x: Position::Absolute(col_num), }); // and update the position for next time Some((row_num, col_num + other_cell.width())) } }; // we could get fancy and try to minimize the update traffic // by computing a series of AttributeChange values here. // For now, let's just record the new value self.attr = match self.attr.take() { Some(ref attr) if attr == other_cell.attrs() => { // Active attributes match, so we don't need // to emit a change for them Some(attr.clone()) } _ => { // Attributes are different self.changes .push(Change::AllAttributes(other_cell.attrs().clone())); Some(other_cell.attrs().clone()) } }; // A little bit of bloat in the code to avoid runs of single // character Text entries; just append to the string. let result_len = self.changes.len(); if result_len > 0 && self.changes[result_len - 1].is_text() { if let Some(Change::Text(ref mut prefix)) = self.changes.get_mut(result_len - 1) { prefix.push_str(other_cell.str()); } } else { self.changes .push(Change::Text(other_cell.str().to_string())); } } } impl Surface { /// Create a new Surface with the specified width and height. pub fn new(width: usize, height: usize) -> Self { let mut scr = Surface { width, height, ..Default::default() }; scr.resize(width, height); scr } /// Returns the (width, height) of the surface pub fn dimensions(&self) -> (usize, usize) { (self.width, self.height) } pub fn cursor_position(&self) -> (usize, usize) { (self.xpos, self.ypos) } pub fn cursor_shape(&self) -> Option { self.cursor_shape } pub fn cursor_visibility(&self) -> CursorVisibility { self.cursor_visibility } pub fn title(&self) -> &str { &self.title } /// Resize the Surface to the specified width and height. /// If the width and/or height are smaller than previously, the rows and/or /// columns are truncated. If the width and/or height are larger than /// previously then an appropriate number of cells are added to the /// buffer and filled with default attributes. /// The resize event invalidates the change stream, discarding it and /// causing a subsequent `get_changes` call to yield a full repaint. /// If the cursor position would be outside the bounds of the newly resized /// screen, it will be moved to be within the new bounds. pub fn resize(&mut self, width: usize, height: usize) { // We need to invalidate the change stream prior to this // event, so we nominally generate an entry for the resize // here. Since rendering a resize doesn't make sense, we // don't record a Change entry. Instead what we do is // increment the sequence number and then flush the whole // stream. The next call to get_changes() will perform a // full repaint, and that is what we want. // We only do this if we have any changes buffered. if !self.changes.is_empty() { self.seqno += 1; self.changes.clear(); } self.lines .resize(height, Line::with_width(width, self.seqno)); for line in &mut self.lines { line.resize(width, self.seqno); } self.width = width; self.height = height; // Ensure that the cursor position is well-defined self.xpos = compute_position_change(self.xpos, &Position::Relative(0), self.width); self.ypos = compute_position_change(self.ypos, &Position::Relative(0), self.height); } /// Efficiently apply a series of changes /// Returns the sequence number at the end of the change. pub fn add_changes(&mut self, mut changes: Vec) -> SequenceNo { let seq = self.seqno.saturating_sub(1) + changes.len(); for change in &changes { self.apply_change(&change); } self.seqno += changes.len(); self.changes.append(&mut changes); seq } /// Apply a change and return the sequence number at the end of the change. pub fn add_change>(&mut self, change: C) -> SequenceNo { let seq = self.seqno; self.seqno += 1; let change = change.into(); self.apply_change(&change); self.changes.push(change); seq } fn apply_change(&mut self, change: &Change) { match change { Change::AllAttributes(attr) => self.attributes = attr.clone(), Change::Text(text) => self.print_text(text), Change::Attribute(change) => self.attributes.apply_change(change), Change::CursorPosition { x, y } => self.set_cursor_pos(x, y), Change::ClearScreen(color) => self.clear_screen(*color), Change::ClearToEndOfLine(color) => self.clear_eol(*color), Change::ClearToEndOfScreen(color) => self.clear_eos(*color), Change::CursorColor(color) => self.cursor_color = *color, Change::CursorShape(shape) => self.cursor_shape = Some(*shape), Change::CursorVisibility(visibility) => self.cursor_visibility = *visibility, Change::Image(image) => self.add_image(image), Change::Title(text) => self.title = text.to_owned(), Change::ScrollRegionUp { first_row, region_size, scroll_count, } => self.scroll_region_up(*first_row, *region_size, *scroll_count), Change::ScrollRegionDown { first_row, region_size, scroll_count, } => self.scroll_region_down(*first_row, *region_size, *scroll_count), Change::LineAttribute(attr) => self.line_attribute(attr), } } fn add_image(&mut self, image: &Image) { let xsize = (image.bottom_right.x - image.top_left.x) / image.width as f32; let ysize = (image.bottom_right.y - image.top_left.y) / image.height as f32; if self.ypos + image.height > self.height { let scroll = (self.ypos + image.height) - self.height; for _ in 0..scroll { self.scroll_screen_up(); } self.ypos -= scroll; } let mut ypos = NotNan::new(0.0).unwrap(); for y in 0..image.height { let mut xpos = NotNan::new(0.0).unwrap(); for x in 0..image.width { self.lines[self.ypos + y].set_cell( self.xpos + x, Cell::new( ' ', self.attributes .clone() .set_image(Box::new(ImageCell::new( TextureCoordinate::new( image.top_left.x + xpos, image.top_left.y + ypos, ), TextureCoordinate::new( image.top_left.x + xpos + xsize, image.top_left.y + ypos + ysize, ), image.image.clone(), ))) .clone(), ), self.seqno, ); xpos += xsize; } ypos += ysize; } self.xpos += image.width; } fn clear_screen(&mut self, color: ColorAttribute) { self.attributes = CellAttributes::default().set_background(color).clone(); let cleared = Cell::new(' ', self.attributes.clone()); for line in &mut self.lines { line.fill_range(0..self.width, &cleared, self.seqno); } self.xpos = 0; self.ypos = 0; } fn clear_eos(&mut self, color: ColorAttribute) { self.attributes = CellAttributes::default().set_background(color).clone(); let cleared = Cell::new(' ', self.attributes.clone()); self.lines[self.ypos].fill_range(self.xpos..self.width, &cleared, self.seqno); for line in &mut self.lines.iter_mut().skip(self.ypos + 1) { line.fill_range(0..self.width, &cleared, self.seqno); } } fn clear_eol(&mut self, color: ColorAttribute) { self.attributes = CellAttributes::default().set_background(color).clone(); let cleared = Cell::new(' ', self.attributes.clone()); self.lines[self.ypos].fill_range(self.xpos..self.width, &cleared, self.seqno); } fn scroll_screen_up(&mut self) { self.lines.remove(0); self.lines.push(Line::with_width(self.width, self.seqno)); } fn scroll_region_up(&mut self, start: usize, size: usize, count: usize) { // Replace the first lines with empty lines for index in start..start + min(count, size) { self.lines[index] = Line::with_width(self.width, self.seqno); } // Rotate the remaining lines up the surface. if 0 < count && count < size { self.lines[start..start + size].rotate_left(count); } } fn scroll_region_down(&mut self, start: usize, size: usize, count: usize) { // Replace the last lines with empty lines for index in start + size - min(count, size)..start + size { self.lines[index] = Line::with_width(self.width, self.seqno); } // Rotate the remaining lines down the surface. if 0 < count && count < size { self.lines[start..start + size].rotate_right(count); } } fn line_attribute(&mut self, attr: &LineAttribute) { let line = &mut self.lines[self.ypos]; match attr { LineAttribute::DoubleHeightTopHalfLine => line.set_double_height_top(self.seqno), LineAttribute::DoubleHeightBottomHalfLine => line.set_double_height_bottom(self.seqno), LineAttribute::DoubleWidthLine => line.set_double_width(self.seqno), LineAttribute::SingleWidthLine => line.set_single_width(self.seqno), } } fn print_text(&mut self, text: &str) { for g in Graphemes::new(text) { if g == "\r\n" { self.xpos = 0; let new_y = self.ypos + 1; if new_y >= self.height { self.scroll_screen_up(); } else { self.ypos = new_y; } continue; } if g == "\r" { self.xpos = 0; continue; } if g == "\n" { let new_y = self.ypos + 1; if new_y >= self.height { self.scroll_screen_up(); } else { self.ypos = new_y; } continue; } if self.xpos >= self.width { let new_y = self.ypos + 1; if new_y >= self.height { self.scroll_screen_up(); } else { self.ypos = new_y; } self.xpos = 0; } let cell = Cell::new_grapheme(g, self.attributes.clone(), None); // the max(1) here is to ensure that we advance to the next cell // position for zero-width graphemes. We want to make sure that // they occupy a cell so that we can re-emit them when we output them. // If we didn't do this, then we'd effectively filter them out from // the model, which seems like a lossy design choice. let width = cell.width().max(1); self.lines[self.ypos].set_cell(self.xpos, cell, self.seqno); // Increment the position now; we'll defer processing // wrapping until the next printed character, otherwise // we'll eagerly scroll when we reach the right margin. self.xpos += width; } } fn set_cursor_pos(&mut self, x: &Position, y: &Position) { self.xpos = compute_position_change(self.xpos, x, self.width); self.ypos = compute_position_change(self.ypos, y, self.height); } /// Returns the entire contents of the screen as a string. /// Only the character data is returned. The end of each line is /// returned as a \n character. /// This function exists primarily for testing purposes. pub fn screen_chars_to_string(&self) -> String { let mut s = String::new(); for line in &self.lines { for cell in line.visible_cells() { s.push_str(cell.str()); } s.push('\n'); } s } /// Returns the cell data for the screen. /// This is intended to be used for testing purposes. pub fn screen_cells(&mut self) -> Vec<&mut [Cell]> { let mut lines = Vec::new(); for line in &mut self.lines { lines.push(line.cells_mut()); } lines } pub fn screen_lines(&self) -> Vec> { self.lines.iter().map(|line| Cow::Borrowed(line)).collect() } /// Returns a stream of changes suitable to update the screen /// to match the model. The input `seq` argument should be 0 /// on the first call, or in any situation where the screen /// contents may have been invalidated, otherwise it should /// be set to the `SequenceNo` returned by the most recent call /// to `get_changes`. /// `get_changes` will use a heuristic to decide on the lower /// cost approach to updating the screen and return some sequence /// of `Change` entries that will update the display accordingly. /// The worst case is that this function will fabricate a sequence /// of Change entries to paint the screen from scratch. pub fn get_changes(&self, seq: SequenceNo) -> (SequenceNo, Cow<[Change]>) { // Do we have continuity in the sequence numbering? let first = self.seqno.saturating_sub(self.changes.len()); if seq == 0 || first > seq || self.seqno == 0 { // No, we have folded away some data, we'll need a full paint return (self.seqno, Cow::Owned(self.repaint_all())); } // Approximate cost to render the change screen let delta_cost = self.seqno - seq; // Approximate cost to repaint from scratch let full_cost = self.estimate_full_paint_cost(); if delta_cost > full_cost { (self.seqno, Cow::Owned(self.repaint_all())) } else { (self.seqno, Cow::Borrowed(&self.changes[seq - first..])) } } pub fn has_changes(&self, seq: SequenceNo) -> bool { self.seqno != seq } pub fn current_seqno(&self) -> SequenceNo { self.seqno } /// After having called `get_changes` and processed the resultant /// change stream, the caller can then pass the returned `SequenceNo` /// value to this call to prune the list of changes and free up /// resources from the change log. pub fn flush_changes_older_than(&mut self, seq: SequenceNo) { let first = self.seqno.saturating_sub(self.changes.len()); let idx = seq.saturating_sub(first); if idx > self.changes.len() { return; } self.changes = self.changes.split_off(idx); } /// Without allocating resources, estimate how many Change entries /// we would produce in repaint_all for the current state. fn estimate_full_paint_cost(&self) -> usize { // assume 1 per cell with 20% overhead for attribute changes 3 + (((self.width * self.height) as f64) * 1.2) as usize } fn repaint_all(&self) -> Vec { let mut result = vec![ // Home the cursor and clear the screen to defaults. Hide the // cursor while we're repainting. Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), ]; if !self.title.is_empty() { result.push(Change::Title(self.title.to_owned())); } let mut attr = CellAttributes::default(); let crlf = Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }; // Walk backwards through the lines; the goal is to determine // if the screen ends with a number of clear lines that we // can coalesce together as a ClearToEndOfScreen op. // We track the index (from the end) of the last matching // run, together with the color of that run. let mut trailing_color = None; let mut trailing_idx = None; for (idx, line) in self.lines.iter().rev().enumerate() { let changes = line.changes(&attr); if changes.is_empty() { // The line recorded no changes; this means that the line // consists of spaces and the default background color match trailing_color { Some(other) if other != Default::default() => { // Color doesn't match up, so we have to stop // looking for the ClearToEndOfScreen run here break; } // Color does match Some(_) => continue, // we don't have a run, we should start one None => { trailing_color = Some(Default::default()); trailing_idx = Some(idx); continue; } } } else { let last_change = changes.len() - 1; match (&changes[last_change], trailing_color) { (&Change::ClearToEndOfLine(ref color), None) => { trailing_color = Some(*color); trailing_idx = Some(idx); } (&Change::ClearToEndOfLine(ref color), Some(other)) => { if other == *color { trailing_idx = Some(idx); continue; } else { break; } } _ => break, } } } for (idx, line) in self.lines.iter().enumerate() { match trailing_idx { Some(t) if self.height - t == idx => { let color = trailing_color.expect("didn't set trailing_color along with trailing_idx"); // The first in the sequence of the ClearToEndOfLine may // be batched up here; let's remove it if that is the case. let last_result = result.len() - 1; match result[last_result] { Change::ClearToEndOfLine(col) if col == color => { result.remove(last_result); } _ => {} } result.push(Change::ClearToEndOfScreen(color)); break; } _ => {} } let mut changes = line.changes(&attr); if idx != 0 { // We emit a relative move at the end of each // line with the theory that this will translate // to a short \r\n sequence rather than the longer // absolute cursor positioning sequence result.push(crlf.clone()); } result.append(&mut changes); if let Some(c) = line.visible_cells().last() { attr = c.attrs().clone(); } } // Remove any trailing sequence of cursor movements, as we're // going to just finish up with an absolute move anyway. loop { let result_len = result.len(); if result_len == 0 { break; } match result[result_len - 1] { Change::CursorPosition { .. } => { result.remove(result_len - 1); } _ => break, } } // Place the cursor at its intended position, but only if we moved the // cursor. We don't explicitly track movement but can infer it from the // size of the results: results will have an initial ClearScreen entry // that homes the cursor and a CursorShape entry that hides the cursor. // If the screen is otherwise blank there will be no further entries // and we don't need to emit cursor movement. However, in the // optimization passes above, we may have removed some number of // movement entries, so let's be sure to check the cursor position to // make sure that we don't fail to emit movement. let moved_cursor = result.len() != 2; if moved_cursor || self.xpos != 0 || self.ypos != 0 { result.push(Change::CursorPosition { x: Position::Absolute(self.xpos), y: Position::Absolute(self.ypos), }); } // Set the intended cursor shape. We hid the cursor at the start // of the repaint, so no need to hide it again. if self.cursor_visibility != CursorVisibility::Hidden { result.push(Change::CursorVisibility(CursorVisibility::Visible)); if let Some(shape) = self.cursor_shape { result.push(Change::CursorShape(shape)); } } result } /// Computes the change stream required to make the region within `self` /// at coordinates `x`, `y` and size `width`, `height` look like the /// same sized region within `other` at coordinates `other_x`, `other_y`. /// /// `other` and `self` may be the same, causing regions within the same /// `Surface` to be differenced; this is used by the `copy_region` method. /// /// The returned list of `Change`s can be passed to the `add_changes` method /// to make the region within self match the region within other. #[allow(clippy::too_many_arguments)] pub fn diff_region( &self, x: usize, y: usize, width: usize, height: usize, other: &Surface, other_x: usize, other_y: usize, ) -> Vec { let mut diff_state = DiffState::default(); for ((row_num, line), other_line) in self .lines .iter() .enumerate() .skip(y) .take_while(|(row_num, _)| *row_num < y + height) .zip(other.lines.iter().skip(other_y)) { diff_line( &mut diff_state, line, row_num, other_line, x, width, other_x, ); } diff_state.changes } pub fn diff_lines(&self, other_lines: Vec<&Line>) -> Vec { let mut diff_state = DiffState::default(); for ((row_num, line), other_line) in self.lines.iter().enumerate().zip(other_lines.iter()) { diff_line(&mut diff_state, line, row_num, other_line, 0, line.len(), 0); } diff_state.changes } pub fn diff_against_numbered_line(&self, row_num: usize, other_line: &Line) -> Vec { let mut diff_state = DiffState::default(); if let Some(line) = self.lines.get(row_num) { diff_line(&mut diff_state, line, row_num, other_line, 0, line.len(), 0); } diff_state.changes } /// Computes the change stream required to make `self` have the same /// screen contents as `other`. pub fn diff_screens(&self, other: &Surface) -> Vec { self.diff_region(0, 0, self.width, self.height, other, 0, 0) } /// Draw the contents of `other` into self at the specified coordinates. /// The required updates are recorded as Change entries as well as stored /// in the screen line/cell data. /// Saves the cursor position and attributes that were in effect prior to /// calling `draw_from_screen` and restores them after applying the changes /// from the other surface. pub fn draw_from_screen(&mut self, other: &Surface, x: usize, y: usize) -> SequenceNo { let attrs = self.attributes.clone(); let cursor = (self.xpos, self.ypos); let changes = self.diff_region(x, y, other.width, other.height, other, 0, 0); let seq = self.add_changes(changes); self.xpos = cursor.0; self.ypos = cursor.1; self.attributes = attrs; seq } /// Copy the contents of the specified region to the same sized /// region elsewhere in the screen display. /// The regions may overlap. /// # Panics /// The destination region must be the same size as the source /// (which is implied by the function parameters) and must fit /// within the width and height of the Surface or this operation /// will panic. pub fn copy_region( &mut self, src_x: usize, src_y: usize, width: usize, height: usize, dest_x: usize, dest_y: usize, ) -> SequenceNo { let changes = self.diff_region(dest_x, dest_y, width, height, self, src_x, src_y); self.add_changes(changes) } } /// Populate `diff_state` with changes to replace contents of `line` in range [x,x+width) /// with the contents of `other_line` in range [other_x,other_x+width). fn diff_line( diff_state: &mut DiffState, line: &Line, row_num: usize, other_line: &Line, x: usize, width: usize, other_x: usize, ) { let mut cells = line .visible_cells() .skip_while(|cell| cell.cell_index() < x) .take_while(|cell| cell.cell_index() < x + width) .peekable(); let other_cells = other_line .visible_cells() .skip_while(|cell| cell.cell_index() < other_x) .take_while(|cell| cell.cell_index() < other_x + width); for other_cell in other_cells { let rel_x = other_cell.cell_index() - other_x; let mut comparison_cell = None; // Advance the `cells` iterator to try to find the visible cell in `line` in the equivalent // position to `other_cell`. If there is no visible cell in equivalent position, advance // one past and wait for next iteration. while let Some(cell) = cells.peek() { let cell_rel_x = cell.cell_index() - x; if cell_rel_x == rel_x { comparison_cell = Some(*cell); break; } else if cell_rel_x > rel_x { break; } cells.next(); } // If we find a cell in the equivalent position, diff against it. If not, we know // there is a multi-cell grapheme in `line` that partially overlaps `other_cell`, // so we have to overwrite anyway. if let Some(comparison_cell) = comparison_cell { diff_state.diff_cells(x + rel_x, row_num, comparison_cell, other_cell); } else { diff_state.set_cell(x + rel_x, row_num, other_cell); } } } /// Applies a Position update to either the x or y position. /// The value is clamped to be in the range: 0..limit fn compute_position_change(current: usize, pos: &Position, limit: usize) -> usize { use self::Position::*; match pos { Relative(delta) => { if *delta >= 0 { min( current.saturating_add(*delta as usize), limit.saturating_sub(1), ) } else { current.saturating_sub((*delta).abs() as usize) } } Absolute(abs) => min(*abs, limit.saturating_sub(1)), EndRelative(delta) => limit.saturating_sub(*delta), } } #[cfg(test)] mod test { use super::*; use crate::cell::{AttributeChange, Intensity}; use crate::color::AnsiColor; use crate::image::ImageData; use std::sync::Arc; // The \x20's look a little awkward, but we can't use a plain // space in the first chararcter of a multi-line continuation; // it gets eaten up and ignored. #[test] fn basic_print() { let mut s = Surface::new(4, 3); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20\x20\n\ \x20\x20\x20\x20\n\ \x20\x20\x20\x20\n" ); s.add_change("w00t"); assert_eq!( s.screen_chars_to_string(), "w00t\n\ \x20\x20\x20\x20\n\ \x20\x20\x20\x20\n" ); s.add_change("foo"); assert_eq!( s.screen_chars_to_string(), "w00t\n\ foo\x20\n\ \x20\x20\x20\x20\n" ); s.add_change("baar"); assert_eq!( s.screen_chars_to_string(), "w00t\n\ foob\n\ aar\x20\n" ); s.add_change("baz"); assert_eq!( s.screen_chars_to_string(), "foob\n\ aarb\n\ az\x20\x20\n" ); } #[test] fn newline() { let mut s = Surface::new(4, 4); s.add_change("bloo\rwat\n hey\r\nho"); assert_eq!( s.screen_chars_to_string(), "wato\n\ \x20\x20\x20\x20\n\ hey \n\ ho \n" ); } #[test] fn clear_screen() { let mut s = Surface::new(2, 2); s.add_change("hello"); assert_eq!(s.xpos, 1); assert_eq!(s.ypos, 1); s.add_change(Change::ClearScreen(Default::default())); assert_eq!(s.xpos, 0); assert_eq!(s.ypos, 0); assert_eq!(s.screen_chars_to_string(), " \n \n"); } #[test] fn clear_eol() { let mut s = Surface::new(3, 3); s.add_change("helwowfoo"); s.add_change(Change::ClearToEndOfLine(Default::default())); assert_eq!(s.screen_chars_to_string(), "hel\nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(0), }); s.add_change(Change::ClearToEndOfLine(Default::default())); assert_eq!(s.screen_chars_to_string(), " \nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::ClearToEndOfLine(Default::default())); assert_eq!(s.screen_chars_to_string(), " \nw\nfoo\n"); } #[test] fn clear_eos() { let mut s = Surface::new(3, 3); s.add_change("helwowfoo"); s.add_change(Change::ClearToEndOfScreen(Default::default())); assert_eq!(s.screen_chars_to_string(), "hel\nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::ClearToEndOfScreen(Default::default())); assert_eq!(s.screen_chars_to_string(), "hel\nw\n \n"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text("hel".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::Text("w".into()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn clear_eos_back_color() { let mut s = Surface::new(3, 3); s.add_change(Change::ClearScreen(AnsiColor::Red.into())); s.add_change("helwowfoo"); assert_eq!(s.screen_chars_to_string(), "hel\nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::ClearToEndOfScreen(AnsiColor::Red.into())); assert_eq!(s.screen_chars_to_string(), "hel\nw \n \n"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::AllAttributes( CellAttributes::default() .set_background(AnsiColor::Red) .clone() ), Change::Text("hel".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::Text("w".into()), Change::ClearToEndOfScreen(AnsiColor::Red.into()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn clear_eol_opt() { let mut s = Surface::new(3, 3); s.add_change(Change::Attribute(AttributeChange::Background( AnsiColor::Red.into(), ))); s.add_change("111 333"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::AllAttributes( CellAttributes::default() .set_background(AnsiColor::Red) .clone() ), Change::Text("111".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::ClearToEndOfLine(AnsiColor::Red.into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::Text("333".into()), Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn clear_and_move_cursor() { let mut s = Surface::new(4, 3); s.add_change(Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn cursor_movement() { let mut s = Surface::new(4, 3); s.add_change(Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }); s.add_change("X"); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20\x20\n\ \x20\x20\x20\x20\n\ \x20\x20\x20X\n" ); s.add_change(Change::CursorPosition { x: Position::Relative(-2), y: Position::Relative(-1), }); s.add_change("-"); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20\x20\n\ \x20\x20-\x20\n\ \x20\x20\x20X\n" ); s.add_change(Change::CursorPosition { x: Position::Relative(1), y: Position::Relative(-1), }); s.add_change("-"); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20-\n\ \x20\x20-\x20\n\ \x20\x20\x20X\n" ); } #[test] fn attribute_setting() { use crate::cell::Intensity; let mut s = Surface::new(3, 1); s.add_change("n"); s.add_change(AttributeChange::Intensity(Intensity::Bold)); s.add_change("b"); let mut bold = CellAttributes::default(); bold.set_intensity(Intensity::Bold); assert_eq!( s.screen_cells(), [[ Cell::new('n', CellAttributes::default()), Cell::new('b', bold), Cell::default(), ]] ); } #[test] fn empty_changes() { let s = Surface::new(4, 3); let empty = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::CursorVisibility(CursorVisibility::Visible), ]; let (seq, changes) = s.get_changes(0); assert_eq!(seq, 0); assert_eq!(empty, &*changes); // Using an invalid sequence number should get us the full // repaint also. let (seq, changes) = s.get_changes(1); assert_eq!(seq, 0); assert_eq!(empty, &*changes); } #[test] fn add_changes_empty() { let mut s = Surface::new(2, 2); let last_seq = s.add_change("foo"); assert_eq!(0, last_seq); assert_eq!(last_seq, s.add_changes(vec![])); assert_eq!(last_seq + 1, s.add_changes(vec![Change::Text("a".into())])); } #[test] fn resize_delta_flush() { let mut s = Surface::new(4, 3); s.add_change("a"); let (seq, _) = s.get_changes(0); s.resize(2, 2); let full = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text("a".to_string()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(0), }, Change::CursorVisibility(CursorVisibility::Visible), ]; let (_seq, changes) = s.get_changes(seq); // The resize causes get_changes to return a full repaint assert_eq!(full, &*changes); } #[test] fn dont_lose_first_char_on_attr_change() { let mut s = Surface::new(2, 2); s.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Maroon.into(), ))); s.add_change("ab"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::AllAttributes( CellAttributes::default() .set_foreground(AnsiColor::Maroon) .clone() ), Change::Text("ab".into()), Change::CursorPosition { x: Position::Absolute(2), y: Position::Absolute(0), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn resize_cursor_position() { let mut s = Surface::new(4, 4); s.add_change(" a"); s.add_change(Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(3), }); assert_eq!(s.xpos, 3); assert_eq!(s.ypos, 3); s.resize(2, 2); assert_eq!(s.xpos, 1); assert_eq!(s.ypos, 1); let full = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text(" a".to_string()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }, Change::CursorVisibility(CursorVisibility::Visible), ]; let (_seq, changes) = s.get_changes(0); assert_eq!(full, &*changes); } #[test] fn delta_change() { let mut s = Surface::new(4, 3); // flushing nothing should be a NOP s.flush_changes_older_than(0); // check that using an invalid index doesn't panic s.flush_changes_older_than(1); let initial = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text("a".to_string()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(0), }, Change::CursorVisibility(CursorVisibility::Visible), ]; let seq_pos = { let next_seq = s.add_change("a"); let (seq, changes) = s.get_changes(0); assert_eq!(seq, next_seq + 1); assert_eq!(initial, &*changes); seq }; let seq_pos = { let next_seq = s.add_change("b"); let (seq, changes) = s.get_changes(seq_pos); assert_eq!(seq, next_seq + 1); assert_eq!(&[Change::Text("b".to_string())], &*changes); seq }; // prep some deltas for the loop to test below { s.add_change(Change::Attribute(AttributeChange::Intensity( Intensity::Bold, ))); s.add_change("c"); s.add_change(Change::Attribute(AttributeChange::Intensity( Intensity::Normal, ))); s.add_change("d"); } // Do this three times to ennsure that the behavior is consistent // across multiple flush calls for _ in 0..3 { { let (_seq, changes) = s.get_changes(seq_pos); assert_eq!( &[ Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("c".to_string()), Change::Attribute(AttributeChange::Intensity(Intensity::Normal)), Change::Text("d".to_string()), ], &*changes ); } // Flush the changes so that the next iteration is run on a pruned // set of changes. It should not change the outcome of the body // of the loop. s.flush_changes_older_than(seq_pos); } } #[test] fn diff_screens() { let mut s = Surface::new(4, 3); s.add_change("w00t"); s.add_change("foo"); s.add_change("baar"); s.add_change("baz"); assert_eq!( s.screen_chars_to_string(), "foob\n\ aarb\n\ az \n" ); let s2 = Surface::new(2, 2); { // We want to sample the top left corner let changes = s2.diff_region(0, 0, 2, 2, &s, 0, 0); assert_eq!( vec![ Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(0), }, Change::AllAttributes(CellAttributes::default()), Change::Text("fo".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(1), }, Change::Text("aa".into()), ], changes ); } // Throw in some attribute changes too s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::Attribute(AttributeChange::Intensity( Intensity::Bold, ))); s.add_change("XO"); { let changes = s2.diff_region(0, 0, 2, 2, &s, 1, 1); assert_eq!( vec![ Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(0), }, Change::AllAttributes( CellAttributes::default() .set_intensity(Intensity::Bold) .clone(), ), Change::Text("XO".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(1), }, Change::AllAttributes(CellAttributes::default()), Change::Text("z".into()), /* There's no change for the final character * position because it is a space in both regions. */ ], changes ); } } #[test] fn draw_screens() { let mut s = Surface::new(4, 4); let mut s1 = Surface::new(2, 2); s1.add_change("1234"); let mut s2 = Surface::new(2, 2); s2.add_change("XYZA"); s.draw_from_screen(&s1, 0, 0); s.draw_from_screen(&s2, 2, 2); assert_eq!( s.screen_chars_to_string(), "12 \n\ 34 \n\ \x20\x20XY\n\ \x20\x20ZA\n" ); } #[test] fn draw_colored_region() { let mut dest = Surface::new(4, 4); dest.add_change("A"); let mut src = Surface::new(2, 2); src.add_change(Change::ClearScreen(AnsiColor::Blue.into())); dest.draw_from_screen(&src, 2, 2); assert_eq!( dest.screen_chars_to_string(), "A \n\ \x20 \n\ \x20 \n\ \x20 \n" ); let blue_space = Cell::new( ' ', CellAttributes::default() .set_background(AnsiColor::Blue) .clone(), ); assert_eq!( dest.screen_cells(), [ [ Cell::new('A', CellAttributes::default()), Cell::default(), Cell::default(), Cell::default(), ], [ Cell::default(), Cell::default(), Cell::default(), Cell::default(), ], [ Cell::default(), Cell::default(), blue_space.clone(), blue_space.clone(), ], [ Cell::default(), Cell::default(), blue_space.clone(), blue_space.clone(), ] ] ); assert_eq!(dest.xpos, 1); assert_eq!(dest.ypos, 0); assert_eq!(dest.attributes, Default::default()); dest.add_change("B"); assert_eq!( dest.screen_chars_to_string(), "AB \n\ \x20 \n\ \x20 \n\ \x20 \n" ); } #[test] fn copy_region() { let mut s = Surface::new(4, 3); s.add_change("w00t"); s.add_change("foo"); s.add_change("baar"); s.add_change("baz"); assert_eq!( s.screen_chars_to_string(), "foob\n\ aarb\n\ az \n" ); // Copy top left to bottom left s.copy_region(0, 0, 2, 2, 2, 1); assert_eq!( s.screen_chars_to_string(), "foob\n\ aafo\n\ azaa\n" ); } #[test] fn double_width() { let mut s = Surface::new(4, 1); s.add_change("🤷12"); assert_eq!(s.screen_chars_to_string(), "🤷12\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(0), }); s.add_change("a🤷"); assert_eq!(s.screen_chars_to_string(), " a🤷\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(2), y: Position::Absolute(0), }); s.add_change("x"); assert_eq!(s.screen_chars_to_string(), " ax \n"); } #[test] fn draw_double_width() { let mut s = Surface::new(4, 1); s.add_change("か a"); assert_eq!(s.screen_chars_to_string(), "か a\n"); let mut s2 = Surface::new(4, 1); s2.draw_from_screen(&s, 0, 0); // Verify no issue when the second visible cells on both sides // are identical (' 's) but they are at different cell indices. assert_eq!(s2.screen_chars_to_string(), "か a\n"); let s3 = Surface::new(4, 1); s2.draw_from_screen(&s3, 0, 0); // Verify same but in other direction assert_eq!(s2.screen_chars_to_string(), " \n"); let mut s4 = Surface::new(4, 1); s4.add_change("abcd"); s.draw_from_screen(&s4, 0, 0); // Verify that all overlapping cells are updated when cell widths // differ on each side. assert_eq!(s.screen_chars_to_string(), "abcd\n"); } #[test] fn diff_cursor_double_width() { let mut s = Surface::new(3, 1); s.add_change("かa"); let s2 = Surface::new(3, 1); let changes = s2.diff_region(0, 0, 3, 1, &s, 0, 0); assert_eq!( changes .iter() .filter(|change| matches!(change, Change::CursorPosition { .. })) .count(), 1 ); } #[test] fn zero_width() { let mut s = Surface::new(4, 1); // https://en.wikipedia.org/wiki/Zero-width_space s.add_change("A\u{200b}B"); assert_eq!(s.screen_chars_to_string(), "A\u{200b}B \n"); } #[test] fn images() { // a dummy image blob with nonsense content let data = Arc::new(ImageData::with_raw_data(vec![])); let mut s = Surface::new(2, 2); s.add_change(Change::Image(Image { top_left: TextureCoordinate::new_f32(0.0, 0.0), bottom_right: TextureCoordinate::new_f32(1.0, 1.0), image: data.clone(), width: 4, height: 2, })); // We're checking that we slice the image up and assign the correct // texture coordinates for each cell. The width and height are // different from each other to help ensure that the right terms // are used by add_image() function. assert_eq!( s.screen_cells(), [ [ Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.0, 0.0), TextureCoordinate::new_f32(0.25, 0.5), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.25, 0.0), TextureCoordinate::new_f32(0.5, 0.5), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.5, 0.0), TextureCoordinate::new_f32(0.75, 0.5), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.75, 0.0), TextureCoordinate::new_f32(1.0, 0.5), data.clone() ))) .clone() ), ], [ Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.0, 0.5), TextureCoordinate::new_f32(0.25, 1.0), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.25, 0.5), TextureCoordinate::new_f32(0.5, 1.0), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.5, 0.5), TextureCoordinate::new_f32(0.75, 1.0), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.75, 0.5), TextureCoordinate::new_f32(1.0, 1.0), data.clone() ))) .clone() ), ], ] ); // Check that starting at not the texture origin coordinates // gives reasonable values in the resultant cell let mut other = Surface::new(1, 1); other.add_change(Change::Image(Image { top_left: TextureCoordinate::new_f32(0.25, 0.3), bottom_right: TextureCoordinate::new_f32(0.75, 0.8), image: data.clone(), width: 1, height: 1, })); assert_eq!( other.screen_cells(), [[Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.25, 0.3), TextureCoordinate::new_f32(0.75, 0.8), data.clone() ))) .clone() ),]] ); } } termwiz-0.23.3/src/terminal/buffered.rs000064400000000000000000000107351046102023000161520ustar 00000000000000//! A Terminal buffered with a Surface use crate::surface::{SequenceNo, Surface}; use crate::terminal::Terminal; use crate::Result; use std::ops::{Deref, DerefMut}; /// `BufferedTerminal` is a convenience wrapper around both /// a `Terminal` and a `Surface`. It enables easier use of /// the output optimization features available to `Surface` /// and internally keeps track of the sequence number. /// `BufferedTerminal` derefs to `Surface` and makes available /// the surface API. /// The `flush` method is used to compute the optimized set /// of changes and actually render them to the underlying /// `Terminal`. No output will be visible until it is flushed! pub struct BufferedTerminal { terminal: T, surface: Surface, seqno: SequenceNo, } impl BufferedTerminal { /// Create a new `BufferedTerminal` with a `Surface` of /// a matching size. pub fn new(mut terminal: T) -> Result { let size = terminal.get_screen_size()?; let surface = Surface::new(size.cols, size.rows); Ok(Self { terminal, surface, seqno: 0, }) } /// Get a mutable reference to the underlying terminal instance pub fn terminal(&mut self) -> &mut T { &mut self.terminal } /// Compute the set of changes needed to update the screen to /// match the current contents of the embedded `Surface` and /// send them to the `Terminal`. /// If some other process has output over the terminal screen, /// or other artifacts are present, this routine has no way to /// detect the lose of synchronization. /// Applications typically build in a refresh function (CTRL-L /// is common for unix applications) to request a repaint. /// You can use the `repaint` function for that situation. pub fn flush(&mut self) -> Result<()> { { let (seq, changes) = self.surface.get_changes(self.seqno); // If we encounter an error during rendering, we want to // reset the sequence number so that a subsequent paint // renders all. self.seqno = 0; self.terminal.render(&changes)?; //self.terminal.flush()?; self.seqno = seq; } self.surface.flush_changes_older_than(self.seqno); Ok(()) } /// Clears the screen and re-draws the surface contents onto /// the Terminal. pub fn repaint(&mut self) -> Result<()> { self.seqno = 0; self.flush() } /// Check to see if the Terminal has been resized by its user. /// If it has, resize the surface to match the new dimensions /// and return true. If the terminal was resized, the application /// will typically want to apply changes to match the new size /// and follow it up with a `flush` call to update the screen. /// /// Why isn't this automatic? On Unix systems the SIGWINCH signal /// is used to indicate that a terminal size has changed. This notification /// is completely out of band from the interactions with the underlying /// terminal device, and thus requires a function such as this one to /// be called after receipt of SIGWINCH, or just speculatively from time /// to time. /// /// Attaching signal handlers unilaterally from a library is undesirable, /// as the embedding application may have strong opinions about how /// best to do such a thing, so we do not automatically configure a /// signal handler. /// /// On Windows it is possible to receive notification about window /// resizing by processing input events. Enabling those requires /// manipulating the input mode and establishing a handler to /// consume the input records. Such a thing is possible, but is /// better suited for a higher level abstraction than this basic /// `BufferedTerminal` interface. pub fn check_for_resize(&mut self) -> Result { let size = self.terminal.get_screen_size()?; let (width, height) = self.surface.dimensions(); if (width != size.cols) || (height != size.rows) { self.surface.resize(size.cols, size.rows); Ok(true) } else { Ok(false) } } } impl Deref for BufferedTerminal { type Target = Surface; fn deref(&self) -> &Surface { &self.surface } } impl DerefMut for BufferedTerminal { fn deref_mut(&mut self) -> &mut Surface { &mut self.surface } } termwiz-0.23.3/src/terminal/mod.rs000064400000000000000000000116431046102023000151460ustar 00000000000000//! An abstraction over a terminal device use crate::caps::probed::ProbeCapabilities; use crate::caps::Capabilities; use crate::input::InputEvent; use crate::surface::Change; use crate::{format_err, Result}; use num_traits::NumCast; use std::fmt::Display; use std::time::Duration; #[cfg(unix)] pub mod unix; #[cfg(windows)] pub mod windows; pub mod buffered; #[cfg(unix)] pub use self::unix::{UnixTerminal, UnixTerminalWaker as TerminalWaker}; #[cfg(windows)] pub use self::windows::{WindowsTerminal, WindowsTerminalWaker as TerminalWaker}; /// Represents the size of the terminal screen. /// The number of rows and columns of character cells are expressed. /// Some implementations populate the size of those cells in pixels. // On Windows, GetConsoleFontSize() can return the size of a cell in // logical units and we can probably use this to populate xpixel, ypixel. // GetConsoleScreenBufferInfo() can return the rows and cols. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ScreenSize { /// The number of rows of text pub rows: usize, /// The number of columns per row pub cols: usize, /// The width of a cell in pixels. Some implementations never /// set this to anything other than zero. pub xpixel: usize, /// The height of a cell in pixels. Some implementations never /// set this to anything other than zero. pub ypixel: usize, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Blocking { DoNotWait, Wait, } /// `Terminal` abstracts over some basic terminal capabilities. /// If the `set_raw_mode` or `set_cooked_mode` functions are used in /// any combination, the implementation is required to restore the /// terminal mode that was in effect when it was created. pub trait Terminal { /// Raw mode disables input line buffering, allowing data to be /// read as the user presses keys, disables local echo, so keys /// pressed by the user do not implicitly render to the terminal /// output, and disables canonicalization of unix newlines to CRLF. fn set_raw_mode(&mut self) -> Result<()>; fn set_cooked_mode(&mut self) -> Result<()>; /// Enter the alternate screen. The alternate screen will be left /// automatically when the `Terminal` is dropped. fn enter_alternate_screen(&mut self) -> Result<()>; /// Exit the alternate screen. fn exit_alternate_screen(&mut self) -> Result<()>; /// Queries the current screen size, returning width, height. fn get_screen_size(&mut self) -> Result; /// Returns a capability probing helper that will use escape /// sequences to attempt to probe information from the terminal fn probe_capabilities(&mut self) -> Option { None } /// Sets the current screen size fn set_screen_size(&mut self, size: ScreenSize) -> Result<()>; /// Render a series of changes to the terminal output fn render(&mut self, changes: &[Change]) -> Result<()>; /// Flush any buffered output fn flush(&mut self) -> Result<()>; /// Check for a parsed input event. /// `wait` indicates the behavior in the case that no input is /// immediately available. If wait is `None` then `poll_input` /// will not return until an event is available. If wait is /// `Some(duration)` then `poll_input` will wait up to the given /// duration for an event before returning with a value of /// `Ok(None)`. If wait is `Some(Duration::ZERO)` then the /// poll is non-blocking. /// /// The possible values returned as `InputEvent`s depend on the /// mode of the terminal. Most values are not returned unless /// the terminal is set to raw mode. fn poll_input(&mut self, wait: Option) -> Result>; fn waker(&self) -> TerminalWaker; } /// `SystemTerminal` is a concrete implementation of `Terminal`. /// Ideally you wouldn't reference `SystemTerminal` in consuming /// code. This type is exposed for convenience if you are doing /// something unusual and want easier access to the constructors. #[cfg(unix)] pub type SystemTerminal = UnixTerminal; #[cfg(windows)] pub type SystemTerminal = WindowsTerminal; /// Construct a new instance of Terminal. /// The terminal will have a renderer that is influenced by the configuration /// in the provided `Capabilities` instance. /// The terminal will explicitly open `/dev/tty` on Unix systems and /// `CONIN$` and `CONOUT$` on Windows systems, so that it should yield a /// functioning console with minimal headaches. /// If you have a more advanced use case you will want to look to the /// constructors for `UnixTerminal` and `WindowsTerminal` and call whichever /// one is most suitable for your needs. pub fn new_terminal(caps: Capabilities) -> Result { SystemTerminal::new(caps) } pub(crate) fn cast(n: T) -> Result { num_traits::cast(n).ok_or_else(|| format_err!("{} is out of bounds for this system", n)) } termwiz-0.23.3/src/terminal/unix.rs000064400000000000000000000421631046102023000153530ustar 00000000000000use crate::render::RenderTty; use crate::terminal::ProbeCapabilities; use crate::{bail, Context, Result}; use filedescriptor::{poll, pollfd, FileDescriptor, POLLIN}; use libc::{self, winsize}; use signal_hook::{self, SigId}; use std::collections::VecDeque; use std::error::Error as _; use std::fs::OpenOptions; use std::io::{stdin, stdout, Error as IoError, ErrorKind, Read, Write}; use std::mem; use std::os::unix::io::AsRawFd; use std::os::unix::net::UnixStream; use std::sync::{Arc, Mutex}; use std::time::Duration; use termios::{ cfmakeraw, tcdrain, tcflush, tcsetattr, Termios, TCIFLUSH, TCIOFLUSH, TCOFLUSH, TCSADRAIN, TCSAFLUSH, TCSANOW, }; use crate::caps::Capabilities; use crate::escape::csi::{DecPrivateMode, DecPrivateModeCode, Mode, XtermKeyModifierResource, CSI}; use crate::input::{InputEvent, InputParser}; use crate::render::terminfo::TerminfoRenderer; use crate::surface::Change; use crate::terminal::{cast, Blocking, ScreenSize, Terminal}; const BUF_SIZE: usize = 4096; pub enum Purge { InputQueue, OutputQueue, InputAndOutputQueue, } pub enum SetAttributeWhen { /// changes are applied immediately Now, /// Apply once the current output queue has drained AfterDrainOutputQueue, /// Wait for the current output queue to drain, then /// discard any unread input AfterDrainOutputQueuePurgeInputQueue, } pub trait UnixTty { fn get_size(&mut self) -> Result; fn set_size(&mut self, size: winsize) -> Result<()>; fn get_termios(&mut self) -> Result; fn set_termios(&mut self, termios: &Termios, when: SetAttributeWhen) -> Result<()>; /// Waits until all written data has been transmitted. fn drain(&mut self) -> Result<()>; fn purge(&mut self, purge: Purge) -> Result<()>; } pub struct TtyReadHandle { fd: FileDescriptor, } impl TtyReadHandle { fn new(fd: FileDescriptor) -> Self { Self { fd } } fn set_blocking(&mut self, blocking: Blocking) -> Result<()> { self.fd.set_non_blocking(blocking == Blocking::DoNotWait)?; Ok(()) } } impl Read for TtyReadHandle { fn read(&mut self, buf: &mut [u8]) -> std::result::Result { let size = unsafe { libc::read(self.fd.as_raw_fd(), buf.as_mut_ptr() as *mut _, buf.len()) }; if size == -1 { Err(IoError::last_os_error()) } else { Ok(size as usize) } } } pub struct TtyWriteHandle { fd: FileDescriptor, write_buffer: Vec, } impl TtyWriteHandle { fn new(fd: FileDescriptor) -> Self { Self { fd, write_buffer: Vec::with_capacity(BUF_SIZE), } } fn flush_local_buffer(&mut self) -> std::result::Result<(), IoError> { if !self.write_buffer.is_empty() { self.fd.write_all(&self.write_buffer)?; self.write_buffer.clear(); } Ok(()) } fn modify_other_keys(&mut self, level: i64) -> std::io::Result<()> { write!( self, "{}", CSI::Mode(Mode::XtermKeyMode { resource: XtermKeyModifierResource::OtherKeys, value: Some(level), }) ) } } impl Write for TtyWriteHandle { fn write(&mut self, buf: &[u8]) -> std::result::Result { if self.write_buffer.len() + buf.len() > self.write_buffer.capacity() { self.flush()?; } if buf.len() >= self.write_buffer.capacity() { self.fd.write(buf) } else { self.write_buffer.write(buf) } } fn flush(&mut self) -> std::result::Result<(), IoError> { self.flush_local_buffer()?; self.drain() .map_err(|e| IoError::new(ErrorKind::Other, format!("{}", e)))?; Ok(()) } } impl RenderTty for TtyWriteHandle { fn get_size_in_cells(&mut self) -> Result<(usize, usize)> { let size = self.get_size()?; Ok((size.ws_col as usize, size.ws_row as usize)) } } impl UnixTty for TtyWriteHandle { fn get_size(&mut self) -> Result { let mut size: winsize = unsafe { mem::zeroed() }; if unsafe { libc::ioctl(self.fd.as_raw_fd(), libc::TIOCGWINSZ as _, &mut size) } != 0 { bail!("failed to ioctl(TIOCGWINSZ): {}", IoError::last_os_error()); } Ok(size) } fn set_size(&mut self, size: winsize) -> Result<()> { if unsafe { libc::ioctl( self.fd.as_raw_fd(), libc::TIOCSWINSZ as _, &size as *const _, ) } != 0 { bail!( "failed to ioctl(TIOCSWINSZ): {:?}", IoError::last_os_error() ); } Ok(()) } fn get_termios(&mut self) -> Result { Termios::from_fd(self.fd.as_raw_fd()).context("get_termios failed") } fn set_termios(&mut self, termios: &Termios, when: SetAttributeWhen) -> Result<()> { let when = match when { SetAttributeWhen::Now => TCSANOW, SetAttributeWhen::AfterDrainOutputQueue => TCSADRAIN, SetAttributeWhen::AfterDrainOutputQueuePurgeInputQueue => TCSAFLUSH, }; tcsetattr(self.fd.as_raw_fd(), when, termios).context("set_termios failed") } fn drain(&mut self) -> Result<()> { tcdrain(self.fd.as_raw_fd()).context("tcdrain failed") } fn purge(&mut self, purge: Purge) -> Result<()> { let param = match purge { Purge::InputQueue => TCIFLUSH, Purge::OutputQueue => TCOFLUSH, Purge::InputAndOutputQueue => TCIOFLUSH, }; tcflush(self.fd.as_raw_fd(), param).context("tcflush failed") } } /// A unix style terminal pub struct UnixTerminal { read: TtyReadHandle, write: TtyWriteHandle, saved_termios: Termios, renderer: TerminfoRenderer, input_parser: InputParser, input_queue: VecDeque, sigwinch_id: SigId, sigwinch_pipe: UnixStream, wake_pipe: UnixStream, wake_pipe_write: Arc>, caps: Capabilities, in_alternate_screen: bool, } impl UnixTerminal { /// Attempt to create an instance from the stdin and stdout of the /// process. This will fail unless both are associated with a tty. /// Note that this will duplicate the underlying file descriptors /// and will no longer participate in the stdin/stdout locking /// provided by the rust standard library. pub fn new_from_stdio(caps: Capabilities) -> Result { Self::new_with(caps, &stdin(), &stdout()) } pub fn new_with( caps: Capabilities, read: &A, write: &B, ) -> Result { let mut read = TtyReadHandle::new(FileDescriptor::dup(read)?); let mut write = TtyWriteHandle::new(FileDescriptor::dup(write)?); let saved_termios = write.get_termios()?; let renderer = TerminfoRenderer::new(caps.clone()); let input_parser = InputParser::new(); let input_queue = VecDeque::new(); let (sigwinch_pipe, sigwinch_pipe_write) = UnixStream::pair()?; let sigwinch_id = signal_hook::low_level::pipe::register(libc::SIGWINCH, sigwinch_pipe_write)?; sigwinch_pipe.set_nonblocking(true)?; let (wake_pipe, wake_pipe_write) = UnixStream::pair()?; wake_pipe.set_nonblocking(true)?; wake_pipe_write.set_nonblocking(true)?; read.set_blocking(Blocking::Wait)?; Ok(UnixTerminal { caps, read, write, saved_termios, renderer, input_parser, input_queue, sigwinch_pipe, sigwinch_id, wake_pipe, wake_pipe_write: Arc::new(Mutex::new(wake_pipe_write)), in_alternate_screen: false, }) } /// Attempt to explicitly open a handle to the terminal device /// (/dev/tty) and build a `UnixTerminal` from there. This will /// yield a terminal even if the stdio streams have been redirected, /// provided that the process has an associated controlling terminal. pub fn new(caps: Capabilities) -> Result { let file = OpenOptions::new().read(true).write(true).open("/dev/tty")?; Self::new_with(caps, &file, &file) } /// Test whether we caught delivery of SIGWINCH. /// If so, yield an `InputEvent` with the current size of the tty. fn caught_sigwinch(&mut self) -> Result> { let mut buf = [0u8; 64]; match self.sigwinch_pipe.read(&mut buf) { Ok(0) => Ok(None), Ok(_) => { let size = self.write.get_size()?; Ok(Some(InputEvent::Resized { rows: cast(size.ws_row)?, cols: cast(size.ws_col)?, })) } Err(ref e) if e.kind() == ErrorKind::WouldBlock || e.kind() == ErrorKind::Interrupted => { Ok(None) } Err(e) => bail!("failed to read sigwinch pipe {}", e), } } } #[derive(Clone)] pub struct UnixTerminalWaker { pipe: Arc>, } impl UnixTerminalWaker { pub fn wake(&self) -> std::result::Result<(), IoError> { let mut pipe = self.pipe.lock().unwrap(); match pipe.write(b"W") { Err(e) => match e.kind() { ErrorKind::WouldBlock => Ok(()), _ => Err(e), }, Ok(_) => Ok(()), } } } impl Terminal for UnixTerminal { fn set_raw_mode(&mut self) -> Result<()> { let mut raw = self.write.get_termios()?; cfmakeraw(&mut raw); self.write .set_termios(&raw, SetAttributeWhen::AfterDrainOutputQueuePurgeInputQueue) .context("failed to set raw mode")?; macro_rules! decset { ($variant:ident) => { write!( self.write, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) )?; }; } if self.caps.bracketed_paste() { decset!(BracketedPaste); } if self.caps.mouse_reporting() { decset!(AnyEventMouse); decset!(SGRMouse); } self.write.modify_other_keys(2)?; self.write.flush()?; Ok(()) } fn set_cooked_mode(&mut self) -> Result<()> { self.write.modify_other_keys(1)?; self.write .set_termios(&self.saved_termios, SetAttributeWhen::Now) } fn enter_alternate_screen(&mut self) -> Result<()> { if !self.in_alternate_screen { write!( self.write, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = true; } Ok(()) } fn exit_alternate_screen(&mut self) -> Result<()> { if self.in_alternate_screen { write!( self.write, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = false; } Ok(()) } fn get_screen_size(&mut self) -> Result { let size = self.write.get_size()?; Ok(ScreenSize { rows: cast(size.ws_row)?, cols: cast(size.ws_col)?, xpixel: cast(size.ws_xpixel)?, ypixel: cast(size.ws_ypixel)?, }) } fn probe_capabilities(&mut self) -> Option { Some(ProbeCapabilities::new(&mut self.read, &mut self.write)) } fn set_screen_size(&mut self, size: ScreenSize) -> Result<()> { let size = winsize { ws_row: cast(size.rows)?, ws_col: cast(size.cols)?, ws_xpixel: cast(size.xpixel)?, ws_ypixel: cast(size.ypixel)?, }; self.write.set_size(size) } fn render(&mut self, changes: &[Change]) -> Result<()> { self.renderer.render_to(changes, &mut self.write) } fn flush(&mut self) -> Result<()> { self.write.flush().context("flush failed") } fn poll_input(&mut self, wait: Option) -> Result> { if let Some(event) = self.input_queue.pop_front() { return Ok(Some(event)); } // Some unfortunately verbose code here. In order to safely hook and process // SIGWINCH we need to use the self-pipe trick to deliver signals to a pipe // so that we can use poll(2) to wait for events on both the tty input and // the sigwinch pipe at the same time. In theory we could do away with this // and use sigaction to register SIGWINCH without SA_RESTART set; that way // we could do a blocking read and have it get EINTR on a resize. // Doing such a thing may introduce more problems for other components in // the rust crate ecosystem if they're not ready to deal with EINTR, so // we opt to take on the complexity here to make things overall easier to // integrate. let mut pfd = [ pollfd { fd: self.sigwinch_pipe.as_raw_fd(), events: POLLIN, revents: 0, }, pollfd { fd: self.read.fd.as_raw_fd(), events: POLLIN, revents: 0, }, pollfd { fd: self.wake_pipe.as_raw_fd(), events: POLLIN, revents: 0, }, ]; if let Err(err) = poll(&mut pfd, wait) { return match err .source() .ok_or_else(|| anyhow::anyhow!("error has no source! {:#}", err))? .downcast_ref::() { Some(err) => { if err.kind() == ErrorKind::Interrupted { // SIGWINCH may have been the source of the interrupt. // Check for that now so that we reduce the latency of // processing the resize if let Some(resize) = self.caught_sigwinch()? { Ok(Some(resize)) } else { Ok(None) } } else { bail!("poll(2) error: {}", err) } } None => bail!("poll(2) error: {}", err), }; }; if pfd[0].revents != 0 { // SIGWINCH received via our pipe? if let Some(resize) = self.caught_sigwinch()? { return Ok(Some(resize)); } } if pfd[1].revents != 0 { let mut buf = [0u8; 64]; match self.read.read(&mut buf) { Ok(n) => { let input_queue = &mut self.input_queue; self.input_parser.parse( &buf[0..n], |evt| input_queue.push_back(evt), n == buf.len(), ); return Ok(self.input_queue.pop_front()); } Err(ref e) if e.kind() == ErrorKind::WouldBlock || e.kind() == ErrorKind::Interrupted => {} Err(e) => bail!("failed to read input {}", e), } } if pfd[2].revents != 0 { let mut buf = [0u8; 64]; if let Ok(n) = self.wake_pipe.read(&mut buf) { if n > 0 { return Ok(Some(InputEvent::Wake)); } } } Ok(None) } fn waker(&self) -> UnixTerminalWaker { UnixTerminalWaker { pipe: self.wake_pipe_write.clone(), } } } impl Drop for UnixTerminal { fn drop(&mut self) { macro_rules! decreset { ($variant:ident) => { write!( self.write, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) ) .unwrap(); }; } self.render(&[Change::CursorVisibility( crate::surface::CursorVisibility::Visible, )]) .ok(); if self.caps.bracketed_paste() { decreset!(BracketedPaste); } if self.caps.mouse_reporting() { decreset!(SGRMouse); decreset!(AnyEventMouse); } self.write.modify_other_keys(0).unwrap(); self.exit_alternate_screen().unwrap(); self.write.flush().unwrap(); signal_hook::low_level::unregister(self.sigwinch_id); self.write .set_termios(&self.saved_termios, SetAttributeWhen::Now) .expect("failed to restore original termios state"); } } termwiz-0.23.3/src/terminal/windows.rs000064400000000000000000000662641046102023000160720ustar 00000000000000use crate::escape::csi::{DecPrivateMode, DecPrivateModeCode, Mode, CSI}; use crate::istty::IsTty; use crate::terminal::ProbeCapabilities; use crate::{bail, ensure, format_err, Result}; use filedescriptor::{FileDescriptor, OwnedHandle}; use std::cmp::{max, min}; use std::collections::VecDeque; use std::fs::OpenOptions; use std::io::{stdin, stdout, Error as IoError, Read, Result as IoResult, Write}; use std::os::windows::io::{AsRawHandle, FromRawHandle}; use std::sync::Arc; use std::time::Duration; use std::{mem, ptr}; use winapi::shared::winerror::WAIT_TIMEOUT; use winapi::um::consoleapi; use winapi::um::synchapi::{CreateEventW, SetEvent, WaitForMultipleObjects}; use winapi::um::winbase::{INFINITE, WAIT_FAILED, WAIT_OBJECT_0}; use winapi::um::wincon::{ FillConsoleOutputAttribute, FillConsoleOutputCharacterW, GetConsoleScreenBufferInfo, ReadConsoleOutputW, ScrollConsoleScreenBufferW, SetConsoleCP, SetConsoleCursorPosition, SetConsoleOutputCP, SetConsoleScreenBufferSize, SetConsoleTextAttribute, SetConsoleWindowInfo, WriteConsoleOutputW, CHAR_INFO, CONSOLE_SCREEN_BUFFER_INFO, COORD, DISABLE_NEWLINE_AUTO_RETURN, ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_MOUSE_INPUT, ENABLE_PROCESSED_INPUT, ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_VIRTUAL_TERMINAL_PROCESSING, ENABLE_WINDOW_INPUT, INPUT_RECORD, SMALL_RECT, }; use winapi::um::winnls::CP_UTF8; use crate::caps::Capabilities; use crate::input::{InputEvent, InputParser}; use crate::render::terminfo::TerminfoRenderer; use crate::render::windows::WindowsConsoleRenderer; use crate::render::RenderTty; use crate::surface::Change; use crate::terminal::{cast, ScreenSize, Terminal}; const BUF_SIZE: usize = 128; enum Renderer { Terminfo(TerminfoRenderer), Windows(WindowsConsoleRenderer), } pub trait ConsoleInputHandle { fn set_input_mode(&mut self, mode: u32) -> Result<()>; fn get_input_mode(&mut self) -> Result; fn set_input_cp(&mut self, cp: u32) -> Result<()>; fn get_input_cp(&mut self) -> u32; fn get_number_of_input_events(&mut self) -> Result; fn read_console_input(&mut self, num_events: usize) -> Result>; } pub trait ConsoleOutputHandle { fn set_output_mode(&mut self, mode: u32) -> Result<()>; fn get_output_mode(&mut self) -> Result; fn set_output_cp(&mut self, cp: u32) -> Result<()>; fn get_output_cp(&mut self) -> u32; fn fill_char(&mut self, text: char, x: i16, y: i16, len: u32) -> Result; fn fill_attr(&mut self, attr: u16, x: i16, y: i16, len: u32) -> Result; fn set_attr(&mut self, attr: u16) -> Result<()>; fn set_cursor_position(&mut self, x: i16, y: i16) -> Result<()>; fn get_buffer_info(&mut self) -> Result; fn get_buffer_contents(&mut self) -> Result>; fn set_buffer_contents(&mut self, buffer: &[CHAR_INFO]) -> Result<()>; fn set_viewport(&mut self, left: i16, top: i16, right: i16, bottom: i16) -> Result<()>; fn scroll_region( &mut self, left: i16, top: i16, right: i16, bottom: i16, dx: i16, dy: i16, attr: u16, ) -> Result<()>; } struct InputHandle { handle: FileDescriptor, } impl Read for InputHandle { fn read(&mut self, buf: &mut [u8]) -> IoResult { self.handle.read(buf) } } impl ConsoleInputHandle for InputHandle { fn set_input_mode(&mut self, mode: u32) -> Result<()> { if unsafe { consoleapi::SetConsoleMode(self.handle.as_raw_handle() as *mut _, mode) } == 0 { bail!("SetConsoleMode failed: {}", IoError::last_os_error()); } Ok(()) } fn get_input_mode(&mut self) -> Result { let mut mode = 0; if unsafe { consoleapi::GetConsoleMode(self.handle.as_raw_handle() as *mut _, &mut mode) } == 0 { bail!("GetConsoleMode failed: {}", IoError::last_os_error()); } Ok(mode) } fn set_input_cp(&mut self, cp: u32) -> Result<()> { if unsafe { SetConsoleCP(cp) } == 0 { bail!("SetConsoleCP failed: {}", IoError::last_os_error()); } Ok(()) } fn get_input_cp(&mut self) -> u32 { unsafe { consoleapi::GetConsoleCP() } } fn get_number_of_input_events(&mut self) -> Result { let mut num = 0; if unsafe { consoleapi::GetNumberOfConsoleInputEvents( self.handle.as_raw_handle() as *mut _, &mut num, ) } == 0 { bail!( "GetNumberOfConsoleInputEvents failed: {}", IoError::last_os_error() ); } Ok(num as usize) } fn read_console_input(&mut self, num_events: usize) -> Result> { let mut res = Vec::with_capacity(num_events); let empty_record: INPUT_RECORD = unsafe { mem::zeroed() }; res.resize(num_events, empty_record); let mut num = 0; if unsafe { consoleapi::ReadConsoleInputW( self.handle.as_raw_handle() as *mut _, res.as_mut_ptr(), num_events as u32, &mut num, ) } == 0 { bail!("ReadConsoleInput failed: {}", IoError::last_os_error()); } unsafe { res.set_len(num as usize) }; Ok(res) } } struct OutputHandle { handle: FileDescriptor, write_buffer: Vec, } impl OutputHandle { fn new(handle: FileDescriptor) -> Self { Self { handle, write_buffer: Vec::with_capacity(BUF_SIZE), } } } fn dimensions_from_buffer_info(info: CONSOLE_SCREEN_BUFFER_INFO) -> (usize, usize) { let cols = 1 + (info.srWindow.Right - info.srWindow.Left); let rows = 1 + (info.srWindow.Bottom - info.srWindow.Top); (cols as usize, rows as usize) } impl RenderTty for OutputHandle { fn get_size_in_cells(&mut self) -> Result<(usize, usize)> { let info = self.get_buffer_info()?; let (cols, rows) = dimensions_from_buffer_info(info); Ok((cols, rows)) } } struct EventHandle { handle: OwnedHandle, } impl EventHandle { fn new() -> IoResult { let handle = unsafe { CreateEventW(ptr::null_mut(), 0, 0, ptr::null_mut()) }; if handle.is_null() { Err(IoError::last_os_error()) } else { Ok(Self { handle: unsafe { OwnedHandle::from_raw_handle(handle as *mut _) }, }) } } fn set(&self) -> IoResult<()> { let ok = unsafe { SetEvent(self.handle.as_raw_handle() as *mut _) }; if ok == 0 { Err(IoError::last_os_error()) } else { Ok(()) } } } // Handle created by `CreateEventW` is safe to be shared. unsafe impl Sync for EventHandle {} impl Write for OutputHandle { fn write(&mut self, buf: &[u8]) -> IoResult { if self.write_buffer.len() + buf.len() > self.write_buffer.capacity() { self.flush()?; } if buf.len() >= self.write_buffer.capacity() { self.handle.write(buf) } else { self.write_buffer.write(buf) } } fn flush(&mut self) -> IoResult<()> { if !self.write_buffer.is_empty() { self.handle.write_all(&self.write_buffer)?; self.write_buffer.clear(); } Ok(()) } } impl ConsoleOutputHandle for OutputHandle { fn set_output_mode(&mut self, mode: u32) -> Result<()> { if unsafe { consoleapi::SetConsoleMode(self.handle.as_raw_handle() as *mut _, mode) } == 0 { bail!("SetConsoleMode failed: {}", IoError::last_os_error()); } Ok(()) } fn get_output_mode(&mut self) -> Result { let mut mode = 0; if unsafe { consoleapi::GetConsoleMode(self.handle.as_raw_handle() as *mut _, &mut mode) } == 0 { bail!("GetConsoleMode failed: {}", IoError::last_os_error()); } Ok(mode) } fn set_output_cp(&mut self, cp: u32) -> Result<()> { if unsafe { SetConsoleOutputCP(cp) } == 0 { bail!("SetConsoleOutputCP failed: {}", IoError::last_os_error()); } Ok(()) } fn get_output_cp(&mut self) -> u32 { unsafe { consoleapi::GetConsoleOutputCP() } } fn fill_char(&mut self, text: char, x: i16, y: i16, len: u32) -> Result { let mut wrote = 0; if unsafe { FillConsoleOutputCharacterW( self.handle.as_raw_handle() as *mut _, text as u16, len, COORD { X: x, Y: y }, &mut wrote, ) } == 0 { bail!( "FillConsoleOutputCharacterW failed: {}", IoError::last_os_error() ); } Ok(wrote) } fn fill_attr(&mut self, attr: u16, x: i16, y: i16, len: u32) -> Result { let mut wrote = 0; if unsafe { FillConsoleOutputAttribute( self.handle.as_raw_handle() as *mut _, attr, len, COORD { X: x, Y: y }, &mut wrote, ) } == 0 { bail!( "FillConsoleOutputAttribute failed: {}", IoError::last_os_error() ); } Ok(wrote) } fn set_attr(&mut self, attr: u16) -> Result<()> { if unsafe { SetConsoleTextAttribute(self.handle.as_raw_handle() as *mut _, attr) } == 0 { bail!( "SetConsoleTextAttribute failed: {}", IoError::last_os_error() ); } Ok(()) } fn set_cursor_position(&mut self, x: i16, y: i16) -> Result<()> { if unsafe { SetConsoleCursorPosition(self.handle.as_raw_handle() as *mut _, COORD { X: x, Y: y }) } == 0 { bail!( "SetConsoleCursorPosition(x={}, y={}) failed: {}", x, y, IoError::last_os_error() ); } Ok(()) } fn get_buffer_contents(&mut self) -> Result> { let info = self.get_buffer_info()?; let cols = info.dwSize.X as usize; let rows = 1 + info.srWindow.Bottom as usize - info.srWindow.Top as usize; let mut res = vec![ CHAR_INFO { Attributes: 0, Char: unsafe { mem::zeroed() } }; cols * rows ]; let mut read_region = SMALL_RECT { Left: 0, Right: info.dwSize.X - 1, Top: info.srWindow.Top, Bottom: info.srWindow.Bottom, }; unsafe { if ReadConsoleOutputW( self.handle.as_raw_handle() as *mut _, res.as_mut_ptr(), COORD { X: cols as i16, Y: rows as i16, }, COORD { X: 0, Y: 0 }, &mut read_region, ) == 0 { bail!("ReadConsoleOutputW failed: {}", IoError::last_os_error()); } } Ok(res) } fn set_buffer_contents(&mut self, buffer: &[CHAR_INFO]) -> Result<()> { let info = self.get_buffer_info()?; let cols = info.dwSize.X as usize; let rows = 1 + info.srWindow.Bottom as usize - info.srWindow.Top as usize; ensure!( rows * cols == buffer.len(), "buffer size doesn't match screen size" ); let mut write_region = SMALL_RECT { Left: 0, Right: info.dwSize.X - 1, Top: info.srWindow.Top, Bottom: info.srWindow.Bottom, }; unsafe { if WriteConsoleOutputW( self.handle.as_raw_handle() as *mut _, buffer.as_ptr(), COORD { X: cols as i16, Y: rows as i16, }, COORD { X: 0, Y: 0 }, &mut write_region, ) == 0 { bail!("WriteConsoleOutputW failed: {}", IoError::last_os_error()); } } Ok(()) } fn get_buffer_info(&mut self) -> Result { let mut info: CONSOLE_SCREEN_BUFFER_INFO = unsafe { mem::zeroed() }; let ok = unsafe { GetConsoleScreenBufferInfo(self.handle.as_raw_handle() as *mut _, &mut info as *mut _) }; if ok == 0 { bail!( "GetConsoleScreenBufferInfo failed: {}", IoError::last_os_error() ); } Ok(info) } fn set_viewport(&mut self, left: i16, top: i16, right: i16, bottom: i16) -> Result<()> { let rect = SMALL_RECT { Left: left, Top: top, Right: right, Bottom: bottom, }; if unsafe { SetConsoleWindowInfo(self.handle.as_raw_handle() as *mut _, 1, &rect) } == 0 { bail!("SetConsoleWindowInfo failed: {}", IoError::last_os_error()); } Ok(()) } fn scroll_region( &mut self, left: i16, top: i16, right: i16, bottom: i16, dx: i16, dy: i16, attr: u16, ) -> Result<()> { let scroll_rect = SMALL_RECT { Left: max(left, left - dx), Top: max(top, top - dy), Right: min(right, right - dx), Bottom: min(bottom, bottom - dy), }; let clip_rect = SMALL_RECT { Left: left, Top: top, Right: right, Bottom: bottom, }; let fill = unsafe { let mut fill = CHAR_INFO { Char: mem::zeroed(), Attributes: attr, }; *fill.Char.UnicodeChar_mut() = ' ' as u16; fill }; if unsafe { ScrollConsoleScreenBufferW( self.handle.as_raw_handle() as *mut _, &scroll_rect, &clip_rect, COORD { X: max(left, left + dx), Y: max(left, top + dy), }, &fill, ) } == 0 { bail!( "ScrollConsoleScreenBufferW failed: {}", IoError::last_os_error() ); } Ok(()) } } pub struct WindowsTerminal { input_handle: InputHandle, output_handle: OutputHandle, waker_handle: Arc, saved_input_mode: u32, saved_output_mode: u32, renderer: Renderer, input_parser: InputParser, input_queue: VecDeque, saved_input_cp: u32, saved_output_cp: u32, in_alternate_screen: bool, caps: Capabilities, } impl Drop for WindowsTerminal { fn drop(&mut self) { if matches!(&self.renderer, Renderer::Terminfo(_)) { macro_rules! decreset { ($variant:ident) => { write!( self.output_handle, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) ) .unwrap(); }; } self.render(&[Change::CursorVisibility( crate::surface::CursorVisibility::Visible, )]) .ok(); decreset!(BracketedPaste); decreset!(SGRMouse); decreset!(AnyEventMouse); } self.exit_alternate_screen().unwrap(); self.output_handle.flush().unwrap(); self.input_handle .set_input_mode(self.saved_input_mode) .expect("failed to restore console input mode"); self.input_handle .set_input_cp(self.saved_input_cp) .expect("failed to restore console input codepage"); self.output_handle .set_output_mode(self.saved_output_mode) .expect("failed to restore console output mode"); self.output_handle .set_output_cp(self.saved_output_cp) .expect("failed to restore console output codepage"); } } impl WindowsTerminal { /// Attempt to create an instance from the stdin and stdout of the /// process. This will fail unless both are associated with a tty. /// Note that this will duplicate the underlying file descriptors /// and will no longer participate in the stdin/stdout locking /// provided by the rust standard library. pub fn new_from_stdio(caps: Capabilities) -> Result { Self::new_with(caps, stdin(), stdout()) } /// Create an instance using the provided capabilities, read and write /// handles. The read and write handles must be tty handles of this /// will return an error. pub fn new_with( caps: Capabilities, read: A, write: B, ) -> Result { if !read.is_tty() || !write.is_tty() { bail!("stdin and stdout must both be tty handles"); } let mut input_handle = InputHandle { handle: FileDescriptor::dup(&read)?, }; let mut output_handle = OutputHandle::new(FileDescriptor::dup(&write)?); let waker_handle = Arc::new(EventHandle::new()?); let saved_input_mode = input_handle.get_input_mode()?; let saved_output_mode = output_handle.get_output_mode()?; let saved_input_cp = input_handle.get_input_cp(); let saved_output_cp = output_handle.get_output_cp(); // Test whether we have a virtual terminal capable // console device by attempting to set the appropriate flags. let virtual_terminal_available = output_handle .set_output_mode( saved_output_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN, ) .is_ok(); // Allow opting out of that processing fn bypass_virtual_terminal() -> bool { if let Ok(t) = std::env::var("TERMWIZ_BYPASS_VIRTUAL_TERMINAL") { t == "1" } else { false } } let renderer = if caps.terminfo_db().is_some() { Renderer::Terminfo(TerminfoRenderer::new(caps.clone())) } else if virtual_terminal_available && !bypass_virtual_terminal() { Renderer::Terminfo(TerminfoRenderer::new(caps.clone().apply_builtin_terminfo())) } else { Renderer::Windows(WindowsConsoleRenderer::new(caps.clone())) }; let input_parser = InputParser::new(); let mut terminal = Self { input_handle, output_handle, waker_handle, saved_input_mode, saved_output_mode, saved_input_cp, saved_output_cp, renderer, input_parser, input_queue: VecDeque::new(), in_alternate_screen: false, caps, }; terminal.input_handle.set_input_cp(CP_UTF8)?; terminal.output_handle.set_output_cp(CP_UTF8)?; // We already enabled this for output, but let's also turn it // on for input here now. terminal.enable_virtual_terminal_processing_if_needed()?; Ok(terminal) } fn enable_virtual_terminal_processing_if_needed(&mut self) -> Result<()> { match &self.renderer { Renderer::Terminfo(_) => self.enable_virtual_terminal_processing(), Renderer::Windows(_) => Ok(()), } } /// Attempt to explicitly open handles to a console device (CONIN$, /// CONOUT$). This should yield the terminal already associated with /// the process, even if stdio streams have been redirected. pub fn new(caps: Capabilities) -> Result { let read = OpenOptions::new().read(true).write(true).open("CONIN$")?; let write = OpenOptions::new().read(true).write(true).open("CONOUT$")?; Self::new_with(caps, read, write) } pub fn enable_virtual_terminal_processing(&mut self) -> Result<()> { let mode = self.output_handle.get_output_mode()?; self.output_handle.set_output_mode( mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN, )?; let mode = self.input_handle.get_input_mode()?; self.input_handle .set_input_mode(mode | ENABLE_VIRTUAL_TERMINAL_INPUT)?; Ok(()) } } #[derive(Clone)] pub struct WindowsTerminalWaker { handle: Arc, } impl WindowsTerminalWaker { pub fn wake(&self) -> IoResult<()> { self.handle.set()?; Ok(()) } } impl Terminal for WindowsTerminal { fn set_raw_mode(&mut self) -> Result<()> { let mode = self.output_handle.get_output_mode()?; self.output_handle .set_output_mode(mode | DISABLE_NEWLINE_AUTO_RETURN) .ok(); let mode = self.input_handle.get_input_mode()?; self.input_handle.set_input_mode( (mode & !(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT)) | ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT, )?; if matches!(&self.renderer, Renderer::Terminfo(_)) { macro_rules! decset { ($variant:ident) => { write!( self.output_handle, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) )?; }; } if self.caps.bracketed_paste() { decset!(BracketedPaste); } if self.caps.mouse_reporting() { decset!(AnyEventMouse); decset!(SGRMouse); } self.output_handle.flush()?; } Ok(()) } fn set_cooked_mode(&mut self) -> Result<()> { let mode = self.output_handle.get_output_mode()?; self.output_handle .set_output_mode(mode & !DISABLE_NEWLINE_AUTO_RETURN) .ok(); let mode = self.input_handle.get_input_mode()?; self.input_handle.set_input_mode( (mode & !(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)) | ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT, ) } fn enter_alternate_screen(&mut self) -> Result<()> { if matches!(&self.renderer, Renderer::Terminfo(_)) { if !self.in_alternate_screen { write!( self.output_handle, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = true; } } else { // TODO: Implement using CreateConsoleScreenBuffer and // SetConsoleActiveScreenBuffer. } Ok(()) } fn exit_alternate_screen(&mut self) -> Result<()> { // TODO: Implement using SetConsoleActiveScreenBuffer. if matches!(&self.renderer, Renderer::Terminfo(_)) { if self.in_alternate_screen { write!( self.output_handle, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = false; } } else { // TODO: Implement using CreateConsoleScreenBuffer and // SetConsoleActiveScreenBuffer. } Ok(()) } fn get_screen_size(&mut self) -> Result { let info = self.output_handle.get_buffer_info()?; let (cols, rows) = dimensions_from_buffer_info(info); Ok(ScreenSize { rows: cast(rows)?, cols: cast(cols)?, xpixel: 0, ypixel: 0, }) } fn probe_capabilities(&mut self) -> Option { Some(ProbeCapabilities::new( &mut self.input_handle, &mut self.output_handle, )) } fn set_screen_size(&mut self, size: ScreenSize) -> Result<()> { // FIXME: take into account the visible window size here; // this probably changes the size of everything including scrollback let size = COORD { X: cast(size.cols)?, Y: cast(size.rows)?, }; let handle = self.output_handle.handle.as_raw_handle(); if unsafe { SetConsoleScreenBufferSize(handle as *mut _, size) } != 1 { bail!( "failed to SetConsoleScreenBufferSize: {}", IoError::last_os_error() ); } Ok(()) } fn render(&mut self, changes: &[Change]) -> Result<()> { match &mut self.renderer { Renderer::Terminfo(r) => r.render_to(changes, &mut self.output_handle), Renderer::Windows(r) => r.render_to(changes, &mut self.output_handle), } } fn flush(&mut self) -> Result<()> { self.output_handle .flush() .map_err(|e| format_err!("flush failed: {}", e)) } fn poll_input(&mut self, wait: Option) -> Result> { loop { if let Some(event) = self.input_queue.pop_front() { return Ok(Some(event)); } let mut pending = self.input_handle.get_number_of_input_events()?; if pending == 0 { let mut handles = [ self.input_handle.handle.as_raw_handle() as *mut _, self.waker_handle.handle.as_raw_handle() as *mut _, ]; let result = unsafe { WaitForMultipleObjects( 2, handles.as_mut_ptr(), 0, wait.map(|wait| wait.as_millis() as u32).unwrap_or(INFINITE), ) }; if result == WAIT_OBJECT_0 + 0 { pending = self.input_handle.get_number_of_input_events()?; } else if result == WAIT_OBJECT_0 + 1 { return Ok(Some(InputEvent::Wake)); } else if result == WAIT_FAILED { bail!( "failed to WaitForMultipleObjects: {}", IoError::last_os_error() ); } else if result == WAIT_TIMEOUT { return Ok(None); } else { return Ok(None); } } let records = self.input_handle.read_console_input(pending)?; let input_queue = &mut self.input_queue; self.input_parser .decode_input_records(&records, &mut |evt| input_queue.push_back(evt)); } } fn waker(&self) -> WindowsTerminalWaker { WindowsTerminalWaker { handle: self.waker_handle.clone(), } } } termwiz-0.23.3/src/tmux_cc/mod.rs000064400000000000000000001065161046102023000150010ustar 00000000000000use anyhow::{anyhow, Context}; use parser::Rule; use pest::iterators::{Pair, Pairs}; use pest::Parser as _; pub type TmuxWindowId = u64; pub type TmuxPaneId = u64; pub type TmuxSessionId = u64; pub mod parser { use pest_derive::Parser; #[derive(Parser)] #[grammar = "tmux_cc/tmux.pest"] pub struct TmuxParser; } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Guarded { pub error: bool, pub timestamp: i64, pub number: u64, pub flags: i64, pub output: String, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Event { // Tmux generic events Begin { timestamp: i64, number: u64, flags: i64, }, End { timestamp: i64, number: u64, flags: i64, }, Error { timestamp: i64, number: u64, flags: i64, }, Guarded(Guarded), // Tmux specific events ClientDetached { client_name: String, }, ClientSessionChanged { client_name: String, session: TmuxSessionId, session_name: String, }, ConfigError { error: String, }, Continue { pane: TmuxPaneId, }, ExtendedOutput { pane: TmuxPaneId, text: String, }, Exit { reason: Option, }, LayoutChange { window: TmuxWindowId, layout: String, visible_layout: Option, raw_flags: Option, }, Message { message: String, }, Output { pane: TmuxPaneId, text: String, }, PaneModeChanged { pane: TmuxPaneId, }, PasteBufferChanged { buffer: String, }, PasteBufferDeleted { buffer: String, }, Pause { pane: TmuxPaneId, }, SessionChanged { session: TmuxSessionId, name: String, }, SessionRenamed { name: String, }, SessionsChanged, SessionWindowChanged { session: TmuxSessionId, window: TmuxWindowId, }, SubscriptionChanged, UnlinkedWindowAdd { window: TmuxWindowId, }, UnlinkedWindowClose { window: TmuxWindowId, }, UnlinkedWindowRenamed { window: TmuxWindowId, }, WindowAdd { window: TmuxWindowId, }, WindowClose { window: TmuxWindowId, }, WindowPaneChanged { window: TmuxWindowId, pane: TmuxPaneId, }, WindowRenamed { window: TmuxWindowId, name: String, }, } #[derive(Debug, Clone, Copy)] pub struct PaneLayout { pub pane_id: TmuxPaneId, pub pane_width: u64, pub pane_height: u64, pub pane_left: u64, pub pane_top: u64, } #[derive(Debug)] pub enum WindowLayout { SplitVertical(Vec), SplitHorizontal(Vec), SinglePane(PaneLayout), } fn parse_pane_id(pair: Pair) -> anyhow::Result { match pair.as_rule() { Rule::pane_id => { let mut pairs = pair.into_inner(); pairs .next() .ok_or_else(|| anyhow!("missing pane id"))? .as_str() .parse() .context("pane_id is somehow not digits") } _ => anyhow::bail!("parse_pane_id can only parse Rule::pane_id, got {:?}", pair), } } fn parse_window_id(pair: Pair) -> anyhow::Result { match pair.as_rule() { Rule::window_id => { let mut pairs = pair.into_inner(); pairs .next() .ok_or_else(|| anyhow!("missing window id"))? .as_str() .parse() .context("window_id is somehow not digits") } _ => anyhow::bail!( "parse_window_id can only parse Rule::window_id, got {:?}", pair ), } } fn parse_session_id(pair: Pair) -> anyhow::Result { match pair.as_rule() { Rule::session_id => { let mut pairs = pair.into_inner(); pairs .next() .ok_or_else(|| anyhow!("missing session id"))? .as_str() .parse() .context("session_id is somehow not digits") } _ => anyhow::bail!( "parse_session_id can only parse Rule::session_id, got {:?}", pair ), } } /// Parses a %begin, %end, %error guard line tuple fn parse_guard(mut pairs: Pairs) -> anyhow::Result<(i64, u64, i64)> { let timestamp = pairs .next() .ok_or_else(|| anyhow!("missing timestamp"))? .as_str() .parse::()?; let number = pairs .next() .ok_or_else(|| anyhow!("missing number"))? .as_str() .parse::()?; let flags = pairs .next() .ok_or_else(|| anyhow!("missing flags"))? .as_str() .parse::()?; Ok((timestamp, number, flags)) } fn parse_line(line: &str) -> anyhow::Result { let mut pairs = parser::TmuxParser::parse(Rule::line_entire, line)?; let pair = pairs.next().ok_or_else(|| anyhow::anyhow!("no pairs!?"))?; match pair.as_rule() { // Tmux generic rules Rule::begin => { let (timestamp, number, flags) = parse_guard(pair.into_inner())?; Ok(Event::Begin { timestamp, number, flags, }) } Rule::end => { let (timestamp, number, flags) = parse_guard(pair.into_inner())?; Ok(Event::End { timestamp, number, flags, }) } Rule::error => { let (timestamp, number, flags) = parse_guard(pair.into_inner())?; Ok(Event::Error { timestamp, number, flags, }) } // Tmux specific rules Rule::client_detached => { let mut pairs = pair.into_inner(); let client_name = unvis( pairs .next() .ok_or_else(|| anyhow!("missing name"))? .as_str(), )?; Ok(Event::ClientDetached { client_name }) } Rule::client_session_changed => { let mut pairs = pair.into_inner(); let client_name = unvis( pairs .next() .ok_or_else(|| anyhow!("missing name"))? .as_str(), )?; let session = parse_session_id(pairs.next().ok_or_else(|| anyhow!("missing session id"))?)?; let session_name = unvis( pairs .next() .ok_or_else(|| anyhow!("missing session name"))? .as_str(), )?; Ok(Event::ClientSessionChanged { client_name, session, session_name, }) } Rule::config_error => { let mut pairs = pair.into_inner(); let error = unvis( pairs .next() .ok_or_else(|| anyhow!("missing name"))? .as_str(), )?; Ok(Event::ConfigError { error }) } Rule::r#continue => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().ok_or_else(|| anyhow!("missing pane id"))?)?; Ok(Event::Continue { pane }) } Rule::extended_output => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().ok_or_else(|| anyhow!("missing pane id"))?)?; let text = unvis( pairs .next() .ok_or_else(|| anyhow!("missing text"))? .as_str(), )?; Ok(Event::ExtendedOutput { pane, text }) } Rule::exit => { let mut pairs = pair.into_inner(); let reason = pairs.next().map(|pair| pair.as_str().to_owned()); Ok(Event::Exit { reason }) } Rule::layout_change => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; let layout = unvis( pairs .next() .ok_or_else(|| anyhow!("missing layout"))? .as_str(), )?; let visible_layout = pairs.next().map(|pair| pair.as_str().to_owned()); let raw_flags = pairs.next().map(|r| r.as_str().to_owned()); Ok(Event::LayoutChange { window, layout, visible_layout, raw_flags, }) } Rule::message => { let mut pairs = pair.into_inner(); let message = unvis( pairs .next() .ok_or_else(|| anyhow!("missing text"))? .as_str(), )?; Ok(Event::Message { message }) } Rule::output => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().ok_or_else(|| anyhow!("missing pane id"))?)?; let text = unvis( pairs .next() .ok_or_else(|| anyhow!("missing text"))? .as_str(), )?; Ok(Event::Output { pane, text }) } Rule::pane_mode_changed => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().ok_or_else(|| anyhow!("missing pane id"))?)?; Ok(Event::PaneModeChanged { pane }) } Rule::paste_buffer_changed => { let mut pairs = pair.into_inner(); let buffer = unvis( pairs .next() .ok_or_else(|| anyhow!("missing text"))? .as_str(), )?; Ok(Event::PasteBufferChanged { buffer }) } Rule::paste_buffer_deleted => { let mut pairs = pair.into_inner(); let buffer = unvis( pairs .next() .ok_or_else(|| anyhow!("missing text"))? .as_str(), )?; Ok(Event::PasteBufferDeleted { buffer }) } Rule::pause => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().ok_or_else(|| anyhow!("missing pane id"))?)?; Ok(Event::Pause { pane }) } Rule::session_changed => { let mut pairs = pair.into_inner(); let session = parse_session_id(pairs.next().ok_or_else(|| anyhow!("missing session id"))?)?; let name = unvis( pairs .next() .ok_or_else(|| anyhow!("missing name"))? .as_str(), )?; Ok(Event::SessionChanged { session, name }) } Rule::session_renamed => { let mut pairs = pair.into_inner(); let name = unvis( pairs .next() .ok_or_else(|| anyhow!("missing name"))? .as_str(), )?; Ok(Event::SessionRenamed { name }) } Rule::session_window_changed => { let mut pairs = pair.into_inner(); let session = parse_session_id(pairs.next().ok_or_else(|| anyhow!("missing session id"))?)?; let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; Ok(Event::SessionWindowChanged { session, window }) } Rule::sessions_changed => Ok(Event::SessionsChanged), Rule::subscription_changed => Ok(Event::SubscriptionChanged), Rule::unlinked_window_add => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; Ok(Event::UnlinkedWindowAdd { window }) } Rule::unlinked_window_close => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; Ok(Event::UnlinkedWindowClose { window }) } Rule::unlinked_window_renamed => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; Ok(Event::UnlinkedWindowRenamed { window }) } Rule::window_add => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; Ok(Event::WindowAdd { window }) } Rule::window_close => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; Ok(Event::WindowClose { window }) } Rule::window_pane_changed => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; let pane = parse_pane_id(pairs.next().ok_or_else(|| anyhow!("missing pane id"))?)?; Ok(Event::WindowPaneChanged { window, pane }) } Rule::window_renamed => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().ok_or_else(|| anyhow!("missing window id"))?)?; let name = unvis( pairs .next() .ok_or_else(|| anyhow!("missing name"))? .as_str(), )?; Ok(Event::WindowRenamed { window, name }) } Rule::EOI | Rule::any_text | Rule::client_name | Rule::layout_pane | Rule::layout_split_horizontal | Rule::layout_split_pane | Rule::layout_split_vertical | Rule::layout_window | Rule::line | Rule::line_entire | Rule::number | Rule::pane_id | Rule::session_id | Rule::window_id | Rule::window_layout | Rule::word => anyhow::bail!("Should not reach here"), } } /// Decode OpenBSD `vis` encoded strings /// See: https://github.com/tmux/tmux/blob/486ce9b09855ae30a2bf5e576cb6f7ad37792699/compat/unvis.c pub fn unvis(s: &str) -> anyhow::Result { enum State { Ground, Start, Meta, Meta1, Ctrl(u8), Octal2(u8), Octal3(u8), } let mut state = State::Ground; let mut result: Vec = vec![]; let mut bytes = s.as_bytes().iter(); fn is_octal(b: u8) -> bool { b >= b'0' && b <= b'7' } fn unvis_byte(b: u8, state: &mut State, result: &mut Vec) -> anyhow::Result { match state { State::Ground => { if b == b'\\' { *state = State::Start; } else { result.push(b); } } State::Start => { match b { b'\\' => { result.push(b'\\'); *state = State::Ground; } b'0' | b'1' | b'2' | b'3' | b'4' | b'5' | b'6' | b'7' => { let value = b - b'0'; *state = State::Octal2(value); } b'M' => { *state = State::Meta; } b'^' => { *state = State::Ctrl(0); } b'n' => { result.push(b'\n'); *state = State::Ground; } b'r' => { result.push(b'\r'); *state = State::Ground; } b'b' => { result.push(b'\x08'); *state = State::Ground; } b'a' => { result.push(b'\x07'); *state = State::Ground; } b'v' => { result.push(b'\x0b'); *state = State::Ground; } b't' => { result.push(b'\t'); *state = State::Ground; } b'f' => { result.push(b'\x0c'); *state = State::Ground; } b's' => { result.push(b' '); *state = State::Ground; } b'E' => { result.push(b'\x1b'); *state = State::Ground; } b'\n' => { // Hidden newline // result.push(b'\n'); *state = State::Ground; } b'$' => { // Hidden marker *state = State::Ground; } _ => { // Invalid syntax anyhow::bail!("Invalid \\ escape: {}", b); } } } State::Meta => { if b == b'-' { *state = State::Meta1; } else if b == b'^' { *state = State::Ctrl(0o200); } else { anyhow::bail!("invalid \\M escape: {}", b); } } State::Meta1 => { result.push(b | 0o200); *state = State::Ground; } State::Ctrl(c) => { if b == b'?' { result.push(*c | 0o177); } else { result.push((b & 0o37) | *c); } *state = State::Ground; } State::Octal2(prior) => { if is_octal(b) { // It's the second in a 2 or 3 byte octal sequence let value = (*prior << 3) + (b - b'0'); *state = State::Octal3(value); } else { // Prior character was a single octal value result.push(*prior); *state = State::Ground; // re-process the current byte return Ok(true); } } State::Octal3(prior) => { if is_octal(b) { // It's the third in a 3 byte octal sequence let value = (*prior << 3) + (b - b'0'); result.push(value); *state = State::Ground; } else { // Prior was a 2-byte octal sequence result.push(*prior); *state = State::Ground; // re-process the current byte return Ok(true); } } } // Don't process this byte again Ok(false) } while let Some(&b) = bytes.next() { let again = unvis_byte(b, &mut state, &mut result)?; if again { unvis_byte(b, &mut state, &mut result)?; } } String::from_utf8(result) .map_err(|err| anyhow::anyhow!("Unescaped string is not valid UTF8: {}", err)) } fn parse_layout_pane(pair: Pair) -> anyhow::Result { let mut pairs = pair.into_inner(); let pane_width = pairs .next() .ok_or_else(|| anyhow!("wrong pane layout format"))? .as_str() .parse()?; let pane_height = pairs .next() .ok_or_else(|| anyhow!("wrong pane layout format"))? .as_str() .parse()?; let pane_left = pairs .next() .ok_or_else(|| anyhow!("wrong pane layout format"))? .as_str() .parse()?; let pane_top = pairs .next() .ok_or_else(|| anyhow!("wrong pane layout format"))? .as_str() .parse()?; let pane_id = match pairs.next() { Some(x) => x.as_str().parse()?, None => 0, }; return Ok(PaneLayout { pane_id, pane_width, pane_height, pane_left, pane_top, }); } fn parse_layout_inner( mut pairs: Pairs, result: &mut Vec, ) -> anyhow::Result> { let mut stack = Vec::new(); while let Some(pair) = pairs.next() { let rule = pair.as_rule(); match rule { Rule::layout_split_horizontal | Rule::layout_split_vertical => { let mut pairs_inner = pair.into_inner(); let pair = pairs_inner .next() .ok_or_else(|| anyhow::anyhow!("no pairs!?"))?; let mut pane = parse_layout_pane(pair)?; if result.is_empty() { // Fake one, to flag it is not a TmuxLayout::SinglePane will pop result.push(WindowLayout::SplitHorizontal(vec![])); } let mut layout_inner = parse_layout_inner(pairs_inner, result)?; let last_item = layout_inner .pop() .ok_or_else(|| anyhow::anyhow!("wrong layout format"))?; pane.pane_id = last_item.pane_id; layout_inner.insert(0, pane.clone()); if let Rule::layout_split_horizontal = rule { result.insert(0, WindowLayout::SplitHorizontal(layout_inner)); } else { result.insert(0, WindowLayout::SplitVertical(layout_inner)); } stack.push(pane); } Rule::layout_pane => { let pane = parse_layout_pane(pair)?; // SinglePane if result.is_empty() { result.insert(0, WindowLayout::SinglePane(pane)); return Ok(stack); } stack.push(pane); } Rule::EOI | Rule::any_text | Rule::begin | Rule::client_detached | Rule::client_name | Rule::client_session_changed | Rule::config_error | Rule::r#continue | Rule::end | Rule::error | Rule::exit | Rule::extended_output | Rule::layout_change | Rule::layout_split_pane | Rule::layout_window | Rule::line | Rule::line_entire | Rule::message | Rule::number | Rule::output | Rule::pane_id | Rule::pane_mode_changed | Rule::paste_buffer_changed | Rule::paste_buffer_deleted | Rule::pause | Rule::session_changed | Rule::session_id | Rule::session_renamed | Rule::session_window_changed | Rule::sessions_changed | Rule::subscription_changed | Rule::unlinked_window_add | Rule::unlinked_window_close | Rule::unlinked_window_renamed | Rule::window_add | Rule::window_close | Rule::window_id | Rule::window_layout | Rule::window_pane_changed | Rule::window_renamed | Rule::word => anyhow::bail!("Should not reach here"), } } Ok(stack) } pub fn parse_layout(layout: &str) -> anyhow::Result> { let mut result = Vec::new(); let pairs = parser::TmuxParser::parse(Rule::layout_window, layout)?; let _ = parse_layout_inner(pairs, &mut result)?; if result.len() > 1 { let _ = result.pop(); } Ok(result) } pub struct Parser { buffer: Vec, begun: Option, } impl Parser { pub fn new() -> Self { Self { buffer: vec![], begun: None, } } pub fn advance_byte(&mut self, c: u8) -> anyhow::Result> { if c == b'\n' { self.process_line() } else { self.buffer.push(c); Ok(None) } } pub fn advance_string(&mut self, s: &str) -> anyhow::Result> { self.advance_bytes(s.as_bytes()) } pub fn advance_bytes(&mut self, bytes: &[u8]) -> anyhow::Result> { let mut events = vec![]; for (i, &b) in bytes.iter().enumerate() { match self.advance_byte(b) { Ok(option_event) => { if let Some(e) = option_event { events.push(e); } } Err(err) => { // concat remained bytes after digested bytes return Err(anyhow::anyhow!(format!( "{}{}", err, String::from_utf8_lossy(&bytes[i..]) ))); } } } Ok(events) } fn process_guarded_line(&mut self, line: String) -> anyhow::Result> { let result = match parse_line(&line) { Ok(Event::End { timestamp, number, flags, }) => { if let Some(begun) = self.begun.take() { if begun.timestamp == timestamp && begun.number == number && begun.flags == flags { Some(Event::Guarded(begun)) } else { log::error!("mismatched %end; expected {:?} but got {}", begun, line); None } } else { log::error!("unexpected %end with no %begin ({})", line); None } } Ok(Event::Error { timestamp, number, flags, }) => { if let Some(mut begun) = self.begun.take() { if begun.timestamp == timestamp && begun.number == number && begun.flags == flags { begun.error = true; Some(Event::Guarded(begun)) } else { log::error!("mismatched %error; expected {:?} but got {}", begun, line); None } } else { log::error!("unexpected %error with no %begin ({})", line); None } } _ => { let begun = self .begun .as_mut() .ok_or_else(|| anyhow!("missing begun"))?; begun.output.push_str(&line); begun.output.push('\n'); None } }; self.buffer.clear(); return Ok(result); } fn process_line(&mut self) -> anyhow::Result> { if self.buffer.last() == Some(&b'\r') { self.buffer.pop(); } let result = match std::str::from_utf8(&self.buffer) { Ok(line) => { if self.begun.is_some() { let line = line.to_owned(); return self.process_guarded_line(line); } match parse_line(line) { Ok(Event::Begin { timestamp, number, flags, }) => { if self.begun.is_some() { log::error!("expected %end or %error before %begin ({})", line); } self.begun.replace(Guarded { timestamp, number, flags, error: false, output: String::new(), }); None } Ok(event) => Some(event), Err(err) => { log::error!("Unrecognized tmux cc line: {}", err); return Err(anyhow::anyhow!(line.to_owned())); } } } Err(err) => { log::error!("Failed to parse line from tmux: {}", err); None } }; self.buffer.clear(); Ok(result) } } #[cfg(test)] mod tests { use super::*; use k9::assert_equal as assert_eq; #[test] fn test_parse_line() { let _ = env_logger::Builder::new() .is_test(true) .filter_level(log::LevelFilter::Trace) .try_init(); assert_eq!( Event::Begin { timestamp: 12345, number: 321, flags: 0, }, parse_line("%begin 12345 321 0").unwrap() ); assert_eq!( Event::End { timestamp: 12345, number: 321, flags: 0, }, parse_line("%end 12345 321 0").unwrap() ); } #[test] fn test_parse_sequence() { let input = b"%sessions-changed %pane-mode-changed %0 %begin 1604279270 310 0 stuff in here %end 1604279270 310 0 %window-add @1 %window-close @38 %unlinked-window-close @39 %sessions-changed %session-changed $1 1 %client-session-changed /dev/pts/5 $1 home %client-detached /dev/pts/10 %layout-change @1 b25d,80x24,0,0,0 %layout-change @1 cafd,120x29,0,0,0 cafd,120x29,0,0,0 * %output %1 \\033[1m\\033[7m%\\033[27m\\033[1m\\033[0m \\015 \\015 %output %1 \\033kwez@cube-localdomain:~\\033\\134\\033]2;wez@cube-localdomain:~\\033\\134 %output %1 \\033]7;file://cube-localdomain/home/wez\\033\\134 %output %1 \\033[K\\033[?2004h %exit %exit I said so %config-error /home/joe/.tmux.conf:1: unknown command: dadsafafasdf %continue %2 %extended-output %1 \\033[1m\\033[7m%\\033[27m\\033[1m\\033[0m \\015 \\015 %message message text %unlinked-window-add @40 %unlinked-window-renamed @41 %paste-buffer-changed just something %paste-buffer-deleted just something else %pause %3 %subscription-changed something we don't handle so far "; let mut p = Parser::new(); let events = p.advance_bytes(input).unwrap(); assert_eq!( vec![ Event::SessionsChanged, Event::PaneModeChanged { pane: 0 }, Event::Guarded(Guarded { timestamp: 1604279270, number: 310, flags: 0, error: false, output: "stuff\nin\nhere\n".to_owned() }), Event::WindowAdd { window: 1 }, Event::WindowClose { window: 38 }, Event::UnlinkedWindowClose { window: 39 }, Event::SessionsChanged, Event::SessionChanged { session: 1, name: "1".to_owned(), }, Event::ClientSessionChanged { client_name: "/dev/pts/5".to_owned(), session: 1, session_name: "home".to_owned() }, Event::ClientDetached { client_name: "/dev/pts/10".to_owned() }, Event::LayoutChange { window: 1, layout: "b25d,80x24,0,0,0".to_owned(), visible_layout: None, raw_flags: None }, Event::LayoutChange { window: 1, layout: "cafd,120x29,0,0,0".to_owned(), visible_layout: Some("cafd,120x29,0,0,0".to_owned()), raw_flags: Some("*".to_owned()) }, Event::Output { pane: 1, text: "\x1b[1m\x1b[7m%\x1b[27m\x1b[1m\x1b[0m \r \r".to_owned() }, Event::Output { pane: 1, text: "\x1bkwez@cube-localdomain:~\x1b\\\x1b]2;wez@cube-localdomain:~\x1b\\" .to_owned() }, Event::Output { pane: 1, text: "\x1b]7;file://cube-localdomain/home/wez\x1b\\".to_owned(), }, Event::Output { pane: 1, text: "\x1b[K\x1b[?2004h".to_owned(), }, Event::Exit { reason: None }, Event::Exit { reason: Some("I said so".to_owned()) }, Event::ConfigError { error: "/home/joe/.tmux.conf:1: unknown command: dadsafafasdf".to_owned() }, Event::Continue { pane: 2 }, Event::ExtendedOutput { pane: 1, text: "\x1b[1m\x1b[7m%\x1b[27m\x1b[1m\x1b[0m \r \r".to_owned() }, Event::Message { message: "message text".to_owned() }, Event::UnlinkedWindowAdd { window: 40 }, Event::UnlinkedWindowRenamed { window: 41 }, Event::PasteBufferChanged { buffer: "just something".to_owned() }, Event::PasteBufferDeleted { buffer: "just something else".to_owned() }, Event::Pause { pane: 3 }, Event::SubscriptionChanged, ], events ); } #[test] fn test_parse_layout() { let layout_case1 = "158x40,0,0,72".to_string(); let layout_case2 = "158x40,0,0[158x20,0,0,69,158x19,0,21{79x19,0,21,70,78x19,80,21[78x9,80,21,71,78x9,80,31,73]}]".to_string(); let layout_case3 = "158x40,0,0{79x40,0,0[79x20,0,0,74,79x19,0,21{39x19,0,21,76,39x19,40,21,77}],78x40,80,0,75}".to_string(); let mut layout = parse_layout(&layout_case1).unwrap(); let l = layout.pop().unwrap(); assert!(if let WindowLayout::SinglePane(p) = l { assert_eq!(p.pane_width, 158); assert_eq!(p.pane_height, 40); assert_eq!(p.pane_left, 0); assert_eq!(p.pane_top, 0); assert_eq!(p.pane_id, 72); true } else { false }); layout = parse_layout(&layout_case2).unwrap(); assert!(matches!(&layout[0], WindowLayout::SplitVertical(_x))); assert!(matches!(&layout[1], WindowLayout::SplitHorizontal(_x))); assert!(matches!(&layout[2], WindowLayout::SplitVertical(_x))); layout = parse_layout(&layout_case3).unwrap(); assert!(matches!(&layout[0], WindowLayout::SplitHorizontal(_x))); assert!(matches!(&layout[1], WindowLayout::SplitVertical(_x))); assert!(matches!(&layout[2], WindowLayout::SplitHorizontal(_x))); } } termwiz-0.23.3/src/tmux_cc/tmux.pest000064400000000000000000000071721046102023000155440ustar 00000000000000// Plese put new items in alphabet order in its category // Generic tokens any_text = { ANY* } number = { ASCII_DIGIT+ } word = { (ASCII_ALPHANUMERIC | "/")+ } // Tmux tokens client_name = { word } pane_id = { "%" ~ number } session_id = { "$" ~ number } window_id = { "@" ~ number } window_layout = { (ASCII_HEX_DIGIT | "x" | "[" | "]" | "{" | "}" | ",")+ } // Tmux generic rules begin = { "%begin " ~ number ~ " " ~ number ~ " " ~ number } end = { "%end " ~ number ~ " " ~ number ~ " " ~ number } error = { "%error " ~ number ~ " " ~ number ~ " " ~ number } // Tmux specific rules client_session_changed = { "%client-session-changed " ~ client_name ~ " " ~ session_id ~ " " ~any_text } client_detached = { "%client-detached " ~ client_name } config_error = { "%config-error " ~ any_text } continue = { "%continue " ~ pane_id } exit = { "%exit" ~ (" " ~ any_text)? } extended_output = { "%extended-output " ~ pane_id ~ " " ~ any_text } layout_change = { "%layout-change " ~ window_id ~ " " ~ (window_layout ~ " " ~ window_layout ~ " " ~any_text | window_layout) } message = { "%message " ~ any_text } output = { "%output " ~ pane_id ~ " " ~ any_text } pane_mode_changed = { "%pane-mode-changed " ~ pane_id } paste_buffer_changed = { "%paste-buffer-changed " ~ any_text } paste_buffer_deleted = { "%paste-buffer-deleted " ~ any_text } pause = { "%pause " ~ pane_id } session_changed = { "%session-changed " ~ session_id ~ " " ~ any_text } session_renamed = { "%session-renamed " ~ any_text } session_window_changed = { "%session-window-changed " ~ session_id ~ " " ~ window_id } sessions_changed = { "%sessions-changed" } subscription_changed = { "%subscription-changed " ~ any_text } unlinked_window_add = { "%unlinked-window-add " ~ window_id } unlinked_window_close = { "%unlinked-window-close " ~ window_id } unlinked_window_renamed = { "%unlinked-window-renamed " ~ window_id } window_add = { "%window-add " ~ window_id } window_close = { "%window-close " ~ window_id } window_pane_changed = { "%window-pane-changed " ~ window_id ~ " " ~ pane_id } window_renamed = { "%window-renamed " ~ window_id ~ " " ~ any_text } line = _{ ( // Tmux generic rules begin | end | error | // Tmux specific rules client_detached | client_session_changed | config_error | continue | exit | extended_output | layout_change | message | output | pane_mode_changed | paste_buffer_changed | paste_buffer_deleted | pause | session_changed | session_renamed | session_window_changed | sessions_changed | subscription_changed | unlinked_window_add | unlinked_window_close | unlinked_window_renamed | window_add | window_close | window_pane_changed | window_renamed ) } line_entire = _{ SOI ~ line ~ EOI } // layout section: // The tmux layout has three cases: single pane, horizontal split or vertical split. // horizontal split can be nested in vertical split // vertical split can be nested in horizontal split // layout pane: widthxheight,left,top,id // layout split pane: widthxheight,left,top // layout horizontal: widthxheight,left,top{...} // layout vertical: widthxheight,left,top[...] layout_pane = {number ~ "x" ~ number ~ "," ~ number ~ "," ~ number ~ "," ~ number} layout_split_horizontal = { layout_split_pane ~ "{" ~ (layout_split_vertical | layout_pane) ~ ("," ~ (layout_split_vertical | layout_pane))* ~ "}" } layout_split_pane = {number ~ "x" ~ number ~ "," ~ number ~ "," ~ number } layout_split_vertical = { layout_split_pane ~ "[" ~ (layout_split_horizontal | layout_pane) ~ ("," ~ (layout_split_horizontal | layout_pane))* ~ "]" } layout_window = _{ ( layout_pane | layout_split_horizontal | layout_split_vertical ) } termwiz-0.23.3/src/white_space.rs000064400000000000000000000102051046102023000150400ustar 00000000000000// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: // // ucd-generate property-bool . --include White_Space --trie-set // // Unicode version: 16.0.0. // // ucd-generate 0.3.1 is available on crates.io. #[allow(unused)] pub const BY_NAME: &'static [(&'static str, &'static ::ucd_trie::TrieSet)] = &[("White_Space", WHITE_SPACE)]; pub const WHITE_SPACE: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0x100003E00, 0, 0x100000020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level2: &[0, 0x1, 0x8300000007FF, 0x80000000], tree3_level1: &[], tree3_level2: &[], tree3_level3: &[], }; termwiz-0.23.3/src/widechar_width.rs000064400000000000000000001220041046102023000155330ustar 00000000000000/** * widechar_width.rs for Unicode 16.0.0 * See https://github.com/ridiculousfish/widecharwidth/ * * SHA1 file hashes: * ( * the hashes for generate.py and the template are git object hashes, * use `git log --all --find-object=` in the widecharwidth repository * to see which commit they correspond to, * or run `git hash-object` on the file to compare. * The other hashes are simple `sha1sum` style hashes. * ) * * generate.py: 2747bb9402d8eeeca8e566ff947f14308511ecb1 * template.js: 7921c1fe6bcb4ce17108929b599bfda097caedb7 * UnicodeData.txt: 91df83276154240bcedef82a09bde77aa182cf8d * EastAsianWidth.txt: 0885c0fc1c21eb58954a3bfb785d78559b361d92 * emoji-data.txt: 1df2f8329dd9f5c238674807de736f316c6b9d87 */ type R = (u32, u32); #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[repr(u8)] pub enum WcWidth { /// The character is single-width One, /// The character is double-width Two, /// The character is not printable. NonPrint, /// The character is a zero-width combiner. Combining, /// The character is East-Asian ambiguous width. Ambiguous, /// The character is for private use. PrivateUse, /// The character is unassigned. Unassigned, /// Width is 1 in Unicode 8, 2 in Unicode 9+. WidenedIn9, /// The character is a noncharacter. NonCharacter, } /// Simple ASCII characters - used a lot, so we check them first. const ASCII_TABLE: &'static [R] = &[(0x00020, 0x0007E)]; /// Private usage range. const PRIVATE_TABLE: &'static [R] = &[(0x0E000, 0x0F8FF), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD)]; /// Nonprinting characters. const NONPRINT_TABLE: &'static [R] = &[ (0x00000, 0x0001F), (0x0007F, 0x0009F), (0x000AD, 0x000AD), (0x00600, 0x00605), (0x0061C, 0x0061C), (0x006DD, 0x006DD), (0x0070F, 0x0070F), (0x00890, 0x00891), (0x008E2, 0x008E2), (0x0180E, 0x0180E), (0x0200B, 0x0200F), (0x02028, 0x0202E), (0x02060, 0x02064), (0x02066, 0x0206F), (0x0D800, 0x0DFFF), (0x0FEFF, 0x0FEFF), (0x0FFF9, 0x0FFFB), (0x110BD, 0x110BD), (0x110CD, 0x110CD), (0x13430, 0x1343F), (0x1BCA0, 0x1BCA3), (0x1D173, 0x1D17A), (0xE0001, 0xE0001), (0xE0020, 0xE007F), ]; /// Width 0 combining marks. const COMBINING_TABLE: &'static [R] = &[ (0x00300, 0x0036F), (0x00483, 0x00489), (0x00591, 0x005BD), (0x005BF, 0x005BF), (0x005C1, 0x005C2), (0x005C4, 0x005C5), (0x005C7, 0x005C7), (0x00610, 0x0061A), (0x0064B, 0x0065F), (0x00670, 0x00670), (0x006D6, 0x006DC), (0x006DF, 0x006E4), (0x006E7, 0x006E8), (0x006EA, 0x006ED), (0x00711, 0x00711), (0x00730, 0x0074A), (0x007A6, 0x007B0), (0x007EB, 0x007F3), (0x007FD, 0x007FD), (0x00816, 0x00819), (0x0081B, 0x00823), (0x00825, 0x00827), (0x00829, 0x0082D), (0x00859, 0x0085B), (0x00897, 0x0089F), (0x008CA, 0x008E1), (0x008E3, 0x00903), (0x0093A, 0x0093C), (0x0093E, 0x0094F), (0x00951, 0x00957), (0x00962, 0x00963), (0x00981, 0x00983), (0x009BC, 0x009BC), (0x009BE, 0x009C4), (0x009C7, 0x009C8), (0x009CB, 0x009CD), (0x009D7, 0x009D7), (0x009E2, 0x009E3), (0x009FE, 0x009FE), (0x00A01, 0x00A03), (0x00A3C, 0x00A3C), (0x00A3E, 0x00A42), (0x00A47, 0x00A48), (0x00A4B, 0x00A4D), (0x00A51, 0x00A51), (0x00A70, 0x00A71), (0x00A75, 0x00A75), (0x00A81, 0x00A83), (0x00ABC, 0x00ABC), (0x00ABE, 0x00AC5), (0x00AC7, 0x00AC9), (0x00ACB, 0x00ACD), (0x00AE2, 0x00AE3), (0x00AFA, 0x00AFF), (0x00B01, 0x00B03), (0x00B3C, 0x00B3C), (0x00B3E, 0x00B44), (0x00B47, 0x00B48), (0x00B4B, 0x00B4D), (0x00B55, 0x00B57), (0x00B62, 0x00B63), (0x00B82, 0x00B82), (0x00BBE, 0x00BC2), (0x00BC6, 0x00BC8), (0x00BCA, 0x00BCD), (0x00BD7, 0x00BD7), (0x00C00, 0x00C04), (0x00C3C, 0x00C3C), (0x00C3E, 0x00C44), (0x00C46, 0x00C48), (0x00C4A, 0x00C4D), (0x00C55, 0x00C56), (0x00C62, 0x00C63), (0x00C81, 0x00C83), (0x00CBC, 0x00CBC), (0x00CBE, 0x00CC4), (0x00CC6, 0x00CC8), (0x00CCA, 0x00CCD), (0x00CD5, 0x00CD6), (0x00CE2, 0x00CE3), (0x00CF3, 0x00CF3), (0x00D00, 0x00D03), (0x00D3B, 0x00D3C), (0x00D3E, 0x00D44), (0x00D46, 0x00D48), (0x00D4A, 0x00D4D), (0x00D57, 0x00D57), (0x00D62, 0x00D63), (0x00D81, 0x00D83), (0x00DCA, 0x00DCA), (0x00DCF, 0x00DD4), (0x00DD6, 0x00DD6), (0x00DD8, 0x00DDF), (0x00DF2, 0x00DF3), (0x00E31, 0x00E31), (0x00E34, 0x00E3A), (0x00E47, 0x00E4E), (0x00EB1, 0x00EB1), (0x00EB4, 0x00EBC), (0x00EC8, 0x00ECE), (0x00F18, 0x00F19), (0x00F35, 0x00F35), (0x00F37, 0x00F37), (0x00F39, 0x00F39), (0x00F3E, 0x00F3F), (0x00F71, 0x00F84), (0x00F86, 0x00F87), (0x00F8D, 0x00F97), (0x00F99, 0x00FBC), (0x00FC6, 0x00FC6), (0x0102B, 0x0103E), (0x01056, 0x01059), (0x0105E, 0x01060), (0x01062, 0x01064), (0x01067, 0x0106D), (0x01071, 0x01074), (0x01082, 0x0108D), (0x0108F, 0x0108F), (0x0109A, 0x0109D), (0x0135D, 0x0135F), (0x01712, 0x01715), (0x01732, 0x01734), (0x01752, 0x01753), (0x01772, 0x01773), (0x017B4, 0x017D3), (0x017DD, 0x017DD), (0x0180B, 0x0180D), (0x0180F, 0x0180F), (0x01885, 0x01886), (0x018A9, 0x018A9), (0x01920, 0x0192B), (0x01930, 0x0193B), (0x01A17, 0x01A1B), (0x01A55, 0x01A5E), (0x01A60, 0x01A7C), (0x01A7F, 0x01A7F), (0x01AB0, 0x01ACE), (0x01B00, 0x01B04), (0x01B34, 0x01B44), (0x01B6B, 0x01B73), (0x01B80, 0x01B82), (0x01BA1, 0x01BAD), (0x01BE6, 0x01BF3), (0x01C24, 0x01C37), (0x01CD0, 0x01CD2), (0x01CD4, 0x01CE8), (0x01CED, 0x01CED), (0x01CF4, 0x01CF4), (0x01CF7, 0x01CF9), (0x01DC0, 0x01DFF), (0x020D0, 0x020F0), (0x02CEF, 0x02CF1), (0x02D7F, 0x02D7F), (0x02DE0, 0x02DFF), (0x0302A, 0x0302F), (0x03099, 0x0309A), (0x0A66F, 0x0A672), (0x0A674, 0x0A67D), (0x0A69E, 0x0A69F), (0x0A6F0, 0x0A6F1), (0x0A802, 0x0A802), (0x0A806, 0x0A806), (0x0A80B, 0x0A80B), (0x0A823, 0x0A827), (0x0A82C, 0x0A82C), (0x0A880, 0x0A881), (0x0A8B4, 0x0A8C5), (0x0A8E0, 0x0A8F1), (0x0A8FF, 0x0A8FF), (0x0A926, 0x0A92D), (0x0A947, 0x0A953), (0x0A980, 0x0A983), (0x0A9B3, 0x0A9C0), (0x0A9E5, 0x0A9E5), (0x0AA29, 0x0AA36), (0x0AA43, 0x0AA43), (0x0AA4C, 0x0AA4D), (0x0AA7B, 0x0AA7D), (0x0AAB0, 0x0AAB0), (0x0AAB2, 0x0AAB4), (0x0AAB7, 0x0AAB8), (0x0AABE, 0x0AABF), (0x0AAC1, 0x0AAC1), (0x0AAEB, 0x0AAEF), (0x0AAF5, 0x0AAF6), (0x0ABE3, 0x0ABEA), (0x0ABEC, 0x0ABED), (0x0FB1E, 0x0FB1E), (0x0FE00, 0x0FE0F), (0x0FE20, 0x0FE2F), (0x101FD, 0x101FD), (0x102E0, 0x102E0), (0x10376, 0x1037A), (0x10A01, 0x10A03), (0x10A05, 0x10A06), (0x10A0C, 0x10A0F), (0x10A38, 0x10A3A), (0x10A3F, 0x10A3F), (0x10AE5, 0x10AE6), (0x10D24, 0x10D27), (0x10D69, 0x10D6D), (0x10EAB, 0x10EAC), (0x10EFC, 0x10EFF), (0x10F46, 0x10F50), (0x10F82, 0x10F85), (0x11000, 0x11002), (0x11038, 0x11046), (0x11070, 0x11070), (0x11073, 0x11074), (0x1107F, 0x11082), (0x110B0, 0x110BA), (0x110C2, 0x110C2), (0x11100, 0x11102), (0x11127, 0x11134), (0x11145, 0x11146), (0x11173, 0x11173), (0x11180, 0x11182), (0x111B3, 0x111C0), (0x111C9, 0x111CC), (0x111CE, 0x111CF), (0x1122C, 0x11237), (0x1123E, 0x1123E), (0x11241, 0x11241), (0x112DF, 0x112EA), (0x11300, 0x11303), (0x1133B, 0x1133C), (0x1133E, 0x11344), (0x11347, 0x11348), (0x1134B, 0x1134D), (0x11357, 0x11357), (0x11362, 0x11363), (0x11366, 0x1136C), (0x11370, 0x11374), (0x113B8, 0x113C0), (0x113C2, 0x113C2), (0x113C5, 0x113C5), (0x113C7, 0x113CA), (0x113CC, 0x113D0), (0x113D2, 0x113D2), (0x113E1, 0x113E2), (0x11435, 0x11446), (0x1145E, 0x1145E), (0x114B0, 0x114C3), (0x115AF, 0x115B5), (0x115B8, 0x115C0), (0x115DC, 0x115DD), (0x11630, 0x11640), (0x116AB, 0x116B7), (0x1171D, 0x1172B), (0x1182C, 0x1183A), (0x11930, 0x11935), (0x11937, 0x11938), (0x1193B, 0x1193E), (0x11940, 0x11940), (0x11942, 0x11943), (0x119D1, 0x119D7), (0x119DA, 0x119E0), (0x119E4, 0x119E4), (0x11A01, 0x11A0A), (0x11A33, 0x11A39), (0x11A3B, 0x11A3E), (0x11A47, 0x11A47), (0x11A51, 0x11A5B), (0x11A8A, 0x11A99), (0x11C2F, 0x11C36), (0x11C38, 0x11C3F), (0x11C92, 0x11CA7), (0x11CA9, 0x11CB6), (0x11D31, 0x11D36), (0x11D3A, 0x11D3A), (0x11D3C, 0x11D3D), (0x11D3F, 0x11D45), (0x11D47, 0x11D47), (0x11D8A, 0x11D8E), (0x11D90, 0x11D91), (0x11D93, 0x11D97), (0x11EF3, 0x11EF6), (0x11F00, 0x11F01), (0x11F03, 0x11F03), (0x11F34, 0x11F3A), (0x11F3E, 0x11F42), (0x11F5A, 0x11F5A), (0x13440, 0x13440), (0x13447, 0x13455), (0x1611E, 0x1612F), (0x16AF0, 0x16AF4), (0x16B30, 0x16B36), (0x16F4F, 0x16F4F), (0x16F51, 0x16F87), (0x16F8F, 0x16F92), (0x16FE4, 0x16FE4), (0x16FF0, 0x16FF1), (0x1BC9D, 0x1BC9E), (0x1CF00, 0x1CF2D), (0x1CF30, 0x1CF46), (0x1D165, 0x1D169), (0x1D16D, 0x1D172), (0x1D17B, 0x1D182), (0x1D185, 0x1D18B), (0x1D1AA, 0x1D1AD), (0x1D242, 0x1D244), (0x1DA00, 0x1DA36), (0x1DA3B, 0x1DA6C), (0x1DA75, 0x1DA75), (0x1DA84, 0x1DA84), (0x1DA9B, 0x1DA9F), (0x1DAA1, 0x1DAAF), (0x1E000, 0x1E006), (0x1E008, 0x1E018), (0x1E01B, 0x1E021), (0x1E023, 0x1E024), (0x1E026, 0x1E02A), (0x1E08F, 0x1E08F), (0x1E130, 0x1E136), (0x1E2AE, 0x1E2AE), (0x1E2EC, 0x1E2EF), (0x1E4EC, 0x1E4EF), (0x1E5EE, 0x1E5EF), (0x1E8D0, 0x1E8D6), (0x1E944, 0x1E94A), (0xE0100, 0xE01EF), ]; /// Width 0 combining letters. const COMBININGLETTERS_TABLE: &'static [R] = &[(0x01160, 0x011FF), (0x0D7B0, 0x0D7FF)]; /// Width 2 characters. const DOUBLEWIDE_TABLE: &'static [R] = &[ (0x01100, 0x0115F), (0x02329, 0x0232A), (0x02630, 0x02637), (0x0268A, 0x0268F), (0x02E80, 0x02E99), (0x02E9B, 0x02EF3), (0x02F00, 0x02FD5), (0x02FF0, 0x0303E), (0x03041, 0x03096), (0x03099, 0x030FF), (0x03105, 0x0312F), (0x03131, 0x0318E), (0x03190, 0x031E5), (0x031EF, 0x0321E), (0x03220, 0x03247), (0x03250, 0x0A48C), (0x0A490, 0x0A4C6), (0x0A960, 0x0A97C), (0x0AC00, 0x0D7A3), (0x0F900, 0x0FAFF), (0x0FE10, 0x0FE19), (0x0FE30, 0x0FE52), (0x0FE54, 0x0FE66), (0x0FE68, 0x0FE6B), (0x0FF01, 0x0FF60), (0x0FFE0, 0x0FFE6), (0x16FE0, 0x16FE4), (0x16FF0, 0x16FF1), (0x17000, 0x187F7), (0x18800, 0x18CD5), (0x18CFF, 0x18D08), (0x1AFF0, 0x1AFF3), (0x1AFF5, 0x1AFFB), (0x1AFFD, 0x1AFFE), (0x1B000, 0x1B122), (0x1B132, 0x1B132), (0x1B150, 0x1B152), (0x1B155, 0x1B155), (0x1B164, 0x1B167), (0x1B170, 0x1B2FB), (0x1D300, 0x1D356), (0x1D360, 0x1D376), (0x1F200, 0x1F200), (0x1F202, 0x1F202), (0x1F210, 0x1F219), (0x1F21B, 0x1F22E), (0x1F230, 0x1F231), (0x1F237, 0x1F237), (0x1F23B, 0x1F23B), (0x1F240, 0x1F248), (0x1F260, 0x1F265), (0x1F57A, 0x1F57A), (0x1F5A4, 0x1F5A4), (0x1F6D1, 0x1F6D2), (0x1F6D5, 0x1F6D7), (0x1F6DC, 0x1F6DF), (0x1F6F4, 0x1F6FC), (0x1F7E0, 0x1F7EB), (0x1F7F0, 0x1F7F0), (0x1F90C, 0x1F90F), (0x1F919, 0x1F93A), (0x1F93C, 0x1F945), (0x1F947, 0x1F97F), (0x1F985, 0x1F9BF), (0x1F9C1, 0x1F9FF), (0x1FA70, 0x1FA7C), (0x1FA80, 0x1FA89), (0x1FA8F, 0x1FAC6), (0x1FACE, 0x1FADC), (0x1FADF, 0x1FAE9), (0x1FAF0, 0x1FAF8), (0x20000, 0x2FFFD), (0x30000, 0x3FFFD), ]; /// Ambiguous-width characters. const AMBIGUOUS_TABLE: &'static [R] = &[ (0x000A1, 0x000A1), (0x000A4, 0x000A4), (0x000A7, 0x000A8), (0x000AA, 0x000AA), (0x000AD, 0x000AE), (0x000B0, 0x000B4), (0x000B6, 0x000BA), (0x000BC, 0x000BF), (0x000C6, 0x000C6), (0x000D0, 0x000D0), (0x000D7, 0x000D8), (0x000DE, 0x000E1), (0x000E6, 0x000E6), (0x000E8, 0x000EA), (0x000EC, 0x000ED), (0x000F0, 0x000F0), (0x000F2, 0x000F3), (0x000F7, 0x000FA), (0x000FC, 0x000FC), (0x000FE, 0x000FE), (0x00101, 0x00101), (0x00111, 0x00111), (0x00113, 0x00113), (0x0011B, 0x0011B), (0x00126, 0x00127), (0x0012B, 0x0012B), (0x00131, 0x00133), (0x00138, 0x00138), (0x0013F, 0x00142), (0x00144, 0x00144), (0x00148, 0x0014B), (0x0014D, 0x0014D), (0x00152, 0x00153), (0x00166, 0x00167), (0x0016B, 0x0016B), (0x001CE, 0x001CE), (0x001D0, 0x001D0), (0x001D2, 0x001D2), (0x001D4, 0x001D4), (0x001D6, 0x001D6), (0x001D8, 0x001D8), (0x001DA, 0x001DA), (0x001DC, 0x001DC), (0x00251, 0x00251), (0x00261, 0x00261), (0x002C4, 0x002C4), (0x002C7, 0x002C7), (0x002C9, 0x002CB), (0x002CD, 0x002CD), (0x002D0, 0x002D0), (0x002D8, 0x002DB), (0x002DD, 0x002DD), (0x002DF, 0x002DF), (0x00300, 0x0036F), (0x00391, 0x003A1), (0x003A3, 0x003A9), (0x003B1, 0x003C1), (0x003C3, 0x003C9), (0x00401, 0x00401), (0x00410, 0x0044F), (0x00451, 0x00451), (0x02010, 0x02010), (0x02013, 0x02016), (0x02018, 0x02019), (0x0201C, 0x0201D), (0x02020, 0x02022), (0x02024, 0x02027), (0x02030, 0x02030), (0x02032, 0x02033), (0x02035, 0x02035), (0x0203B, 0x0203B), (0x0203E, 0x0203E), (0x02074, 0x02074), (0x0207F, 0x0207F), (0x02081, 0x02084), (0x020AC, 0x020AC), (0x02103, 0x02103), (0x02105, 0x02105), (0x02109, 0x02109), (0x02113, 0x02113), (0x02116, 0x02116), (0x02121, 0x02122), (0x02126, 0x02126), (0x0212B, 0x0212B), (0x02153, 0x02154), (0x0215B, 0x0215E), (0x02160, 0x0216B), (0x02170, 0x02179), (0x02189, 0x02189), (0x02190, 0x02199), (0x021B8, 0x021B9), (0x021D2, 0x021D2), (0x021D4, 0x021D4), (0x021E7, 0x021E7), (0x02200, 0x02200), (0x02202, 0x02203), (0x02207, 0x02208), (0x0220B, 0x0220B), (0x0220F, 0x0220F), (0x02211, 0x02211), (0x02215, 0x02215), (0x0221A, 0x0221A), (0x0221D, 0x02220), (0x02223, 0x02223), (0x02225, 0x02225), (0x02227, 0x0222C), (0x0222E, 0x0222E), (0x02234, 0x02237), (0x0223C, 0x0223D), (0x02248, 0x02248), (0x0224C, 0x0224C), (0x02252, 0x02252), (0x02260, 0x02261), (0x02264, 0x02267), (0x0226A, 0x0226B), (0x0226E, 0x0226F), (0x02282, 0x02283), (0x02286, 0x02287), (0x02295, 0x02295), (0x02299, 0x02299), (0x022A5, 0x022A5), (0x022BF, 0x022BF), (0x02312, 0x02312), (0x02460, 0x024E9), (0x024EB, 0x0254B), (0x02550, 0x02573), (0x02580, 0x0258F), (0x02592, 0x02595), (0x025A0, 0x025A1), (0x025A3, 0x025A9), (0x025B2, 0x025B3), (0x025B6, 0x025B7), (0x025BC, 0x025BD), (0x025C0, 0x025C1), (0x025C6, 0x025C8), (0x025CB, 0x025CB), (0x025CE, 0x025D1), (0x025E2, 0x025E5), (0x025EF, 0x025EF), (0x02605, 0x02606), (0x02609, 0x02609), (0x0260E, 0x0260F), (0x0261C, 0x0261C), (0x0261E, 0x0261E), (0x02640, 0x02640), (0x02642, 0x02642), (0x02660, 0x02661), (0x02663, 0x02665), (0x02667, 0x0266A), (0x0266C, 0x0266D), (0x0266F, 0x0266F), (0x0269E, 0x0269F), (0x026BF, 0x026BF), (0x026C6, 0x026CD), (0x026CF, 0x026D3), (0x026D5, 0x026E1), (0x026E3, 0x026E3), (0x026E8, 0x026E9), (0x026EB, 0x026F1), (0x026F4, 0x026F4), (0x026F6, 0x026F9), (0x026FB, 0x026FC), (0x026FE, 0x026FF), (0x0273D, 0x0273D), (0x02776, 0x0277F), (0x02B56, 0x02B59), (0x03248, 0x0324F), (0x0E000, 0x0F8FF), (0x0FE00, 0x0FE0F), (0x0FFFD, 0x0FFFD), (0x1F100, 0x1F10A), (0x1F110, 0x1F12D), (0x1F130, 0x1F169), (0x1F170, 0x1F18D), (0x1F18F, 0x1F190), (0x1F19B, 0x1F1AC), (0xE0100, 0xE01EF), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD), ]; /// Unassigned characters. const UNASSIGNED_TABLE: &'static [R] = &[ (0x00378, 0x00379), (0x00380, 0x00383), (0x0038B, 0x0038B), (0x0038D, 0x0038D), (0x003A2, 0x003A2), (0x00530, 0x00530), (0x00557, 0x00558), (0x0058B, 0x0058C), (0x00590, 0x00590), (0x005C8, 0x005CF), (0x005EB, 0x005EE), (0x005F5, 0x005FF), (0x0070E, 0x0070E), (0x0074B, 0x0074C), (0x007B2, 0x007BF), (0x007FB, 0x007FC), (0x0082E, 0x0082F), (0x0083F, 0x0083F), (0x0085C, 0x0085D), (0x0085F, 0x0085F), (0x0086B, 0x0086F), (0x0088F, 0x0088F), (0x00892, 0x00896), (0x00984, 0x00984), (0x0098D, 0x0098E), (0x00991, 0x00992), (0x009A9, 0x009A9), (0x009B1, 0x009B1), (0x009B3, 0x009B5), (0x009BA, 0x009BB), (0x009C5, 0x009C6), (0x009C9, 0x009CA), (0x009CF, 0x009D6), (0x009D8, 0x009DB), (0x009DE, 0x009DE), (0x009E4, 0x009E5), (0x009FF, 0x00A00), (0x00A04, 0x00A04), (0x00A0B, 0x00A0E), (0x00A11, 0x00A12), (0x00A29, 0x00A29), (0x00A31, 0x00A31), (0x00A34, 0x00A34), (0x00A37, 0x00A37), (0x00A3A, 0x00A3B), (0x00A3D, 0x00A3D), (0x00A43, 0x00A46), (0x00A49, 0x00A4A), (0x00A4E, 0x00A50), (0x00A52, 0x00A58), (0x00A5D, 0x00A5D), (0x00A5F, 0x00A65), (0x00A77, 0x00A80), (0x00A84, 0x00A84), (0x00A8E, 0x00A8E), (0x00A92, 0x00A92), (0x00AA9, 0x00AA9), (0x00AB1, 0x00AB1), (0x00AB4, 0x00AB4), (0x00ABA, 0x00ABB), (0x00AC6, 0x00AC6), (0x00ACA, 0x00ACA), (0x00ACE, 0x00ACF), (0x00AD1, 0x00ADF), (0x00AE4, 0x00AE5), (0x00AF2, 0x00AF8), (0x00B00, 0x00B00), (0x00B04, 0x00B04), (0x00B0D, 0x00B0E), (0x00B11, 0x00B12), (0x00B29, 0x00B29), (0x00B31, 0x00B31), (0x00B34, 0x00B34), (0x00B3A, 0x00B3B), (0x00B45, 0x00B46), (0x00B49, 0x00B4A), (0x00B4E, 0x00B54), (0x00B58, 0x00B5B), (0x00B5E, 0x00B5E), (0x00B64, 0x00B65), (0x00B78, 0x00B81), (0x00B84, 0x00B84), (0x00B8B, 0x00B8D), (0x00B91, 0x00B91), (0x00B96, 0x00B98), (0x00B9B, 0x00B9B), (0x00B9D, 0x00B9D), (0x00BA0, 0x00BA2), (0x00BA5, 0x00BA7), (0x00BAB, 0x00BAD), (0x00BBA, 0x00BBD), (0x00BC3, 0x00BC5), (0x00BC9, 0x00BC9), (0x00BCE, 0x00BCF), (0x00BD1, 0x00BD6), (0x00BD8, 0x00BE5), (0x00BFB, 0x00BFF), (0x00C0D, 0x00C0D), (0x00C11, 0x00C11), (0x00C29, 0x00C29), (0x00C3A, 0x00C3B), (0x00C45, 0x00C45), (0x00C49, 0x00C49), (0x00C4E, 0x00C54), (0x00C57, 0x00C57), (0x00C5B, 0x00C5C), (0x00C5E, 0x00C5F), (0x00C64, 0x00C65), (0x00C70, 0x00C76), (0x00C8D, 0x00C8D), (0x00C91, 0x00C91), (0x00CA9, 0x00CA9), (0x00CB4, 0x00CB4), (0x00CBA, 0x00CBB), (0x00CC5, 0x00CC5), (0x00CC9, 0x00CC9), (0x00CCE, 0x00CD4), (0x00CD7, 0x00CDC), (0x00CDF, 0x00CDF), (0x00CE4, 0x00CE5), (0x00CF0, 0x00CF0), (0x00CF4, 0x00CFF), (0x00D0D, 0x00D0D), (0x00D11, 0x00D11), (0x00D45, 0x00D45), (0x00D49, 0x00D49), (0x00D50, 0x00D53), (0x00D64, 0x00D65), (0x00D80, 0x00D80), (0x00D84, 0x00D84), (0x00D97, 0x00D99), (0x00DB2, 0x00DB2), (0x00DBC, 0x00DBC), (0x00DBE, 0x00DBF), (0x00DC7, 0x00DC9), (0x00DCB, 0x00DCE), (0x00DD5, 0x00DD5), (0x00DD7, 0x00DD7), (0x00DE0, 0x00DE5), (0x00DF0, 0x00DF1), (0x00DF5, 0x00E00), (0x00E3B, 0x00E3E), (0x00E5C, 0x00E80), (0x00E83, 0x00E83), (0x00E85, 0x00E85), (0x00E8B, 0x00E8B), (0x00EA4, 0x00EA4), (0x00EA6, 0x00EA6), (0x00EBE, 0x00EBF), (0x00EC5, 0x00EC5), (0x00EC7, 0x00EC7), (0x00ECF, 0x00ECF), (0x00EDA, 0x00EDB), (0x00EE0, 0x00EFF), (0x00F48, 0x00F48), (0x00F6D, 0x00F70), (0x00F98, 0x00F98), (0x00FBD, 0x00FBD), (0x00FCD, 0x00FCD), (0x00FDB, 0x00FFF), (0x010C6, 0x010C6), (0x010C8, 0x010CC), (0x010CE, 0x010CF), (0x01249, 0x01249), (0x0124E, 0x0124F), (0x01257, 0x01257), (0x01259, 0x01259), (0x0125E, 0x0125F), (0x01289, 0x01289), (0x0128E, 0x0128F), (0x012B1, 0x012B1), (0x012B6, 0x012B7), (0x012BF, 0x012BF), (0x012C1, 0x012C1), (0x012C6, 0x012C7), (0x012D7, 0x012D7), (0x01311, 0x01311), (0x01316, 0x01317), (0x0135B, 0x0135C), (0x0137D, 0x0137F), (0x0139A, 0x0139F), (0x013F6, 0x013F7), (0x013FE, 0x013FF), (0x0169D, 0x0169F), (0x016F9, 0x016FF), (0x01716, 0x0171E), (0x01737, 0x0173F), (0x01754, 0x0175F), (0x0176D, 0x0176D), (0x01771, 0x01771), (0x01774, 0x0177F), (0x017DE, 0x017DF), (0x017EA, 0x017EF), (0x017FA, 0x017FF), (0x0181A, 0x0181F), (0x01879, 0x0187F), (0x018AB, 0x018AF), (0x018F6, 0x018FF), (0x0191F, 0x0191F), (0x0192C, 0x0192F), (0x0193C, 0x0193F), (0x01941, 0x01943), (0x0196E, 0x0196F), (0x01975, 0x0197F), (0x019AC, 0x019AF), (0x019CA, 0x019CF), (0x019DB, 0x019DD), (0x01A1C, 0x01A1D), (0x01A5F, 0x01A5F), (0x01A7D, 0x01A7E), (0x01A8A, 0x01A8F), (0x01A9A, 0x01A9F), (0x01AAE, 0x01AAF), (0x01ACF, 0x01AFF), (0x01B4D, 0x01B4D), (0x01BF4, 0x01BFB), (0x01C38, 0x01C3A), (0x01C4A, 0x01C4C), (0x01C8B, 0x01C8F), (0x01CBB, 0x01CBC), (0x01CC8, 0x01CCF), (0x01CFB, 0x01CFF), (0x01F16, 0x01F17), (0x01F1E, 0x01F1F), (0x01F46, 0x01F47), (0x01F4E, 0x01F4F), (0x01F58, 0x01F58), (0x01F5A, 0x01F5A), (0x01F5C, 0x01F5C), (0x01F5E, 0x01F5E), (0x01F7E, 0x01F7F), (0x01FB5, 0x01FB5), (0x01FC5, 0x01FC5), (0x01FD4, 0x01FD5), (0x01FDC, 0x01FDC), (0x01FF0, 0x01FF1), (0x01FF5, 0x01FF5), (0x01FFF, 0x01FFF), (0x02065, 0x02065), (0x02072, 0x02073), (0x0208F, 0x0208F), (0x0209D, 0x0209F), (0x020C1, 0x020CF), (0x020F1, 0x020FF), (0x0218C, 0x0218F), (0x0242A, 0x0243F), (0x0244B, 0x0245F), (0x02B74, 0x02B75), (0x02B96, 0x02B96), (0x02CF4, 0x02CF8), (0x02D26, 0x02D26), (0x02D28, 0x02D2C), (0x02D2E, 0x02D2F), (0x02D68, 0x02D6E), (0x02D71, 0x02D7E), (0x02D97, 0x02D9F), (0x02DA7, 0x02DA7), (0x02DAF, 0x02DAF), (0x02DB7, 0x02DB7), (0x02DBF, 0x02DBF), (0x02DC7, 0x02DC7), (0x02DCF, 0x02DCF), (0x02DD7, 0x02DD7), (0x02DDF, 0x02DDF), (0x02E5E, 0x02E7F), (0x02E9A, 0x02E9A), (0x02EF4, 0x02EFF), (0x02FD6, 0x02FEF), (0x03040, 0x03040), (0x03097, 0x03098), (0x03100, 0x03104), (0x03130, 0x03130), (0x0318F, 0x0318F), (0x031E6, 0x031EE), (0x0321F, 0x0321F), (0x03401, 0x04DBE), (0x04E01, 0x09FFE), (0x0A48D, 0x0A48F), (0x0A4C7, 0x0A4CF), (0x0A62C, 0x0A63F), (0x0A6F8, 0x0A6FF), (0x0A7CE, 0x0A7CF), (0x0A7D2, 0x0A7D2), (0x0A7D4, 0x0A7D4), (0x0A7DD, 0x0A7F1), (0x0A82D, 0x0A82F), (0x0A83A, 0x0A83F), (0x0A878, 0x0A87F), (0x0A8C6, 0x0A8CD), (0x0A8DA, 0x0A8DF), (0x0A954, 0x0A95E), (0x0A97D, 0x0A97F), (0x0A9CE, 0x0A9CE), (0x0A9DA, 0x0A9DD), (0x0A9FF, 0x0A9FF), (0x0AA37, 0x0AA3F), (0x0AA4E, 0x0AA4F), (0x0AA5A, 0x0AA5B), (0x0AAC3, 0x0AADA), (0x0AAF7, 0x0AB00), (0x0AB07, 0x0AB08), (0x0AB0F, 0x0AB10), (0x0AB17, 0x0AB1F), (0x0AB27, 0x0AB27), (0x0AB2F, 0x0AB2F), (0x0AB6C, 0x0AB6F), (0x0ABEE, 0x0ABEF), (0x0ABFA, 0x0ABFF), (0x0AC01, 0x0D7A2), (0x0D7A4, 0x0D7AF), (0x0D7C7, 0x0D7CA), (0x0D7FC, 0x0D7FF), (0x0FA6E, 0x0FA6F), (0x0FADA, 0x0FAFF), (0x0FB07, 0x0FB12), (0x0FB18, 0x0FB1C), (0x0FB37, 0x0FB37), (0x0FB3D, 0x0FB3D), (0x0FB3F, 0x0FB3F), (0x0FB42, 0x0FB42), (0x0FB45, 0x0FB45), (0x0FBC3, 0x0FBD2), (0x0FD90, 0x0FD91), (0x0FDC8, 0x0FDCE), (0x0FE1A, 0x0FE1F), (0x0FE53, 0x0FE53), (0x0FE67, 0x0FE67), (0x0FE6C, 0x0FE6F), (0x0FE75, 0x0FE75), (0x0FEFD, 0x0FEFE), (0x0FF00, 0x0FF00), (0x0FFBF, 0x0FFC1), (0x0FFC8, 0x0FFC9), (0x0FFD0, 0x0FFD1), (0x0FFD8, 0x0FFD9), (0x0FFDD, 0x0FFDF), (0x0FFE7, 0x0FFE7), (0x0FFEF, 0x0FFF8), (0x1000C, 0x1000C), (0x10027, 0x10027), (0x1003B, 0x1003B), (0x1003E, 0x1003E), (0x1004E, 0x1004F), (0x1005E, 0x1007F), (0x100FB, 0x100FF), (0x10103, 0x10106), (0x10134, 0x10136), (0x1018F, 0x1018F), (0x1019D, 0x1019F), (0x101A1, 0x101CF), (0x101FE, 0x1027F), (0x1029D, 0x1029F), (0x102D1, 0x102DF), (0x102FC, 0x102FF), (0x10324, 0x1032C), (0x1034B, 0x1034F), (0x1037B, 0x1037F), (0x1039E, 0x1039E), (0x103C4, 0x103C7), (0x103D6, 0x103FF), (0x1049E, 0x1049F), (0x104AA, 0x104AF), (0x104D4, 0x104D7), (0x104FC, 0x104FF), (0x10528, 0x1052F), (0x10564, 0x1056E), (0x1057B, 0x1057B), (0x1058B, 0x1058B), (0x10593, 0x10593), (0x10596, 0x10596), (0x105A2, 0x105A2), (0x105B2, 0x105B2), (0x105BA, 0x105BA), (0x105BD, 0x105BF), (0x105F4, 0x105FF), (0x10737, 0x1073F), (0x10756, 0x1075F), (0x10768, 0x1077F), (0x10786, 0x10786), (0x107B1, 0x107B1), (0x107BB, 0x107FF), (0x10806, 0x10807), (0x10809, 0x10809), (0x10836, 0x10836), (0x10839, 0x1083B), (0x1083D, 0x1083E), (0x10856, 0x10856), (0x1089F, 0x108A6), (0x108B0, 0x108DF), (0x108F3, 0x108F3), (0x108F6, 0x108FA), (0x1091C, 0x1091E), (0x1093A, 0x1093E), (0x10940, 0x1097F), (0x109B8, 0x109BB), (0x109D0, 0x109D1), (0x10A04, 0x10A04), (0x10A07, 0x10A0B), (0x10A14, 0x10A14), (0x10A18, 0x10A18), (0x10A36, 0x10A37), (0x10A3B, 0x10A3E), (0x10A49, 0x10A4F), (0x10A59, 0x10A5F), (0x10AA0, 0x10ABF), (0x10AE7, 0x10AEA), (0x10AF7, 0x10AFF), (0x10B36, 0x10B38), (0x10B56, 0x10B57), (0x10B73, 0x10B77), (0x10B92, 0x10B98), (0x10B9D, 0x10BA8), (0x10BB0, 0x10BFF), (0x10C49, 0x10C7F), (0x10CB3, 0x10CBF), (0x10CF3, 0x10CF9), (0x10D28, 0x10D2F), (0x10D3A, 0x10D3F), (0x10D66, 0x10D68), (0x10D86, 0x10D8D), (0x10D90, 0x10E5F), (0x10E7F, 0x10E7F), (0x10EAA, 0x10EAA), (0x10EAE, 0x10EAF), (0x10EB2, 0x10EC1), (0x10EC5, 0x10EFB), (0x10F28, 0x10F2F), (0x10F5A, 0x10F6F), (0x10F8A, 0x10FAF), (0x10FCC, 0x10FDF), (0x10FF7, 0x10FFF), (0x1104E, 0x11051), (0x11076, 0x1107E), (0x110C3, 0x110CC), (0x110CE, 0x110CF), (0x110E9, 0x110EF), (0x110FA, 0x110FF), (0x11135, 0x11135), (0x11148, 0x1114F), (0x11177, 0x1117F), (0x111E0, 0x111E0), (0x111F5, 0x111FF), (0x11212, 0x11212), (0x11242, 0x1127F), (0x11287, 0x11287), (0x11289, 0x11289), (0x1128E, 0x1128E), (0x1129E, 0x1129E), (0x112AA, 0x112AF), (0x112EB, 0x112EF), (0x112FA, 0x112FF), (0x11304, 0x11304), (0x1130D, 0x1130E), (0x11311, 0x11312), (0x11329, 0x11329), (0x11331, 0x11331), (0x11334, 0x11334), (0x1133A, 0x1133A), (0x11345, 0x11346), (0x11349, 0x1134A), (0x1134E, 0x1134F), (0x11351, 0x11356), (0x11358, 0x1135C), (0x11364, 0x11365), (0x1136D, 0x1136F), (0x11375, 0x1137F), (0x1138A, 0x1138A), (0x1138C, 0x1138D), (0x1138F, 0x1138F), (0x113B6, 0x113B6), (0x113C1, 0x113C1), (0x113C3, 0x113C4), (0x113C6, 0x113C6), (0x113CB, 0x113CB), (0x113D6, 0x113D6), (0x113D9, 0x113E0), (0x113E3, 0x113FF), (0x1145C, 0x1145C), (0x11462, 0x1147F), (0x114C8, 0x114CF), (0x114DA, 0x1157F), (0x115B6, 0x115B7), (0x115DE, 0x115FF), (0x11645, 0x1164F), (0x1165A, 0x1165F), (0x1166D, 0x1167F), (0x116BA, 0x116BF), (0x116CA, 0x116CF), (0x116E4, 0x116FF), (0x1171B, 0x1171C), (0x1172C, 0x1172F), (0x11747, 0x117FF), (0x1183C, 0x1189F), (0x118F3, 0x118FE), (0x11907, 0x11908), (0x1190A, 0x1190B), (0x11914, 0x11914), (0x11917, 0x11917), (0x11936, 0x11936), (0x11939, 0x1193A), (0x11947, 0x1194F), (0x1195A, 0x1199F), (0x119A8, 0x119A9), (0x119D8, 0x119D9), (0x119E5, 0x119FF), (0x11A48, 0x11A4F), (0x11AA3, 0x11AAF), (0x11AF9, 0x11AFF), (0x11B0A, 0x11BBF), (0x11BE2, 0x11BEF), (0x11BFA, 0x11BFF), (0x11C09, 0x11C09), (0x11C37, 0x11C37), (0x11C46, 0x11C4F), (0x11C6D, 0x11C6F), (0x11C90, 0x11C91), (0x11CA8, 0x11CA8), (0x11CB7, 0x11CFF), (0x11D07, 0x11D07), (0x11D0A, 0x11D0A), (0x11D37, 0x11D39), (0x11D3B, 0x11D3B), (0x11D3E, 0x11D3E), (0x11D48, 0x11D4F), (0x11D5A, 0x11D5F), (0x11D66, 0x11D66), (0x11D69, 0x11D69), (0x11D8F, 0x11D8F), (0x11D92, 0x11D92), (0x11D99, 0x11D9F), (0x11DAA, 0x11EDF), (0x11EF9, 0x11EFF), (0x11F11, 0x11F11), (0x11F3B, 0x11F3D), (0x11F5B, 0x11FAF), (0x11FB1, 0x11FBF), (0x11FF2, 0x11FFE), (0x1239A, 0x123FF), (0x1246F, 0x1246F), (0x12475, 0x1247F), (0x12544, 0x12F8F), (0x12FF3, 0x12FFF), (0x13456, 0x1345F), (0x143FB, 0x143FF), (0x14647, 0x160FF), (0x1613A, 0x167FF), (0x16A39, 0x16A3F), (0x16A5F, 0x16A5F), (0x16A6A, 0x16A6D), (0x16ABF, 0x16ABF), (0x16ACA, 0x16ACF), (0x16AEE, 0x16AEF), (0x16AF6, 0x16AFF), (0x16B46, 0x16B4F), (0x16B5A, 0x16B5A), (0x16B62, 0x16B62), (0x16B78, 0x16B7C), (0x16B90, 0x16D3F), (0x16D7A, 0x16E3F), (0x16E9B, 0x16EFF), (0x16F4B, 0x16F4E), (0x16F88, 0x16F8E), (0x16FA0, 0x16FDF), (0x16FE5, 0x16FEF), (0x16FF2, 0x16FFF), (0x17001, 0x187F6), (0x187F8, 0x187FF), (0x18CD6, 0x18CFE), (0x18D01, 0x18D07), (0x18D09, 0x1AFEF), (0x1AFF4, 0x1AFF4), (0x1AFFC, 0x1AFFC), (0x1AFFF, 0x1AFFF), (0x1B123, 0x1B131), (0x1B133, 0x1B14F), (0x1B153, 0x1B154), (0x1B156, 0x1B163), (0x1B168, 0x1B16F), (0x1B2FC, 0x1BBFF), (0x1BC6B, 0x1BC6F), (0x1BC7D, 0x1BC7F), (0x1BC89, 0x1BC8F), (0x1BC9A, 0x1BC9B), (0x1BCA4, 0x1CBFF), (0x1CCFA, 0x1CCFF), (0x1CEB4, 0x1CEFF), (0x1CF2E, 0x1CF2F), (0x1CF47, 0x1CF4F), (0x1CFC4, 0x1CFFF), (0x1D0F6, 0x1D0FF), (0x1D127, 0x1D128), (0x1D1EB, 0x1D1FF), (0x1D246, 0x1D2BF), (0x1D2D4, 0x1D2DF), (0x1D2F4, 0x1D2FF), (0x1D357, 0x1D35F), (0x1D379, 0x1D3FF), (0x1D455, 0x1D455), (0x1D49D, 0x1D49D), (0x1D4A0, 0x1D4A1), (0x1D4A3, 0x1D4A4), (0x1D4A7, 0x1D4A8), (0x1D4AD, 0x1D4AD), (0x1D4BA, 0x1D4BA), (0x1D4BC, 0x1D4BC), (0x1D4C4, 0x1D4C4), (0x1D506, 0x1D506), (0x1D50B, 0x1D50C), (0x1D515, 0x1D515), (0x1D51D, 0x1D51D), (0x1D53A, 0x1D53A), (0x1D53F, 0x1D53F), (0x1D545, 0x1D545), (0x1D547, 0x1D549), (0x1D551, 0x1D551), (0x1D6A6, 0x1D6A7), (0x1D7CC, 0x1D7CD), (0x1DA8C, 0x1DA9A), (0x1DAA0, 0x1DAA0), (0x1DAB0, 0x1DEFF), (0x1DF1F, 0x1DF24), (0x1DF2B, 0x1DFFF), (0x1E007, 0x1E007), (0x1E019, 0x1E01A), (0x1E022, 0x1E022), (0x1E025, 0x1E025), (0x1E02B, 0x1E02F), (0x1E06E, 0x1E08E), (0x1E090, 0x1E0FF), (0x1E12D, 0x1E12F), (0x1E13E, 0x1E13F), (0x1E14A, 0x1E14D), (0x1E150, 0x1E28F), (0x1E2AF, 0x1E2BF), (0x1E2FA, 0x1E2FE), (0x1E300, 0x1E4CF), (0x1E4FA, 0x1E5CF), (0x1E5FB, 0x1E5FE), (0x1E600, 0x1E7DF), (0x1E7E7, 0x1E7E7), (0x1E7EC, 0x1E7EC), (0x1E7EF, 0x1E7EF), (0x1E7FF, 0x1E7FF), (0x1E8C5, 0x1E8C6), (0x1E8D7, 0x1E8FF), (0x1E94C, 0x1E94F), (0x1E95A, 0x1E95D), (0x1E960, 0x1EC70), (0x1ECB5, 0x1ED00), (0x1ED3E, 0x1EDFF), (0x1EE04, 0x1EE04), (0x1EE20, 0x1EE20), (0x1EE23, 0x1EE23), (0x1EE25, 0x1EE26), (0x1EE28, 0x1EE28), (0x1EE33, 0x1EE33), (0x1EE38, 0x1EE38), (0x1EE3A, 0x1EE3A), (0x1EE3C, 0x1EE41), (0x1EE43, 0x1EE46), (0x1EE48, 0x1EE48), (0x1EE4A, 0x1EE4A), (0x1EE4C, 0x1EE4C), (0x1EE50, 0x1EE50), (0x1EE53, 0x1EE53), (0x1EE55, 0x1EE56), (0x1EE58, 0x1EE58), (0x1EE5A, 0x1EE5A), (0x1EE5C, 0x1EE5C), (0x1EE5E, 0x1EE5E), (0x1EE60, 0x1EE60), (0x1EE63, 0x1EE63), (0x1EE65, 0x1EE66), (0x1EE6B, 0x1EE6B), (0x1EE73, 0x1EE73), (0x1EE78, 0x1EE78), (0x1EE7D, 0x1EE7D), (0x1EE7F, 0x1EE7F), (0x1EE8A, 0x1EE8A), (0x1EE9C, 0x1EEA0), (0x1EEA4, 0x1EEA4), (0x1EEAA, 0x1EEAA), (0x1EEBC, 0x1EEEF), (0x1EEF2, 0x1EFFF), (0x1F02C, 0x1F02F), (0x1F094, 0x1F09F), (0x1F0AF, 0x1F0B0), (0x1F0C0, 0x1F0C0), (0x1F0D0, 0x1F0D0), (0x1F0F6, 0x1F0FF), (0x1F1AE, 0x1F1E5), (0x1F203, 0x1F20F), (0x1F23C, 0x1F23F), (0x1F249, 0x1F24F), (0x1F252, 0x1F25F), (0x1F266, 0x1F2FF), (0x1F6D8, 0x1F6DB), (0x1F6ED, 0x1F6EF), (0x1F6FD, 0x1F6FF), (0x1F777, 0x1F77A), (0x1F7DA, 0x1F7DF), (0x1F7EC, 0x1F7EF), (0x1F7F1, 0x1F7FF), (0x1F80C, 0x1F80F), (0x1F848, 0x1F84F), (0x1F85A, 0x1F85F), (0x1F888, 0x1F88F), (0x1F8AE, 0x1F8AF), (0x1F8BC, 0x1F8BF), (0x1F8C2, 0x1F8FF), (0x1FA54, 0x1FA5F), (0x1FA6E, 0x1FA6F), (0x1FA7D, 0x1FA7F), (0x1FA8A, 0x1FA8E), (0x1FAC7, 0x1FACD), (0x1FADD, 0x1FADE), (0x1FAEA, 0x1FAEF), (0x1FAF9, 0x1FAFF), (0x1FB93, 0x1FB93), (0x1FBFA, 0x1FFFD), (0x20001, 0x2A6DE), (0x2A6E0, 0x2A6FF), (0x2A701, 0x2B738), (0x2B73A, 0x2B73F), (0x2B741, 0x2B81C), (0x2B81E, 0x2B81F), (0x2B821, 0x2CEA0), (0x2CEA2, 0x2CEAF), (0x2CEB1, 0x2EBDF), (0x2EBE1, 0x2EBEF), (0x2EBF1, 0x2EE5C), (0x2EE5E, 0x2F7FF), (0x2FA1E, 0x2FFFD), (0x30001, 0x31349), (0x3134B, 0x3134F), (0x31351, 0x323AE), (0x323B0, 0x3FFFD), (0x40000, 0x4FFFD), (0x50000, 0x5FFFD), (0x60000, 0x6FFFD), (0x70000, 0x7FFFD), (0x80000, 0x8FFFD), (0x90000, 0x9FFFD), (0xA0000, 0xAFFFD), (0xB0000, 0xBFFFD), (0xC0000, 0xCFFFD), (0xD0000, 0xDFFFD), (0xE0000, 0xE0000), (0xE0002, 0xE001F), (0xE0080, 0xE00FF), (0xE01F0, 0xEFFFD), ]; /// Non-characters. const NONCHAR_TABLE: &'static [R] = &[ (0x0FDD0, 0x0FDEF), (0x0FFFE, 0x0FFFF), (0x1FFFE, 0x1FFFF), (0x2FFFE, 0x2FFFF), (0x3FFFE, 0x3FFFF), (0x4FFFE, 0x4FFFF), (0x5FFFE, 0x5FFFF), (0x6FFFE, 0x6FFFF), (0x7FFFE, 0x7FFFF), (0x8FFFE, 0x8FFFF), (0x9FFFE, 0x9FFFF), (0xAFFFE, 0xAFFFF), (0xBFFFE, 0xBFFFF), (0xCFFFE, 0xCFFFF), (0xDFFFE, 0xDFFFF), (0xEFFFE, 0xEFFFF), (0xFFFFE, 0xFFFFF), (0x10FFFE, 0x10FFFF), ]; /// Characters that were widened from width 1 to 2 in Unicode 9. const WIDENED_TABLE: &'static [R] = &[ (0x0231A, 0x0231B), (0x023E9, 0x023EC), (0x023F0, 0x023F0), (0x023F3, 0x023F3), (0x025FD, 0x025FE), (0x02614, 0x02615), (0x02648, 0x02653), (0x0267F, 0x0267F), (0x02693, 0x02693), (0x026A1, 0x026A1), (0x026AA, 0x026AB), (0x026BD, 0x026BE), (0x026C4, 0x026C5), (0x026CE, 0x026CE), (0x026D4, 0x026D4), (0x026EA, 0x026EA), (0x026F2, 0x026F3), (0x026F5, 0x026F5), (0x026FA, 0x026FA), (0x026FD, 0x026FD), (0x02705, 0x02705), (0x0270A, 0x0270B), (0x02728, 0x02728), (0x0274C, 0x0274C), (0x0274E, 0x0274E), (0x02753, 0x02755), (0x02757, 0x02757), (0x02795, 0x02797), (0x027B0, 0x027B0), (0x027BF, 0x027BF), (0x02B1B, 0x02B1C), (0x02B50, 0x02B50), (0x02B55, 0x02B55), (0x1F004, 0x1F004), (0x1F0CF, 0x1F0CF), (0x1F18E, 0x1F18E), (0x1F191, 0x1F19A), (0x1F201, 0x1F201), (0x1F21A, 0x1F21A), (0x1F22F, 0x1F22F), (0x1F232, 0x1F236), (0x1F238, 0x1F23A), (0x1F250, 0x1F251), (0x1F300, 0x1F320), (0x1F32D, 0x1F335), (0x1F337, 0x1F37C), (0x1F37E, 0x1F393), (0x1F3A0, 0x1F3CA), (0x1F3CF, 0x1F3D3), (0x1F3E0, 0x1F3F0), (0x1F3F4, 0x1F3F4), (0x1F3F8, 0x1F43E), (0x1F440, 0x1F440), (0x1F442, 0x1F4FC), (0x1F4FF, 0x1F53D), (0x1F54B, 0x1F54E), (0x1F550, 0x1F567), (0x1F595, 0x1F596), (0x1F5FB, 0x1F64F), (0x1F680, 0x1F6C5), (0x1F6CC, 0x1F6CC), (0x1F6D0, 0x1F6D0), (0x1F6EB, 0x1F6EC), (0x1F910, 0x1F918), (0x1F980, 0x1F984), (0x1F9C0, 0x1F9C0), ]; fn in_table(arr: &[R], c: u32) -> bool { arr.binary_search_by(|(start, end)| { if c >= *start && c <= *end { std::cmp::Ordering::Equal } else { start.cmp(&c) } }) .is_ok() } impl WcWidth { /// Return the width of character c pub fn from_char(c: char) -> Self { let c = c as u32; if in_table(&ASCII_TABLE, c) { return Self::One; } if in_table(&PRIVATE_TABLE, c) { return Self::PrivateUse; } if in_table(&NONPRINT_TABLE, c) { return Self::NonPrint; } if in_table(&NONCHAR_TABLE, c) { return Self::NonCharacter; } if in_table(&COMBINING_TABLE, c) { return Self::Combining; } if in_table(&COMBININGLETTERS_TABLE, c) { return Self::Combining; } if in_table(&DOUBLEWIDE_TABLE, c) { return Self::Two; } if in_table(&AMBIGUOUS_TABLE, c) { return Self::Ambiguous; } if in_table(&UNASSIGNED_TABLE, c) { return Self::Unassigned; } if in_table(&WIDENED_TABLE, c) { return Self::WidenedIn9; } Self::One } /// Returns width for applications that are using unicode 8 or earlier #[inline] pub fn width_unicode_8_or_earlier(self) -> u8 { match self { Self::One => 1, Self::Two => 2, Self::NonPrint | Self::Combining | Self::Unassigned | Self::NonCharacter => 0, Self::Ambiguous | Self::PrivateUse => 1, Self::WidenedIn9 => 1, } } /// Returns width for applications that are using unicode 9 or later #[inline] pub fn width_unicode_9_or_later(self) -> u8 { if self == Self::WidenedIn9 { return 2; } self.width_unicode_8_or_earlier() } } /// An alternative interface that precomputes the values for the first 64k /// codepoints and maintains a table that is 64kb in size. /// Lookups are then a simple O(1) index operation that takes ~1.5ns /// constant time for codepoints in that range, falling back to /// the regular WcWidth::from_char for codepoints outside that range /// (which takes 20-75ns depending on the codepoint and which table /// it is resolved to) pub struct WcLookupTable { pub table: [WcWidth; 65536], } impl WcLookupTable { #[allow(unused)] pub fn new() -> Self { let mut table = [WcWidth::One; 65536]; // Populate the table with data from the other tables in // the reverse order to that used to lookup in // WcWidth::from_char so that the precedence is the // same in the event that there are any overlaps. for &(start, end) in WIDENED_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::WidenedIn9; } } for &(start, end) in UNASSIGNED_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Unassigned; } } for &(start, end) in AMBIGUOUS_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Ambiguous; } } for &(start, end) in DOUBLEWIDE_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Two; } } for &(start, end) in COMBININGLETTERS_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Combining; } } for &(start, end) in COMBINING_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Combining; } } for &(start, end) in NONCHAR_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::NonCharacter; } } for &(start, end) in NONPRINT_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::NonPrint; } } for &(start, end) in PRIVATE_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::PrivateUse; } } /* Implicit, as we initialized to One for &(start, end) in ASCII_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::One; } } */ Self { table } } /// Classify a char as a WcWidth pub fn classify(&self, c: char) -> WcWidth { let c32 = c as u32; if c32 <= 0xffff { return self.table[c32 as usize]; } WcWidth::from_char(c) } } #[cfg(test)] mod test { use super::*; #[test] fn basics() { assert_eq!(WcWidth::from_char('w'), WcWidth::One); assert_eq!(WcWidth::from_char('\x1f'), WcWidth::NonPrint); assert_eq!(WcWidth::from_char('\u{e001}'), WcWidth::PrivateUse); assert_eq!(WcWidth::from_char('\u{2716}'), WcWidth::One); assert_eq!(WcWidth::from_char('\u{270a}'), WcWidth::WidenedIn9); assert_eq!(WcWidth::from_char('\u{3fffd}'), WcWidth::Two); } } termwiz-0.23.3/src/widgets/layout.rs000064400000000000000000000670521046102023000155440ustar 00000000000000//! This module provides some automatic layout functionality for widgets. //! The parameters are similar to those that you may have encountered //! in HTML, but do not fully recreate the layout model. use crate::{format_err, Error, Result}; use cassowary::strength::{REQUIRED, STRONG, WEAK}; use cassowary::WeightedRelation::*; use cassowary::{AddConstraintError, Expression, Solver, SuggestValueError, Variable}; use std::collections::HashMap; use crate::widgets::{Rect, WidgetId}; /// Expands to an Expression holding the value of the variable, /// or if there is no variable, a constant with the specified /// value. /// Equivalent to Option::unwrap_or(). fn unwrap_variable_or(var: Option, value: f64) -> Expression { // The `v + 0.0` portion "converts" the variable to an Expression. var.map(|v| v + 0.0) .unwrap_or_else(|| Expression::from_constant(value)) } /// Specify whether a width or a height has a preferred fixed size /// or whether it should occupy a percentage of its parent container. /// The default is 100% of the parent container. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum DimensionSpec { /// Occupy a fixed number of cells Fixed(u16), /// Occupy a percentage of the space in the parent container Percentage(u8), } impl Default for DimensionSpec { fn default() -> Self { DimensionSpec::Percentage(100) } } /// Specifies the extent of a width or height. The `spec` field /// holds the preferred size, while the `minimum` and `maximum` /// fields set optional lower and upper bounds. #[derive(Clone, Default, Copy, Debug, PartialEq, Eq)] pub struct Dimension { pub spec: DimensionSpec, pub maximum: Option, pub minimum: Option, } /// Specifies whether the children of a widget are laid out /// vertically (top to bottom) or horizontally (left to right). /// The default is horizontal. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum ChildOrientation { Vertical, Horizontal, } impl Default for ChildOrientation { fn default() -> Self { ChildOrientation::Horizontal } } /// Specifies whether the widget should be aligned to the top, /// middle or bottom of the vertical space in its parent. /// The default is Top. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum VerticalAlignment { Top, Middle, Bottom, } impl Default for VerticalAlignment { fn default() -> Self { VerticalAlignment::Top } } /// Specifies whether the widget should be aligned to the left, /// center or right of the horizontal space in its parent. /// The default is Left. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum HorizontalAlignment { Left, Center, Right, } impl Default for HorizontalAlignment { fn default() -> Self { HorizontalAlignment::Left } } /// Specifies the size constraints for a widget #[derive(Clone, Default, Copy, Debug, PartialEq, Eq)] pub struct Constraints { pub width: Dimension, pub height: Dimension, pub valign: VerticalAlignment, pub halign: HorizontalAlignment, pub child_orientation: ChildOrientation, } impl Constraints { pub fn with_fixed_width_height(width: u16, height: u16) -> Self { *Self::default() .set_fixed_width(width) .set_fixed_height(height) } pub fn set_fixed_width(&mut self, width: u16) -> &mut Self { self.width = Dimension { spec: DimensionSpec::Fixed(width), minimum: Some(width), maximum: Some(width), }; self } pub fn set_pct_width(&mut self, width: u8) -> &mut Self { self.width = Dimension { spec: DimensionSpec::Percentage(width), ..Default::default() }; self } pub fn set_fixed_height(&mut self, height: u16) -> &mut Self { self.height = Dimension { spec: DimensionSpec::Fixed(height), minimum: Some(height), maximum: Some(height), }; self } pub fn set_pct_height(&mut self, height: u8) -> &mut Self { self.height = Dimension { spec: DimensionSpec::Percentage(height), ..Default::default() }; self } pub fn set_valign(&mut self, valign: VerticalAlignment) -> &mut Self { self.valign = valign; self } pub fn set_halign(&mut self, halign: HorizontalAlignment) -> &mut Self { self.halign = halign; self } } /// Holds state used to compute the layout of a tree of widgets pub struct LayoutState { solver: Solver, screen_width: Variable, screen_height: Variable, widget_states: HashMap, } /// Each `WidgetId` has a `WidgetState` associated with it. /// This allows us to look up the `Variable` for each of the /// layout features of a widget by `WidgetId` after the solver /// has computed the layout solution. #[derive(Clone)] struct WidgetState { left: Variable, top: Variable, width: Variable, height: Variable, constraints: Constraints, children: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct LaidOutWidget { pub widget: WidgetId, pub rect: Rect, } fn suggesterr(e: SuggestValueError) -> Error { match e { SuggestValueError::UnknownEditVariable => format_err!("Unknown edit variable"), SuggestValueError::InternalSolverError(e) => format_err!("Internal solver error: {}", e), } } fn adderr(e: AddConstraintError) -> Error { format_err!("{:?}", e) } impl Default for LayoutState { fn default() -> Self { Self::new() } } impl LayoutState { /// Create a new `LayoutState` pub fn new() -> Self { let mut solver = Solver::new(); let screen_width = Variable::new(); let screen_height = Variable::new(); solver .add_edit_variable(screen_width, STRONG) .expect("failed to add screen_width to solver"); solver .add_edit_variable(screen_height, STRONG) .expect("failed to add screen_height to solver"); Self { solver, screen_width, screen_height, widget_states: HashMap::new(), } } /// Creates a WidgetState entry for a widget. pub fn add_widget( &mut self, widget: WidgetId, constraints: &Constraints, children: &[WidgetId], ) { let state = WidgetState { left: Variable::new(), top: Variable::new(), width: Variable::new(), height: Variable::new(), constraints: *constraints, children: children.to_vec(), }; self.widget_states.insert(widget, state); } /// Assign the screen dimensions, compute constraints, solve /// the layout and then apply the size and positioning information /// to the widgets in the widget tree. pub fn compute_constraints( &mut self, screen_width: usize, screen_height: usize, root_widget: WidgetId, ) -> Result> { self.solver .suggest_value(self.screen_width, screen_width as f64) .map_err(suggesterr)?; self.solver .suggest_value(self.screen_height, screen_height as f64) .map_err(suggesterr)?; let width = self.screen_width; let height = self.screen_height; self.update_widget_constraint(root_widget, width, height, None, None)?; // The updates are in an unspecified order, and the coordinates are in // the screen absolute coordinate space, rather than the parent-relative // coordinates that we desire. So we need to either to accumulate the // deltas and then sort them such that we walk the widget tree to apply // them, or just walk the tree and apply them all anyway. The latter // feels easier and probably has a low enough cardinality that it won't // feel too expensive. self.solver.fetch_changes(); let mut results = Vec::new(); self.compute_widget_state(root_widget, 0, 0, &mut results)?; Ok(results) } fn compute_widget_state( &self, widget: WidgetId, parent_left: usize, parent_top: usize, results: &mut Vec, ) -> Result<()> { let state = self .widget_states .get(&widget) .ok_or_else(|| format_err!("widget has no solver state"))?; let width = self.solver.get_value(state.width) as usize; let height = self.solver.get_value(state.height) as usize; let left = self.solver.get_value(state.left) as usize; let top = self.solver.get_value(state.top) as usize; results.push(LaidOutWidget { widget, rect: Rect { x: left - parent_left, y: top - parent_top, width, height, }, }); for child in &state.children { self.compute_widget_state(*child, left, top, results)?; } Ok(()) } fn update_widget_constraint( &mut self, widget: WidgetId, parent_width: Variable, parent_height: Variable, parent_left: Option, parent_top: Option, ) -> Result { let state = self .widget_states .get(&widget) .ok_or_else(|| format_err!("widget has no solver state"))? .clone(); let is_root_widget = parent_left.is_none(); let parent_left = unwrap_variable_or(parent_left, 0.0); let parent_top = unwrap_variable_or(parent_top, 0.0); // First, we should fit inside the parent container self.solver .add_constraint( (state.left + state.width) | LE(REQUIRED) | (parent_left.clone() + parent_width), ) .map_err(adderr)?; self.solver .add_constraint(state.left | GE(REQUIRED) | parent_left) .map_err(adderr)?; self.solver .add_constraint( (state.top + state.height) | LE(REQUIRED) | (parent_top.clone() + parent_height), ) .map_err(adderr)?; self.solver .add_constraint(state.top | GE(REQUIRED) | parent_top) .map_err(adderr)?; if is_root_widget { // We handle alignment on the root widget specially here; // for non-root widgets, we handle it when assessing children match state.constraints.halign { HorizontalAlignment::Left => self .solver .add_constraint(state.left | EQ(STRONG) | 0.0) .map_err(adderr)?, HorizontalAlignment::Right => self .solver .add_constraint(state.left | EQ(STRONG) | (parent_width - state.width)) .map_err(adderr)?, HorizontalAlignment::Center => self .solver .add_constraint(state.left | EQ(STRONG) | ((parent_width - state.width) / 2.0)) .map_err(adderr)?, } match state.constraints.valign { VerticalAlignment::Top => self .solver .add_constraint(state.top | EQ(STRONG) | 0.0) .map_err(adderr)?, VerticalAlignment::Bottom => self .solver .add_constraint(state.top | EQ(STRONG) | (parent_height - state.height)) .map_err(adderr)?, VerticalAlignment::Middle => self .solver .add_constraint(state.top | EQ(STRONG) | ((parent_height - state.height) / 2.0)) .map_err(adderr)?, } } match state.constraints.width.spec { DimensionSpec::Fixed(width) => { self.solver .add_constraint(state.width | EQ(STRONG) | f64::from(width)) .map_err(adderr)?; } DimensionSpec::Percentage(pct) => { self.solver .add_constraint( state.width | EQ(STRONG) | (f64::from(pct) * parent_width / 100.0), ) .map_err(adderr)?; } } self.solver .add_constraint( state.width | GE(STRONG) | f64::from(state.constraints.width.minimum.unwrap_or(1).max(1)), ) .map_err(adderr)?; if let Some(max_width) = state.constraints.width.maximum { self.solver .add_constraint(state.width | LE(STRONG) | f64::from(max_width)) .map_err(adderr)?; } match state.constraints.height.spec { DimensionSpec::Fixed(height) => { self.solver .add_constraint(state.height | EQ(STRONG) | f64::from(height)) .map_err(adderr)?; } DimensionSpec::Percentage(pct) => { self.solver .add_constraint( state.height | EQ(STRONG) | (f64::from(pct) * parent_height / 100.0), ) .map_err(adderr)?; } } self.solver .add_constraint( state.height | GE(STRONG) | f64::from(state.constraints.height.minimum.unwrap_or(1).max(1)), ) .map_err(adderr)?; if let Some(max_height) = state.constraints.height.maximum { self.solver .add_constraint(state.height | LE(STRONG) | f64::from(max_height)) .map_err(adderr)?; } let has_children = !state.children.is_empty(); if has_children { let mut left_edge: Expression = state.left + 0.0; let mut top_edge: Expression = state.top + 0.0; let mut width_constraint = Expression::from_constant(0.0); let mut height_constraint = Expression::from_constant(0.0); for child in &state.children { let child_state = self.update_widget_constraint( *child, state.width, state.height, Some(state.left), Some(state.top), )?; match child_state.constraints.halign { HorizontalAlignment::Left => self .solver .add_constraint(child_state.left | EQ(STRONG) | left_edge.clone()) .map_err(adderr)?, HorizontalAlignment::Right => self .solver .add_constraint( (child_state.left + child_state.width) | EQ(STRONG) | (state.left + state.width), ) .map_err(adderr)?, HorizontalAlignment::Center => self .solver .add_constraint( child_state.left | EQ(STRONG) | (state.left + (state.width - child_state.width) / 2.0), ) .map_err(adderr)?, } match child_state.constraints.valign { VerticalAlignment::Top => self .solver .add_constraint(child_state.top | EQ(STRONG) | top_edge.clone()) .map_err(adderr)?, VerticalAlignment::Bottom => self .solver .add_constraint( (child_state.top + child_state.height) | EQ(STRONG) | (state.top + state.height), ) .map_err(adderr)?, VerticalAlignment::Middle => self .solver .add_constraint( child_state.top | EQ(STRONG) | (state.top + (state.height - child_state.height) / 2.0), ) .map_err(adderr)?, } match state.constraints.child_orientation { ChildOrientation::Horizontal => { left_edge = child_state.left + child_state.width; width_constraint = width_constraint + child_state.width; } ChildOrientation::Vertical => { top_edge = child_state.top + child_state.height; height_constraint = height_constraint + child_state.height; } } } // This constraint encourages the contents to fill out to the width // of the container, rather than clumping left self.solver .add_constraint(left_edge | EQ(STRONG) | (state.left + state.width)) .map_err(adderr)?; self.solver .add_constraint(state.width | GE(WEAK) | width_constraint) .map_err(adderr)?; // This constraint encourages the contents to fill out to the height // of the container, rather than clumping top self.solver .add_constraint(top_edge | EQ(STRONG) | (state.top + state.height)) .map_err(adderr)?; self.solver .add_constraint(state.height | GE(WEAK) | height_constraint) .map_err(adderr)?; } Ok(state) } } #[cfg(test)] mod test { use super::*; #[test] fn single_widget_unspec() { let mut layout = LayoutState::new(); let main_id = WidgetId::new(); layout.add_widget(main_id, &Constraints::default(), &[]); let results = layout.compute_constraints(40, 12, main_id).unwrap(); assert_eq!( results, vec![LaidOutWidget { widget: main_id, rect: Rect { x: 0, y: 0, width: 40, height: 12, }, }] ); } #[test] fn two_children_pct() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b]); layout.add_widget(a, Constraints::default().set_pct_width(50), &[]); layout.add_widget(b, Constraints::default().set_pct_width(50), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 50, height: 100, }, }, LaidOutWidget { widget: b, rect: Rect { x: 50, y: 0, width: 50, height: 100, }, }, ] ); } #[test] fn three_children_pct() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let c = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b, c]); layout.add_widget(a, Constraints::default().set_pct_width(20), &[]); layout.add_widget(b, Constraints::default().set_pct_width(20), &[]); layout.add_widget(c, Constraints::default().set_pct_width(20), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 20, height: 100, }, }, LaidOutWidget { widget: b, rect: Rect { x: 20, y: 0, width: 20, height: 100, }, }, LaidOutWidget { widget: c, rect: Rect { x: 40, y: 0, width: 20, height: 100, }, }, ] ); } #[test] fn two_children_a_b() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b]); layout.add_widget(a, &Constraints::with_fixed_width_height(5, 2), &[]); layout.add_widget(b, &Constraints::with_fixed_width_height(3, 2), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 5, height: 2, }, }, LaidOutWidget { widget: b, rect: Rect { x: 5, y: 0, width: 3, height: 2, }, }, ] ); } #[test] fn two_children_b_a() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[b, a]); layout.add_widget(a, &Constraints::with_fixed_width_height(5, 2), &[]); layout.add_widget(b, &Constraints::with_fixed_width_height(3, 2), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: b, rect: Rect { x: 0, y: 0, width: 3, height: 2, }, }, LaidOutWidget { widget: a, rect: Rect { x: 3, y: 0, width: 5, height: 2, }, }, ] ); } #[test] fn two_children_overflow() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b]); layout.add_widget(a, &Constraints::with_fixed_width_height(5, 2), &[]); layout.add_widget(b, &Constraints::with_fixed_width_height(3, 2), &[]); let results = layout.compute_constraints(6, 2, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 8, height: 2, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 5, height: 2, }, }, LaidOutWidget { widget: b, rect: Rect { x: 5, y: 0, width: 3, height: 2, }, }, ] ); } macro_rules! single_constrain { ($name:ident, $constraint:expr, $width:expr, $height:expr, $x:expr, $y:expr) => { #[test] fn $name() { let root = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &$constraint, &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![LaidOutWidget { widget: root, rect: Rect { x: $x, y: $y, width: $width, height: $height, }, }] ); } }; } single_constrain!( single_constrained_widget_top, Constraints::with_fixed_width_height(10, 2), 10, 2, 0, 0 ); single_constrain!( single_constrained_widget_bottom, Constraints::with_fixed_width_height(10, 2) .set_valign(VerticalAlignment::Bottom) .clone(), 10, 2, 0, 98 ); single_constrain!( single_constrained_widget_middle, Constraints::with_fixed_width_height(10, 2) .set_valign(VerticalAlignment::Middle) .clone(), 10, 2, 0, 49 ); single_constrain!( single_constrained_widget_right, Constraints::with_fixed_width_height(10, 2) .set_halign(HorizontalAlignment::Right) .clone(), 10, 2, 90, 0 ); single_constrain!( single_constrained_widget_bottom_center, Constraints::with_fixed_width_height(10, 2) .set_valign(VerticalAlignment::Bottom) .set_halign(HorizontalAlignment::Center) .clone(), 10, 2, 45, 98 ); } termwiz-0.23.3/src/widgets/mod.rs000064400000000000000000000423371046102023000150050ustar 00000000000000// Ideally this would be scoped to WidgetId, but I can't seem to find the // right place for it to take effect #![allow(clippy::new_without_default)] use crate::color::ColorAttribute; use crate::input::InputEvent; use crate::surface::{Change, CursorShape, CursorVisibility, Position, SequenceNo, Surface}; use crate::Result; use fnv::FnvHasher; use std::collections::{HashMap, VecDeque}; use std::hash::BuildHasherDefault; /// fnv is a more appropriate hasher for the WidgetIds we use in this module. type FnvHashMap = HashMap>; pub mod layout; /// Describes an event that may need to be processed by the widget pub enum WidgetEvent { Input(InputEvent), } #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct CursorShapeAndPosition { pub shape: CursorShape, pub coords: ParentRelativeCoords, pub color: ColorAttribute, pub visibility: CursorVisibility, } #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct Rect { pub x: usize, pub y: usize, pub width: usize, pub height: usize, } pub struct RenderArgs<'a> { /// The id of the current widget pub id: WidgetId, pub is_focused: bool, pub cursor: &'a mut CursorShapeAndPosition, pub surface: &'a mut Surface, } /// UpdateArgs provides access to the widget and UI state during /// a call to `Widget::update_state` pub struct UpdateArgs<'a> { /// The id of the current widget pub id: WidgetId, pub cursor: &'a mut CursorShapeAndPosition, } /// Implementing the `Widget` trait allows for defining a potentially /// interactive component in a UI layout. pub trait Widget { /// Draw the widget to the RenderArgs::surface, and optionally /// update RenderArgs::cursor to reflect the cursor position and /// display attributes. fn render(&mut self, args: &mut RenderArgs); /// Override this to have your widget specify its layout constraints. /// You may wish to have your widget constructor receive a `Constraints` /// instance to make this more easily configurable in more generic widgets. fn get_size_constraints(&self) -> layout::Constraints { Default::default() } /// Override this to allow your widget to respond to keyboard, mouse and /// other widget events. /// Return `true` if your widget handled the event, or `false` to allow /// the event to propagate to the widget parent. fn process_event(&mut self, _event: &WidgetEvent, _args: &mut UpdateArgs) -> bool { false } } /// Relative to the top left of the parent container #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct ParentRelativeCoords { pub x: usize, pub y: usize, } impl ParentRelativeCoords { pub fn new(x: usize, y: usize) -> Self { Self { x, y } } } impl From<(usize, usize)> for ParentRelativeCoords { fn from(coords: (usize, usize)) -> ParentRelativeCoords { ParentRelativeCoords::new(coords.0, coords.1) } } /// Relative to the top left of the screen #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct ScreenRelativeCoords { pub x: usize, pub y: usize, } impl ScreenRelativeCoords { pub fn new(x: usize, y: usize) -> Self { Self { x, y } } pub fn offset_by(&self, rel: &ParentRelativeCoords) -> Self { Self { x: self.x + rel.x, y: self.y + rel.y, } } } static WIDGET_ID: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::AtomicUsize::new(0); /// The `WidgetId` uniquely describes an instance of a widget. /// Creating a new `WidgetId` generates a new unique identifier which can /// be safely copied and moved around; each copy refers to the same widget. /// The intent is that you set up the identifiers once and re-use them, /// rather than generating new ids on each iteration of the UI loop so that /// the widget state is maintained correctly by the Ui. #[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct WidgetId(usize); impl WidgetId { pub fn new() -> Self { WidgetId(WIDGET_ID.fetch_add(1, ::std::sync::atomic::Ordering::Relaxed)) } } impl Default for WidgetId { fn default() -> Self { Self::new() } } struct RenderData<'widget> { surface: Surface, cursor: CursorShapeAndPosition, coordinates: ParentRelativeCoords, widget: Box, } #[derive(Default)] struct Graph { root: Option, children: FnvHashMap>, parent: FnvHashMap, } impl Graph { fn add(&mut self, parent: Option) -> WidgetId { let id = WidgetId::new(); if self.root.is_none() { self.root = Some(id); } self.children.insert(id, Vec::new()); if let Some(parent) = parent { self.parent.insert(id, parent); self.children.get_mut(&parent).unwrap().push(id); } id } fn children(&self, id: WidgetId) -> &[WidgetId] { self.children .get(&id) .map(|v| v.as_slice()) .unwrap_or_else(|| &[]) } } /// Manages the widgets on the display #[derive(Default)] pub struct Ui<'widget> { graph: Graph, render: FnvHashMap>, input_queue: VecDeque, focused: Option, } impl<'widget> Ui<'widget> { pub fn new() -> Self { Default::default() } pub fn add(&mut self, parent: Option, w: W) -> WidgetId { let id = self.graph.add(parent); self.render.insert( id, RenderData { surface: Surface::new(1, 1), cursor: Default::default(), coordinates: Default::default(), widget: Box::new(w), }, ); if parent.is_none() && self.focused.is_none() { self.focused = Some(id); } id } pub fn set_root(&mut self, w: W) -> WidgetId { self.add(None, w) } pub fn add_child(&mut self, parent: WidgetId, w: W) -> WidgetId { self.add(Some(parent), w) } fn do_deliver(&mut self, id: WidgetId, event: &WidgetEvent) -> bool { let render_data = self.render.get_mut(&id).unwrap(); let mut args = UpdateArgs { id, cursor: &mut render_data.cursor, }; render_data.widget.process_event(event, &mut args) } fn deliver_event(&mut self, mut id: WidgetId, event: &WidgetEvent) { loop { let handled = match event { WidgetEvent::Input(InputEvent::Resized { .. }) => true, WidgetEvent::Input(InputEvent::Mouse(m)) => { let mut m = m.clone(); // convert from screen to widget coords let coords = self.to_widget_coords( id, &ScreenRelativeCoords::new(m.x as usize, m.y as usize), ); m.x = coords.x as u16; m.y = coords.y as u16; self.do_deliver(id, &WidgetEvent::Input(InputEvent::Mouse(m))) } WidgetEvent::Input(InputEvent::Paste(_)) | WidgetEvent::Input(InputEvent::PixelMouse(_)) | WidgetEvent::Input(InputEvent::Key(_)) | WidgetEvent::Input(InputEvent::Wake) => self.do_deliver(id, event), }; if handled { return; } id = match self.graph.parent.get(&id) { Some(parent) => *parent, None => return, }; } } /// find the best matching widget that is under the mouse cursor. /// We're looking for the latest, deepest widget that contains the input /// coordinates. fn hovered_widget(&self, coords: &ScreenRelativeCoords) -> Option { let root = match self.graph.root { Some(id) => id, _ => return None, }; let depth = 0; let mut best = (depth, root); self.hovered_recursive(root, depth, coords.x, coords.y, &mut best); Some(best.1) } /// Recursive helper for hovered_widget(). The `best` tuple holds the /// best (depth, widget) pair. Depth is incremented each time the function /// recurses. fn hovered_recursive( &self, widget: WidgetId, depth: usize, x: usize, y: usize, best: &mut (usize, WidgetId), ) { let render = &self.render[&widget]; // only consider the dimensions if this node is at the same or a deeper // depth. If so, then we check to see if the coords are within the bounds. if depth >= best.0 && x >= render.coordinates.x && y >= render.coordinates.y { let (width, height) = render.surface.dimensions(); if (x - render.coordinates.x < width) && (y - render.coordinates.y < height) { *best = (depth, widget); } } for child in self.graph.children(widget) { self.hovered_recursive( *child, depth + 1, x + render.coordinates.x, y + render.coordinates.y, best, ); } } pub fn process_event_queue(&mut self) -> Result<()> { while let Some(event) = self.input_queue.pop_front() { match event { WidgetEvent::Input(InputEvent::Resized { rows, cols }) => { self.compute_layout(cols, rows)?; } WidgetEvent::Input(InputEvent::Mouse(ref m)) => { if let Some(hover) = self.hovered_widget(&ScreenRelativeCoords::new(m.x as usize, m.y as usize)) { self.deliver_event(hover, &event); } } WidgetEvent::Input(InputEvent::Key(_)) | WidgetEvent::Input(InputEvent::Paste(_)) | WidgetEvent::Input(InputEvent::PixelMouse(_)) | WidgetEvent::Input(InputEvent::Wake) => { if let Some(focus) = self.focused { self.deliver_event(focus, &event); } } } } Ok(()) } /// Queue up an event. Events are processed by the appropriate /// `Widget::update_state` method. Events may be re-processed to /// simplify handling for widgets. eg: a TODO: is to synthesize double /// and triple click events. pub fn queue_event(&mut self, event: WidgetEvent) { self.input_queue.push_back(event); } /// Assign keyboard focus to the specified widget. pub fn set_focus(&mut self, id: WidgetId) { self.focused = Some(id); } /// Helper for applying the surfaces from the widgets to the target /// screen in the correct order (from the root to the leaves) fn render_recursive( &mut self, id: WidgetId, screen: &mut Surface, abs_coords: &ScreenRelativeCoords, ) -> Result<()> { let coords = { let render_data = self.render.get_mut(&id).unwrap(); let surface = &mut render_data.surface; { let mut args = RenderArgs { id, cursor: &mut render_data.cursor, surface, is_focused: self.focused.map(|f| f == id).unwrap_or(false), }; render_data.widget.render(&mut args); } screen.draw_from_screen( surface, abs_coords.x + render_data.coordinates.x, abs_coords.y + render_data.coordinates.y, ); surface.flush_changes_older_than(SequenceNo::max_value()); render_data.coordinates }; for child in self.graph.children(id).to_vec() { self.render_recursive( child, screen, &ScreenRelativeCoords::new(coords.x + abs_coords.x, coords.y + abs_coords.y), )?; } Ok(()) } /// Reconsider the layout constraints and apply them. /// Returns true if the layout was changed, false if no changes were made. fn compute_layout(&mut self, width: usize, height: usize) -> Result { let mut layout = layout::LayoutState::new(); let root = self.graph.root.unwrap(); self.add_widget_to_layout(&mut layout, root)?; let mut changed = false; // Clippy is dead wrong about this iterator being an identity_conversion #[allow(clippy::identity_conversion)] for result in layout.compute_constraints(width, height, root)? { let render_data = self.render.get_mut(&result.widget).unwrap(); let coords = ParentRelativeCoords::new(result.rect.x, result.rect.y); if coords != render_data.coordinates { render_data.coordinates = coords; changed = true; } if (result.rect.width, result.rect.height) != render_data.surface.dimensions() { render_data .surface .resize(result.rect.width, result.rect.height); changed = true; } } Ok(changed) } /// Recursive helper for building up the LayoutState fn add_widget_to_layout( &mut self, layout: &mut layout::LayoutState, widget: WidgetId, ) -> Result<()> { let constraints = self.render[&widget].widget.get_size_constraints(); let children = self.graph.children(widget).to_vec(); layout.add_widget(widget, &constraints, &children); for child in children { self.add_widget_to_layout(layout, child)?; } Ok(()) } /// Apply the current state of the widgets to the screen. /// This has the side effect of clearing out any unconsumed input queue. /// Returns true if the Ui may need to be updated again; for example, /// if the most recent update operation changed layout. pub fn render_to_screen(&mut self, screen: &mut Surface) -> Result { if let Some(root) = self.graph.root { let (width, height) = screen.dimensions(); // Render from scratch into a fresh screen buffer let mut alt_screen = Surface::new(width, height); self.render_recursive(root, &mut alt_screen, &ScreenRelativeCoords::new(0, 0))?; // Now compute a delta and apply it to the actual screen let diff = screen.diff_screens(&alt_screen); screen.add_changes(diff); } // TODO: garbage collect unreachable WidgetId's from self.state if let Some(id) = self.focused { let cursor = &self.render[&id].cursor; let coords = self.to_screen_coords(id, &cursor.coords); screen.add_changes(vec![ Change::CursorShape(cursor.shape), Change::CursorColor(cursor.color), Change::CursorVisibility(cursor.visibility), Change::CursorPosition { x: Position::Absolute(coords.x), y: Position::Absolute(coords.y), }, ]); } let (width, height) = screen.dimensions(); self.compute_layout(width, height) } fn coord_walk usize>( &self, widget: WidgetId, mut x: usize, mut y: usize, f: F, ) -> (usize, usize) { let mut widget = widget; loop { let render = &self.render[&widget]; x = f(x, render.coordinates.x); y = f(y, render.coordinates.y); widget = match self.graph.parent.get(&widget) { Some(parent) => *parent, None => break, }; } (x, y) } /// Convert coordinates that are relative to widget into coordinates /// that are relative to the screen origin (top left). pub fn to_screen_coords( &self, widget: WidgetId, coords: &ParentRelativeCoords, ) -> ScreenRelativeCoords { let (x, y) = self.coord_walk(widget, coords.x, coords.y, |a, b| a + b); ScreenRelativeCoords { x, y } } /// Convert coordinates that are relative to the screen origin (top left) /// into coordinates that are relative to the widget. pub fn to_widget_coords( &self, widget: WidgetId, coords: &ScreenRelativeCoords, ) -> ParentRelativeCoords { let (x, y) = self.coord_walk(widget, coords.x, coords.y, |a, b| a - b); ParentRelativeCoords { x, y } } } #[cfg(test)] mod test { use super::*; struct CursorHider {} impl Widget for CursorHider { fn render(&mut self, args: &mut RenderArgs) { args.cursor.visibility = CursorVisibility::Hidden; } } #[test] fn hide_cursor() { let mut ui = Ui::new(); ui.set_root(CursorHider {}); let mut surface = Surface::new(10, 10); assert_eq!(CursorVisibility::Visible, surface.cursor_visibility()); ui.render_to_screen(&mut surface).unwrap(); assert_eq!(CursorVisibility::Hidden, surface.cursor_visibility()); } } termwiz-0.23.3/update-changelog.sh000075500000000000000000000003301046102023000151540ustar 00000000000000#!/bin/sh cd $(git rev-parse --show-toplevel) docker run -t \ -v "$(pwd)":/app/ \ --workdir /app/termwiz \ "ghcr.io/orhun/git-cliff/git-cliff:latest" \ --tag-pattern 'termwiz-*' -o CHANGELOG.md -c cliff.toml