diff options
author | 2021-10-23 04:57:34 -0700 | |
---|---|---|
committer | 2021-10-23 04:57:34 -0700 | |
commit | f1bda194e0cb21b2050c36d4ae71d7424d42397f (patch) | |
tree | 75ac5d488af61993394d0cc02490a46630021543 | |
parent | a84b62452c609c3331e9c2c6f3f675b215099c55 (diff) | |
download | bun-f1bda194e0cb21b2050c36d4ae71d7424d42397f.tar.gz bun-f1bda194e0cb21b2050c36d4ae71d7424d42397f.tar.zst bun-f1bda194e0cb21b2050c36d4ae71d7424d42397f.zip |
[Lexer] Improve lexing performance by 2% via a bitfield for checking identifiers, inlining functions, and moving some branches to comptime
-rw-r--r-- | src/js_lexer.zig | 4619 | ||||
-rw-r--r-- | src/js_lexer/identifier.zig | 2142 | ||||
-rw-r--r-- | src/js_lexer/unicode.zig | 2734 |
3 files changed, 7178 insertions, 2317 deletions
diff --git a/src/js_lexer.zig b/src/js_lexer.zig index 524655b5e..2ad1ffbcb 100644 --- a/src/js_lexer.zig +++ b/src/js_lexer.zig @@ -27,753 +27,818 @@ fn notimpl() noreturn { pub var emptyJavaScriptString = ([_]u16{0}); pub const JSONOptions = struct { + + /// Enable JSON-specific warnings/errors + is_json: bool = false, + + /// tsconfig.json supports comments & trailing comments allow_comments: bool = false, allow_trailing_commas: bool = false, - starts_with_string: bool = false, -}; - -pub const Lexer = struct { - const LexerType = @This(); - pub const Error = error{ - UTF8Fail, - OutOfMemory, - SyntaxError, - UnexpectedSyntax, - JSONStringsMustUseDoubleQuotes, - ParserError, - }; + /// Loading JSON-in-JSON may start like \\""\\" + /// This is technically invalid, since we parse from the first value of the string + ignore_leading_escape_sequences: bool = false, + ignore_trailing_escape_sequences: bool = false, +}; - // pub const Error = error{ - // UnexpectedToken, - // EndOfFile, - // }; - - // err: ?LexerType.Error, - log: *logger.Log, - json_options: ?JSONOptions = null, - for_global_name: bool = false, - source: *const logger.Source, - current: usize = 0, - start: usize = 0, - end: usize = 0, - did_panic: bool = false, - approximate_newline_count: usize = 0, - previous_backslash_quote_in_jsx: logger.Range = logger.Range.None, - token: T = T.t_end_of_file, - has_newline_before: bool = false, - has_pure_comment_before: bool = false, - preserve_all_comments_before: bool = false, - is_legacy_octal_literal: bool = false, - is_log_disabled: bool = false, - comments_to_preserve_before: std.ArrayList(js_ast.G.Comment), - all_original_comments: ?[]js_ast.G.Comment = null, - code_point: CodePoint = -1, - identifier: []const u8 = "", - jsx_factory_pragma_comment: ?js_ast.Span = null, - jsx_fragment_pragma_comment: ?js_ast.Span = null, - source_mapping_url: ?js_ast.Span = null, - number: f64 = 0.0, - rescan_close_brace_as_template_token: bool = false, - prev_error_loc: logger.Loc = logger.Loc.Empty, - regex_flags_start: ?u16 = null, - allocator: *std.mem.Allocator, - /// In JavaScript, strings are stored as UTF-16, but nearly every string is ascii. - /// This means, usually, we can skip UTF8 -> UTF16 conversions. - string_literal_buffer: std.ArrayList(u16), - string_literal_slice: string = "", - string_literal: JavascriptString, - string_literal_is_ascii: bool = false, - - is_ascii_only: bool = true, - - pub fn clone(self: *const LexerType) LexerType { - return LexerType{ - .log = self.log, - .json_options = self.json_options, - .for_global_name = self.for_global_name, - .source = self.source, - .current = self.current, - .start = self.start, - .end = self.end, - .did_panic = self.did_panic, - .approximate_newline_count = self.approximate_newline_count, - .previous_backslash_quote_in_jsx = self.previous_backslash_quote_in_jsx, - .token = self.token, - .has_newline_before = self.has_newline_before, - .has_pure_comment_before = self.has_pure_comment_before, - .preserve_all_comments_before = self.preserve_all_comments_before, - .is_legacy_octal_literal = self.is_legacy_octal_literal, - .is_log_disabled = self.is_log_disabled, - .comments_to_preserve_before = self.comments_to_preserve_before, - .all_original_comments = self.all_original_comments, - .code_point = self.code_point, - .identifier = self.identifier, - .regex_flags_start = self.regex_flags_start, - .jsx_factory_pragma_comment = self.jsx_factory_pragma_comment, - .jsx_fragment_pragma_comment = self.jsx_fragment_pragma_comment, - .source_mapping_url = self.source_mapping_url, - .number = self.number, - .rescan_close_brace_as_template_token = self.rescan_close_brace_as_template_token, - .prev_error_loc = self.prev_error_loc, - .allocator = self.allocator, - .string_literal_buffer = self.string_literal_buffer, - .string_literal_slice = self.string_literal_slice, - .string_literal = self.string_literal, - .string_literal_is_ascii = self.string_literal_is_ascii, - .is_ascii_only = self.is_ascii_only, +pub fn NewLexer(comptime json_options: JSONOptions) type { + return struct { + const LexerType = @This(); + const is_json = json_options.is_json; + const json = json_options; + + pub const Error = error{ + UTF8Fail, + OutOfMemory, + SyntaxError, + UnexpectedSyntax, + JSONStringsMustUseDoubleQuotes, + ParserError, }; - } - pub fn loc(self: *LexerType) logger.Loc { - return logger.usize2Loc(self.start); - } - - pub fn syntaxError(self: *LexerType) !void { - @setCold(true); + // pub const Error = error{ + // UnexpectedToken, + // EndOfFile, + // }; + + // err: ?LexerType.Error, + log: *logger.Log, + for_global_name: bool = false, + source: *const logger.Source, + current: usize = 0, + start: usize = 0, + end: usize = 0, + did_panic: bool = false, + approximate_newline_count: usize = 0, + previous_backslash_quote_in_jsx: logger.Range = logger.Range.None, + token: T = T.t_end_of_file, + has_newline_before: bool = false, + has_pure_comment_before: bool = false, + preserve_all_comments_before: bool = false, + is_legacy_octal_literal: bool = false, + is_log_disabled: bool = false, + comments_to_preserve_before: std.ArrayList(js_ast.G.Comment), + all_original_comments: ?[]js_ast.G.Comment = null, + code_point: CodePoint = -1, + identifier: []const u8 = "", + jsx_factory_pragma_comment: ?js_ast.Span = null, + jsx_fragment_pragma_comment: ?js_ast.Span = null, + source_mapping_url: ?js_ast.Span = null, + number: f64 = 0.0, + rescan_close_brace_as_template_token: bool = false, + prev_error_loc: logger.Loc = logger.Loc.Empty, + regex_flags_start: ?u16 = null, + allocator: *std.mem.Allocator, + /// In JavaScript, strings are stored as UTF-16, but nearly every string is ascii. + /// This means, usually, we can skip UTF8 -> UTF16 conversions. + string_literal_buffer: std.ArrayList(u16), + string_literal_slice: string = "", + string_literal: JavascriptString, + string_literal_is_ascii: bool = false, + + is_ascii_only: bool = true, + + pub fn clone(self: *const LexerType) LexerType { + return LexerType{ + .log = self.log, + .for_global_name = self.for_global_name, + .source = self.source, + .current = self.current, + .start = self.start, + .end = self.end, + .did_panic = self.did_panic, + .approximate_newline_count = self.approximate_newline_count, + .previous_backslash_quote_in_jsx = self.previous_backslash_quote_in_jsx, + .token = self.token, + .has_newline_before = self.has_newline_before, + .has_pure_comment_before = self.has_pure_comment_before, + .preserve_all_comments_before = self.preserve_all_comments_before, + .is_legacy_octal_literal = self.is_legacy_octal_literal, + .is_log_disabled = self.is_log_disabled, + .comments_to_preserve_before = self.comments_to_preserve_before, + .all_original_comments = self.all_original_comments, + .code_point = self.code_point, + .identifier = self.identifier, + .regex_flags_start = self.regex_flags_start, + .jsx_factory_pragma_comment = self.jsx_factory_pragma_comment, + .jsx_fragment_pragma_comment = self.jsx_fragment_pragma_comment, + .source_mapping_url = self.source_mapping_url, + .number = self.number, + .rescan_close_brace_as_template_token = self.rescan_close_brace_as_template_token, + .prev_error_loc = self.prev_error_loc, + .allocator = self.allocator, + .string_literal_buffer = self.string_literal_buffer, + .string_literal_slice = self.string_literal_slice, + .string_literal = self.string_literal, + .string_literal_is_ascii = self.string_literal_is_ascii, + .is_ascii_only = self.is_ascii_only, + }; + } - self.addError(self.start, "Syntax Error!!", .{}, true); - return Error.SyntaxError; - } + pub fn loc(self: *LexerType) logger.Loc { + return logger.usize2Loc(self.start); + } - pub fn addDefaultError(self: *LexerType, msg: []const u8) !void { - @setCold(true); + pub fn syntaxError(self: *LexerType) !void { + @setCold(true); - self.addError(self.start, "{s}", .{msg}, true); - return Error.SyntaxError; - } + self.addError(self.start, "Syntax Error!!", .{}, true); + return Error.SyntaxError; + } - pub fn addSyntaxError(self: *LexerType, _loc: usize, comptime fmt: []const u8, args: anytype) !void { - @setCold(true); - self.addError(_loc, fmt, args, false); - return Error.SyntaxError; - } + pub fn addDefaultError(self: *LexerType, msg: []const u8) !void { + @setCold(true); - pub fn addError(self: *LexerType, _loc: usize, comptime format: []const u8, args: anytype, panic: bool) void { - @setCold(true); + self.addError(self.start, "{s}", .{msg}, true); + return Error.SyntaxError; + } - if (self.is_log_disabled) return; - var __loc = logger.usize2Loc(_loc); - if (__loc.eql(self.prev_error_loc)) { - return; + pub fn addSyntaxError(self: *LexerType, _loc: usize, comptime fmt: []const u8, args: anytype) !void { + @setCold(true); + self.addError(_loc, fmt, args, false); + return Error.SyntaxError; } - self.log.addErrorFmt(self.source, __loc, self.allocator, format, args) catch unreachable; - self.prev_error_loc = __loc; - } + pub fn addError(self: *LexerType, _loc: usize, comptime format: []const u8, args: anytype, panic: bool) void { + @setCold(true); - pub fn addRangeError(self: *LexerType, r: logger.Range, comptime format: []const u8, args: anytype, panic: bool) !void { - @setCold(true); + if (self.is_log_disabled) return; + var __loc = logger.usize2Loc(_loc); + if (__loc.eql(self.prev_error_loc)) { + return; + } - if (self.is_log_disabled) return; - if (self.prev_error_loc.eql(r.loc)) { - return; + self.log.addErrorFmt(self.source, __loc, self.allocator, format, args) catch unreachable; + self.prev_error_loc = __loc; } - const errorMessage = std.fmt.allocPrint(self.allocator, format, args) catch unreachable; - var msg = self.log.addRangeError(self.source, r, errorMessage); - self.prev_error_loc = r.loc; - - // if (panic) { - // return Error.ParserError; - // } - } + pub fn addRangeError(self: *LexerType, r: logger.Range, comptime format: []const u8, args: anytype, panic: bool) !void { + @setCold(true); - pub fn codePointEql(self: *LexerType, a: u8) bool { - return @intCast(CodePoint, a) == self.code_point; - } + if (self.is_log_disabled) return; + if (self.prev_error_loc.eql(r.loc)) { + return; + } - /// Look ahead at the next n codepoints without advancing the iterator. - /// If fewer than n codepoints are available, then return the remainder of the string. - fn peek(it: *LexerType, n: usize) string { - const original_i = it.current; - defer it.current = original_i; + const errorMessage = std.fmt.allocPrint(self.allocator, format, args) catch unreachable; + var msg = self.log.addRangeError(self.source, r, errorMessage); + self.prev_error_loc = r.loc; - var end_ix = original_i; - var found: usize = 0; - while (found < n) : (found += 1) { - const next_codepoint = it.nextCodepointSlice(); - if (next_codepoint.len == 0) break; - end_ix += next_codepoint.len; + // if (panic) { + // return Error.ParserError; + // } } - return it.source.contents[original_i..end_ix]; - } + pub fn codePointEql(self: *LexerType, a: u8) bool { + return @intCast(CodePoint, a) == self.code_point; + } - pub fn isIdentifierOrKeyword(lexer: LexerType) bool { - return @enumToInt(lexer.token) >= @enumToInt(T.t_identifier); - } + /// Look ahead at the next n codepoints without advancing the iterator. + /// If fewer than n codepoints are available, then return the remainder of the string. + fn peek(it: *LexerType, n: usize) string { + const original_i = it.current; + defer it.current = original_i; + + var end_ix = original_i; + var found: usize = 0; + while (found < n) : (found += 1) { + const next_codepoint = it.nextCodepointSlice(); + if (next_codepoint.len == 0) break; + end_ix += next_codepoint.len; + } - pub fn stringLiteralUTF16(lexer: *LexerType) JavascriptString { - if (lexer.string_literal_is_ascii) { - return lexer.stringToUTF16(lexer.string_literal_slice); - } else { - return lexer.allocator.dupe(u16, lexer.string_literal) catch unreachable; + return it.source.contents[original_i..end_ix]; } - } - pub fn decodeEscapeSequences(lexer: *LexerType, start: usize, text: string, comptime BufType: type, buf_: *BufType) !void { - var buf = buf_.*; - defer buf_.* = buf; - lexer.is_ascii_only = false; - - var iter = CodepointIterator{ .bytes = text[start..], .i = 0 }; - const start_length = buf.items.len; - while (iter.nextCodepoint()) |c| { - const width = iter.width; - @setRuntimeSafety(false); - switch (c) { - '\r' => { - // From the specification: - // - // 11.8.6.1 Static Semantics: TV and TRV - // - // TV excludes the code units of LineContinuation while TRV includes - // them. <CR><LF> and <CR> LineTerminatorSequences are normalized to - // <LF> for both TV and TRV. An explicit EscapeSequence is needed to - // include a <CR> or <CR><LF> sequence. - - // Convert '\r\n' into '\n' - if (iter.i < text.len and text[iter.i] == '\n') { - iter.i += 1; - } + pub fn isIdentifierOrKeyword(lexer: LexerType) bool { + return @enumToInt(lexer.token) >= @enumToInt(T.t_identifier); + } - // Convert '\r' into '\n' - buf.append('\n') catch unreachable; - continue; - }, + pub fn stringLiteralUTF16(lexer: *LexerType) JavascriptString { + if (lexer.string_literal_is_ascii) { + return lexer.stringToUTF16(lexer.string_literal_slice); + } else { + return lexer.allocator.dupe(u16, lexer.string_literal) catch unreachable; + } + } - '\\' => { - @setRuntimeSafety(false); + pub fn deinit(this: *LexerType) void {} + + pub fn decodeEscapeSequences(lexer: *LexerType, start: usize, text: string, comptime BufType: type, buf_: *BufType) !void { + var buf = buf_.*; + defer buf_.* = buf; + lexer.is_ascii_only = false; + + var iterator = strings.CodepointIterator{ .bytes = text[start..], .i = 0 }; + var iter = strings.CodepointIterator.Cursor{}; + const start_length = buf.items.len; + while (iterator.next(&iter)) { + const width = iter.width; + switch (iter.c) { + '\r' => { + // From the specification: + // + // 11.8.6.1 Static Semantics: TV and TRV + // + // TV excludes the code units of LineContinuation while TRV includes + // them. <CR><LF> and <CR> LineTerminatorSequences are normalized to + // <LF> for both TV and TRV. An explicit EscapeSequence is needed to + // include a <CR> or <CR><LF> sequence. + + // Convert '\r\n' into '\n' + if (iter.i < text.len and text[iter.i] == '\n') { + iter.i += 1; + } - const c2 = iter.nextCodepoint() orelse return; - const width2 = iter.width; - switch (c2) { - 'b' => { - buf.append(std.mem.readIntNative(u16, "\\b")) catch unreachable; - continue; - }, - 'f' => { - buf.append(std.mem.readIntNative(u16, "\\f")) catch unreachable; - continue; - }, - 'n' => { - buf.append(std.mem.readIntNative(u16, "\\n")) catch unreachable; - continue; - }, - 'r' => { - buf.append(std.mem.readIntNative(u16, "\\r")) catch unreachable; - continue; - }, - 't' => { - buf.append(std.mem.readIntNative(u16, "\\t")) catch unreachable; - continue; - }, - 'v' => { - if (lexer.json_options != null) { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); - } + // Convert '\r' into '\n' + buf.append('\n') catch unreachable; + continue; + }, - buf.append(std.mem.readIntNative(u16, "\\v")) catch unreachable; - continue; - }, + '\\' => { + _ = iterator.next(&iter) or return; - // legacy octal literals - '0'...'7' => { - const octal_start = iter.i - 2; - if (lexer.json_options != null) { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); - } + const c2 = iter.c; - // 1-3 digit octal - var is_bad = false; - var value: i64 = c2 - '0'; - - const c3: CodePoint = iter.nextCodepoint() orelse return lexer.syntaxError(); - const width3 = iter.width; - - switch (c3) { - '0'...'7' => { - value = value * 8 + c3 - '0'; - iter.i += width3; - - const c4 = iter.nextCodepoint() orelse return lexer.syntaxError(); - const width4 = iter.width; - switch (c4) { - '0'...'7' => { - const temp = value * 8 + c4 - '0'; - if (temp < 256) { - value = temp; - iter.i += width4; - } - }, - '8', '9' => { - is_bad = true; - }, - else => {}, - } - }, - '8', '9' => { - is_bad = true; - }, - else => {}, - } - iter.c = @intCast(i32, value); - if (is_bad) { - lexer.addRangeError( - logger.Range{ .loc = .{ .start = @intCast(i32, octal_start) }, .len = @intCast(i32, iter.i - octal_start) }, - "Invalid legacy octal literal", - .{}, - false, - ) catch unreachable; - } - }, - '8', '9' => { - iter.c = c2; - }, - // 2-digit hexadecimal - 'x' => { - if (lexer.json_options != null) { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); - } + const width2 = iter.width; + switch (iter.c) { + 'b' => { + buf.append(std.mem.readIntNative(u16, "\\b")) catch unreachable; + continue; + }, + 'f' => { + buf.append(std.mem.readIntNative(u16, "\\f")) catch unreachable; + continue; + }, + 'n' => { + buf.append(std.mem.readIntNative(u16, "\\n")) catch unreachable; + continue; + }, + 'r' => { + buf.append(std.mem.readIntNative(u16, "\\r")) catch unreachable; + continue; + }, + 't' => { + buf.append(std.mem.readIntNative(u16, "\\t")) catch unreachable; + continue; + }, + 'v' => { + if (comptime is_json) { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + } - var value: CodePoint = 0; - var c3: CodePoint = 0; - var width3: u3 = 0; + buf.append(std.mem.readIntNative(u16, "\\v")) catch unreachable; + continue; + }, - c3 = iter.nextCodepoint() orelse return lexer.syntaxError(); - width3 = iter.width; - switch (c3) { - '0'...'9' => { - value = value * 16 | (c3 - '0'); - }, - 'a'...'f' => { - value = value * 16 | (c3 + 10 - 'a'); - }, - 'A'...'F' => { - value = value * 16 | (c3 + 10 - 'A'); - }, - else => { - lexer.end = start + iter.i - width3; - return lexer.syntaxError(); - }, - } + // legacy octal literals + '0'...'7' => { + const octal_start = iter.i - 2; + if (comptime is_json) { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + } - c3 = iter.nextCodepoint() orelse return lexer.syntaxError(); - width3 = iter.width; - switch (c3) { - '0'...'9' => { - value = value * 16 | (c3 - '0'); - }, - 'a'...'f' => { - value = value * 16 | (c3 + 10 - 'a'); - }, - 'A'...'F' => { - value = value * 16 | (c3 + 10 - 'A'); - }, - else => { - lexer.end = start + iter.i - width3; - return lexer.syntaxError(); - }, - } + // 1-3 digit octal + var is_bad = false; + var value: i64 = c2 - '0'; + + _ = iterator.next(&iter) or return lexer.syntaxError(); + const c3: CodePoint = iter.c; + const width3 = iter.width; + + switch (c3) { + '0'...'7' => { + value = value * 8 + c3 - '0'; + iter.i += width3; + + _ = iterator.next(&iter) or return lexer.syntaxError(); + const c4 = iter.c; + const width4 = iter.width; + switch (c4) { + '0'...'7' => { + const temp = value * 8 + c4 - '0'; + if (temp < 256) { + value = temp; + iter.i += width4; + } + }, + '8', '9' => { + is_bad = true; + }, + else => {}, + } + }, + '8', '9' => { + is_bad = true; + }, + else => {}, + } + iter.c = @intCast(i32, value); + if (is_bad) { + lexer.addRangeError( + logger.Range{ .loc = .{ .start = @intCast(i32, octal_start) }, .len = @intCast(i32, iter.i - octal_start) }, + "Invalid legacy octal literal", + .{}, + false, + ) catch unreachable; + } + }, + '8', '9' => { + iter.c = c2; + }, + // 2-digit hexadecimal + 'x' => { + if (comptime is_json) { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + } - iter.c = value; - }, - 'u' => { - // We're going to make this an i64 so we don't risk integer overflows - // when people do weird things - var value: i64 = 0; + var value: CodePoint = 0; + var c3: CodePoint = 0; + var width3: u3 = 0; - var c3 = iter.nextCodepoint() orelse return lexer.syntaxError(); - var width3 = iter.width; + _ = iterator.next(&iter) or return lexer.syntaxError(); + c3 = iter.c; + width3 = iter.width; + switch (c3) { + '0'...'9' => { + value = value * 16 | (c3 - '0'); + }, + 'a'...'f' => { + value = value * 16 | (c3 + 10 - 'a'); + }, + 'A'...'F' => { + value = value * 16 | (c3 + 10 - 'A'); + }, + else => { + lexer.end = start + iter.i - width3; + return lexer.syntaxError(); + }, + } - // variable-length - if (c3 == '{') { - if (lexer.json_options != null) { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); + _ = iterator.next(&iter) or return lexer.syntaxError(); + c3 = iter.c; + width3 = iter.width; + switch (c3) { + '0'...'9' => { + value = value * 16 | (c3 - '0'); + }, + 'a'...'f' => { + value = value * 16 | (c3 + 10 - 'a'); + }, + 'A'...'F' => { + value = value * 16 | (c3 + 10 - 'A'); + }, + else => { + lexer.end = start + iter.i - width3; + return lexer.syntaxError(); + }, } - const hex_start = iter.i - width - width2 - width3; - var is_first = true; - var is_out_of_range = false; - variableLength: while (true) { - c3 = iter.nextCodepoint() orelse break :variableLength; + iter.c = value; + }, + 'u' => { + // We're going to make this an i64 so we don't risk integer overflows + // when people do weird things + var value: i64 = 0; + + _ = iterator.next(&iter) or return lexer.syntaxError(); + var c3 = iter.c; + var width3 = iter.width; + + // variable-length + if (c3 == '{') { + if (comptime is_json) { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + } - switch (c3) { - '0'...'9' => { - value = value * 16 | (c3 - '0'); - }, - 'a'...'f' => { - value = value * 16 | (c3 + 10 - 'a'); - }, - 'A'...'F' => { - value = value * 16 | (c3 + 10 - 'A'); - }, - '}' => { - if (is_first) { + const hex_start = iter.i - width - width2 - width3; + var is_first = true; + var is_out_of_range = false; + variableLength: while (true) { + _ = iterator.next(&iter) or break :variableLength; + c3 = iter.c; + + switch (c3) { + '0'...'9' => { + value = value * 16 | (c3 - '0'); + }, + 'a'...'f' => { + value = value * 16 | (c3 + 10 - 'a'); + }, + 'A'...'F' => { + value = value * 16 | (c3 + 10 - 'A'); + }, + '}' => { + if (is_first) { + lexer.end = start + iter.i - width3; + return lexer.syntaxError(); + } + break :variableLength; + }, + else => { lexer.end = start + iter.i - width3; return lexer.syntaxError(); - } - break :variableLength; - }, - else => { - lexer.end = start + iter.i - width3; - return lexer.syntaxError(); - }, + }, + } + + // '\U0010FFFF + // copied from golang utf8.MaxRune + if (value > 1114111) { + is_out_of_range = true; + } + is_first = false; } - // '\U0010FFFF - // copied from golang utf8.MaxRune - if (value > 1114111) { - is_out_of_range = true; + if (is_out_of_range) { + try lexer.addRangeError( + .{ .loc = .{ .start = @intCast(i32, start + hex_start) }, .len = @intCast(i32, (iter.i - hex_start)) }, + "Unicode escape sequence is out of range", + .{}, + true, + ); + return; } - is_first = false; - } - if (is_out_of_range) { - try lexer.addRangeError( - .{ .loc = .{ .start = @intCast(i32, start + hex_start) }, .len = @intCast(i32, (iter.i - hex_start)) }, - "Unicode escape sequence is out of range", - .{}, - true, - ); - return; - } + // fixed-length + } else { + // Fixed-length + // comptime var j: usize = 0; + var j: usize = 0; + while (j < 4) : (j += 1) { + switch (c3) { + '0'...'9' => { + value = value * 16 | (c3 - '0'); + }, + 'a'...'f' => { + value = value * 16 | (c3 + 10 - 'a'); + }, + 'A'...'F' => { + value = value * 16 | (c3 + 10 - 'A'); + }, + else => { + lexer.end = start + iter.i - width3; + return lexer.syntaxError(); + }, + } - // fixed-length - } else { - // Fixed-length - // comptime var j: usize = 0; - var j: usize = 0; - while (j < 4) : (j += 1) { - switch (c3) { - '0'...'9' => { - value = value * 16 | (c3 - '0'); - }, - 'a'...'f' => { - value = value * 16 | (c3 + 10 - 'a'); - }, - 'A'...'F' => { - value = value * 16 | (c3 + 10 - 'A'); - }, - else => { - lexer.end = start + iter.i - width3; - return lexer.syntaxError(); - }, - } + if (j < 3) { + _ = iterator.next(&iter) or return lexer.syntaxError(); + c3 = iter.c; - if (j < 3) { - c3 = iter.nextCodepoint() orelse return lexer.syntaxError(); - width3 = iter.width; + width3 = iter.width; + } } } - } - iter.c = @truncate(CodePoint, value); - }, - '\r' => { - if (lexer.json_options != null) { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); - } + iter.c = @truncate(CodePoint, value); + }, + '\r' => { + if (comptime is_json) { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + } - // Ignore line continuations. A line continuation is not an escaped newline. - if (iter.i < text.len and text[iter.i + 1] == '\n') { - // Make sure Windows CRLF counts as a single newline - iter.i += 1; - } - continue; - }, - '\n', 0x2028, 0x2029 => { - if (lexer.json_options != null) { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); - } + // Ignore line continuations. A line continuation is not an escaped newline. + if (iter.i < text.len and text[iter.i + 1] == '\n') { + // Make sure Windows CRLF counts as a single newline + iter.i += 1; + } + continue; + }, + '\n', 0x2028, 0x2029 => { + if (comptime is_json) { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + } - // Ignore line continuations. A line continuation is not an escaped newline. - continue; - }, - else => { - if (lexer.json_options != null) { - switch (c2) { - '"', '\\', '/' => {}, - else => { - lexer.end = start + iter.i - width2; - try lexer.syntaxError(); - }, + // Ignore line continuations. A line continuation is not an escaped newline. + continue; + }, + else => { + if (comptime is_json) { + switch (c2) { + '"', '\\', '/' => {}, + else => { + lexer.end = start + iter.i - width2; + try lexer.syntaxError(); + }, + } } - } - iter.c = c2; - }, - } - }, - else => {}, - } + iter.c = c2; + }, + } + }, + else => {}, + } - switch (iter.c) { - 0...0xFFFF => { - buf.append(@intCast(u16, iter.c)) catch unreachable; - }, - else => { - iter.c -= 0x10000; - buf.ensureUnusedCapacity(2) catch unreachable; - buf.appendAssumeCapacity(@intCast(u16, 0xD800 + ((iter.c >> 10) & 0x3FF))); - buf.appendAssumeCapacity(@intCast(u16, 0xDC00 + (iter.c & 0x3FF))); - }, + switch (iter.c) { + -1 => return try lexer.addDefaultError("Unexpected end of file"), + 0...0xFFFF => { + buf.append(@intCast(u16, iter.c)) catch unreachable; + }, + else => { + iter.c -= 0x10000; + buf.ensureUnusedCapacity(2) catch unreachable; + buf.appendAssumeCapacity(@intCast(u16, 0xD800 + ((iter.c >> 10) & 0x3FF))); + buf.appendAssumeCapacity(@intCast(u16, 0xDC00 + (iter.c & 0x3FF))); + }, + } } } - } - - pub const InnerStringLiteral = packed struct { suffix_len: u3, needs_slow_path: bool }; - fn parseStringLiteralInnter(lexer: *LexerType, comptime quote: CodePoint) !InnerStringLiteral { - var needs_slow_path = false; - var suffix_len: u3 = if (comptime quote == 0) 0 else 1; - stringLiteral: while (true) { - @setRuntimeSafety(false); - - switch (lexer.code_point) { - '\\' => { - try lexer.step(); - // Handle Windows CRLF - if (lexer.code_point == 'r' and lexer.json_options != null) { + pub const InnerStringLiteral = packed struct { suffix_len: u3, needs_slow_path: bool }; + fn parseStringLiteralInnter(lexer: *LexerType, comptime quote: CodePoint) !InnerStringLiteral { + var needs_slow_path = false; + var suffix_len: u3 = if (comptime quote == 0) 0 else 1; + stringLiteral: while (true) { + switch (lexer.code_point) { + '\\' => { try lexer.step(); - if (lexer.code_point == '\n') { - try lexer.step(); - } - continue :stringLiteral; - } - switch (lexer.code_point) { - 'f', 't', 'r', 'n', '`', '\'', '0', '"', 0x2028, 0x2029 => { + // Handle Windows CRLF + if (lexer.code_point == 'r' and comptime !is_json) { try lexer.step(); + if (lexer.code_point == '\n') { + try lexer.step(); + } continue :stringLiteral; - }, - else => { - needs_slow_path = true; - }, - } - }, - // This indicates the end of the file + } - -1 => { - if (comptime quote != 0) { - try lexer.addDefaultError("Unterminated string literal"); - } + if (comptime is_json and json_options.ignore_trailing_escape_sequences) { + if (lexer.code_point == quote and lexer.current >= lexer.source.contents.len) { + try lexer.step(); - break :stringLiteral; - }, + break; + } + } - '\r' => { - if (comptime quote != '`') { - try lexer.addDefaultError("Unterminated string literal"); - } + switch (lexer.code_point) { + 'f', 't', 'r', 'n', '`', '\'', '0', '"', 0x2028, 0x2029 => { + try lexer.step(); + continue :stringLiteral; + }, + else => { + needs_slow_path = true; + }, + } + }, + // This indicates the end of the file - // Template literals require newline normalization - needs_slow_path = true; - }, + -1 => { + if (comptime quote != 0) { + try lexer.addDefaultError("Unterminated string literal"); + } - '\n' => { + break :stringLiteral; + }, - // Implicitly-quoted strings end when they reach a newline OR end of file - // This only applies to .env - switch (comptime quote) { - 0 => { - break :stringLiteral; - }, - '`' => {}, - else => { + '\r' => { + if (comptime quote != '`') { try lexer.addDefaultError("Unterminated string literal"); - }, - } - }, + } - '$' => { - if (comptime quote == '`') { - try lexer.step(); - if (lexer.code_point == '{') { - suffix_len = 2; + // Template literals require newline normalization + needs_slow_path = true; + }, + + '\n' => { + + // Implicitly-quoted strings end when they reach a newline OR end of file + // This only applies to .env + switch (comptime quote) { + 0 => { + break :stringLiteral; + }, + '`' => {}, + else => { + try lexer.addDefaultError("Unterminated string literal"); + }, + } + }, + + '$' => { + if (comptime quote == '`') { try lexer.step(); - if (lexer.rescan_close_brace_as_template_token) { - lexer.token = T.t_template_middle; - } else { - lexer.token = T.t_template_head; + if (lexer.code_point == '{') { + suffix_len = 2; + try lexer.step(); + if (lexer.rescan_close_brace_as_template_token) { + lexer.token = T.t_template_middle; + } else { + lexer.token = T.t_template_head; + } + break :stringLiteral; } - break :stringLiteral; + continue :stringLiteral; } - continue :stringLiteral; - } - }, - // exit condition - quote => { - try lexer.step(); + }, + // exit condition + quote => { + try lexer.step(); - break; - }, + break; + }, - else => { + else => { - // Non-ASCII strings need the slow path - if (lexer.code_point >= 0x80) { - needs_slow_path = true; - } else if (lexer.json_options != null and lexer.code_point < 0x20) { - try lexer.syntaxError(); - } - }, + // Non-ASCII strings need the slow path + if (lexer.code_point >= 0x80) { + needs_slow_path = true; + } else if (is_json and lexer.code_point < 0x20) { + try lexer.syntaxError(); + } + }, + } + try lexer.step(); } - try lexer.step(); - } - - return InnerStringLiteral{ .needs_slow_path = needs_slow_path, .suffix_len = suffix_len }; - } - pub fn parseStringLiteral(lexer: *LexerType, comptime quote: CodePoint) !void { - if (comptime quote != '`') { - lexer.token = T.t_string_literal; - } else if (lexer.rescan_close_brace_as_template_token) { - lexer.token = T.t_template_tail; - } else { - lexer.token = T.t_no_substitution_template_literal; - } - // quote is 0 when parsing JSON from .env - // .env values may not always be quoted. - try lexer.step(); - - var string_literal_details = try lexer.parseStringLiteralInnter(quote); - - // Reset string literal - const base = if (comptime quote == 0) lexer.start else lexer.start + 1; - lexer.string_literal_slice = lexer.source.contents[base..std.math.min(lexer.source.contents.len, lexer.end - string_literal_details.suffix_len)]; - lexer.string_literal_is_ascii = !string_literal_details.needs_slow_path; - lexer.string_literal_buffer.shrinkRetainingCapacity(0); - if (string_literal_details.needs_slow_path) { - lexer.string_literal_buffer.ensureUnusedCapacity(lexer.string_literal_slice.len) catch unreachable; - try lexer.decodeEscapeSequences(0, lexer.string_literal_slice, @TypeOf(lexer.string_literal_buffer), &lexer.string_literal_buffer); - lexer.string_literal = lexer.string_literal_buffer.items; + return InnerStringLiteral{ .needs_slow_path = needs_slow_path, .suffix_len = suffix_len }; } - lexer.is_ascii_only = lexer.is_ascii_only and lexer.string_literal_is_ascii; - if (comptime !FeatureFlags.allow_json_single_quotes) { - if (quote == '\'' and lexer.json_options != null) { - try lexer.addRangeError(lexer.range(), "JSON strings must use double quotes", .{}, true); + pub fn parseStringLiteral(lexer: *LexerType, comptime quote: CodePoint) !void { + if (comptime quote != '`') { + lexer.token = T.t_string_literal; + } else if (lexer.rescan_close_brace_as_template_token) { + lexer.token = T.t_template_tail; + } else { + lexer.token = T.t_no_substitution_template_literal; } - } - - // for (text) - // // if (needs_slow_path) { - // // // Slow path - - // // // lexer.string_literal = lexer.(lexer.start + 1, text); - // // } else { - // // // Fast path + // quote is 0 when parsing JSON from .env + // .env values may not always be quoted. + try lexer.step(); - // // } - } + var string_literal_details = try lexer.parseStringLiteralInnter(quote); + + // Reset string literal + const base = if (comptime quote == 0) lexer.start else lexer.start + 1; + lexer.string_literal_slice = lexer.source.contents[base..@minimum(lexer.source.contents.len, lexer.end - string_literal_details.suffix_len)]; + lexer.string_literal_is_ascii = !string_literal_details.needs_slow_path; + lexer.string_literal_buffer.shrinkRetainingCapacity(0); + if (string_literal_details.needs_slow_path) { + lexer.string_literal_buffer.ensureUnusedCapacity(lexer.string_literal_slice.len) catch unreachable; + try lexer.decodeEscapeSequences(0, lexer.string_literal_slice, @TypeOf(lexer.string_literal_buffer), &lexer.string_literal_buffer); + lexer.string_literal = lexer.string_literal_buffer.items; + } + lexer.is_ascii_only = lexer.is_ascii_only and lexer.string_literal_is_ascii; - inline fn nextCodepointSlice(it: *LexerType) []const u8 { - @setRuntimeSafety(false); + if (comptime !FeatureFlags.allow_json_single_quotes) { + if (quote == '\'' and is_json) { + try lexer.addRangeError(lexer.range(), "JSON strings must use double quotes", .{}, true); + } + } - const cp_len = strings.utf8ByteSequenceLength(it.source.contents[it.current]); - it.end = it.current; - it.current += cp_len; + // for (text) + // // if (needs_slow_path) { + // // // Slow path - return if (!(it.current > it.source.contents.len)) it.source.contents[it.current - cp_len .. it.current] else ""; - } + // // // lexer.string_literal = lexer.(lexer.start + 1, text); + // // } else { + // // // Fast path - inline fn nextCodepoint(it: *LexerType) !CodePoint { - const slice = it.nextCodepointSlice(); + // // } + } - return switch (slice.len) { - 0 => -1, - 1 => @as(CodePoint, slice[0]), - 2 => @as(CodePoint, unicode.utf8Decode2(slice) catch unreachable), - 3 => @as(CodePoint, unicode.utf8Decode3(slice) catch unreachable), - 4 => @as(CodePoint, unicode.utf8Decode4(slice) catch unreachable), - else => unreachable, - }; - } + inline fn nextCodepointSlice(it: *LexerType) []const u8 { + const cp_len = strings.utf8ByteSequenceLength(it.source.contents.ptr[it.current]); + it.end = it.current; + it.current += cp_len; - fn step(lexer: *LexerType) !void { - lexer.code_point = try lexer.nextCodepoint(); + return if (!(it.current > it.source.contents.len)) it.source.contents[it.current - cp_len .. it.current] else ""; + } - // Track the approximate number of newlines in the file so we can preallocate - // the line offset table in the printer for source maps. The line offset table - // is the #1 highest allocation in the heap profile, so this is worth doing. - // This count is approximate because it handles "\n" and "\r\n" (the common - // cases) but not "\r" or "\u2028" or "\u2029". Getting this wrong is harmless - // because it's only a preallocation. The array will just grow if it's too small. - lexer.approximate_newline_count += @boolToInt(lexer.code_point == '\n'); - } + inline fn nextCodepoint(it: *LexerType) !CodePoint { + const slice = it.nextCodepointSlice(); - pub fn expect(self: *LexerType, comptime token: T) !void { - if (self.token != token) { - try self.expected(token); + return switch (slice.len) { + 0 => -1, + 1 => @as(CodePoint, slice[0]), + 2 => @as(CodePoint, unicode.utf8Decode2(slice) catch unreachable), + 3 => @as(CodePoint, unicode.utf8Decode3(slice) catch unreachable), + 4 => @as(CodePoint, unicode.utf8Decode4(slice) catch unreachable), + else => unreachable, + }; } - try self.next(); - } + inline fn step(lexer: *LexerType) !void { + lexer.code_point = try lexer.nextCodepoint(); - pub fn expectOrInsertSemicolon(lexer: *LexerType) !void { - if (lexer.token == T.t_semicolon or (!lexer.has_newline_before and - lexer.token != T.t_close_brace and lexer.token != T.t_end_of_file)) - { - try lexer.expect(T.t_semicolon); + // Track the approximate number of newlines in the file so we can preallocate + // the line offset table in the printer for source maps. The line offset table + // is the #1 highest allocation in the heap profile, so this is worth doing. + // This count is approximate because it handles "\n" and "\r\n" (the common + // cases) but not "\r" or "\u2028" or "\u2029". Getting this wrong is harmless + // because it's only a preallocation. The array will just grow if it's too small. + lexer.approximate_newline_count += @boolToInt(lexer.code_point == '\n'); } - } - pub fn addUnsupportedSyntaxError(self: *LexerType, msg: []const u8) !void { - self.addError(self.end, "Unsupported syntax: {s}", .{msg}, true); - return Error.SyntaxError; - } + pub inline fn expect(self: *LexerType, comptime token: T) !void { + if (self.token != token) { + try self.expected(token); + } - pub const IdentifierKind = enum { normal, private }; - pub const ScanResult = struct { token: T, contents: string }; - threadlocal var small_escape_sequence_buffer: [4096]u16 = undefined; - const FakeArrayList16 = struct { - items: []u16, - i: usize = 0, - - pub fn append(fake: *FakeArrayList16, value: u16) !void { - std.debug.assert(fake.items.len < fake.i); - fake.items[fake.i] = value; - fake.i += 1; + try self.next(); } - pub fn appendAssumeCapacity(fake: *FakeArrayList16, value: u16) void { - std.debug.assert(fake.items.len < fake.i); - fake.items[fake.i] = value; - fake.i += 1; + pub inline fn expectOrInsertSemicolon(lexer: *LexerType) !void { + if (lexer.token == T.t_semicolon or (!lexer.has_newline_before and + lexer.token != T.t_close_brace and lexer.token != T.t_end_of_file)) + { + try lexer.expect(T.t_semicolon); + } } - pub fn ensureUnusedCapacity(fake: *FakeArrayList16, int: anytype) !void { - std.debug.assert(fake.items.len < fake.i + int); + + pub fn addUnsupportedSyntaxError(self: *LexerType, msg: []const u8) !void { + self.addError(self.end, "Unsupported syntax: {s}", .{msg}, true); + return Error.SyntaxError; } - }; - threadlocal var large_escape_sequence_list: std.ArrayList(u16) = undefined; - threadlocal var large_escape_sequence_list_loaded: bool = false; - - // This is an edge case that doesn't really exist in the wild, so it doesn't - // need to be as fast as possible. - pub fn scanIdentifierWithEscapes(lexer: *LexerType, comptime kind: IdentifierKind) anyerror!ScanResult { - var result = ScanResult{ .token = .t_end_of_file, .contents = "" }; - // First pass: scan over the identifier to see how long it is - while (true) { - // Scan a unicode escape sequence. There is at least one because that's - // what caused us to get on this slow path in the first place. - if (lexer.code_point == '\\') { - try lexer.step(); - if (lexer.code_point != 'u') { - try lexer.syntaxError(); - } - try lexer.step(); - if (lexer.code_point == '{') { - // Variable-length + pub const IdentifierKind = enum { normal, private }; + pub const ScanResult = struct { token: T, contents: string }; + threadlocal var small_escape_sequence_buffer: [4096]u16 = undefined; + const FakeArrayList16 = struct { + items: []u16, + i: usize = 0, + + pub fn append(fake: *FakeArrayList16, value: u16) !void { + std.debug.assert(fake.items.len < fake.i); + fake.items[fake.i] = value; + fake.i += 1; + } + + pub fn appendAssumeCapacity(fake: *FakeArrayList16, value: u16) void { + std.debug.assert(fake.items.len < fake.i); + fake.items[fake.i] = value; + fake.i += 1; + } + pub fn ensureUnusedCapacity(fake: *FakeArrayList16, int: anytype) !void { + std.debug.assert(fake.items.len < fake.i + int); + } + }; + threadlocal var large_escape_sequence_list: std.ArrayList(u16) = undefined; + threadlocal var large_escape_sequence_list_loaded: bool = false; + + // This is an edge case that doesn't really exist in the wild, so it doesn't + // need to be as fast as possible. + pub fn scanIdentifierWithEscapes(lexer: *LexerType, comptime kind: IdentifierKind) anyerror!ScanResult { + var result = ScanResult{ .token = .t_end_of_file, .contents = "" }; + // First pass: scan over the identifier to see how long it is + while (true) { + // Scan a unicode escape sequence. There is at least one because that's + // what caused us to get on this slow path in the first place. + if (lexer.code_point == '\\') { + try lexer.step(); + + if (lexer.code_point != 'u') { + try lexer.syntaxError(); + } try lexer.step(); - while (lexer.code_point != '}') { + if (lexer.code_point == '{') { + // Variable-length + try lexer.step(); + while (lexer.code_point != '}') { + switch (lexer.code_point) { + '0'...'9', 'a'...'f', 'A'...'F' => { + try lexer.step(); + }, + else => { + try lexer.syntaxError(); + }, + } + } + + try lexer.step(); + } else { + // Fixed-length + // comptime var j: usize = 0; + + switch (lexer.code_point) { + '0'...'9', 'a'...'f', 'A'...'F' => { + try lexer.step(); + }, + else => { + try lexer.syntaxError(); + }, + } + switch (lexer.code_point) { + '0'...'9', 'a'...'f', 'A'...'F' => { + try lexer.step(); + }, + else => { + try lexer.syntaxError(); + }, + } + switch (lexer.code_point) { + '0'...'9', 'a'...'f', 'A'...'F' => { + try lexer.step(); + }, + else => { + try lexer.syntaxError(); + }, + } switch (lexer.code_point) { '0'...'9', 'a'...'f', 'A'...'F' => { try lexer.step(); @@ -783,1733 +848,1651 @@ pub const Lexer = struct { }, } } + continue; + } - try lexer.step(); - } else { - // Fixed-length - // comptime var j: usize = 0; - - switch (lexer.code_point) { - '0'...'9', 'a'...'f', 'A'...'F' => { - try lexer.step(); - }, - else => { - try lexer.syntaxError(); - }, - } - switch (lexer.code_point) { - '0'...'9', 'a'...'f', 'A'...'F' => { - try lexer.step(); - }, - else => { - try lexer.syntaxError(); - }, - } - switch (lexer.code_point) { - '0'...'9', 'a'...'f', 'A'...'F' => { - try lexer.step(); - }, - else => { - try lexer.syntaxError(); - }, - } - switch (lexer.code_point) { - '0'...'9', 'a'...'f', 'A'...'F' => { - try lexer.step(); - }, - else => { - try lexer.syntaxError(); - }, - } + if (!isIdentifierContinue(lexer.code_point)) { + break; } - continue; + try lexer.step(); } - if (!isIdentifierContinue(lexer.code_point)) { - break; - } - try lexer.step(); - } + // Second pass: re-use our existing escape sequence parser + var original_text = lexer.raw(); + if (original_text.len < 1024) { + var buf = FakeArrayList16{ .items = &small_escape_sequence_buffer, .i = 0 }; + try lexer.decodeEscapeSequences(lexer.start, original_text, FakeArrayList16, &buf); + result.contents = lexer.utf16ToString(buf.items[0..buf.i]); + } else { + if (!large_escape_sequence_list_loaded) { + large_escape_sequence_list = try std.ArrayList(u16).initCapacity(lexer.allocator, original_text.len); + large_escape_sequence_list_loaded = true; + } - // Second pass: re-use our existing escape sequence parser - var original_text = lexer.raw(); - if (original_text.len < 1024) { - var buf = FakeArrayList16{ .items = &small_escape_sequence_buffer, .i = 0 }; - try lexer.decodeEscapeSequences(lexer.start, original_text, FakeArrayList16, &buf); - result.contents = lexer.utf16ToString(buf.items[0..buf.i]); - } else { - if (!large_escape_sequence_list_loaded) { - large_escape_sequence_list = try std.ArrayList(u16).initCapacity(lexer.allocator, original_text.len); - large_escape_sequence_list_loaded = true; + large_escape_sequence_list.shrinkRetainingCapacity(0); + try lexer.decodeEscapeSequences(lexer.start, original_text, std.ArrayList(u16), &large_escape_sequence_list); + result.contents = lexer.utf16ToString(large_escape_sequence_list.items); } - large_escape_sequence_list.shrinkRetainingCapacity(0); - try lexer.decodeEscapeSequences(lexer.start, original_text, std.ArrayList(u16), &large_escape_sequence_list); - result.contents = lexer.utf16ToString(large_escape_sequence_list.items); - } - - var identifier = result.contents; - if (kind == .private) { - identifier = result.contents[1..]; - } - - if (!isIdentifier(identifier)) { - try lexer.addRangeError( - .{ .loc = logger.usize2Loc(lexer.start), .len = @intCast(i32, lexer.end - lexer.start) }, - "Invalid identifier: \"{s}\"", - .{result.contents}, - true, - ); - } - result.contents = identifier; - - // Escaped keywords are not allowed to work as actual keywords, but they are - // allowed wherever we allow identifiers or keywords. For example: - // - // // This is an error (equivalent to "var var;") - // var \u0076\u0061\u0072; - // - // // This is an error (equivalent to "var foo;" except for this rule) - // \u0076\u0061\u0072 foo; - // - // // This is an fine (equivalent to "foo.var;") - // foo.\u0076\u0061\u0072; - // - result.token = if (Keywords.has(result.contents)) .t_escaped_keyword else .t_identifier; - - // const text = lexer.decodeEscapeSequences(lexer.start, lexer.raw(), ) - return result; - } - - pub fn expectContextualKeyword(self: *LexerType, comptime keyword: string) !void { - if (!self.isContextualKeyword(keyword)) { - if (std.builtin.mode == std.builtin.Mode.Debug) { - self.addError(self.start, "Expected \"{s}\" but found \"{s}\" (token: {s})", .{ - keyword, - self.raw(), - self.token, - }, true); - } else { - self.addError(self.start, "Expected \"{s}\" but found \"{s}\"", .{ keyword, self.raw() }, true); + var identifier = result.contents; + if (kind == .private) { + identifier = result.contents[1..]; } - return Error.UnexpectedSyntax; - } - try self.next(); - } - - pub fn maybeExpandEquals(lexer: *LexerType) !void { - switch (lexer.code_point) { - '>' => { - // "=" + ">" = "=>" - lexer.token = .t_equals_greater_than; - try lexer.step(); - }, - '=' => { - // "=" + "=" = "==" - lexer.token = .t_equals_equals; - try lexer.step(); - - if (lexer.code_point == '=') { - // "=" + "==" = "===" - lexer.token = .t_equals_equals_equals; - try lexer.step(); - } - }, - else => {}, - } - } - pub fn expectLessThan(lexer: *LexerType, comptime is_inside_jsx_element: bool) !void { - switch (lexer.token) { - .t_less_than => { - if (is_inside_jsx_element) { - try lexer.nextInsideJSXElement(); - } else { - try lexer.next(); - } - }, - .t_less_than_equals => { - lexer.token = .t_equals; - lexer.start += 1; - try lexer.maybeExpandEquals(); - }, - .t_less_than_less_than => { - lexer.token = .t_less_than; - lexer.start += 1; - }, - .t_less_than_less_than_equals => { - lexer.token = .t_less_than_equals; - lexer.start += 1; - }, - else => { - try lexer.expected(.t_less_than); - }, + if (!isIdentifier(identifier)) { + try lexer.addRangeError( + .{ .loc = logger.usize2Loc(lexer.start), .len = @intCast(i32, lexer.end - lexer.start) }, + "Invalid identifier: \"{s}\"", + .{result.contents}, + true, + ); + } + result.contents = identifier; + + // Escaped keywords are not allowed to work as actual keywords, but they are + // allowed wherever we allow identifiers or keywords. For example: + // + // // This is an error (equivalent to "var var;") + // var \u0076\u0061\u0072; + // + // // This is an error (equivalent to "var foo;" except for this rule) + // \u0076\u0061\u0072 foo; + // + // // This is an fine (equivalent to "foo.var;") + // foo.\u0076\u0061\u0072; + // + result.token = if (Keywords.has(result.contents)) .t_escaped_keyword else .t_identifier; + + // const text = lexer.decodeEscapeSequences(lexer.start, lexer.raw(), ) + return result; } - } - pub fn expectGreaterThan(lexer: *LexerType, comptime is_inside_jsx_element: bool) !void { - switch (lexer.token) { - .t_greater_than => { - if (is_inside_jsx_element) { - try lexer.nextInsideJSXElement(); + pub fn expectContextualKeyword(self: *LexerType, comptime keyword: string) !void { + if (!self.isContextualKeyword(keyword)) { + if (std.builtin.mode == std.builtin.Mode.Debug) { + self.addError(self.start, "Expected \"{s}\" but found \"{s}\" (token: {s})", .{ + keyword, + self.raw(), + self.token, + }, true); } else { - try lexer.next(); + self.addError(self.start, "Expected \"{s}\" but found \"{s}\"", .{ keyword, self.raw() }, true); } - }, - .t_greater_than_greater_than => { - lexer.token = .t_greater_than; - lexer.start += 1; - }, - - .t_greater_than_greater_than_greater_than => { - lexer.token = .t_greater_than_greater_than; - lexer.start += 1; - }, - - .t_greater_than_equals => { - lexer.token = .t_equals; - lexer.start += 1; - try lexer.maybeExpandEquals(); - }, - - .t_greater_than_greater_than_equals => { - lexer.token = .t_greater_than_greater_than; - lexer.start += 1; - }, - .t_greater_than_greater_than_greater_than_equals => { - lexer.token = .t_greater_than_greater_than_equals; - lexer.start += 1; - }, - else => { - try lexer.expected(.t_greater_than); - }, + return Error.UnexpectedSyntax; + } + try self.next(); } - } - - pub fn next(lexer: *LexerType) !void { - lexer.has_newline_before = lexer.end == 0; - - while (true) { - lexer.start = lexer.end; - lexer.token = T.t_end_of_file; - @setRuntimeSafety(false); + pub fn maybeExpandEquals(lexer: *LexerType) !void { switch (lexer.code_point) { - -1 => { - lexer.token = T.t_end_of_file; + '>' => { + // "=" + ">" = "=>" + lexer.token = .t_equals_greater_than; + try lexer.step(); }, + '=' => { + // "=" + "=" = "==" + lexer.token = .t_equals_equals; + try lexer.step(); - '#' => { - @setRuntimeSafety(false); - - if (lexer.start == 0 and lexer.source.contents[1] == '!') { - // "#!/usr/bin/env node" - lexer.token = .t_hashbang; - hashbang: while (true) { - @setRuntimeSafety(false); - - try lexer.step(); - switch (lexer.code_point) { - '\r', '\n', 0x2028, 0x2029 => { - break :hashbang; - }, - -1 => { - break :hashbang; - }, - else => {}, - } - } - lexer.identifier = lexer.raw(); - } else { + if (lexer.code_point == '=') { + // "=" + "==" = "===" + lexer.token = .t_equals_equals_equals; try lexer.step(); - if (lexer.code_point == '\\') { - @setRuntimeSafety(false); - - lexer.identifier = (try lexer.scanIdentifierWithEscapes(.private)).contents; - lexer.token = T.t_private_identifier; - } else { - @setRuntimeSafety(false); - - if (!isIdentifierStart(lexer.code_point)) { - try lexer.syntaxError(); - } - - try lexer.step(); - while (isIdentifierContinue(lexer.code_point)) { - try lexer.step(); - } - if (lexer.code_point == '\\') { - lexer.identifier = (try lexer.scanIdentifierWithEscapes(.private)).contents; - lexer.token = T.t_private_identifier; - } else { - lexer.token = T.t_private_identifier; - lexer.identifier = lexer.raw(); - } - break; - } } }, - '\r', '\n', 0x2028, 0x2029 => { - try lexer.step(); - lexer.has_newline_before = true; - continue; - }, - '\t', ' ' => { - try lexer.step(); - continue; + else => {}, + } + } + + pub fn expectLessThan(lexer: *LexerType, comptime is_inside_jsx_element: bool) !void { + switch (lexer.token) { + .t_less_than => { + if (is_inside_jsx_element) { + try lexer.nextInsideJSXElement(); + } else { + try lexer.next(); + } }, - '(' => { - try lexer.step(); - lexer.token = T.t_open_paren; + .t_less_than_equals => { + lexer.token = .t_equals; + lexer.start += 1; + try lexer.maybeExpandEquals(); }, - ')' => { - try lexer.step(); - lexer.token = T.t_close_paren; + .t_less_than_less_than => { + lexer.token = .t_less_than; + lexer.start += 1; }, - '[' => { - try lexer.step(); - lexer.token = T.t_open_bracket; + .t_less_than_less_than_equals => { + lexer.token = .t_less_than_equals; + lexer.start += 1; }, - ']' => { - try lexer.step(); - lexer.token = T.t_close_bracket; + else => { + try lexer.expected(.t_less_than); }, - '{' => { - try lexer.step(); - lexer.token = T.t_open_brace; + } + } + + pub fn expectGreaterThan(lexer: *LexerType, comptime is_inside_jsx_element: bool) !void { + switch (lexer.token) { + .t_greater_than => { + if (is_inside_jsx_element) { + try lexer.nextInsideJSXElement(); + } else { + try lexer.next(); + } }, - '}' => { - try lexer.step(); - lexer.token = T.t_close_brace; + .t_greater_than_greater_than => { + lexer.token = .t_greater_than; + lexer.start += 1; }, - ',' => { - try lexer.step(); - lexer.token = T.t_comma; + + .t_greater_than_greater_than_greater_than => { + lexer.token = .t_greater_than_greater_than; + lexer.start += 1; }, - ':' => { - try lexer.step(); - lexer.token = T.t_colon; + + .t_greater_than_equals => { + lexer.token = .t_equals; + lexer.start += 1; + try lexer.maybeExpandEquals(); }, - ';' => { - try lexer.step(); - lexer.token = T.t_semicolon; + + .t_greater_than_greater_than_equals => { + lexer.token = .t_greater_than_greater_than; + lexer.start += 1; }, - '@' => { - try lexer.step(); - lexer.token = T.t_at; + .t_greater_than_greater_than_greater_than_equals => { + lexer.token = .t_greater_than_greater_than_equals; + lexer.start += 1; }, - '~' => { - try lexer.step(); - lexer.token = T.t_tilde; + else => { + try lexer.expected(.t_greater_than); }, - '?' => { - // '?' or '?.' or '??' or '??=' - try lexer.step(); - switch (lexer.code_point) { - '?' => { + } + } + + pub fn next(lexer: *LexerType) !void { + lexer.has_newline_before = lexer.end == 0; + + while (true) { + lexer.start = lexer.end; + lexer.token = T.t_end_of_file; + + switch (lexer.code_point) { + -1 => { + lexer.token = T.t_end_of_file; + }, + + '#' => { + if (lexer.start == 0 and lexer.source.contents[1] == '!') { + // "#!/usr/bin/env node" + lexer.token = .t_hashbang; + hashbang: while (true) { + try lexer.step(); + switch (lexer.code_point) { + '\r', '\n', 0x2028, 0x2029 => { + break :hashbang; + }, + -1 => { + break :hashbang; + }, + else => {}, + } + } + lexer.identifier = lexer.raw(); + } else { try lexer.step(); - switch (lexer.code_point) { - '=' => { + if (lexer.code_point == '\\') { + lexer.identifier = (try lexer.scanIdentifierWithEscapes(.private)).contents; + lexer.token = T.t_private_identifier; + } else { + if (!isIdentifierStart(lexer.code_point)) { + try lexer.syntaxError(); + } + + try lexer.step(); + while (isIdentifierContinue(lexer.code_point)) { try lexer.step(); - lexer.token = T.t_question_question_equals; - }, - else => { - lexer.token = T.t_question_question; - }, + } + if (lexer.code_point == '\\') { + lexer.identifier = (try lexer.scanIdentifierWithEscapes(.private)).contents; + lexer.token = T.t_private_identifier; + } else { + lexer.token = T.t_private_identifier; + lexer.identifier = lexer.raw(); + } + break; } - }, + } + }, + '\r', '\n', 0x2028, 0x2029 => { + try lexer.step(); + lexer.has_newline_before = true; + continue; + }, + '\t', ' ' => { + try lexer.step(); + continue; + }, + '(' => { + try lexer.step(); + lexer.token = T.t_open_paren; + }, + ')' => { + try lexer.step(); + lexer.token = T.t_close_paren; + }, + '[' => { + try lexer.step(); + lexer.token = T.t_open_bracket; + }, + ']' => { + try lexer.step(); + lexer.token = T.t_close_bracket; + }, + '{' => { + try lexer.step(); + lexer.token = T.t_open_brace; + }, + '}' => { + try lexer.step(); + lexer.token = T.t_close_brace; + }, + ',' => { + try lexer.step(); + lexer.token = T.t_comma; + }, + ':' => { + try lexer.step(); + lexer.token = T.t_colon; + }, + ';' => { + try lexer.step(); + lexer.token = T.t_semicolon; + }, + '@' => { + try lexer.step(); + lexer.token = T.t_at; + }, + '~' => { + try lexer.step(); + lexer.token = T.t_tilde; + }, + '?' => { + // '?' or '?.' or '??' or '??=' + try lexer.step(); + switch (lexer.code_point) { + '?' => { + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_question_question_equals; + }, + else => { + lexer.token = T.t_question_question; + }, + } + }, - '.' => { - lexer.token = T.t_question; - const current = lexer.current; - const contents = lexer.source.contents; + '.' => { + lexer.token = T.t_question; + const current = lexer.current; + const contents = lexer.source.contents; - // Lookahead to disambiguate with 'a?.1:b' - if (current < contents.len) { - const c = contents[current]; - if (c < '0' or c > '9') { - try lexer.step(); - lexer.token = T.t_question_dot; + // Lookahead to disambiguate with 'a?.1:b' + if (current < contents.len) { + const c = contents[current]; + if (c < '0' or c > '9') { + try lexer.step(); + lexer.token = T.t_question_dot; + } } - } - }, - else => { - lexer.token = T.t_question; - }, - } - }, - '%' => { - // '%' or '%=' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_percent_equals; - }, + }, + else => { + lexer.token = T.t_question; + }, + } + }, + '%' => { + // '%' or '%=' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_percent_equals; + }, - else => { - lexer.token = T.t_percent; - }, - } - }, + else => { + lexer.token = T.t_percent; + }, + } + }, - '&' => { - // '&' or '&=' or '&&' or '&&=' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_ampersand_equals; - }, + '&' => { + // '&' or '&=' or '&&' or '&&=' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_ampersand_equals; + }, - '&' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_ampersand_ampersand_equals; - }, + '&' => { + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_ampersand_ampersand_equals; + }, - else => { - lexer.token = T.t_ampersand_ampersand; - }, - } - }, - else => { - lexer.token = T.t_ampersand; - }, - } - }, + else => { + lexer.token = T.t_ampersand_ampersand; + }, + } + }, + else => { + lexer.token = T.t_ampersand; + }, + } + }, - '|' => { + '|' => { - // '|' or '|=' or '||' or '||=' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_bar_equals; - }, - '|' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_bar_bar_equals; - }, + // '|' or '|=' or '||' or '||=' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_bar_equals; + }, + '|' => { + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_bar_bar_equals; + }, - else => { - lexer.token = T.t_bar_bar; - }, - } - }, - else => { - lexer.token = T.t_bar; - }, - } - }, + else => { + lexer.token = T.t_bar_bar; + }, + } + }, + else => { + lexer.token = T.t_bar; + }, + } + }, - '^' => { - // '^' or '^=' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_caret_equals; - }, + '^' => { + // '^' or '^=' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_caret_equals; + }, - else => { - lexer.token = T.t_caret; - }, - } - }, + else => { + lexer.token = T.t_caret; + }, + } + }, - '+' => { - // '+' or '+=' or '++' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_plus_equals; - }, + '+' => { + // '+' or '+=' or '++' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_plus_equals; + }, - '+' => { - try lexer.step(); - lexer.token = T.t_plus_plus; - }, + '+' => { + try lexer.step(); + lexer.token = T.t_plus_plus; + }, - else => { - lexer.token = T.t_plus; - }, - } - }, + else => { + lexer.token = T.t_plus; + }, + } + }, - '-' => { - // '+' or '+=' or '++' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_minus_equals; - }, + '-' => { + // '+' or '+=' or '++' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_minus_equals; + }, - '-' => { - try lexer.step(); + '-' => { + try lexer.step(); + + if (lexer.code_point == '>' and lexer.has_newline_before) { + try lexer.step(); + lexer.log.addRangeWarning(lexer.source, lexer.range(), "Treating \"-->\" as the start of a legacy HTML single-line comment") catch unreachable; + + singleLineHTMLCloseComment: while (true) { + switch (lexer.code_point) { + '\r', '\n', 0x2028, 0x2029 => { + break :singleLineHTMLCloseComment; + }, + -1 => { + break :singleLineHTMLCloseComment; + }, + else => {}, + } + try lexer.step(); + } + continue; + } + + lexer.token = T.t_minus_minus; + }, - if (lexer.code_point == '>' and lexer.has_newline_before) { + else => { + lexer.token = T.t_minus; + }, + } + }, + + '*' => { + // '*' or '*=' or '**' or '**=' + + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = .t_asterisk_equals; + }, + '*' => { try lexer.step(); - lexer.log.addRangeWarning(lexer.source, lexer.range(), "Treating \"-->\" as the start of a legacy HTML single-line comment") catch unreachable; + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = .t_asterisk_asterisk_equals; + }, + else => { + lexer.token = .t_asterisk_asterisk; + }, + } + }, + else => { + lexer.token = .t_asterisk; + }, + } + }, + '/' => { + // '/' or '/=' or '//' or '/* ... */' + try lexer.step(); - singleLineHTMLCloseComment: while (true) { + if (lexer.for_global_name) { + lexer.token = .t_slash; + break; + } + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = .t_slash_equals; + }, + '/' => { + singleLineComment: while (true) { + try lexer.step(); switch (lexer.code_point) { '\r', '\n', 0x2028, 0x2029 => { - break :singleLineHTMLCloseComment; + break :singleLineComment; }, -1 => { - break :singleLineHTMLCloseComment; + break :singleLineComment; }, else => {}, } - try lexer.step(); } - continue; - } - - lexer.token = T.t_minus_minus; - }, - else => { - lexer.token = T.t_minus; - }, - } - }, + if (comptime is_json) { + if (!json.allow_comments) { + try lexer.addRangeError(lexer.range(), "JSON does not support comments", .{}, true); + return; + } + } + lexer.scanCommentText(); + continue; + }, + '*' => { + try lexer.step(); - '*' => { - // '*' or '*=' or '**' or '**=' + multiLineComment: while (true) { + switch (lexer.code_point) { + '*' => { + try lexer.step(); + if (lexer.code_point == '/') { + try lexer.step(); + break :multiLineComment; + } + }, + '\r', '\n', 0x2028, 0x2029 => { + try lexer.step(); + lexer.has_newline_before = true; + }, + -1 => { + lexer.start = lexer.end; + try lexer.addSyntaxError( + lexer.start, + "Expected \"*/\" to terminate multi-line comment", + .{}, + ); + }, + else => { + try lexer.step(); + }, + } + } + if (comptime is_json) { + if (!json.allow_comments) { + try lexer.addRangeError(lexer.range(), "JSON does not support comments", .{}, true); + return; + } + } + lexer.scanCommentText(); + continue; + }, + else => { + lexer.token = .t_slash; + }, + } + }, - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = .t_asterisk_equals; - }, - '*' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = .t_asterisk_asterisk_equals; - }, - else => { - lexer.token = .t_asterisk_asterisk; - }, - } - }, - else => { - lexer.token = .t_asterisk; - }, - } - }, - '/' => { - // '/' or '/=' or '//' or '/* ... */' - try lexer.step(); + '=' => { + // '=' or '=>' or '==' or '===' + try lexer.step(); + switch (lexer.code_point) { + '>' => { + try lexer.step(); + lexer.token = T.t_equals_greater_than; + }, - if (lexer.for_global_name) { - lexer.token = .t_slash; - break; - } - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = .t_slash_equals; - }, - '/' => { - singleLineComment: while (true) { + '=' => { try lexer.step(); switch (lexer.code_point) { - '\r', '\n', 0x2028, 0x2029 => { - break :singleLineComment; + '=' => { + try lexer.step(); + lexer.token = T.t_equals_equals_equals; }, - -1 => { - break :singleLineComment; + + else => { + lexer.token = T.t_equals_equals; }, - else => {}, } - } + }, - if (lexer.json_options) |json| { - if (!json.allow_comments) { - try lexer.addRangeError(lexer.range(), "JSON does not support comments", .{}, true); - return; - } - } - lexer.scanCommentText(); - continue; - }, - '*' => { - try lexer.step(); + else => { + lexer.token = T.t_equals; + }, + } + }, + + '<' => { + // '<' or '<<' or '<=' or '<<=' or '<!--' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_less_than_equals; + }, - multiLineComment: while (true) { + '<' => { + try lexer.step(); switch (lexer.code_point) { - '*' => { + '=' => { try lexer.step(); - if (lexer.code_point == '/') { - try lexer.step(); - break :multiLineComment; - } - }, - '\r', '\n', 0x2028, 0x2029 => { - try lexer.step(); - lexer.has_newline_before = true; - }, - -1 => { - lexer.start = lexer.end; - try lexer.addSyntaxError( - lexer.start, - "Expected \"*/\" to terminate multi-line comment", - .{}, - ); + lexer.token = T.t_less_than_less_than_equals; }, + else => { - try lexer.step(); + lexer.token = T.t_less_than_less_than; }, } - } - if (lexer.json_options) |json| { - if (!json.allow_comments) { - try lexer.addRangeError(lexer.range(), "JSON does not support comments", .{}, true); + }, + // Handle legacy HTML-style comments + '!' => { + if (strings.eqlComptime(lexer.peek("--".len), "--")) { + try lexer.addUnsupportedSyntaxError("Legacy HTML comments not implemented yet!"); return; } - } - lexer.scanCommentText(); - continue; - }, - else => { - lexer.token = .t_slash; - }, - } - }, - - '=' => { - // '=' or '=>' or '==' or '===' - try lexer.step(); - switch (lexer.code_point) { - '>' => { - try lexer.step(); - lexer.token = T.t_equals_greater_than; - }, - - '=' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_equals_equals_equals; - }, - else => { - lexer.token = T.t_equals_equals; - }, - } - }, - - else => { - lexer.token = T.t_equals; - }, - } - }, + lexer.token = T.t_less_than; + }, - '<' => { - // '<' or '<<' or '<=' or '<<=' or '<!--' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_less_than_equals; - }, + else => { + lexer.token = T.t_less_than; + }, + } + }, - '<' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_less_than_less_than_equals; - }, + '>' => { + // '>' or '>>' or '>>>' or '>=' or '>>=' or '>>>=' + try lexer.step(); - else => { - lexer.token = T.t_less_than_less_than; - }, - } - }, - // Handle legacy HTML-style comments - '!' => { - if (strings.eqlComptime(lexer.peek("--".len), "--")) { - try lexer.addUnsupportedSyntaxError("Legacy HTML comments not implemented yet!"); - return; - } + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_greater_than_equals; + }, + '>' => { + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_greater_than_greater_than_equals; + }, + '>' => { + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_greater_than_greater_than_greater_than_equals; + }, + else => { + lexer.token = T.t_greater_than_greater_than_greater_than; + }, + } + }, + else => { + lexer.token = T.t_greater_than_greater_than; + }, + } + }, + else => { + lexer.token = T.t_greater_than; + }, + } + }, - lexer.token = T.t_less_than; - }, + '!' => { + // '!' or '!=' or '!==' + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + switch (lexer.code_point) { + '=' => { + try lexer.step(); + lexer.token = T.t_exclamation_equals_equals; + }, - else => { - lexer.token = T.t_less_than; - }, - } - }, + else => { + lexer.token = T.t_exclamation_equals; + }, + } + }, + else => { + lexer.token = T.t_exclamation; + }, + } + }, - '>' => { - // '>' or '>>' or '>>>' or '>=' or '>>=' or '>>>=' - try lexer.step(); + '\'' => { + try lexer.parseStringLiteral('\''); + }, + '"' => { + try lexer.parseStringLiteral('"'); + }, + '`' => { + try lexer.parseStringLiteral('`'); + }, - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_greater_than_equals; - }, - '>' => { + '_', '$', 'a'...'z', 'A'...'Z' => { + try lexer.step(); + while (isIdentifierContinue(lexer.code_point)) { try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_greater_than_greater_than_equals; - }, - '>' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_greater_than_greater_than_greater_than_equals; - }, - else => { - lexer.token = T.t_greater_than_greater_than_greater_than; - }, - } - }, - else => { - lexer.token = T.t_greater_than_greater_than; - }, - } - }, - else => { - lexer.token = T.t_greater_than; - }, - } - }, + } - '!' => { - // '!' or '!=' or '!==' - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - switch (lexer.code_point) { - '=' => { - try lexer.step(); - lexer.token = T.t_exclamation_equals_equals; - }, + if (lexer.code_point != '\\') { + // this code is so hot that if you save lexer.raw() into a temporary variable + // it shows up in profiling + lexer.identifier = lexer.raw(); + lexer.token = Keywords.get(lexer.identifier) orelse T.t_identifier; + } else { + const scan_result = try lexer.scanIdentifierWithEscapes(.normal); + lexer.identifier = scan_result.contents; + lexer.token = scan_result.token; + } + }, - else => { - lexer.token = T.t_exclamation_equals; - }, + '\\' => { + if (comptime is_json and json_options.ignore_leading_escape_sequences) { + if (lexer.start == 0 or lexer.current == lexer.source.contents.len - 1) { + try lexer.step(); + continue; } - }, - else => { - lexer.token = T.t_exclamation; - }, - } - }, - - '\'' => { - try lexer.parseStringLiteral('\''); - }, - '"' => { - try lexer.parseStringLiteral('"'); - }, - '`' => { - try lexer.parseStringLiteral('`'); - }, - - '_', '$', 'a'...'z', 'A'...'Z' => { - try lexer.step(); - while (isIdentifierContinue(lexer.code_point)) { - try lexer.step(); - } + } - if (lexer.code_point == '\\') { const scan_result = try lexer.scanIdentifierWithEscapes(.normal); lexer.identifier = scan_result.contents; lexer.token = scan_result.token; - } else { - // this code is so hot that if you save lexer.raw() into a temporary variable - // it shows up in profiling - lexer.identifier = lexer.raw(); - lexer.token = Keywords.get(lexer.identifier) orelse T.t_identifier; - } - }, - - '\\' => { - const scan_result = try lexer.scanIdentifierWithEscapes(.normal); - lexer.identifier = scan_result.contents; - lexer.token = scan_result.token; - }, - - '.', '0'...'9' => { - try lexer.parseNumericLiteralOrDot(); - }, + }, - else => { - // Check for unusual whitespace characters - if (isWhitespace(lexer.code_point)) { - try lexer.step(); - continue; - } + '.', '0'...'9' => { + try lexer.parseNumericLiteralOrDot(); + }, - if (isIdentifierStart(lexer.code_point)) { - try lexer.step(); - while (isIdentifierContinue(lexer.code_point)) { + else => { + // Check for unusual whitespace characters + if (isWhitespace(lexer.code_point)) { try lexer.step(); + continue; } - if (lexer.code_point == '\\') { - const scan_result = try lexer.scanIdentifierWithEscapes(.normal); - lexer.identifier = scan_result.contents; - lexer.token = scan_result.token; - } else { - lexer.token = T.t_identifier; - lexer.identifier = lexer.raw(); - } - break; - } - lexer.end = lexer.current; - lexer.token = T.t_syntax_error; - }, - } + if (isIdentifierStart(lexer.code_point)) { + try lexer.step(); + while (isIdentifierContinue(lexer.code_point)) { + try lexer.step(); + } + if (lexer.code_point == '\\') { + const scan_result = try lexer.scanIdentifierWithEscapes(.normal); + lexer.identifier = scan_result.contents; + lexer.token = scan_result.token; + } else { + lexer.token = T.t_identifier; + lexer.identifier = lexer.raw(); + } + break; + } - return; - } - } + lexer.end = lexer.current; + lexer.token = T.t_syntax_error; + }, + } - pub fn expected(self: *LexerType, token: T) !void { - if (self.is_log_disabled) { - return error.Backtrack; - } else if (tokenToString.get(token).len > 0) { - try self.expectedString(tokenToString.get(token)); - } else { - try self.unexpected(); + return; + } } - } - - pub fn unexpected(lexer: *LexerType) !void { - const found = finder: { - lexer.start = std.math.min(lexer.start, lexer.end); - if (lexer.start == lexer.source.contents.len) { - break :finder "end of file"; + pub fn expected(self: *LexerType, token: T) !void { + if (self.is_log_disabled) { + return error.Backtrack; + } else if (tokenToString.get(token).len > 0) { + try self.expectedString(tokenToString.get(token)); } else { - break :finder lexer.raw(); + try self.unexpected(); } - }; + } - try lexer.addRangeError(lexer.range(), "Unexpected {s}", .{found}, true); - } + pub fn unexpected(lexer: *LexerType) !void { + const found = finder: { + lexer.start = std.math.min(lexer.start, lexer.end); - pub fn raw(self: *LexerType) []const u8 { - return self.source.contents[self.start..self.end]; - } + if (lexer.start == lexer.source.contents.len) { + break :finder "end of file"; + } else { + break :finder lexer.raw(); + } + }; - pub fn isContextualKeyword(self: *LexerType, comptime keyword: string) bool { - return self.token == .t_identifier and strings.eqlComptime(self.raw(), keyword); - } + try lexer.addRangeError(lexer.range(), "Unexpected {s}", .{found}, true); + } - pub fn expectedString(self: *LexerType, text: string) !void { - const found = finder: { - if (self.source.contents.len != self.start) { - break :finder self.raw(); - } else { - break :finder "end of file"; - } - }; + pub fn raw(self: *LexerType) []const u8 { + return self.source.contents[self.start..self.end]; + } - try self.addRangeError(self.range(), "Expected {s} but found {s}", .{ text, found }, true); - } + pub fn isContextualKeyword(self: *LexerType, comptime keyword: string) bool { + return self.token == .t_identifier and strings.eqlComptime(self.raw(), keyword); + } - pub fn scanCommentText(lexer: *LexerType) void { - var text = lexer.source.contents[lexer.start..lexer.end]; - const has_preserve_annotation = text.len > 2 and text[2] == '!'; - const is_multiline_comment = text[1] == '*'; + pub fn expectedString(self: *LexerType, text: string) !void { + const found = finder: { + if (self.source.contents.len != self.start) { + break :finder self.raw(); + } else { + break :finder "end of file"; + } + }; - // Omit the trailing "*/" from the checks below - var endCommentText = text.len; - if (is_multiline_comment) { - endCommentText -= 2; + try self.addRangeError(self.range(), "Expected {s} but found {s}", .{ text, found }, true); } - if (has_preserve_annotation or lexer.preserve_all_comments_before) { + pub fn scanCommentText(lexer: *LexerType) void { + var text = lexer.source.contents[lexer.start..lexer.end]; + const has_preserve_annotation = text.len > 2 and text[2] == '!'; + const is_multiline_comment = text[1] == '*'; + + // Omit the trailing "*/" from the checks below + var endCommentText = text.len; if (is_multiline_comment) { - // text = lexer.removeMultilineCommentIndent(lexer.source.contents[0..lexer.start], text); + endCommentText -= 2; } - lexer.comments_to_preserve_before.append(js_ast.G.Comment{ - .text = text, - .loc = lexer.loc(), - }) catch unreachable; + if (has_preserve_annotation or lexer.preserve_all_comments_before) { + if (is_multiline_comment) { + // text = lexer.removeMultilineCommentIndent(lexer.source.contents[0..lexer.start], text); + } + + lexer.comments_to_preserve_before.append(js_ast.G.Comment{ + .text = text, + .loc = lexer.loc(), + }) catch unreachable; + } } - } - // TODO: implement this - // it's too complicated to handle all the edgecases right now given the state of Zig's standard library - pub fn removeMultilineCommentIndent(lexer: *LexerType, _prefix: string, text: string) string { - return text; - } + // TODO: implement this + // it's too complicated to handle all the edgecases right now given the state of Zig's standard library + pub fn removeMultilineCommentIndent(lexer: *LexerType, _prefix: string, text: string) string { + return text; + } - pub fn range(self: *LexerType) logger.Range { - return logger.Range{ - .loc = logger.usize2Loc(self.start), - .len = std.math.lossyCast(i32, self.end - self.start), - }; - } + pub fn range(self: *LexerType) logger.Range { + return logger.Range{ + .loc = logger.usize2Loc(self.start), + .len = std.math.lossyCast(i32, self.end - self.start), + }; + } - pub fn initGlobalName(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { - var empty_string_literal: JavascriptString = &emptyJavaScriptString; - var lex = LexerType{ - .log = log, - .source = source, - .string_literal_is_ascii = true, - .string_literal = empty_string_literal, - .string_literal_buffer = std.ArrayList(u16).init(allocator), - .prev_error_loc = logger.Loc.Empty, - .allocator = allocator, - .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), - .for_global_name = true, - }; - try lex.step(); - try lex.next(); + pub fn initGlobalName(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { + var empty_string_literal: JavascriptString = &emptyJavaScriptString; + var lex = LexerType{ + .log = log, + .source = source, + .string_literal_is_ascii = true, + .string_literal = empty_string_literal, + .string_literal_buffer = std.ArrayList(u16).init(allocator), + .prev_error_loc = logger.Loc.Empty, + .allocator = allocator, + .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), + .for_global_name = true, + }; + try lex.step(); + try lex.next(); - return lex; - } + return lex; + } - pub fn initTSConfig(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { - var empty_string_literal: JavascriptString = &emptyJavaScriptString; - var lex = LexerType{ - .log = log, - .source = source, - .string_literal = empty_string_literal, - .string_literal_buffer = std.ArrayList(u16).init(allocator), - .prev_error_loc = logger.Loc.Empty, - .string_literal_is_ascii = true, - .allocator = allocator, - .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), - .json_options = JSONOptions{ - .allow_comments = true, - .allow_trailing_commas = true, - }, - }; - try lex.step(); - try lex.next(); + pub fn initTSConfig(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { + var empty_string_literal: JavascriptString = &emptyJavaScriptString; + var lex = LexerType{ + .log = log, + .source = source, + .string_literal = empty_string_literal, + .string_literal_buffer = std.ArrayList(u16).init(allocator), + .prev_error_loc = logger.Loc.Empty, + .string_literal_is_ascii = true, + .allocator = allocator, + .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), + }; + try lex.step(); + try lex.next(); - return lex; - } + return lex; + } - pub fn initJSON(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { - var empty_string_literal: JavascriptString = &emptyJavaScriptString; - var lex = LexerType{ - .log = log, - .string_literal_buffer = std.ArrayList(u16).init(allocator), - .source = source, - .string_literal = empty_string_literal, - .prev_error_loc = logger.Loc.Empty, - .allocator = allocator, - .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), - .json_options = JSONOptions{ - .allow_comments = false, - .allow_trailing_commas = false, - }, - }; - try lex.step(); - try lex.next(); + pub fn initJSON(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { + var empty_string_literal: JavascriptString = &emptyJavaScriptString; + var lex = LexerType{ + .log = log, + .string_literal_buffer = std.ArrayList(u16).init(allocator), + .source = source, + .string_literal = empty_string_literal, + .prev_error_loc = logger.Loc.Empty, + .allocator = allocator, + .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), + }; + try lex.step(); + try lex.next(); - return lex; - } + return lex; + } - pub fn init(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { - try tables.initJSXEntityMap(); - var empty_string_literal: JavascriptString = &emptyJavaScriptString; - var lex = LexerType{ - .log = log, - .source = source, - .string_literal = empty_string_literal, - .string_literal_buffer = std.ArrayList(u16).init(allocator), - .prev_error_loc = logger.Loc.Empty, - .allocator = allocator, - .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), - }; - try lex.step(); - try lex.next(); + pub fn init(log: *logger.Log, source: *const logger.Source, allocator: *std.mem.Allocator) !LexerType { + try tables.initJSXEntityMap(); + var empty_string_literal: JavascriptString = &emptyJavaScriptString; + var lex = LexerType{ + .log = log, + .source = source, + .string_literal = empty_string_literal, + .string_literal_buffer = std.ArrayList(u16).init(allocator), + .prev_error_loc = logger.Loc.Empty, + .allocator = allocator, + .comments_to_preserve_before = std.ArrayList(js_ast.G.Comment).init(allocator), + }; + try lex.step(); + try lex.next(); - return lex; - } + return lex; + } - pub fn toEString(lexer: *LexerType) js_ast.E.String { - if (lexer.string_literal_is_ascii) { - return js_ast.E.String{ .utf8 = lexer.string_literal_slice }; - } else { - return js_ast.E.String{ .value = lexer.stringLiteralUTF16() }; + pub fn toEString(lexer: *LexerType) js_ast.E.String { + if (lexer.string_literal_is_ascii) { + return js_ast.E.String{ .utf8 = lexer.string_literal_slice }; + } else { + return js_ast.E.String{ .value = lexer.stringLiteralUTF16() }; + } } - } - pub fn scanRegExp(lexer: *LexerType) !void { - lexer.regex_flags_start = null; - while (true) { - switch (lexer.code_point) { - '/' => { - try lexer.step(); + pub fn scanRegExp(lexer: *LexerType) !void { + lexer.regex_flags_start = null; + while (true) { + switch (lexer.code_point) { + '/' => { + try lexer.step(); - var has_set_flags_start = false; - while (isIdentifierContinue(lexer.code_point)) { - switch (lexer.code_point) { - 'g', 'i', 'm', 's', 'u', 'y' => { - if (!has_set_flags_start) { - lexer.regex_flags_start = @truncate(u16, lexer.end - lexer.start); - has_set_flags_start = true; - } + var has_set_flags_start = false; + while (isIdentifierContinue(lexer.code_point)) { + switch (lexer.code_point) { + 'g', 'i', 'm', 's', 'u', 'y' => { + if (!has_set_flags_start) { + lexer.regex_flags_start = @truncate(u16, lexer.end - lexer.start); + has_set_flags_start = true; + } - try lexer.step(); - }, - else => { - try lexer.syntaxError(); - }, + try lexer.step(); + }, + else => { + try lexer.syntaxError(); + }, + } } - } - return; - }, - '[' => { - try lexer.step(); - while (lexer.code_point != ']') { + return; + }, + '[' => { + try lexer.step(); + while (lexer.code_point != ']') { + try lexer.scanRegExpValidateAndStep(); + } + try lexer.step(); + }, + else => { try lexer.scanRegExpValidateAndStep(); - } - try lexer.step(); - }, - else => { - try lexer.scanRegExpValidateAndStep(); - }, + }, + } } } - } - // TODO: use wtf-8 encoding. - pub fn stringToUTF16(lexer: *LexerType, str: string) JavascriptString { - var buf: JavascriptString = lexer.allocator.alloc(u16, std.mem.len(str)) catch unreachable; - // theres prob a faster/better way - for (str) |char, i| { - buf[i] = char; + // TODO: use wtf-8 encoding. + pub fn stringToUTF16(lexer: *LexerType, str: string) JavascriptString { + var buf: JavascriptString = lexer.allocator.alloc(u16, std.mem.len(str)) catch unreachable; + // theres prob a faster/better way + for (str) |char, i| { + buf[i] = char; + } + return buf; } - return buf; - } - // TODO: use wtf-8 encoding. - pub fn utf16ToStringWithValidation(lexer: *LexerType, js: JavascriptString) !string { - // return std.unicode.utf16leToUtf8Alloc(lexer.allocator, js); - return utf16ToString(lexer, js); - } + // TODO: use wtf-8 encoding. + pub fn utf16ToStringWithValidation(lexer: *LexerType, js: JavascriptString) !string { + // return std.unicode.utf16leToUtf8Alloc(lexer.allocator, js); + return utf16ToString(lexer, js); + } - pub fn utf16ToString(lexer: *LexerType, js: JavascriptString) string { - var temp: [4]u8 = undefined; - var list = std.ArrayList(u8).initCapacity(lexer.allocator, js.len) catch unreachable; - var i: usize = 0; - while (i < js.len) : (i += 1) { - var r1 = @intCast(i32, js[i]); - if (r1 >= 0xD800 and r1 <= 0xDBFF and i + 1 < js.len) { - const r2 = @intCast(i32, js[i] + 1); - if (r2 >= 0xDC00 and r2 <= 0xDFFF) { - r1 = (r1 - 0xD800) << 10 | (r2 - 0xDC00) + 0x10000; - i += 1; + pub fn utf16ToString(lexer: *LexerType, js: JavascriptString) string { + var temp: [4]u8 = undefined; + var list = std.ArrayList(u8).initCapacity(lexer.allocator, js.len) catch unreachable; + var i: usize = 0; + while (i < js.len) : (i += 1) { + var r1 = @intCast(i32, js[i]); + if (r1 >= 0xD800 and r1 <= 0xDBFF and i + 1 < js.len) { + const r2 = @intCast(i32, js[i] + 1); + if (r2 >= 0xDC00 and r2 <= 0xDFFF) { + r1 = (r1 - 0xD800) << 10 | (r2 - 0xDC00) + 0x10000; + i += 1; + } } + const width = strings.encodeWTF8Rune(&temp, r1); + list.appendSlice(temp[0..width]) catch unreachable; } - const width = strings.encodeWTF8Rune(&temp, r1); - list.appendSlice(temp[0..width]) catch unreachable; + return list.items; + // return std.unicode.utf16leToUtf8Alloc(lexer.allocator, js) catch unreachable; } - return list.items; - // return std.unicode.utf16leToUtf8Alloc(lexer.allocator, js) catch unreachable; - } - pub fn nextInsideJSXElement(lexer: *LexerType) !void { - lexer.has_newline_before = false; + pub fn nextInsideJSXElement(lexer: *LexerType) !void { + lexer.has_newline_before = false; - while (true) { - lexer.start = lexer.end; - lexer.token = .t_end_of_file; + while (true) { + lexer.start = lexer.end; + lexer.token = .t_end_of_file; - switch (lexer.code_point) { - -1 => { - lexer.token = .t_end_of_file; - }, - '\r', '\n', 0x2028, 0x2029 => { - try lexer.step(); - lexer.has_newline_before = true; - continue; - }, - '\t', ' ' => { - try lexer.step(); - continue; - }, - '.' => { - try lexer.step(); - lexer.token = .t_dot; - }, - '=' => { - try lexer.step(); - lexer.token = .t_equals; - }, - '{' => { - try lexer.step(); - lexer.token = .t_open_brace; - }, - '}' => { - try lexer.step(); - lexer.token = .t_close_brace; - }, - '<' => { - try lexer.step(); - lexer.token = .t_less_than; - }, - '>' => { - try lexer.step(); - lexer.token = .t_greater_than; - }, - '/' => { - // '/' or '//' or '/* ... */' + switch (lexer.code_point) { + -1 => { + lexer.token = .t_end_of_file; + }, + '\r', '\n', 0x2028, 0x2029 => { + try lexer.step(); + lexer.has_newline_before = true; + continue; + }, + '\t', ' ' => { + try lexer.step(); + continue; + }, + '.' => { + try lexer.step(); + lexer.token = .t_dot; + }, + '=' => { + try lexer.step(); + lexer.token = .t_equals; + }, + '{' => { + try lexer.step(); + lexer.token = .t_open_brace; + }, + '}' => { + try lexer.step(); + lexer.token = .t_close_brace; + }, + '<' => { + try lexer.step(); + lexer.token = .t_less_than; + }, + '>' => { + try lexer.step(); + lexer.token = .t_greater_than; + }, + '/' => { + // '/' or '//' or '/* ... */' - try lexer.step(); - switch (lexer.code_point) { - '/' => { - single_line_comment: { - while (true) { - try lexer.step(); - switch (lexer.code_point) { - '\r', '\n', 0x2028, 0x2029 => { - break :single_line_comment; - }, - -1 => { - break :single_line_comment; - }, - else => {}, + try lexer.step(); + switch (lexer.code_point) { + '/' => { + single_line_comment: { + while (true) { + try lexer.step(); + switch (lexer.code_point) { + '\r', '\n', 0x2028, 0x2029 => { + break :single_line_comment; + }, + -1 => { + break :single_line_comment; + }, + else => {}, + } } } - } - continue; - }, - '*' => { - try lexer.step(); - const start_range = lexer.range(); - multi_line_comment: { - while (true) { - switch (lexer.code_point) { - '*' => { - try lexer.step(); - if (lexer.code_point == '/') { + continue; + }, + '*' => { + try lexer.step(); + const start_range = lexer.range(); + multi_line_comment: { + while (true) { + switch (lexer.code_point) { + '*' => { try lexer.step(); - break :multi_line_comment; - } - }, - '\r', '\n', 0x2028, 0x2029 => { - try lexer.step(); - lexer.has_newline_before = true; - }, - -1 => { - lexer.start = lexer.end; - try lexer.addSyntaxError(lexer.start, "Expected \"*/\" to terminate multi-line comment", .{}); - }, - else => { - try lexer.step(); - }, + if (lexer.code_point == '/') { + try lexer.step(); + break :multi_line_comment; + } + }, + '\r', '\n', 0x2028, 0x2029 => { + try lexer.step(); + lexer.has_newline_before = true; + }, + -1 => { + lexer.start = lexer.end; + try lexer.addSyntaxError(lexer.start, "Expected \"*/\" to terminate multi-line comment", .{}); + }, + else => { + try lexer.step(); + }, + } } } - } - continue; - }, - else => { - lexer.token = .t_slash; - }, - } - }, - '\'' => { - try lexer.step(); - try lexer.parseJSXStringLiteral('\''); - }, - '"' => { - try lexer.step(); - try lexer.parseJSXStringLiteral('"'); - }, - else => { - if (isWhitespace(lexer.code_point)) { + continue; + }, + else => { + lexer.token = .t_slash; + }, + } + }, + '\'' => { try lexer.step(); - continue; - } - - if (isIdentifierStart(lexer.code_point)) { + try lexer.parseJSXStringLiteral('\''); + }, + '"' => { try lexer.step(); - while (isIdentifierContinue(lexer.code_point) or lexer.code_point == '-') { + try lexer.parseJSXStringLiteral('"'); + }, + else => { + if (isWhitespace(lexer.code_point)) { try lexer.step(); + continue; } - // Parse JSX namespaces. These are not supported by React or TypeScript - // but someone using JSX syntax in more obscure ways may find a use for - // them. A namespaced name is just always turned into a string so you - // can't use this feature to reference JavaScript identifiers. - if (lexer.code_point == ':') { + if (isIdentifierStart(lexer.code_point)) { try lexer.step(); + while (isIdentifierContinue(lexer.code_point) or lexer.code_point == '-') { + try lexer.step(); + } - if (isIdentifierStart(lexer.code_point)) { - while (isIdentifierStart(lexer.code_point) or lexer.code_point == '-') { - try lexer.step(); + // Parse JSX namespaces. These are not supported by React or TypeScript + // but someone using JSX syntax in more obscure ways may find a use for + // them. A namespaced name is just always turned into a string so you + // can't use this feature to reference JavaScript identifiers. + if (lexer.code_point == ':') { + try lexer.step(); + + if (isIdentifierStart(lexer.code_point)) { + while (isIdentifierStart(lexer.code_point) or lexer.code_point == '-') { + try lexer.step(); + } + } else { + try lexer.addSyntaxError(lexer.range().endI(), "Expected identifier after \"{s}\" in namespaced JSX name", .{lexer.raw()}); } - } else { - try lexer.addSyntaxError(lexer.range().endI(), "Expected identifier after \"{s}\" in namespaced JSX name", .{lexer.raw()}); } + + lexer.identifier = lexer.raw(); + lexer.token = .t_identifier; + break; } - lexer.identifier = lexer.raw(); - lexer.token = .t_identifier; - break; - } + lexer.end = lexer.current; + lexer.token = .t_syntax_error; + }, + } - lexer.end = lexer.current; - lexer.token = .t_syntax_error; - }, + return; } - - return; } - } - pub fn parseJSXStringLiteral(lexer: *LexerType, comptime quote: u8) !void { - var backslash = logger.Range.None; - var needs_decode = false; + pub fn parseJSXStringLiteral(lexer: *LexerType, comptime quote: u8) !void { + var backslash = logger.Range.None; + var needs_decode = false; - string_literal: while (true) { - switch (lexer.code_point) { - -1 => { - try lexer.syntaxError(); - }, - '&' => { - needs_decode = true; - try lexer.step(); - }, - '\\' => { - backslash = logger.Range{ .loc = logger.Loc{ - .start = @intCast(i32, lexer.end), - }, .len = 1 }; - try lexer.step(); - continue; - }, - quote => { - if (backslash.len > 0) { - backslash.len += 1; - lexer.previous_backslash_quote_in_jsx = backslash; - } - try lexer.step(); - // not sure about this! - break :string_literal; - }, - else => { - // Non-ASCII strings need the slow path - if (lexer.code_point >= 0x80) { + string_literal: while (true) { + switch (lexer.code_point) { + -1 => { + try lexer.syntaxError(); + }, + '&' => { needs_decode = true; - } - try lexer.step(); - }, + try lexer.step(); + }, + '\\' => { + backslash = logger.Range{ .loc = logger.Loc{ + .start = @intCast(i32, lexer.end), + }, .len = 1 }; + try lexer.step(); + continue; + }, + quote => { + if (backslash.len > 0) { + backslash.len += 1; + lexer.previous_backslash_quote_in_jsx = backslash; + } + try lexer.step(); + // not sure about this! + break :string_literal; + }, + else => { + // Non-ASCII strings need the slow path + if (lexer.code_point >= 0x80) { + needs_decode = true; + } else if ((comptime is_json) and lexer.code_point < 0x20) { + try lexer.syntaxError(); + } + try lexer.step(); + }, + } + backslash = logger.Range.None; } - backslash = logger.Range.None; - } - lexer.token = .t_string_literal; - lexer.string_literal_slice = lexer.source.contents[lexer.start + 1 .. lexer.end - 1]; - lexer.string_literal_is_ascii = !needs_decode; - lexer.string_literal_buffer.clearRetainingCapacity(); - if (needs_decode) { - lexer.string_literal_buffer.ensureTotalCapacity(lexer.string_literal_slice.len) catch unreachable; - try lexer.decodeJSXEntities(lexer.string_literal_slice, &lexer.string_literal_buffer); - lexer.string_literal = lexer.string_literal_buffer.items; + lexer.token = .t_string_literal; + lexer.string_literal_slice = lexer.source.contents[lexer.start + 1 .. lexer.end - 1]; + lexer.string_literal_is_ascii = !needs_decode; + lexer.string_literal_buffer.clearRetainingCapacity(); + if (needs_decode) { + lexer.string_literal_buffer.ensureTotalCapacity(lexer.string_literal_slice.len) catch unreachable; + try lexer.decodeJSXEntities(lexer.string_literal_slice, &lexer.string_literal_buffer); + lexer.string_literal = lexer.string_literal_buffer.items; + } } - } - pub fn expectJSXElementChild(lexer: *LexerType, token: T) !void { - if (lexer.token != token) { - try lexer.expected(token); - } + pub fn expectJSXElementChild(lexer: *LexerType, token: T) !void { + if (lexer.token != token) { + try lexer.expected(token); + } - try lexer.nextJSXElementChild(); - } + try lexer.nextJSXElementChild(); + } - pub fn nextJSXElementChild(lexer: *LexerType) !void { - lexer.has_newline_before = false; - const original_start = lexer.end; + pub fn nextJSXElementChild(lexer: *LexerType) !void { + lexer.has_newline_before = false; + const original_start = lexer.end; - while (true) { - lexer.start = lexer.end; - lexer.token = T.t_end_of_file; + while (true) { + lexer.start = lexer.end; + lexer.token = T.t_end_of_file; - switch (lexer.code_point) { - -1 => { - lexer.token = .t_end_of_file; - }, - '{' => { - try lexer.step(); - lexer.token = .t_open_brace; - }, - '<' => { - try lexer.step(); - lexer.token = .t_less_than; - }, - else => { - var needs_fixing = false; + switch (lexer.code_point) { + -1 => { + lexer.token = .t_end_of_file; + }, + '{' => { + try lexer.step(); + lexer.token = .t_open_brace; + }, + '<' => { + try lexer.step(); + lexer.token = .t_less_than; + }, + else => { + var needs_fixing = false; - string_literal: while (true) { - switch (lexer.code_point) { - -1 => { - try lexer.syntaxError(); - }, - '&', '\r', '\n', 0x2028, 0x2029 => { - needs_fixing = true; - try lexer.step(); - }, - '{', '<' => { - break :string_literal; - }, - else => { - // Non-ASCII strings need the slow path - needs_fixing = needs_fixing or lexer.code_point >= 0x80; - try lexer.step(); - }, + string_literal: while (true) { + switch (lexer.code_point) { + -1 => { + try lexer.syntaxError(); + }, + '&', '\r', '\n', 0x2028, 0x2029 => { + needs_fixing = true; + try lexer.step(); + }, + '{', '<' => { + break :string_literal; + }, + else => { + // Non-ASCII strings need the slow path + needs_fixing = needs_fixing or lexer.code_point >= 0x80; + try lexer.step(); + }, + } } - } - lexer.token = .t_string_literal; - lexer.string_literal_slice = lexer.source.contents[original_start..lexer.end]; - lexer.string_literal_is_ascii = !needs_fixing; - if (needs_fixing) { - // slow path - lexer.string_literal = try fixWhitespaceAndDecodeJSXEntities(lexer, lexer.string_literal_slice); + lexer.token = .t_string_literal; + lexer.string_literal_slice = lexer.source.contents[original_start..lexer.end]; + lexer.string_literal_is_ascii = !needs_fixing; + if (needs_fixing) { + // slow path + lexer.string_literal = try fixWhitespaceAndDecodeJSXEntities(lexer, lexer.string_literal_slice); - if (lexer.string_literal.len == 0) { - lexer.has_newline_before = true; - continue; + if (lexer.string_literal.len == 0) { + lexer.has_newline_before = true; + continue; + } + } else { + lexer.string_literal = &([_]u16{}); } - } else { - lexer.string_literal = &([_]u16{}); - } - }, - } - - break; - } - } + }, + } - threadlocal var jsx_decode_buf: std.ArrayList(u16) = undefined; - threadlocal var jsx_decode_init = false; - pub fn fixWhitespaceAndDecodeJSXEntities(lexer: *LexerType, text: string) !JavascriptString { - if (!jsx_decode_init) { - jsx_decode_init = true; - jsx_decode_buf = std.ArrayList(u16).init(default_allocator); + break; + } } - jsx_decode_buf.clearRetainingCapacity(); - - var decoded = jsx_decode_buf; - defer jsx_decode_buf = decoded; - var decoded_ptr = &decoded; - var i: u32 = 0; - var after_last_non_whitespace: ?u32 = null; - // Trim whitespace off the end of the first line - var first_non_whitespace: ?u32 = 0; - - while (i < text.len) { - const width: u3 = strings.utf8ByteSequenceLength(text[i]); - - const c: CodePoint = switch (width) { - 0 => -1, - 1 => @intCast(CodePoint, text[i]), - 2 => @intCast(CodePoint, std.unicode.utf8Decode2(text[i..][0..2]) catch unreachable), - 3 => @intCast(CodePoint, std.unicode.utf8Decode3(text[i..][0..3]) catch unreachable), - 4 => @intCast(CodePoint, std.unicode.utf8Decode4(text[i..][0..4]) catch unreachable), - else => unreachable, - }; + threadlocal var jsx_decode_buf: std.ArrayList(u16) = undefined; + threadlocal var jsx_decode_init = false; + pub fn fixWhitespaceAndDecodeJSXEntities(lexer: *LexerType, text: string) !JavascriptString { + if (!jsx_decode_init) { + jsx_decode_init = true; + jsx_decode_buf = std.ArrayList(u16).init(default_allocator); + } + jsx_decode_buf.clearRetainingCapacity(); + + var decoded = jsx_decode_buf; + defer jsx_decode_buf = decoded; + var decoded_ptr = &decoded; + var i: u32 = 0; + var after_last_non_whitespace: ?u32 = null; + + // Trim whitespace off the end of the first line + var first_non_whitespace: ?u32 = 0; + + while (i < text.len) { + const width: u3 = strings.utf8ByteSequenceLength(text[i]); + + const c: CodePoint = switch (width) { + 0 => -1, + 1 => @intCast(CodePoint, text[i]), + 2 => @intCast(CodePoint, std.unicode.utf8Decode2(text[i..][0..2]) catch unreachable), + 3 => @intCast(CodePoint, std.unicode.utf8Decode3(text[i..][0..3]) catch unreachable), + 4 => @intCast(CodePoint, std.unicode.utf8Decode4(text[i..][0..4]) catch unreachable), + else => unreachable, + }; + + switch (c) { + '\r', '\n', 0x2028, 0x2029 => { + if (first_non_whitespace != null and after_last_non_whitespace != null) { + // Newline + if (decoded.items.len > 0) { + try decoded.append(' '); + } - switch (c) { - '\r', '\n', 0x2028, 0x2029 => { - if (first_non_whitespace != null and after_last_non_whitespace != null) { - // Newline - if (decoded.items.len > 0) { - try decoded.append(' '); + // Trim whitespace off the start and end of lines in the middle + try lexer.decodeJSXEntities(text[first_non_whitespace.?..after_last_non_whitespace.?], &decoded); } - // Trim whitespace off the start and end of lines in the middle - try lexer.decodeJSXEntities(text[first_non_whitespace.?..after_last_non_whitespace.?], &decoded); - } - - // Reset for the next line - first_non_whitespace = null; - }, - '\t', ' ' => {}, - else => { - // Check for unusual whitespace characters - if (!isWhitespace(@intCast(CodePoint, c))) { - after_last_non_whitespace = i + width; - if (first_non_whitespace == null) { - first_non_whitespace = i; + // Reset for the next line + first_non_whitespace = null; + }, + '\t', ' ' => {}, + else => { + // Check for unusual whitespace characters + if (!isWhitespace(@intCast(CodePoint, c))) { + after_last_non_whitespace = i + width; + if (first_non_whitespace == null) { + first_non_whitespace = i; + } } - } - }, + }, + } + i += width; } - i += width; - } - if (first_non_whitespace) |start| { - if (decoded.items.len > 0) { - try decoded.append(' '); + if (first_non_whitespace) |start| { + if (decoded.items.len > 0) { + try decoded.append(' '); + } + + try decodeJSXEntities(lexer, text[start..text.len], decoded_ptr); } - try decodeJSXEntities(lexer, text[start..text.len], decoded_ptr); + return decoded.items; } - return decoded.items; - } - - pub fn decodeJSXEntities(lexer: *LexerType, text: string, out: *std.ArrayList(u16)) !void { - var i: usize = 0; - var buf = [4]u8{ 0, 0, 0, 0 }; - - while (i < text.len) { - const width: u3 = strings.utf8ByteSequenceLength(text[i]); - - var c: CodePoint = switch (width) { - 0 => -1, - 1 => @intCast(CodePoint, text[i]), - 2 => @intCast(CodePoint, std.unicode.utf8Decode2(text[i..][0..2]) catch unreachable), - 3 => @intCast(CodePoint, std.unicode.utf8Decode3(text[i..][0..3]) catch unreachable), - 4 => @intCast(CodePoint, std.unicode.utf8Decode4(text[i..][0..4]) catch unreachable), - else => unreachable, - }; - i += width; - - if (c == '&') { - if (strings.indexOfChar(text[i..text.len], ';')) |length| { - const entity = text[i .. i + length]; - if (entity[0] == '#') { - var number = entity[1..entity.len]; - var base: u8 = 10; - if (number.len > 1 and number[0] == 'x') { - number = number[1..number.len]; - base = 16; + pub fn decodeJSXEntities(lexer: *LexerType, text: string, out: *std.ArrayList(u16)) !void { + var i: usize = 0; + var buf = [4]u8{ 0, 0, 0, 0 }; + + while (i < text.len) { + const width: u3 = strings.utf8ByteSequenceLength(text[i]); + + var c: CodePoint = switch (width) { + 0 => -1, + 1 => @intCast(CodePoint, text[i]), + 2 => @intCast(CodePoint, std.unicode.utf8Decode2(text[i..][0..2]) catch unreachable), + 3 => @intCast(CodePoint, std.unicode.utf8Decode3(text[i..][0..3]) catch unreachable), + 4 => @intCast(CodePoint, std.unicode.utf8Decode4(text[i..][0..4]) catch unreachable), + else => unreachable, + }; + i += width; + + if (c == '&') { + if (strings.indexOfChar(text[i..text.len], ';')) |length| { + const entity = text[i .. i + length]; + if (entity[0] == '#') { + var number = entity[1..entity.len]; + var base: u8 = 10; + if (number.len > 1 and number[0] == 'x') { + number = number[1..number.len]; + base = 16; + } + c = try std.fmt.parseInt(i32, number, base); + i += length + 1; + } else if (tables.jsxEntity.get(entity)) |ent| { + c = ent; + i += length + 1; } - c = try std.fmt.parseInt(i32, number, base); - i += length + 1; - } else if (tables.jsxEntity.get(entity)) |ent| { - c = ent; - i += length + 1; } } - } - if (c <= 0xFFFF) { - try out.append(@intCast(u16, c)); - } else { - c -= 0x1000; - try out.ensureUnusedCapacity(2); - out.appendAssumeCapacity(@intCast(u16, 0xD800 + ((c >> 10) & 0x3FF))); - out.appendAssumeCapacity(@intCast(u16, 0xDC00 + (c & 0x3FF))); + if (c <= 0xFFFF) { + try out.append(@intCast(u16, c)); + } else { + c -= 0x1000; + try out.ensureUnusedCapacity(2); + out.appendAssumeCapacity(@intCast(u16, 0xD800 + ((c >> 10) & 0x3FF))); + out.appendAssumeCapacity(@intCast(u16, 0xDC00 + (c & 0x3FF))); + } } } - } - pub fn expectInsideJSXElement(lexer: *LexerType, token: T) !void { - if (lexer.token != token) { - try lexer.expected(token); - } - - try lexer.nextInsideJSXElement(); - } + pub fn expectInsideJSXElement(lexer: *LexerType, token: T) !void { + if (lexer.token != token) { + try lexer.expected(token); + } - fn scanRegExpValidateAndStep(lexer: *LexerType) !void { - if (lexer.code_point == '\\') { - try lexer.step(); + try lexer.nextInsideJSXElement(); } - switch (lexer.code_point) { - '\r', '\n', 0x2028, 0x2029 => { - // Newlines aren't allowed in regular expressions - try lexer.syntaxError(); - }, - -1 => { // EOF - try lexer.syntaxError(); - }, - else => { + fn scanRegExpValidateAndStep(lexer: *LexerType) !void { + if (lexer.code_point == '\\') { try lexer.step(); - }, - } - } + } - pub fn rescanCloseBraceAsTemplateToken(lexer: *LexerType) !void { - if (lexer.token != .t_close_brace) { - try lexer.expected(.t_close_brace); + switch (lexer.code_point) { + '\r', '\n', 0x2028, 0x2029 => { + // Newlines aren't allowed in regular expressions + try lexer.syntaxError(); + }, + -1 => { // EOF + try lexer.syntaxError(); + }, + else => { + try lexer.step(); + }, + } } - lexer.rescan_close_brace_as_template_token = true; - lexer.code_point = '`'; - lexer.current = lexer.end; - lexer.end -= 1; - try lexer.next(); - lexer.rescan_close_brace_as_template_token = false; - } + pub fn rescanCloseBraceAsTemplateToken(lexer: *LexerType) !void { + if (lexer.token != .t_close_brace) { + try lexer.expected(.t_close_brace); + } - pub fn rawTemplateContents(lexer: *LexerType) string { - var text: string = undefined; - - switch (lexer.token) { - .t_no_substitution_template_literal, .t_template_tail => { - text = lexer.source.contents[lexer.start + 1 .. lexer.end - 1]; - }, - .t_template_middle, .t_template_head => { - text = lexer.source.contents[lexer.start + 1 .. lexer.end - 2]; - }, - else => {}, + lexer.rescan_close_brace_as_template_token = true; + lexer.code_point = '`'; + lexer.current = lexer.end; + lexer.end -= 1; + try lexer.next(); + lexer.rescan_close_brace_as_template_token = false; } - if (strings.indexOfChar(text, '\r') == null) { - return text; - } + pub fn rawTemplateContents(lexer: *LexerType) string { + var text: string = undefined; - // From the specification: - // - // 11.8.6.1 Static Semantics: TV and TRV - // - // TV excludes the code units of LineContinuation while TRV includes - // them. <CR><LF> and <CR> LineTerminatorSequences are normalized to - // <LF> for both TV and TRV. An explicit EscapeSequence is needed to - // include a <CR> or <CR><LF> sequence. - var bytes = MutableString.initCopy(lexer.allocator, text) catch unreachable; - var end: usize = 0; - var i: usize = 0; - var c: u8 = '0'; - while (i < bytes.list.items.len) { - c = bytes.list.items[i]; - i += 1; - - if (c == '\r') { - // Convert '\r\n' into '\n' - if (i < bytes.list.items.len and bytes.list.items[i] == '\n') { - i += 1; - } + switch (lexer.token) { + .t_no_substitution_template_literal, .t_template_tail => { + text = lexer.source.contents[lexer.start + 1 .. lexer.end - 1]; + }, + .t_template_middle, .t_template_head => { + text = lexer.source.contents[lexer.start + 1 .. lexer.end - 2]; + }, + else => {}, + } - // Convert '\r' into '\n' - c = '\n'; + if (strings.indexOfChar(text, '\r') == null) { + return text; } - bytes.list.items[end] = c; - end += 1; - } + // From the specification: + // + // 11.8.6.1 Static Semantics: TV and TRV + // + // TV excludes the code units of LineContinuation while TRV includes + // them. <CR><LF> and <CR> LineTerminatorSequences are normalized to + // <LF> for both TV and TRV. An explicit EscapeSequence is needed to + // include a <CR> or <CR><LF> sequence. + var bytes = MutableString.initCopy(lexer.allocator, text) catch unreachable; + var end: usize = 0; + var i: usize = 0; + var c: u8 = '0'; + while (i < bytes.list.items.len) { + c = bytes.list.items[i]; + i += 1; - return bytes.toOwnedSliceLength(end + 1); - } + if (c == '\r') { + // Convert '\r\n' into '\n' + if (i < bytes.list.items.len and bytes.list.items[i] == '\n') { + i += 1; + } - fn parseNumericLiteralOrDot(lexer: *LexerType) !void { - // Number or dot; - var first = lexer.code_point; - try lexer.step(); - - // Dot without a digit after it; - if (first == '.' and (lexer.code_point < '0' or lexer.code_point > '9')) { - // "..." - if ((lexer.code_point == '.' and - lexer.current < lexer.source.contents.len) and - lexer.source.contents[lexer.current] == '.') - { - try lexer.step(); - try lexer.step(); - lexer.token = T.t_dot_dot_dot; - return; + // Convert '\r' into '\n' + c = '\n'; + } + + bytes.list.items[end] = c; + end += 1; } - // "." - lexer.token = T.t_dot; - return; + return bytes.toOwnedSliceLength(end + 1); } - var underscoreCount: usize = 0; - var lastUnderscoreEnd: usize = 0; - var hasDotOrExponent = first == '.'; - var base: f32 = 0.0; - lexer.is_legacy_octal_literal = false; - - // Assume this is a number, but potentially change to a bigint later; - lexer.token = T.t_numeric_literal; - - // Check for binary, octal, or hexadecimal literal; - if (first == '0') { - switch (lexer.code_point) { - 'b', 'B' => { - base = 2; - }, - - 'o', 'O' => { - base = 8; - }, + fn parseNumericLiteralOrDot(lexer: *LexerType) !void { + // Number or dot; + var first = lexer.code_point; + try lexer.step(); - 'x', 'X' => { - base = 16; - }, + // Dot without a digit after it; + if (first == '.' and (lexer.code_point < '0' or lexer.code_point > '9')) { + // "..." + if ((lexer.code_point == '.' and + lexer.current < lexer.source.contents.len) and + lexer.source.contents[lexer.current] == '.') + { + try lexer.step(); + try lexer.step(); + lexer.token = T.t_dot_dot_dot; + return; + } - '0'...'7', '_' => { - base = 8; - lexer.is_legacy_octal_literal = true; - }, - else => {}, + // "." + lexer.token = T.t_dot; + return; } - } - if (base != 0) { - // Integer literal; - var isFirst = true; - var isInvalidLegacyOctalLiteral = false; - lexer.number = 0; - if (!lexer.is_legacy_octal_literal) { - try lexer.step(); - } + var underscoreCount: usize = 0; + var lastUnderscoreEnd: usize = 0; + var hasDotOrExponent = first == '.'; + var base: f32 = 0.0; + lexer.is_legacy_octal_literal = false; - integerLiteral: while (true) { - switch (lexer.code_point) { - '_' => { - // Cannot have multiple underscores in a row; - if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { - try lexer.syntaxError(); - } - - // The first digit must exist; - if (isFirst or lexer.is_legacy_octal_literal) { - try lexer.syntaxError(); - } + // Assume this is a number, but potentially change to a bigint later; + lexer.token = T.t_numeric_literal; - lastUnderscoreEnd = lexer.end; - underscoreCount += 1; + // Check for binary, octal, or hexadecimal literal; + if (first == '0') { + switch (lexer.code_point) { + 'b', 'B' => { + base = 2; }, - '0', '1' => { - lexer.number = lexer.number * base + float64(lexer.code_point - '0'); + 'o', 'O' => { + base = 8; }, - '2', '3', '4', '5', '6', '7' => { - if (base == 2) { - try lexer.syntaxError(); - } - lexer.number = lexer.number * base + float64(lexer.code_point - '0'); - }, - '8', '9' => { - if (lexer.is_legacy_octal_literal) { - isInvalidLegacyOctalLiteral = true; - } else if (base < 10) { - try lexer.syntaxError(); - } - lexer.number = lexer.number * base + float64(lexer.code_point - '0'); - }, - 'A', 'B', 'C', 'D', 'E', 'F' => { - if (base != 16) { - try lexer.syntaxError(); - } - lexer.number = lexer.number * base + float64(lexer.code_point + 10 - 'A'); + 'x', 'X' => { + base = 16; }, - 'a', 'b', 'c', 'd', 'e', 'f' => { - if (base != 16) { - try lexer.syntaxError(); - } - lexer.number = lexer.number * base + float64(lexer.code_point + 10 - 'a'); + '0'...'7', '_' => { + base = 8; + lexer.is_legacy_octal_literal = true; }, - else => { - // The first digit must exist; - if (isFirst) { - try lexer.syntaxError(); - } + else => {}, + } + } - break :integerLiteral; - }, + if (base != 0) { + // Integer literal; + var isFirst = true; + var isInvalidLegacyOctalLiteral = false; + lexer.number = 0; + if (!lexer.is_legacy_octal_literal) { + try lexer.step(); } - try lexer.step(); - isFirst = false; - } + integerLiteral: while (true) { + switch (lexer.code_point) { + '_' => { + // Cannot have multiple underscores in a row; + if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { + try lexer.syntaxError(); + } - var isBigIntegerLiteral = lexer.code_point == 'n' and !hasDotOrExponent; + // The first digit must exist; + if (isFirst or lexer.is_legacy_octal_literal) { + try lexer.syntaxError(); + } - // Slow path: do we need to re-scan the input as text? - if (isBigIntegerLiteral or isInvalidLegacyOctalLiteral) { - var text = lexer.raw(); + lastUnderscoreEnd = lexer.end; + underscoreCount += 1; + }, - // Can't use a leading zero for bigint literals; - if (isBigIntegerLiteral and lexer.is_legacy_octal_literal) { - try lexer.syntaxError(); - } + '0', '1' => { + lexer.number = lexer.number * base + float64(lexer.code_point - '0'); + }, - // Filter out underscores; - if (underscoreCount > 0) { - var bytes = lexer.allocator.alloc(u8, text.len - underscoreCount) catch unreachable; - var i: usize = 0; - for (text) |char| { - if (char != '_') { - bytes[i] = char; - i += 1; - } - } - } + '2', '3', '4', '5', '6', '7' => { + if (base == 2) { + try lexer.syntaxError(); + } + lexer.number = lexer.number * base + float64(lexer.code_point - '0'); + }, + '8', '9' => { + if (lexer.is_legacy_octal_literal) { + isInvalidLegacyOctalLiteral = true; + } else if (base < 10) { + try lexer.syntaxError(); + } + lexer.number = lexer.number * base + float64(lexer.code_point - '0'); + }, + 'A', 'B', 'C', 'D', 'E', 'F' => { + if (base != 16) { + try lexer.syntaxError(); + } + lexer.number = lexer.number * base + float64(lexer.code_point + 10 - 'A'); + }, - // Store bigints as text to avoid precision loss; - if (isBigIntegerLiteral) { - lexer.identifier = text; - } else if (isInvalidLegacyOctalLiteral) { - if (std.fmt.parseFloat(f64, text)) |num| { - lexer.number = num; - } else |err| { - try lexer.addSyntaxError(lexer.start, "Invalid number {s}", .{text}); + 'a', 'b', 'c', 'd', 'e', 'f' => { + if (base != 16) { + try lexer.syntaxError(); + } + lexer.number = lexer.number * base + float64(lexer.code_point + 10 - 'a'); + }, + else => { + // The first digit must exist; + if (isFirst) { + try lexer.syntaxError(); + } + + break :integerLiteral; + }, } + + try lexer.step(); + isFirst = false; } - } - } else { - // Floating-point literal; - var isInvalidLegacyOctalLiteral = first == '0' and (lexer.code_point == '8' or lexer.code_point == '9'); - // Initial digits; - while (true) { - if (lexer.code_point < '0' or lexer.code_point > '9') { - if (lexer.code_point != '_') { - break; - } + var isBigIntegerLiteral = lexer.code_point == 'n' and !hasDotOrExponent; - // Cannot have multiple underscores in a row; - if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { - try lexer.syntaxError(); - } + // Slow path: do we need to re-scan the input as text? + if (isBigIntegerLiteral or isInvalidLegacyOctalLiteral) { + var text = lexer.raw(); - // The specification forbids underscores in this case; - if (isInvalidLegacyOctalLiteral) { + // Can't use a leading zero for bigint literals; + if (isBigIntegerLiteral and lexer.is_legacy_octal_literal) { try lexer.syntaxError(); } - lastUnderscoreEnd = lexer.end; - underscoreCount += 1; - } - try lexer.step(); - } + // Filter out underscores; + if (underscoreCount > 0) { + var bytes = lexer.allocator.alloc(u8, text.len - underscoreCount) catch unreachable; + var i: usize = 0; + for (text) |char| { + if (char != '_') { + bytes[i] = char; + i += 1; + } + } + } - // Fractional digits; - if (first != '.' and lexer.code_point == '.') { - // An underscore must not come last; - if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { - lexer.end -= 1; - try lexer.syntaxError(); + // Store bigints as text to avoid precision loss; + if (isBigIntegerLiteral) { + lexer.identifier = text; + } else if (isInvalidLegacyOctalLiteral) { + if (std.fmt.parseFloat(f64, text)) |num| { + lexer.number = num; + } else |err| { + try lexer.addSyntaxError(lexer.start, "Invalid number {s}", .{text}); + } + } } + } else { + // Floating-point literal; + var isInvalidLegacyOctalLiteral = first == '0' and (lexer.code_point == '8' or lexer.code_point == '9'); - hasDotOrExponent = true; - try lexer.step(); - if (lexer.code_point == '_') { - try lexer.syntaxError(); - } + // Initial digits; while (true) { if (lexer.code_point < '0' or lexer.code_point > '9') { if (lexer.code_point != '_') { @@ -2521,160 +2504,152 @@ pub const Lexer = struct { try lexer.syntaxError(); } + // The specification forbids underscores in this case; + if (isInvalidLegacyOctalLiteral) { + try lexer.syntaxError(); + } + lastUnderscoreEnd = lexer.end; underscoreCount += 1; } try lexer.step(); } - } - // Exponent; - if (lexer.code_point == 'e' or lexer.code_point == 'E') { - // An underscore must not come last; - if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { - lexer.end -= 1; - try lexer.syntaxError(); - } + // Fractional digits; + if (first != '.' and lexer.code_point == '.') { + // An underscore must not come last; + if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { + lexer.end -= 1; + try lexer.syntaxError(); + } - hasDotOrExponent = true; - try lexer.step(); - if (lexer.code_point == '+' or lexer.code_point == '-') { + hasDotOrExponent = true; try lexer.step(); - } - if (lexer.code_point < '0' or lexer.code_point > '9') { - try lexer.syntaxError(); - } - while (true) { - if (lexer.code_point < '0' or lexer.code_point > '9') { - if (lexer.code_point != '_') { - break; - } + if (lexer.code_point == '_') { + try lexer.syntaxError(); + } + while (true) { + if (lexer.code_point < '0' or lexer.code_point > '9') { + if (lexer.code_point != '_') { + break; + } - // Cannot have multiple underscores in a row; - if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { - try lexer.syntaxError(); + // Cannot have multiple underscores in a row; + if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { + try lexer.syntaxError(); + } + + lastUnderscoreEnd = lexer.end; + underscoreCount += 1; } + try lexer.step(); + } + } - lastUnderscoreEnd = lexer.end; - underscoreCount += 1; + // Exponent; + if (lexer.code_point == 'e' or lexer.code_point == 'E') { + // An underscore must not come last; + if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { + lexer.end -= 1; + try lexer.syntaxError(); } + + hasDotOrExponent = true; try lexer.step(); - } - } + if (lexer.code_point == '+' or lexer.code_point == '-') { + try lexer.step(); + } + if (lexer.code_point < '0' or lexer.code_point > '9') { + try lexer.syntaxError(); + } + while (true) { + if (lexer.code_point < '0' or lexer.code_point > '9') { + if (lexer.code_point != '_') { + break; + } + + // Cannot have multiple underscores in a row; + if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { + try lexer.syntaxError(); + } - // Take a slice of the text to parse; - var text = lexer.raw(); - - // Filter out underscores; - if (underscoreCount > 0) { - var i: usize = 0; - if (lexer.allocator.alloc(u8, text.len - underscoreCount)) |bytes| { - for (text) |char| { - if (char != '_') { - bytes[i] = char; - i += 1; + lastUnderscoreEnd = lexer.end; + underscoreCount += 1; } + try lexer.step(); } - text = bytes; - } else |err| { - try lexer.addSyntaxError(lexer.start, "Out of Memory Wah Wah Wah", .{}); - return; } - } - if (lexer.code_point == 'n' and !hasDotOrExponent) { - // The only bigint literal that can start with 0 is "0n" - if (text.len > 1 and first == '0') { - try lexer.syntaxError(); - } + // Take a slice of the text to parse; + var text = lexer.raw(); - // Store bigints as text to avoid precision loss; - lexer.identifier = text; - } else if (!hasDotOrExponent and lexer.end - lexer.start < 10) { - // Parse a 32-bit integer (very fast path); - var number: u32 = 0; - for (text) |c| { - number = number * 10 + @intCast(u32, c - '0'); + // Filter out underscores; + if (underscoreCount > 0) { + var i: usize = 0; + if (lexer.allocator.alloc(u8, text.len - underscoreCount)) |bytes| { + for (text) |char| { + if (char != '_') { + bytes[i] = char; + i += 1; + } + } + text = bytes; + } else |err| { + try lexer.addSyntaxError(lexer.start, "Out of Memory Wah Wah Wah", .{}); + return; + } } - lexer.number = @intToFloat(f64, number); - } else { - // Parse a double-precision floating-point number; - if (std.fmt.parseFloat(f64, text)) |num| { - lexer.number = num; - } else |err| { - try lexer.addSyntaxError(lexer.start, "Invalid number", .{}); + + if (lexer.code_point == 'n' and !hasDotOrExponent) { + // The only bigint literal that can start with 0 is "0n" + if (text.len > 1 and first == '0') { + try lexer.syntaxError(); + } + + // Store bigints as text to avoid precision loss; + lexer.identifier = text; + } else if (!hasDotOrExponent and lexer.end - lexer.start < 10) { + // Parse a 32-bit integer (very fast path); + var number: u32 = 0; + for (text) |c| { + number = number * 10 + @intCast(u32, c - '0'); + } + lexer.number = @intToFloat(f64, number); + } else { + // Parse a double-precision floating-point number; + if (std.fmt.parseFloat(f64, text)) |num| { + lexer.number = num; + } else |err| { + try lexer.addSyntaxError(lexer.start, "Invalid number", .{}); + } } } - } - // An underscore must not come last; - if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { - lexer.end -= 1; - try lexer.syntaxError(); - } + // An underscore must not come last; + if (lastUnderscoreEnd > 0 and lexer.end == lastUnderscoreEnd + 1) { + lexer.end -= 1; + try lexer.syntaxError(); + } - // Handle bigint literals after the underscore-at-end check above; - if (lexer.code_point == 'n' and !hasDotOrExponent) { - lexer.token = T.t_big_integer_literal; - try lexer.step(); - } + // Handle bigint literals after the underscore-at-end check above; + if (lexer.code_point == 'n' and !hasDotOrExponent) { + lexer.token = T.t_big_integer_literal; + try lexer.step(); + } - // Identifiers can't occur immediately after numbers; - if (isIdentifierStart(lexer.code_point)) { - try lexer.syntaxError(); + // Identifiers can't occur immediately after numbers; + if (isIdentifierStart(lexer.code_point)) { + try lexer.syntaxError(); + } } - } -}; - -pub inline fn isIdentifierStart(codepoint: CodePoint) bool { - @setRuntimeSafety(false); - switch (codepoint) { - 'a'...'z', 'A'...'Z', '_', '$' => return true, - else => {}, - } - - return if (codepoint < 127) - false - else - isIdentifierStartSlow(codepoint); -} - -fn isIdentifierStartSlow(codepoint: CodePoint) bool { - @setRuntimeSafety(false); - @setCold(true); - return switch (codepoint) { - std.math.max(tables.id_start.r16_min, tables.id_start.latin_offset)...tables.id_start.r16_max => tables.id_start.inRange16(@intCast(u16, codepoint)), - tables.id_start.r32_min...tables.id_start.r32_max => tables.id_start.inRange32(@intCast(u32, codepoint)), - else => false, }; } -const zero_width_non_joiner = 0x200C; -const zero_width_joiner = 0x200D; -pub inline fn isIdentifierContinue(codepoint: CodePoint) bool { - @setRuntimeSafety(false); +pub const Lexer = NewLexer(.{}); - switch (codepoint) { - zero_width_non_joiner, zero_width_joiner, 'a'...'z', 'A'...'Z', '_', '$', '0'...'9' => return true, - else => {}, - } - - return if (codepoint < 127) - false - else - isIdentifierContinueSlow(codepoint); -} - -// separate function because zig's @setCold is granular up to a function -fn isIdentifierContinueSlow(codepoint: CodePoint) bool { - @setCold(true); - @setRuntimeSafety(false); - return switch (codepoint) { - std.math.max(tables.id_continue.r16_min, tables.id_continue.latin_offset)...tables.id_continue.r16_max => tables.id_continue.inRange16(@intCast(u16, codepoint)), - tables.id_continue.r32_min...tables.id_continue.r32_max => tables.id_continue.inRange32(@intCast(u32, codepoint)), - else => false, - }; -} +const JSIdentifier = @import("./js_lexer/identifier.zig"); +pub const isIdentifierStart = JSIdentifier.Bitset.isIdentifierStart; +pub const isIdentifierContinue = JSIdentifier.Bitset.isIdentifierPart; pub fn isWhitespace(codepoint: CodePoint) bool { return switch (codepoint) { @@ -2710,16 +2685,16 @@ pub fn isIdentifier(text: string) bool { return false; } - var iter = strings.CodepointIterator.init(text); + var iter = strings.CodepointIterator{ .bytes = text, .i = 0 }; + var cursor = strings.CodepointIterator.Cursor{}; + if (!iter.next(&cursor)) return false; - if (!isIdentifierStart(iter.nextCodepoint())) { + if (!isIdentifierStart(cursor.c)) { return false; } - iter.nextCodepointNoReturn(); - - while (iter.c > -1) : (iter.nextCodepointNoReturn()) { - if (!isIdentifierContinue(iter.c)) { + while (iter.next(&cursor)) { + if (!isIdentifierContinue(cursor.c)) { return false; } } @@ -2727,56 +2702,6 @@ pub fn isIdentifier(text: string) bool { return true; } -test "isIdentifier" { - const expect = std.testing.expect; - try expect(!isIdentifierStart(0x2029)); - try expect(!isIdentifierStart(0x2028)); - try expect(!isIdentifier("\\u2028")); - try expect(!isIdentifier("\\u2029")); - - try expect(!isIdentifierContinue(':')); - try expect(!isIdentifier("javascript:")); - - try expect(isIdentifier("javascript")); - - try expect(!isIdentifier(":2")); - try expect(!isIdentifier("2:")); - try expect(isIdentifier("$")); - try expect(!isIdentifier("$:")); -} - -pub fn isIdentifierUTF16(text: JavascriptString) bool { - const n = text.len; - if (n == 0) { - return false; - } - - var i: usize = 0; - while (i < n) : (i += 1) { - @setRuntimeSafety(false); - - var r1 = @intCast(i32, text[i]); - if (r1 >= 0xD800 and r1 <= 0xDBFF and i + 1 < n) { - const r2 = @intCast(i32, text[i + 1]); - if (r2 >= 0xDC00 and r2 <= 0xDFFF) { - r1 = (r1 << 10) + r2 + (0x10000 - (0xD800 << 10) - 0xDC00); - i += 1; - } - } - if (i == 0) { - if (!isIdentifierStart(@intCast(u21, r1))) { - return false; - } - } else { - if (!isIdentifierContinue(@intCast(u21, r1))) { - return false; - } - } - } - - return true; -} - pub const CodepointIterator = struct { bytes: []const u8, i: usize, @@ -2789,9 +2714,10 @@ pub const CodepointIterator = struct { const cp_len = strings.utf8ByteSequenceLength(it.bytes[it.i]); it.i += cp_len; // without branching, - it.width = @as(u3, @boolToInt(it.i <= it.bytes.len and cp_len > 0)); - return if (!(it.i > it.bytes.len)) it.bytes[it.i - cp_len .. it.i] else ""; + const slice = if (!(it.i > it.bytes.len)) it.bytes[it.i - cp_len .. it.i] else ""; + it.width = @truncate(u3, slice.len); + return slice; } pub fn nextCodepoint(it: *CodepointIterator) ?CodePoint { @@ -2825,47 +2751,110 @@ pub const CodepointIterator = struct { } }; +test "isIdentifier" { + const expect = std.testing.expect; + try expect(!isIdentifierStart(0x2029)); + try expect(!isIdentifierStart(0)); + try expect(!isIdentifierStart(1)); + try expect(!isIdentifierStart(2)); + try expect(!isIdentifierStart(3)); + try expect(!isIdentifierStart(4)); + try expect(!isIdentifierStart(5)); + try expect(!isIdentifierStart(6)); + try expect(!isIdentifierStart(7)); + try expect(!isIdentifierStart(8)); + try expect(!isIdentifierStart(9)); + try expect(!isIdentifierStart(0x2028)); + try expect(!isIdentifier("\\u2028")); + try expect(!isIdentifier("\\u2029")); + + try expect(!isIdentifierContinue(':')); + try expect(!isIdentifier("javascript:")); + + try expect(isIdentifier("javascript")); + + try expect(!isIdentifier(":2")); + try expect(!isIdentifier("2:")); + try expect(isIdentifier("$")); + try expect(!isIdentifier("$:")); +} + +pub fn isIdentifierUTF16(text: []const u16) bool { + const n = text.len; + if (n == 0) { + return false; + } + + var i: usize = 0; + while (i < n) : (i += 1) { + const is_start = i == 0; + + var codepoint = @as(CodePoint, text[i]); + if (codepoint >= 0xD800 and codepoint <= 0xDBFF and i + 1 < n) { + const surrogate = @as(CodePoint, text[i + 1]); + if (surrogate >= 0xDC00 and surrogate <= 0xDFFF) { + codepoint = (codepoint << 10) + surrogate + (0x10000 - (0xD800 << 10) - 0xDC00); + i += 1; + } + } + if (is_start) { + if (!isIdentifierStart(@as(CodePoint, codepoint))) { + return false; + } + } else { + if (!isIdentifierContinue(@as(CodePoint, codepoint))) { + return false; + } + } + } + + return true; +} + // TODO: implement this to actually work right // this fn is a stub! pub fn rangeOfIdentifier(source: *const Source, loc: logger.Loc) logger.Range { - if (loc.start == -1) return logger.Range.None; - const text = source.contents[loc.toUsize()..]; + const contents = source.contents; + if (loc.start == -1 or @intCast(usize, loc.start) >= contents.len) return logger.Range.None; + + const iter = strings.CodepointIterator.init(contents[loc.toUsize()..]); + var cursor = strings.CodepointIterator.Cursor{}; + var r = logger.Range{ .loc = loc, .len = 0 }; - if (text.len == 0) { + if (iter.bytes.len == 0) { return r; } + const text = iter.bytes; + const end = @intCast(u32, text.len); - var iter = CodepointIterator{ .bytes = text, .i = 0 }; - var c = @intCast(CodePoint, iter.nextCodepoint() orelse unreachable); - + if (!iter.next(&cursor)) return r; // Handle private names - if (c == '#') { - c = @intCast(CodePoint, iter.nextCodepoint() orelse { + if (cursor.c == '#') { + if (!iter.next(&cursor)) { r.len = 1; return r; - }); + } } - if (isIdentifierStart(c) or c == '\\') { - defer r.len = @intCast(i32, iter.i); - while (iter.nextCodepoint()) |code_point| { - if (code_point == '\\') { - @setRuntimeSafety(false); + if (isIdentifierStart(cursor.c) or cursor.c == '\\') { + defer r.len = @intCast(i32, cursor.i); + while (iter.next(&cursor)) { + if (cursor.c == '\\') { // Search for the end of the identifier // Skip over bracketed unicode escapes such as "\u{10000}" - if (iter.i + 2 < text.len and text[iter.i + 1] == 'u' and text[iter.i + 2] == '{') { - iter.i += 2; - while (iter.i < text.len) { - if (text[iter.i] == '}') { - iter.i += 1; + if (cursor.i + 2 < end and text[cursor.i + 1] == 'u' and text[cursor.i + 2] == '{') { + cursor.i += 2; + while (cursor.i < end) { + if (text[cursor.i] == '}') { + cursor.i += 1; break; } - iter.i += 1; + cursor.i += 1; } } - } else if (!isIdentifierContinue(code_point)) { + } else if (!isIdentifierContinue(cursor.c)) { return r; } } diff --git a/src/js_lexer/identifier.zig b/src/js_lexer/identifier.zig new file mode 100644 index 000000000..3c27d0346 --- /dev/null +++ b/src/js_lexer/identifier.zig @@ -0,0 +1,2142 @@ +// This file benchmarks different approaches for determinig whether or not a unicode codepoint is possibly a JS identifier +// these values are copy-pasted from "typescript/lib/typescriptServices.js" +// "unicodeESNextIdentifierStart" +const start_codepoints = [_]i32{ 65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2208, 2228, 2230, 2237, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12443, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69376, 69404, 69415, 69415, 69424, 69445, 69600, 69622, 69635, 69687, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70751, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71680, 71723, 71840, 71903, 71935, 71935, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 123136, 123180, 123191, 123197, 123214, 123214, 123584, 123627, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101 }; +// "unicodeESNextIdentifierPart" +const part_codepoints = [_]i32{ 48, 57, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 183, 183, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2208, 2228, 2230, 2237, 2259, 2273, 2275, 2403, 2406, 2415, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2556, 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2809, 2815, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3168, 3171, 3174, 3183, 3200, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3328, 3331, 3333, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402, 3406, 3412, 3415, 3423, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4969, 4977, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6618, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6832, 6845, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7673, 7675, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42737, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43047, 43072, 43123, 43136, 43205, 43216, 43225, 43232, 43255, 43259, 43259, 43261, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43488, 43518, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66378, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66720, 66729, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108, 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68903, 68912, 68921, 69376, 69404, 69415, 69415, 69424, 69456, 69600, 69622, 69632, 69702, 69734, 69743, 69759, 69818, 69840, 69864, 69872, 69881, 69888, 69940, 69942, 69951, 69956, 69958, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70096, 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70206, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70384, 70393, 70400, 70403, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480, 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70656, 70730, 70736, 70745, 70750, 70751, 70784, 70853, 70855, 70855, 70864, 70873, 71040, 71093, 71096, 71104, 71128, 71133, 71168, 71232, 71236, 71236, 71248, 71257, 71296, 71352, 71360, 71369, 71424, 71450, 71453, 71467, 71472, 71481, 71680, 71738, 71840, 71913, 71935, 71935, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263, 72263, 72272, 72345, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72758, 72760, 72768, 72784, 72793, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971, 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73040, 73049, 73056, 73061, 73063, 73064, 73066, 73102, 73104, 73105, 73107, 73112, 73120, 73129, 73440, 73462, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92768, 92777, 92880, 92909, 92912, 92916, 92928, 92982, 92992, 92995, 93008, 93017, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123136, 123180, 123184, 123197, 123200, 123209, 123214, 123214, 123584, 123641, 124928, 125124, 125136, 125142, 125184, 125259, 125264, 125273, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 917760, 917999 }; + +const start_codepoints_including_ascii = [_]i32{ + 'a', + 'z', + 'A', + 'Z', + '_', + '_', + '$', + '$', +} ++ start_codepoints; +const part_codepoints_including_ascii = [_]i32{ + 'a', + 'z', + 'A', + 'Z', + '0', + '9', + '_', + '_', + '$', + '$', +} ++ part_codepoints; + +pub const Bitset = struct { + const id_start_range: [2]i32 = brk: { + var minmax = [2]i32{ std.math.maxInt(i32), 0 }; + + for (start_codepoints_including_ascii) |c| { + @setEvalBranchQuota(9999); + minmax[0] = if (c < minmax[0]) c else minmax[0]; + minmax[1] = if (c > minmax[1]) c else minmax[1]; + } + + break :brk minmax; + }; + const id_start_count = id_start_range[1] - id_start_range[0] + 1; + const id_start_offset = id_start_range[0]; + + const id_end_range: [2]i32 = brk: { + var minmax = [2]i32{ std.math.maxInt(i32), 0 }; + + for (part_codepoints_including_ascii) |c| { + @setEvalBranchQuota(9999); + minmax[0] = if (c < minmax[0]) c else minmax[0]; + minmax[1] = if (c > minmax[1]) c else minmax[1]; + } + + break :brk minmax; + }; + + const id_end_count = id_end_range[1] - id_end_range[0] + 1; + const id_end_offset = id_end_range[0]; + + const IDStartType = std.bit_set.StaticBitSet(id_start_count + 1); + const IDContinueType = std.bit_set.StaticBitSet(id_end_count + 1); + + const id_start: IDStartType = brk: { + var bits: IDStartType = IDStartType.initEmpty(); + var i: usize = 0; + + @setEvalBranchQuota(999999); + while (i < start_codepoints_including_ascii.len) : (i += 2) { + var min = start_codepoints_including_ascii[i]; + var max = start_codepoints_including_ascii[i + 1]; + while (min <= max) : (min += 1) { + @setEvalBranchQuota(999999); + bits.set(id_start_range[1] - min); + } + } + break :brk bits; + }; + + const id_continue: IDContinueType = brk: { + var bits: IDContinueType = IDContinueType.initEmpty(); + var i: usize = 0; + + while (i < part_codepoints_including_ascii.len) : (i += 2) { + var min = part_codepoints_including_ascii[i]; + var max = part_codepoints_including_ascii[i + 1]; + @setEvalBranchQuota(999999); + while (min <= max) : (min += 1) { + @setEvalBranchQuota(999999); + bits.set(id_end_range[1] - min); + } + } + break :brk bits; + }; + + pub fn init() void {} + + pub inline fn isIdentifierStart(codepoint: i32) bool { + return codepoint >= (comptime id_start_range[0]) and + codepoint <= (comptime id_start_range[1]) and + id_start.isSet((comptime @intCast(usize, id_start_range[1])) - @intCast( + usize, + codepoint, + )); + } + + pub fn isIdentifier(str: []const u8) bool { + if (str.len == 0) + return false; + var iter = std.unicode.Utf8Iterator{ .bytes = str, .i = 0 }; + if (!isIdentifierStart(iter.nextCodepoint() orelse return false)) return false; + + while (iter.nextCodepoint()) |i| { + if (!isIdentifierPart(i)) return false; + } + + return true; + } + + pub inline fn isIdentifierPart(codepoint: i32) bool { + return codepoint >= (comptime id_end_range[0]) and + codepoint <= (comptime id_end_range[1]) and + id_continue.isSet( + (comptime @intCast(usize, id_end_range[1])) - @intCast( + usize, + codepoint, + ), + ); + } +}; + +pub const JumpTable = struct { + const minInt = @import("std").math.minInt; + const maxInt = @import("std").math.maxInt; + const max_codepoint = 0x10FFFF; + noinline fn isIdentifierPartSlow(codepoint: i32) bool { + @setCold(true); + return switch (codepoint) { + // explicitly tell LLVM's optimizer about values we know will not be in the range of this switch statement + 0xaa...0xffd7 => isIdentifierPartSlow16(@intCast(u16, codepoint)), + (0xffd7 + 1)...0xe01ef => isIdentifierPartSlow32(codepoint), + else => false, + }; + } + + fn isIdentifierPartSlow16(codepoint: u16) bool { + return switch (codepoint) { + minInt(u16)...(0xaa - 1) => unreachable, + 0xaa...0xaa, 0xb5...0xb5, 0xb7...0xb7, 0xba...0xba, 0xc0...0xd6, 0xd8...0xf6, 0xf8...0x2c1, 0x2c6...0x2d1, 0x2e0...0x2e4, 0x2ec...0x2ec, 0x2ee...0x2ee, 0x300...0x374, 0x376...0x377, 0x37a...0x37d, 0x37f...0x37f, 0x386...0x38a, 0x38c...0x38c, 0x38e...0x3a1, 0x3a3...0x3f5, 0x3f7...0x481, 0x483...0x487, 0x48a...0x52f, 0x531...0x556, 0x559...0x559, 0x560...0x588, 0x591...0x5bd, 0x5bf...0x5bf, 0x5c1...0x5c2, 0x5c4...0x5c5, 0x5c7...0x5c7, 0x5d0...0x5ea, 0x5ef...0x5f2, 0x610...0x61a, 0x620...0x669, 0x66e...0x6d3, 0x6d5...0x6dc, 0x6df...0x6e8, 0x6ea...0x6fc, 0x6ff...0x6ff, 0x710...0x74a, 0x74d...0x7b1, 0x7c0...0x7f5, 0x7fa...0x7fa, 0x7fd...0x7fd, 0x800...0x82d, 0x840...0x85b, 0x860...0x86a, 0x8a0...0x8b4, 0x8b6...0x8c7, 0x8d3...0x8e1, 0x8e3...0x963, 0x966...0x96f, 0x971...0x983, 0x985...0x98c, 0x98f...0x990, 0x993...0x9a8, 0x9aa...0x9b0, 0x9b2...0x9b2, 0x9b6...0x9b9, 0x9bc...0x9c4, 0x9c7...0x9c8, 0x9cb...0x9ce, 0x9d7...0x9d7, 0x9dc...0x9dd, 0x9df...0x9e3, 0x9e6...0x9f1, 0x9fc...0x9fc, 0x9fe...0x9fe, 0xa01...0xa03, 0xa05...0xa0a, 0xa0f...0xa10, 0xa13...0xa28, 0xa2a...0xa30, 0xa32...0xa33, 0xa35...0xa36, 0xa38...0xa39, 0xa3c...0xa3c, 0xa3e...0xa42, 0xa47...0xa48, 0xa4b...0xa4d, 0xa51...0xa51, 0xa59...0xa5c, 0xa5e...0xa5e, 0xa66...0xa75, 0xa81...0xa83, 0xa85...0xa8d, 0xa8f...0xa91, 0xa93...0xaa8, 0xaaa...0xab0, 0xab2...0xab3, 0xab5...0xab9, 0xabc...0xac5, 0xac7...0xac9, 0xacb...0xacd, 0xad0...0xad0, 0xae0...0xae3, 0xae6...0xaef, 0xaf9...0xaff, 0xb01...0xb03, 0xb05...0xb0c, 0xb0f...0xb10, 0xb13...0xb28, 0xb2a...0xb30, 0xb32...0xb33, 0xb35...0xb39, 0xb3c...0xb44, 0xb47...0xb48, 0xb4b...0xb4d, 0xb55...0xb57, 0xb5c...0xb5d, 0xb5f...0xb63, 0xb66...0xb6f, 0xb71...0xb71, 0xb82...0xb83, 0xb85...0xb8a, 0xb8e...0xb90, 0xb92...0xb95, 0xb99...0xb9a, 0xb9c...0xb9c, 0xb9e...0xb9f, 0xba3...0xba4, 0xba8...0xbaa, 0xbae...0xbb9, 0xbbe...0xbc2, 0xbc6...0xbc8, 0xbca...0xbcd, 0xbd0...0xbd0, 0xbd7...0xbd7, 0xbe6...0xbef, 0xc00...0xc0c, 0xc0e...0xc10, 0xc12...0xc28, 0xc2a...0xc39, 0xc3d...0xc44, 0xc46...0xc48, 0xc4a...0xc4d, 0xc55...0xc56, 0xc58...0xc5a, 0xc60...0xc63, 0xc66...0xc6f, 0xc80...0xc83, 0xc85...0xc8c, 0xc8e...0xc90, 0xc92...0xca8, 0xcaa...0xcb3, 0xcb5...0xcb9, 0xcbc...0xcc4, 0xcc6...0xcc8, 0xcca...0xccd, 0xcd5...0xcd6, 0xcde...0xcde, 0xce0...0xce3, 0xce6...0xcef, 0xcf1...0xcf2, 0xd00...0xd0c, 0xd0e...0xd10, 0xd12...0xd44, 0xd46...0xd48, 0xd4a...0xd4e, 0xd54...0xd57, 0xd5f...0xd63, 0xd66...0xd6f, 0xd7a...0xd7f, 0xd81...0xd83, 0xd85...0xd96, 0xd9a...0xdb1, 0xdb3...0xdbb, 0xdbd...0xdbd, 0xdc0...0xdc6, 0xdca...0xdca, 0xdcf...0xdd4, 0xdd6...0xdd6, 0xdd8...0xddf, 0xde6...0xdef, 0xdf2...0xdf3, 0xe01...0xe3a, 0xe40...0xe4e, 0xe50...0xe59, 0xe81...0xe82, 0xe84...0xe84, 0xe86...0xe8a, 0xe8c...0xea3, 0xea5...0xea5, 0xea7...0xebd, 0xec0...0xec4, 0xec6...0xec6, 0xec8...0xecd, 0xed0...0xed9, 0xedc...0xedf, 0xf00...0xf00, 0xf18...0xf19, 0xf20...0xf29, 0xf35...0xf35, 0xf37...0xf37, 0xf39...0xf39, 0xf3e...0xf47, 0xf49...0xf6c, 0xf71...0xf84, 0xf86...0xf97, 0xf99...0xfbc, 0xfc6...0xfc6, 0x1000...0x1049, 0x1050...0x109d, 0x10a0...0x10c5, 0x10c7...0x10c7, 0x10cd...0x10cd, 0x10d0...0x10fa, 0x10fc...0x1248, 0x124a...0x124d, 0x1250...0x1256, 0x1258...0x1258, 0x125a...0x125d, 0x1260...0x1288, 0x128a...0x128d, 0x1290...0x12b0, 0x12b2...0x12b5, 0x12b8...0x12be, 0x12c0...0x12c0, 0x12c2...0x12c5, 0x12c8...0x12d6, 0x12d8...0x1310, 0x1312...0x1315, 0x1318...0x135a, 0x135d...0x135f, 0x1369...0x1371, 0x1380...0x138f, 0x13a0...0x13f5, 0x13f8...0x13fd, 0x1401...0x166c, 0x166f...0x167f, 0x1681...0x169a, 0x16a0...0x16ea, 0x16ee...0x16f8, 0x1700...0x170c, 0x170e...0x1714, 0x1720...0x1734, 0x1740...0x1753, 0x1760...0x176c, 0x176e...0x1770, 0x1772...0x1773, 0x1780...0x17d3, 0x17d7...0x17d7, 0x17dc...0x17dd, 0x17e0...0x17e9, 0x180b...0x180d, 0x1810...0x1819, 0x1820...0x1878, 0x1880...0x18aa, 0x18b0...0x18f5, 0x1900...0x191e, 0x1920...0x192b, 0x1930...0x193b, 0x1946...0x196d, 0x1970...0x1974, 0x1980...0x19ab, 0x19b0...0x19c9, 0x19d0...0x19da, 0x1a00...0x1a1b, 0x1a20...0x1a5e, 0x1a60...0x1a7c, 0x1a7f...0x1a89, 0x1a90...0x1a99, 0x1aa7...0x1aa7, 0x1ab0...0x1abd, 0x1abf...0x1ac0, 0x1b00...0x1b4b, 0x1b50...0x1b59, 0x1b6b...0x1b73, 0x1b80...0x1bf3, 0x1c00...0x1c37, 0x1c40...0x1c49, 0x1c4d...0x1c7d, 0x1c80...0x1c88, 0x1c90...0x1cba, 0x1cbd...0x1cbf, 0x1cd0...0x1cd2, 0x1cd4...0x1cfa, 0x1d00...0x1df9, 0x1dfb...0x1f15, 0x1f18...0x1f1d, 0x1f20...0x1f45, 0x1f48...0x1f4d, 0x1f50...0x1f57, 0x1f59...0x1f59, 0x1f5b...0x1f5b, 0x1f5d...0x1f5d, 0x1f5f...0x1f7d, 0x1f80...0x1fb4, 0x1fb6...0x1fbc, 0x1fbe...0x1fbe, 0x1fc2...0x1fc4, 0x1fc6...0x1fcc, 0x1fd0...0x1fd3, 0x1fd6...0x1fdb, 0x1fe0...0x1fec, 0x1ff2...0x1ff4, 0x1ff6...0x1ffc, 0x203f...0x2040, 0x2054...0x2054, 0x2071...0x2071, 0x207f...0x207f, 0x2090...0x209c, 0x20d0...0x20dc, 0x20e1...0x20e1, 0x20e5...0x20f0, 0x2102...0x2102, 0x2107...0x2107, 0x210a...0x2113, 0x2115...0x2115, 0x2118...0x211d, 0x2124...0x2124, 0x2126...0x2126, 0x2128...0x2128, 0x212a...0x2139, 0x213c...0x213f, 0x2145...0x2149, 0x214e...0x214e, 0x2160...0x2188, 0x2c00...0x2c2e, 0x2c30...0x2c5e, 0x2c60...0x2ce4, 0x2ceb...0x2cf3, 0x2d00...0x2d25, 0x2d27...0x2d27, 0x2d2d...0x2d2d, 0x2d30...0x2d67, 0x2d6f...0x2d6f, 0x2d7f...0x2d96, 0x2da0...0x2da6, 0x2da8...0x2dae, 0x2db0...0x2db6, 0x2db8...0x2dbe, 0x2dc0...0x2dc6, 0x2dc8...0x2dce, 0x2dd0...0x2dd6, 0x2dd8...0x2dde, 0x2de0...0x2dff, 0x3005...0x3007, 0x3021...0x302f, 0x3031...0x3035, 0x3038...0x303c, 0x3041...0x3096, 0x3099...0x309f, 0x30a1...0x30ff, 0x3105...0x312f, 0x3131...0x318e, 0x31a0...0x31bf, 0x31f0...0x31ff, 0x3400...0x4dbf, 0x4e00...0x9ffc, 0xa000...0xa48c, 0xa4d0...0xa4fd, 0xa500...0xa60c, 0xa610...0xa62b, 0xa640...0xa66f, 0xa674...0xa67d, 0xa67f...0xa6f1, 0xa717...0xa71f, 0xa722...0xa788, 0xa78b...0xa7bf, 0xa7c2...0xa7ca, 0xa7f5...0xa827, 0xa82c...0xa82c, 0xa840...0xa873, 0xa880...0xa8c5, 0xa8d0...0xa8d9, 0xa8e0...0xa8f7, 0xa8fb...0xa8fb, 0xa8fd...0xa92d, 0xa930...0xa953, 0xa960...0xa97c, 0xa980...0xa9c0, 0xa9cf...0xa9d9, 0xa9e0...0xa9fe, 0xaa00...0xaa36, 0xaa40...0xaa4d, 0xaa50...0xaa59, 0xaa60...0xaa76, 0xaa7a...0xaac2, 0xaadb...0xaadd, 0xaae0...0xaaef, 0xaaf2...0xaaf6, 0xab01...0xab06, 0xab09...0xab0e, 0xab11...0xab16, 0xab20...0xab26, 0xab28...0xab2e, 0xab30...0xab5a, 0xab5c...0xab69, 0xab70...0xabea, 0xabec...0xabed, 0xabf0...0xabf9, 0xac00...0xd7a3, 0xd7b0...0xd7c6, 0xd7cb...0xd7fb, 0xf900...0xfa6d, 0xfa70...0xfad9, 0xfb00...0xfb06, 0xfb13...0xfb17, 0xfb1d...0xfb28, 0xfb2a...0xfb36, 0xfb38...0xfb3c, 0xfb3e...0xfb3e, 0xfb40...0xfb41, 0xfb43...0xfb44, 0xfb46...0xfbb1, 0xfbd3...0xfd3d, 0xfd50...0xfd8f, 0xfd92...0xfdc7, 0xfdf0...0xfdfb, 0xfe00...0xfe0f, 0xfe20...0xfe2f, 0xfe33...0xfe34, 0xfe4d...0xfe4f, 0xfe70...0xfe74, 0xfe76...0xfefc, 0xff10...0xff19, 0xff21...0xff3a, 0xff3f...0xff3f, 0xff41...0xff5a, 0xff65...0xffbe, 0xffc2...0xffc7, 0xffca...0xffcf, 0xffd2...0xffd7 => true, + else => false, + }; + } + + fn isIdentifierPartSlow32(codepoint: i32) bool { + return switch (codepoint) { + 0xffda...0xffdc, 0x10000...0x1000b, 0x1000d...0x10026, 0x10028...0x1003a, 0x1003c...0x1003d, 0x1003f...0x1004d, 0x10050...0x1005d, 0x10080...0x100fa, 0x10140...0x10174, 0x101fd...0x101fd, 0x10280...0x1029c, 0x102a0...0x102d0, 0x102e0...0x102e0, 0x10300...0x1031f, 0x1032d...0x1034a, 0x10350...0x1037a, 0x10380...0x1039d, 0x103a0...0x103c3, 0x103c8...0x103cf, 0x103d1...0x103d5, 0x10400...0x1049d, 0x104a0...0x104a9, 0x104b0...0x104d3, 0x104d8...0x104fb, 0x10500...0x10527, 0x10530...0x10563, 0x10600...0x10736, 0x10740...0x10755, 0x10760...0x10767, 0x10800...0x10805, 0x10808...0x10808, 0x1080a...0x10835, 0x10837...0x10838, 0x1083c...0x1083c, 0x1083f...0x10855, 0x10860...0x10876, 0x10880...0x1089e, 0x108e0...0x108f2, 0x108f4...0x108f5, 0x10900...0x10915, 0x10920...0x10939, 0x10980...0x109b7, 0x109be...0x109bf, 0x10a00...0x10a03, 0x10a05...0x10a06, 0x10a0c...0x10a13, 0x10a15...0x10a17, 0x10a19...0x10a35, 0x10a38...0x10a3a, 0x10a3f...0x10a3f, 0x10a60...0x10a7c, 0x10a80...0x10a9c, 0x10ac0...0x10ac7, 0x10ac9...0x10ae6, 0x10b00...0x10b35, 0x10b40...0x10b55, 0x10b60...0x10b72, 0x10b80...0x10b91, 0x10c00...0x10c48, 0x10c80...0x10cb2, 0x10cc0...0x10cf2, 0x10d00...0x10d27, 0x10d30...0x10d39, 0x10e80...0x10ea9, 0x10eab...0x10eac, 0x10eb0...0x10eb1, 0x10f00...0x10f1c, 0x10f27...0x10f27, 0x10f30...0x10f50, 0x10fb0...0x10fc4, 0x10fe0...0x10ff6, 0x11000...0x11046, 0x11066...0x1106f, 0x1107f...0x110ba, 0x110d0...0x110e8, 0x110f0...0x110f9, 0x11100...0x11134, 0x11136...0x1113f, 0x11144...0x11147, 0x11150...0x11173, 0x11176...0x11176, 0x11180...0x111c4, 0x111c9...0x111cc, 0x111ce...0x111da, 0x111dc...0x111dc, 0x11200...0x11211, 0x11213...0x11237, 0x1123e...0x1123e, 0x11280...0x11286, 0x11288...0x11288, 0x1128a...0x1128d, 0x1128f...0x1129d, 0x1129f...0x112a8, 0x112b0...0x112ea, 0x112f0...0x112f9, 0x11300...0x11303, 0x11305...0x1130c, 0x1130f...0x11310, 0x11313...0x11328, 0x1132a...0x11330, 0x11332...0x11333, 0x11335...0x11339, 0x1133b...0x11344, 0x11347...0x11348, 0x1134b...0x1134d, 0x11350...0x11350, 0x11357...0x11357, 0x1135d...0x11363, 0x11366...0x1136c, 0x11370...0x11374, 0x11400...0x1144a, 0x11450...0x11459, 0x1145e...0x11461, 0x11480...0x114c5, 0x114c7...0x114c7, 0x114d0...0x114d9, 0x11580...0x115b5, 0x115b8...0x115c0, 0x115d8...0x115dd, 0x11600...0x11640, 0x11644...0x11644, 0x11650...0x11659, 0x11680...0x116b8, 0x116c0...0x116c9, 0x11700...0x1171a, 0x1171d...0x1172b, 0x11730...0x11739, 0x11800...0x1183a, 0x118a0...0x118e9, 0x118ff...0x11906, 0x11909...0x11909, 0x1190c...0x11913, 0x11915...0x11916, 0x11918...0x11935, 0x11937...0x11938, 0x1193b...0x11943, 0x11950...0x11959, 0x119a0...0x119a7, 0x119aa...0x119d7, 0x119da...0x119e1, 0x119e3...0x119e4, 0x11a00...0x11a3e, 0x11a47...0x11a47, 0x11a50...0x11a99, 0x11a9d...0x11a9d, 0x11ac0...0x11af8, 0x11c00...0x11c08, 0x11c0a...0x11c36, 0x11c38...0x11c40, 0x11c50...0x11c59, 0x11c72...0x11c8f, 0x11c92...0x11ca7, 0x11ca9...0x11cb6, 0x11d00...0x11d06, 0x11d08...0x11d09, 0x11d0b...0x11d36, 0x11d3a...0x11d3a, 0x11d3c...0x11d3d, 0x11d3f...0x11d47, 0x11d50...0x11d59, 0x11d60...0x11d65, 0x11d67...0x11d68, 0x11d6a...0x11d8e, 0x11d90...0x11d91, 0x11d93...0x11d98, 0x11da0...0x11da9, 0x11ee0...0x11ef6, 0x11fb0...0x11fb0, 0x12000...0x12399, 0x12400...0x1246e, 0x12480...0x12543, 0x13000...0x1342e, 0x14400...0x14646, 0x16800...0x16a38, 0x16a40...0x16a5e, 0x16a60...0x16a69, 0x16ad0...0x16aed, 0x16af0...0x16af4, 0x16b00...0x16b36, 0x16b40...0x16b43, 0x16b50...0x16b59, 0x16b63...0x16b77, 0x16b7d...0x16b8f, 0x16e40...0x16e7f, 0x16f00...0x16f4a, 0x16f4f...0x16f87, 0x16f8f...0x16f9f, 0x16fe0...0x16fe1, 0x16fe3...0x16fe4, 0x16ff0...0x16ff1, 0x17000...0x187f7, 0x18800...0x18cd5, 0x18d00...0x18d08, 0x1b000...0x1b11e, 0x1b150...0x1b152, 0x1b164...0x1b167, 0x1b170...0x1b2fb, 0x1bc00...0x1bc6a, 0x1bc70...0x1bc7c, 0x1bc80...0x1bc88, 0x1bc90...0x1bc99, 0x1bc9d...0x1bc9e, 0x1d165...0x1d169, 0x1d16d...0x1d172, 0x1d17b...0x1d182, 0x1d185...0x1d18b, 0x1d1aa...0x1d1ad, 0x1d242...0x1d244, 0x1d400...0x1d454, 0x1d456...0x1d49c, 0x1d49e...0x1d49f, 0x1d4a2...0x1d4a2, 0x1d4a5...0x1d4a6, 0x1d4a9...0x1d4ac, 0x1d4ae...0x1d4b9, 0x1d4bb...0x1d4bb, 0x1d4bd...0x1d4c3, 0x1d4c5...0x1d505, 0x1d507...0x1d50a, 0x1d50d...0x1d514, 0x1d516...0x1d51c, 0x1d51e...0x1d539, 0x1d53b...0x1d53e, 0x1d540...0x1d544, 0x1d546...0x1d546, 0x1d54a...0x1d550, 0x1d552...0x1d6a5, 0x1d6a8...0x1d6c0, 0x1d6c2...0x1d6da, 0x1d6dc...0x1d6fa, 0x1d6fc...0x1d714, 0x1d716...0x1d734, 0x1d736...0x1d74e, 0x1d750...0x1d76e, 0x1d770...0x1d788, 0x1d78a...0x1d7a8, 0x1d7aa...0x1d7c2, 0x1d7c4...0x1d7cb, 0x1d7ce...0x1d7ff, 0x1da00...0x1da36, 0x1da3b...0x1da6c, 0x1da75...0x1da75, 0x1da84...0x1da84, 0x1da9b...0x1da9f, 0x1daa1...0x1daaf, 0x1e000...0x1e006, 0x1e008...0x1e018, 0x1e01b...0x1e021, 0x1e023...0x1e024, 0x1e026...0x1e02a, 0x1e100...0x1e12c, 0x1e130...0x1e13d, 0x1e140...0x1e149, 0x1e14e...0x1e14e, 0x1e2c0...0x1e2f9, 0x1e800...0x1e8c4, 0x1e8d0...0x1e8d6, 0x1e900...0x1e94b, 0x1e950...0x1e959, 0x1ee00...0x1ee03, 0x1ee05...0x1ee1f, 0x1ee21...0x1ee22, 0x1ee24...0x1ee24, 0x1ee27...0x1ee27, 0x1ee29...0x1ee32, 0x1ee34...0x1ee37, 0x1ee39...0x1ee39, 0x1ee3b...0x1ee3b, 0x1ee42...0x1ee42, 0x1ee47...0x1ee47, 0x1ee49...0x1ee49, 0x1ee4b...0x1ee4b, 0x1ee4d...0x1ee4f, 0x1ee51...0x1ee52, 0x1ee54...0x1ee54, 0x1ee57...0x1ee57, 0x1ee59...0x1ee59, 0x1ee5b...0x1ee5b, 0x1ee5d...0x1ee5d, 0x1ee5f...0x1ee5f, 0x1ee61...0x1ee62, 0x1ee64...0x1ee64, 0x1ee67...0x1ee6a, 0x1ee6c...0x1ee72, 0x1ee74...0x1ee77, 0x1ee79...0x1ee7c, 0x1ee7e...0x1ee7e, 0x1ee80...0x1ee89, 0x1ee8b...0x1ee9b, 0x1eea1...0x1eea3, 0x1eea5...0x1eea9, 0x1eeab...0x1eebb, 0x1fbf0...0x1fbf9, 0x20000...0x2a6dd, 0x2a700...0x2b734, 0x2b740...0x2b81d, 0x2b820...0x2cea1, 0x2ceb0...0x2ebe0, 0x2f800...0x2fa1d, 0x30000...0x3134a, 0xe0100...0xe01ef => true, + else => false, + }; + } + + fn isIdentifierStartSlow16(codepoint: u16) bool { + return switch (codepoint) { + 0xaa...0xaa, 0xb5...0xb5, 0xba...0xba, 0xc0...0xd6, 0xd8...0xf6, 0xf8...0x2c1, 0x2c6...0x2d1, 0x2e0...0x2e4, 0x2ec...0x2ec, 0x2ee...0x2ee, 0x370...0x374, 0x376...0x377, 0x37a...0x37d, 0x37f...0x37f, 0x386...0x386, 0x388...0x38a, 0x38c...0x38c, 0x38e...0x3a1, 0x3a3...0x3f5, 0x3f7...0x481, 0x48a...0x52f, 0x531...0x556, 0x559...0x559, 0x560...0x588, 0x5d0...0x5ea, 0x5ef...0x5f2, 0x620...0x64a, 0x66e...0x66f, 0x671...0x6d3, 0x6d5...0x6d5, 0x6e5...0x6e6, 0x6ee...0x6ef, 0x6fa...0x6fc, 0x6ff...0x6ff, 0x710...0x710, 0x712...0x72f, 0x74d...0x7a5, 0x7b1...0x7b1, 0x7ca...0x7ea, 0x7f4...0x7f5, 0x7fa...0x7fa, 0x800...0x815, 0x81a...0x81a, 0x824...0x824, 0x828...0x828, 0x840...0x858, 0x860...0x86a, 0x8a0...0x8b4, 0x8b6...0x8c7, 0x904...0x939, 0x93d...0x93d, 0x950...0x950, 0x958...0x961, 0x971...0x980, 0x985...0x98c, 0x98f...0x990, 0x993...0x9a8, 0x9aa...0x9b0, 0x9b2...0x9b2, 0x9b6...0x9b9, 0x9bd...0x9bd, 0x9ce...0x9ce, 0x9dc...0x9dd, 0x9df...0x9e1, 0x9f0...0x9f1, 0x9fc...0x9fc, 0xa05...0xa0a, 0xa0f...0xa10, 0xa13...0xa28, 0xa2a...0xa30, 0xa32...0xa33, 0xa35...0xa36, 0xa38...0xa39, 0xa59...0xa5c, 0xa5e...0xa5e, 0xa72...0xa74, 0xa85...0xa8d, 0xa8f...0xa91, 0xa93...0xaa8, 0xaaa...0xab0, 0xab2...0xab3, 0xab5...0xab9, 0xabd...0xabd, 0xad0...0xad0, 0xae0...0xae1, 0xaf9...0xaf9, 0xb05...0xb0c, 0xb0f...0xb10, 0xb13...0xb28, 0xb2a...0xb30, 0xb32...0xb33, 0xb35...0xb39, 0xb3d...0xb3d, 0xb5c...0xb5d, 0xb5f...0xb61, 0xb71...0xb71, 0xb83...0xb83, 0xb85...0xb8a, 0xb8e...0xb90, 0xb92...0xb95, 0xb99...0xb9a, 0xb9c...0xb9c, 0xb9e...0xb9f, 0xba3...0xba4, 0xba8...0xbaa, 0xbae...0xbb9, 0xbd0...0xbd0, 0xc05...0xc0c, 0xc0e...0xc10, 0xc12...0xc28, 0xc2a...0xc39, 0xc3d...0xc3d, 0xc58...0xc5a, 0xc60...0xc61, 0xc80...0xc80, 0xc85...0xc8c, 0xc8e...0xc90, 0xc92...0xca8, 0xcaa...0xcb3, 0xcb5...0xcb9, 0xcbd...0xcbd, 0xcde...0xcde, 0xce0...0xce1, 0xcf1...0xcf2, 0xd04...0xd0c, 0xd0e...0xd10, 0xd12...0xd3a, 0xd3d...0xd3d, 0xd4e...0xd4e, 0xd54...0xd56, 0xd5f...0xd61, 0xd7a...0xd7f, 0xd85...0xd96, 0xd9a...0xdb1, 0xdb3...0xdbb, 0xdbd...0xdbd, 0xdc0...0xdc6, 0xe01...0xe30, 0xe32...0xe33, 0xe40...0xe46, 0xe81...0xe82, 0xe84...0xe84, 0xe86...0xe8a, 0xe8c...0xea3, 0xea5...0xea5, 0xea7...0xeb0, 0xeb2...0xeb3, 0xebd...0xebd, 0xec0...0xec4, 0xec6...0xec6, 0xedc...0xedf, 0xf00...0xf00, 0xf40...0xf47, 0xf49...0xf6c, 0xf88...0xf8c, 0x1000...0x102a, 0x103f...0x103f, 0x1050...0x1055, 0x105a...0x105d, 0x1061...0x1061, 0x1065...0x1066, 0x106e...0x1070, 0x1075...0x1081, 0x108e...0x108e, 0x10a0...0x10c5, 0x10c7...0x10c7, 0x10cd...0x10cd, 0x10d0...0x10fa, 0x10fc...0x1248, 0x124a...0x124d, 0x1250...0x1256, 0x1258...0x1258, 0x125a...0x125d, 0x1260...0x1288, 0x128a...0x128d, 0x1290...0x12b0, 0x12b2...0x12b5, 0x12b8...0x12be, 0x12c0...0x12c0, 0x12c2...0x12c5, 0x12c8...0x12d6, 0x12d8...0x1310, 0x1312...0x1315, 0x1318...0x135a, 0x1380...0x138f, 0x13a0...0x13f5, 0x13f8...0x13fd, 0x1401...0x166c, 0x166f...0x167f, 0x1681...0x169a, 0x16a0...0x16ea, 0x16ee...0x16f8, 0x1700...0x170c, 0x170e...0x1711, 0x1720...0x1731, 0x1740...0x1751, 0x1760...0x176c, 0x176e...0x1770, 0x1780...0x17b3, 0x17d7...0x17d7, 0x17dc...0x17dc, 0x1820...0x1878, 0x1880...0x18a8, 0x18aa...0x18aa, 0x18b0...0x18f5, 0x1900...0x191e, 0x1950...0x196d, 0x1970...0x1974, 0x1980...0x19ab, 0x19b0...0x19c9, 0x1a00...0x1a16, 0x1a20...0x1a54, 0x1aa7...0x1aa7, 0x1b05...0x1b33, 0x1b45...0x1b4b, 0x1b83...0x1ba0, 0x1bae...0x1baf, 0x1bba...0x1be5, 0x1c00...0x1c23, 0x1c4d...0x1c4f, 0x1c5a...0x1c7d, 0x1c80...0x1c88, 0x1c90...0x1cba, 0x1cbd...0x1cbf, 0x1ce9...0x1cec, 0x1cee...0x1cf3, 0x1cf5...0x1cf6, 0x1cfa...0x1cfa, 0x1d00...0x1dbf, 0x1e00...0x1f15, 0x1f18...0x1f1d, 0x1f20...0x1f45, 0x1f48...0x1f4d, 0x1f50...0x1f57, 0x1f59...0x1f59, 0x1f5b...0x1f5b, 0x1f5d...0x1f5d, 0x1f5f...0x1f7d, 0x1f80...0x1fb4, 0x1fb6...0x1fbc, 0x1fbe...0x1fbe, 0x1fc2...0x1fc4, 0x1fc6...0x1fcc, 0x1fd0...0x1fd3, 0x1fd6...0x1fdb, 0x1fe0...0x1fec, 0x1ff2...0x1ff4, 0x1ff6...0x1ffc, 0x2071...0x2071, 0x207f...0x207f, 0x2090...0x209c, 0x2102...0x2102, 0x2107...0x2107, 0x210a...0x2113, 0x2115...0x2115, 0x2118...0x211d, 0x2124...0x2124, 0x2126...0x2126, 0x2128...0x2128, 0x212a...0x2139, 0x213c...0x213f, 0x2145...0x2149, 0x214e...0x214e, 0x2160...0x2188, 0x2c00...0x2c2e, 0x2c30...0x2c5e, 0x2c60...0x2ce4, 0x2ceb...0x2cee, 0x2cf2...0x2cf3, 0x2d00...0x2d25, 0x2d27...0x2d27, 0x2d2d...0x2d2d, 0x2d30...0x2d67, 0x2d6f...0x2d6f, 0x2d80...0x2d96, 0x2da0...0x2da6, 0x2da8...0x2dae, 0x2db0...0x2db6, 0x2db8...0x2dbe, 0x2dc0...0x2dc6, 0x2dc8...0x2dce, 0x2dd0...0x2dd6, 0x2dd8...0x2dde, 0x3005...0x3007, 0x3021...0x3029, 0x3031...0x3035, 0x3038...0x303c, 0x3041...0x3096, 0x309b...0x309f, 0x30a1...0x30fa, 0x30fc...0x30ff, 0x3105...0x312f, 0x3131...0x318e, 0x31a0...0x31bf, 0x31f0...0x31ff, 0x3400...0x4dbf, 0x4e00...0x9ffc, 0xa000...0xa48c, 0xa4d0...0xa4fd, 0xa500...0xa60c, 0xa610...0xa61f, 0xa62a...0xa62b, 0xa640...0xa66e, 0xa67f...0xa69d, 0xa6a0...0xa6ef, 0xa717...0xa71f, 0xa722...0xa788, 0xa78b...0xa7bf, 0xa7c2...0xa7ca, 0xa7f5...0xa801, 0xa803...0xa805, 0xa807...0xa80a, 0xa80c...0xa822, 0xa840...0xa873, 0xa882...0xa8b3, 0xa8f2...0xa8f7, 0xa8fb...0xa8fb, 0xa8fd...0xa8fe, 0xa90a...0xa925, 0xa930...0xa946, 0xa960...0xa97c, 0xa984...0xa9b2, 0xa9cf...0xa9cf, 0xa9e0...0xa9e4, 0xa9e6...0xa9ef, 0xa9fa...0xa9fe, 0xaa00...0xaa28, 0xaa40...0xaa42, 0xaa44...0xaa4b, 0xaa60...0xaa76, 0xaa7a...0xaa7a, 0xaa7e...0xaaaf, 0xaab1...0xaab1, 0xaab5...0xaab6, 0xaab9...0xaabd, 0xaac0...0xaac0, 0xaac2...0xaac2, 0xaadb...0xaadd, 0xaae0...0xaaea, 0xaaf2...0xaaf4, 0xab01...0xab06, 0xab09...0xab0e, 0xab11...0xab16, 0xab20...0xab26, 0xab28...0xab2e, 0xab30...0xab5a, 0xab5c...0xab69, 0xab70...0xabe2, 0xac00...0xd7a3, 0xd7b0...0xd7c6, 0xd7cb...0xd7fb, 0xf900...0xfa6d, 0xfa70...0xfad9, 0xfb00...0xfb06, 0xfb13...0xfb17, 0xfb1d...0xfb1d, 0xfb1f...0xfb28, 0xfb2a...0xfb36, 0xfb38...0xfb3c, 0xfb3e...0xfb3e, 0xfb40...0xfb41, 0xfb43...0xfb44, 0xfb46...0xfbb1, 0xfbd3...0xfd3d, 0xfd50...0xfd8f, 0xfd92...0xfdc7 => true, + else => false, + }; + } + + fn isIdentifierStartSlow32(codepoint: i32) bool { + return switch (codepoint) { + 0xfdf0...0xfdfb, 0xfe70...0xfe74, 0xfe76...0xfefc, 0xff21...0xff3a, 0xff41...0xff5a, 0xff66...0xffbe, 0xffc2...0xffc7, 0xffca...0xffcf, 0xffd2...0xffd7, 0xffda...0xffdc, 0x10000...0x1000b, 0x1000d...0x10026, 0x10028...0x1003a, 0x1003c...0x1003d, 0x1003f...0x1004d, 0x10050...0x1005d, 0x10080...0x100fa, 0x10140...0x10174, 0x10280...0x1029c, 0x102a0...0x102d0, 0x10300...0x1031f, 0x1032d...0x1034a, 0x10350...0x10375, 0x10380...0x1039d, 0x103a0...0x103c3, 0x103c8...0x103cf, 0x103d1...0x103d5, 0x10400...0x1049d, 0x104b0...0x104d3, 0x104d8...0x104fb, 0x10500...0x10527, 0x10530...0x10563, 0x10600...0x10736, 0x10740...0x10755, 0x10760...0x10767, 0x10800...0x10805, 0x10808...0x10808, 0x1080a...0x10835, 0x10837...0x10838, 0x1083c...0x1083c, 0x1083f...0x10855, 0x10860...0x10876, 0x10880...0x1089e, 0x108e0...0x108f2, 0x108f4...0x108f5, 0x10900...0x10915, 0x10920...0x10939, 0x10980...0x109b7, 0x109be...0x109bf, 0x10a00...0x10a00, 0x10a10...0x10a13, 0x10a15...0x10a17, 0x10a19...0x10a35, 0x10a60...0x10a7c, 0x10a80...0x10a9c, 0x10ac0...0x10ac7, 0x10ac9...0x10ae4, 0x10b00...0x10b35, 0x10b40...0x10b55, 0x10b60...0x10b72, 0x10b80...0x10b91, 0x10c00...0x10c48, 0x10c80...0x10cb2, 0x10cc0...0x10cf2, 0x10d00...0x10d23, 0x10e80...0x10ea9, 0x10eb0...0x10eb1, 0x10f00...0x10f1c, 0x10f27...0x10f27, 0x10f30...0x10f45, 0x10fb0...0x10fc4, 0x10fe0...0x10ff6, 0x11003...0x11037, 0x11083...0x110af, 0x110d0...0x110e8, 0x11103...0x11126, 0x11144...0x11144, 0x11147...0x11147, 0x11150...0x11172, 0x11176...0x11176, 0x11183...0x111b2, 0x111c1...0x111c4, 0x111da...0x111da, 0x111dc...0x111dc, 0x11200...0x11211, 0x11213...0x1122b, 0x11280...0x11286, 0x11288...0x11288, 0x1128a...0x1128d, 0x1128f...0x1129d, 0x1129f...0x112a8, 0x112b0...0x112de, 0x11305...0x1130c, 0x1130f...0x11310, 0x11313...0x11328, 0x1132a...0x11330, 0x11332...0x11333, 0x11335...0x11339, 0x1133d...0x1133d, 0x11350...0x11350, 0x1135d...0x11361, 0x11400...0x11434, 0x11447...0x1144a, 0x1145f...0x11461, 0x11480...0x114af, 0x114c4...0x114c5, 0x114c7...0x114c7, 0x11580...0x115ae, 0x115d8...0x115db, 0x11600...0x1162f, 0x11644...0x11644, 0x11680...0x116aa, 0x116b8...0x116b8, 0x11700...0x1171a, 0x11800...0x1182b, 0x118a0...0x118df, 0x118ff...0x11906, 0x11909...0x11909, 0x1190c...0x11913, 0x11915...0x11916, 0x11918...0x1192f, 0x1193f...0x1193f, 0x11941...0x11941, 0x119a0...0x119a7, 0x119aa...0x119d0, 0x119e1...0x119e1, 0x119e3...0x119e3, 0x11a00...0x11a00, 0x11a0b...0x11a32, 0x11a3a...0x11a3a, 0x11a50...0x11a50, 0x11a5c...0x11a89, 0x11a9d...0x11a9d, 0x11ac0...0x11af8, 0x11c00...0x11c08, 0x11c0a...0x11c2e, 0x11c40...0x11c40, 0x11c72...0x11c8f, 0x11d00...0x11d06, 0x11d08...0x11d09, 0x11d0b...0x11d30, 0x11d46...0x11d46, 0x11d60...0x11d65, 0x11d67...0x11d68, 0x11d6a...0x11d89, 0x11d98...0x11d98, 0x11ee0...0x11ef2, 0x11fb0...0x11fb0, 0x12000...0x12399, 0x12400...0x1246e, 0x12480...0x12543, 0x13000...0x1342e, 0x14400...0x14646, 0x16800...0x16a38, 0x16a40...0x16a5e, 0x16ad0...0x16aed, 0x16b00...0x16b2f, 0x16b40...0x16b43, 0x16b63...0x16b77, 0x16b7d...0x16b8f, 0x16e40...0x16e7f, 0x16f00...0x16f4a, 0x16f50...0x16f50, 0x16f93...0x16f9f, 0x16fe0...0x16fe1, 0x16fe3...0x16fe3, 0x17000...0x187f7, 0x18800...0x18cd5, 0x18d00...0x18d08, 0x1b000...0x1b11e, 0x1b150...0x1b152, 0x1b164...0x1b167, 0x1b170...0x1b2fb, 0x1bc00...0x1bc6a, 0x1bc70...0x1bc7c, 0x1bc80...0x1bc88, 0x1bc90...0x1bc99, 0x1d400...0x1d454, 0x1d456...0x1d49c, 0x1d49e...0x1d49f, 0x1d4a2...0x1d4a2, 0x1d4a5...0x1d4a6, 0x1d4a9...0x1d4ac, 0x1d4ae...0x1d4b9, 0x1d4bb...0x1d4bb, 0x1d4bd...0x1d4c3, 0x1d4c5...0x1d505, 0x1d507...0x1d50a, 0x1d50d...0x1d514, 0x1d516...0x1d51c, 0x1d51e...0x1d539, 0x1d53b...0x1d53e, 0x1d540...0x1d544, 0x1d546...0x1d546, 0x1d54a...0x1d550, 0x1d552...0x1d6a5, 0x1d6a8...0x1d6c0, 0x1d6c2...0x1d6da, 0x1d6dc...0x1d6fa, 0x1d6fc...0x1d714, 0x1d716...0x1d734, 0x1d736...0x1d74e, 0x1d750...0x1d76e, 0x1d770...0x1d788, 0x1d78a...0x1d7a8, 0x1d7aa...0x1d7c2, 0x1d7c4...0x1d7cb, 0x1e100...0x1e12c, 0x1e137...0x1e13d, 0x1e14e...0x1e14e, 0x1e2c0...0x1e2eb, 0x1e800...0x1e8c4, 0x1e900...0x1e943, 0x1e94b...0x1e94b, 0x1ee00...0x1ee03, 0x1ee05...0x1ee1f, 0x1ee21...0x1ee22, 0x1ee24...0x1ee24, 0x1ee27...0x1ee27, 0x1ee29...0x1ee32, 0x1ee34...0x1ee37, 0x1ee39...0x1ee39, 0x1ee3b...0x1ee3b, 0x1ee42...0x1ee42, 0x1ee47...0x1ee47, 0x1ee49...0x1ee49, 0x1ee4b...0x1ee4b, 0x1ee4d...0x1ee4f, 0x1ee51...0x1ee52, 0x1ee54...0x1ee54, 0x1ee57...0x1ee57, 0x1ee59...0x1ee59, 0x1ee5b...0x1ee5b, 0x1ee5d...0x1ee5d, 0x1ee5f...0x1ee5f, 0x1ee61...0x1ee62, 0x1ee64...0x1ee64, 0x1ee67...0x1ee6a, 0x1ee6c...0x1ee72, 0x1ee74...0x1ee77, 0x1ee79...0x1ee7c, 0x1ee7e...0x1ee7e, 0x1ee80...0x1ee89, 0x1ee8b...0x1ee9b, 0x1eea1...0x1eea3, 0x1eea5...0x1eea9, 0x1eeab...0x1eebb, 0x20000...0x2a6dd, 0x2a700...0x2b734, 0x2b740...0x2b81d, 0x2b820...0x2cea1, 0x2ceb0...0x2ebe0, 0x2f800...0x2fa1d, 0x30000...0x3134a => true, + else => false, + }; + } + + noinline fn isIdentifierStartSlow(codepoint: i32) bool { + @setCold(true); + return switch (codepoint) { + // explicitly tell LLVM's optimizer about values we know will not be in the range of this switch statement + + (max_codepoint + 1)...maxInt(i32), minInt(i32)...127 => unreachable, + 128...0xfdc7 => isIdentifierStartSlow16(@intCast(u16, codepoint)), + 0xfdf0...0x3134a => isIdentifierStartSlow32(codepoint), + else => false, + }; + } + + pub inline fn isIdentifierStart(codepoint: i32) bool { + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '$', '_' => true, + else => if (codepoint < 128) + return false + else + return isIdentifierStartSlow(codepoint), + }; + } + + pub inline fn isIdentifierPart(codepoint: i32) bool { + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '0'...'9', '$', '_' => true, + else => if (codepoint < 128) + return false + else + return isIdentifierPartSlow(codepoint), + }; + } +}; + +pub const JumpTableInline = struct { + pub inline fn isIdentifierStart(codepoint: i32) bool { + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '$', '_' => true, + + else => switch (codepoint) { + 0x41...0x5a, 0x61...0x7a, 0xaa...0xaa, 0xb5...0xb5, 0xba...0xba, 0xc0...0xd6, 0xd8...0xf6, 0xf8...0x2c1, 0x2c6...0x2d1, 0x2e0...0x2e4, 0x2ec...0x2ec, 0x2ee...0x2ee, 0x370...0x374, 0x376...0x377, 0x37a...0x37d, 0x37f...0x37f, 0x386...0x386, 0x388...0x38a, 0x38c...0x38c, 0x38e...0x3a1, 0x3a3...0x3f5, 0x3f7...0x481, 0x48a...0x52f, 0x531...0x556, 0x559...0x559, 0x560...0x588, 0x5d0...0x5ea, 0x5ef...0x5f2, 0x620...0x64a, 0x66e...0x66f, 0x671...0x6d3, 0x6d5...0x6d5, 0x6e5...0x6e6, 0x6ee...0x6ef, 0x6fa...0x6fc, 0x6ff...0x6ff, 0x710...0x710, 0x712...0x72f, 0x74d...0x7a5, 0x7b1...0x7b1, 0x7ca...0x7ea, 0x7f4...0x7f5, 0x7fa...0x7fa, 0x800...0x815, 0x81a...0x81a, 0x824...0x824, 0x828...0x828, 0x840...0x858, 0x860...0x86a, 0x8a0...0x8b4, 0x8b6...0x8c7, 0x904...0x939, 0x93d...0x93d, 0x950...0x950, 0x958...0x961, 0x971...0x980, 0x985...0x98c, 0x98f...0x990, 0x993...0x9a8, 0x9aa...0x9b0, 0x9b2...0x9b2, 0x9b6...0x9b9, 0x9bd...0x9bd, 0x9ce...0x9ce, 0x9dc...0x9dd, 0x9df...0x9e1, 0x9f0...0x9f1, 0x9fc...0x9fc, 0xa05...0xa0a, 0xa0f...0xa10, 0xa13...0xa28, 0xa2a...0xa30, 0xa32...0xa33, 0xa35...0xa36, 0xa38...0xa39, 0xa59...0xa5c, 0xa5e...0xa5e, 0xa72...0xa74, 0xa85...0xa8d, 0xa8f...0xa91, 0xa93...0xaa8, 0xaaa...0xab0, 0xab2...0xab3, 0xab5...0xab9, 0xabd...0xabd, 0xad0...0xad0, 0xae0...0xae1, 0xaf9...0xaf9, 0xb05...0xb0c, 0xb0f...0xb10, 0xb13...0xb28, 0xb2a...0xb30, 0xb32...0xb33, 0xb35...0xb39, 0xb3d...0xb3d, 0xb5c...0xb5d, 0xb5f...0xb61, 0xb71...0xb71, 0xb83...0xb83, 0xb85...0xb8a, 0xb8e...0xb90, 0xb92...0xb95, 0xb99...0xb9a, 0xb9c...0xb9c, 0xb9e...0xb9f, 0xba3...0xba4, 0xba8...0xbaa, 0xbae...0xbb9, 0xbd0...0xbd0, 0xc05...0xc0c, 0xc0e...0xc10, 0xc12...0xc28, 0xc2a...0xc39, 0xc3d...0xc3d, 0xc58...0xc5a, 0xc60...0xc61, 0xc80...0xc80, 0xc85...0xc8c, 0xc8e...0xc90, 0xc92...0xca8, 0xcaa...0xcb3, 0xcb5...0xcb9, 0xcbd...0xcbd, 0xcde...0xcde, 0xce0...0xce1, 0xcf1...0xcf2, 0xd04...0xd0c, 0xd0e...0xd10, 0xd12...0xd3a, 0xd3d...0xd3d, 0xd4e...0xd4e, 0xd54...0xd56, 0xd5f...0xd61, 0xd7a...0xd7f, 0xd85...0xd96, 0xd9a...0xdb1, 0xdb3...0xdbb, 0xdbd...0xdbd, 0xdc0...0xdc6, 0xe01...0xe30, 0xe32...0xe33, 0xe40...0xe46, 0xe81...0xe82, 0xe84...0xe84, 0xe86...0xe8a, 0xe8c...0xea3, 0xea5...0xea5, 0xea7...0xeb0, 0xeb2...0xeb3, 0xebd...0xebd, 0xec0...0xec4, 0xec6...0xec6, 0xedc...0xedf, 0xf00...0xf00, 0xf40...0xf47, 0xf49...0xf6c, 0xf88...0xf8c, 0x1000...0x102a, 0x103f...0x103f, 0x1050...0x1055, 0x105a...0x105d, 0x1061...0x1061, 0x1065...0x1066, 0x106e...0x1070, 0x1075...0x1081, 0x108e...0x108e, 0x10a0...0x10c5, 0x10c7...0x10c7, 0x10cd...0x10cd, 0x10d0...0x10fa, 0x10fc...0x1248, 0x124a...0x124d, 0x1250...0x1256, 0x1258...0x1258, 0x125a...0x125d, 0x1260...0x1288, 0x128a...0x128d, 0x1290...0x12b0, 0x12b2...0x12b5, 0x12b8...0x12be, 0x12c0...0x12c0, 0x12c2...0x12c5, 0x12c8...0x12d6, 0x12d8...0x1310, 0x1312...0x1315, 0x1318...0x135a, 0x1380...0x138f, 0x13a0...0x13f5, 0x13f8...0x13fd, 0x1401...0x166c, 0x166f...0x167f, 0x1681...0x169a, 0x16a0...0x16ea, 0x16ee...0x16f8, 0x1700...0x170c, 0x170e...0x1711, 0x1720...0x1731, 0x1740...0x1751, 0x1760...0x176c, 0x176e...0x1770, 0x1780...0x17b3, 0x17d7...0x17d7, 0x17dc...0x17dc, 0x1820...0x1878, 0x1880...0x18a8, 0x18aa...0x18aa, 0x18b0...0x18f5, 0x1900...0x191e, 0x1950...0x196d, 0x1970...0x1974, 0x1980...0x19ab, 0x19b0...0x19c9, 0x1a00...0x1a16, 0x1a20...0x1a54, 0x1aa7...0x1aa7, 0x1b05...0x1b33, 0x1b45...0x1b4b, 0x1b83...0x1ba0, 0x1bae...0x1baf, 0x1bba...0x1be5, 0x1c00...0x1c23, 0x1c4d...0x1c4f, 0x1c5a...0x1c7d, 0x1c80...0x1c88, 0x1c90...0x1cba, 0x1cbd...0x1cbf, 0x1ce9...0x1cec, 0x1cee...0x1cf3, 0x1cf5...0x1cf6, 0x1cfa...0x1cfa, 0x1d00...0x1dbf, 0x1e00...0x1f15, 0x1f18...0x1f1d, 0x1f20...0x1f45, 0x1f48...0x1f4d, 0x1f50...0x1f57, 0x1f59...0x1f59, 0x1f5b...0x1f5b, 0x1f5d...0x1f5d, 0x1f5f...0x1f7d, 0x1f80...0x1fb4, 0x1fb6...0x1fbc, 0x1fbe...0x1fbe, 0x1fc2...0x1fc4, 0x1fc6...0x1fcc, 0x1fd0...0x1fd3, 0x1fd6...0x1fdb, 0x1fe0...0x1fec, 0x1ff2...0x1ff4, 0x1ff6...0x1ffc, 0x2071...0x2071, 0x207f...0x207f, 0x2090...0x209c, 0x2102...0x2102, 0x2107...0x2107, 0x210a...0x2113, 0x2115...0x2115, 0x2118...0x211d, 0x2124...0x2124, 0x2126...0x2126, 0x2128...0x2128, 0x212a...0x2139, 0x213c...0x213f, 0x2145...0x2149, 0x214e...0x214e, 0x2160...0x2188, 0x2c00...0x2c2e, 0x2c30...0x2c5e, 0x2c60...0x2ce4, 0x2ceb...0x2cee, 0x2cf2...0x2cf3, 0x2d00...0x2d25, 0x2d27...0x2d27, 0x2d2d...0x2d2d, 0x2d30...0x2d67, 0x2d6f...0x2d6f, 0x2d80...0x2d96, 0x2da0...0x2da6, 0x2da8...0x2dae, 0x2db0...0x2db6, 0x2db8...0x2dbe, 0x2dc0...0x2dc6, 0x2dc8...0x2dce, 0x2dd0...0x2dd6, 0x2dd8...0x2dde, 0x3005...0x3007, 0x3021...0x3029, 0x3031...0x3035, 0x3038...0x303c, 0x3041...0x3096, 0x309b...0x309f, 0x30a1...0x30fa, 0x30fc...0x30ff, 0x3105...0x312f, 0x3131...0x318e, 0x31a0...0x31bf, 0x31f0...0x31ff, 0x3400...0x4dbf, 0x4e00...0x9ffc, 0xa000...0xa48c, 0xa4d0...0xa4fd, 0xa500...0xa60c, 0xa610...0xa61f, 0xa62a...0xa62b, 0xa640...0xa66e, 0xa67f...0xa69d, 0xa6a0...0xa6ef, 0xa717...0xa71f, 0xa722...0xa788, 0xa78b...0xa7bf, 0xa7c2...0xa7ca, 0xa7f5...0xa801, 0xa803...0xa805, 0xa807...0xa80a, 0xa80c...0xa822, 0xa840...0xa873, 0xa882...0xa8b3, 0xa8f2...0xa8f7, 0xa8fb...0xa8fb, 0xa8fd...0xa8fe, 0xa90a...0xa925, 0xa930...0xa946, 0xa960...0xa97c, 0xa984...0xa9b2, 0xa9cf...0xa9cf, 0xa9e0...0xa9e4, 0xa9e6...0xa9ef, 0xa9fa...0xa9fe, 0xaa00...0xaa28, 0xaa40...0xaa42, 0xaa44...0xaa4b, 0xaa60...0xaa76, 0xaa7a...0xaa7a, 0xaa7e...0xaaaf, 0xaab1...0xaab1, 0xaab5...0xaab6, 0xaab9...0xaabd, 0xaac0...0xaac0, 0xaac2...0xaac2, 0xaadb...0xaadd, 0xaae0...0xaaea, 0xaaf2...0xaaf4, 0xab01...0xab06, 0xab09...0xab0e, 0xab11...0xab16, 0xab20...0xab26, 0xab28...0xab2e, 0xab30...0xab5a, 0xab5c...0xab69, 0xab70...0xabe2, 0xac00...0xd7a3, 0xd7b0...0xd7c6, 0xd7cb...0xd7fb, 0xf900...0xfa6d, 0xfa70...0xfad9, 0xfb00...0xfb06, 0xfb13...0xfb17, 0xfb1d...0xfb1d, 0xfb1f...0xfb28, 0xfb2a...0xfb36, 0xfb38...0xfb3c, 0xfb3e...0xfb3e, 0xfb40...0xfb41, 0xfb43...0xfb44, 0xfb46...0xfbb1, 0xfbd3...0xfd3d, 0xfd50...0xfd8f, 0xfd92...0xfdc7, 0xfdf0...0xfdfb, 0xfe70...0xfe74, 0xfe76...0xfefc, 0xff21...0xff3a, 0xff41...0xff5a, 0xff66...0xffbe, 0xffc2...0xffc7, 0xffca...0xffcf, 0xffd2...0xffd7, 0xffda...0xffdc, 0x10000...0x1000b, 0x1000d...0x10026, 0x10028...0x1003a, 0x1003c...0x1003d, 0x1003f...0x1004d, 0x10050...0x1005d, 0x10080...0x100fa, 0x10140...0x10174, 0x10280...0x1029c, 0x102a0...0x102d0, 0x10300...0x1031f, 0x1032d...0x1034a, 0x10350...0x10375, 0x10380...0x1039d, 0x103a0...0x103c3, 0x103c8...0x103cf, 0x103d1...0x103d5, 0x10400...0x1049d, 0x104b0...0x104d3, 0x104d8...0x104fb, 0x10500...0x10527, 0x10530...0x10563, 0x10600...0x10736, 0x10740...0x10755, 0x10760...0x10767, 0x10800...0x10805, 0x10808...0x10808, 0x1080a...0x10835, 0x10837...0x10838, 0x1083c...0x1083c, 0x1083f...0x10855, 0x10860...0x10876, 0x10880...0x1089e, 0x108e0...0x108f2, 0x108f4...0x108f5, 0x10900...0x10915, 0x10920...0x10939, 0x10980...0x109b7, 0x109be...0x109bf, 0x10a00...0x10a00, 0x10a10...0x10a13, 0x10a15...0x10a17, 0x10a19...0x10a35, 0x10a60...0x10a7c, 0x10a80...0x10a9c, 0x10ac0...0x10ac7, 0x10ac9...0x10ae4, 0x10b00...0x10b35, 0x10b40...0x10b55, 0x10b60...0x10b72, 0x10b80...0x10b91, 0x10c00...0x10c48, 0x10c80...0x10cb2, 0x10cc0...0x10cf2, 0x10d00...0x10d23, 0x10e80...0x10ea9, 0x10eb0...0x10eb1, 0x10f00...0x10f1c, 0x10f27...0x10f27, 0x10f30...0x10f45, 0x10fb0...0x10fc4, 0x10fe0...0x10ff6, 0x11003...0x11037, 0x11083...0x110af, 0x110d0...0x110e8, 0x11103...0x11126, 0x11144...0x11144, 0x11147...0x11147, 0x11150...0x11172, 0x11176...0x11176, 0x11183...0x111b2, 0x111c1...0x111c4, 0x111da...0x111da, 0x111dc...0x111dc, 0x11200...0x11211, 0x11213...0x1122b, 0x11280...0x11286, 0x11288...0x11288, 0x1128a...0x1128d, 0x1128f...0x1129d, 0x1129f...0x112a8, 0x112b0...0x112de, 0x11305...0x1130c, 0x1130f...0x11310, 0x11313...0x11328, 0x1132a...0x11330, 0x11332...0x11333, 0x11335...0x11339, 0x1133d...0x1133d, 0x11350...0x11350, 0x1135d...0x11361, 0x11400...0x11434, 0x11447...0x1144a, 0x1145f...0x11461, 0x11480...0x114af, 0x114c4...0x114c5, 0x114c7...0x114c7, 0x11580...0x115ae, 0x115d8...0x115db, 0x11600...0x1162f, 0x11644...0x11644, 0x11680...0x116aa, 0x116b8...0x116b8, 0x11700...0x1171a, 0x11800...0x1182b, 0x118a0...0x118df, 0x118ff...0x11906, 0x11909...0x11909, 0x1190c...0x11913, 0x11915...0x11916, 0x11918...0x1192f, 0x1193f...0x1193f, 0x11941...0x11941, 0x119a0...0x119a7, 0x119aa...0x119d0, 0x119e1...0x119e1, 0x119e3...0x119e3, 0x11a00...0x11a00, 0x11a0b...0x11a32, 0x11a3a...0x11a3a, 0x11a50...0x11a50, 0x11a5c...0x11a89, 0x11a9d...0x11a9d, 0x11ac0...0x11af8, 0x11c00...0x11c08, 0x11c0a...0x11c2e, 0x11c40...0x11c40, 0x11c72...0x11c8f, 0x11d00...0x11d06, 0x11d08...0x11d09, 0x11d0b...0x11d30, 0x11d46...0x11d46, 0x11d60...0x11d65, 0x11d67...0x11d68, 0x11d6a...0x11d89, 0x11d98...0x11d98, 0x11ee0...0x11ef2, 0x11fb0...0x11fb0, 0x12000...0x12399, 0x12400...0x1246e, 0x12480...0x12543, 0x13000...0x1342e, 0x14400...0x14646, 0x16800...0x16a38, 0x16a40...0x16a5e, 0x16ad0...0x16aed, 0x16b00...0x16b2f, 0x16b40...0x16b43, 0x16b63...0x16b77, 0x16b7d...0x16b8f, 0x16e40...0x16e7f, 0x16f00...0x16f4a, 0x16f50...0x16f50, 0x16f93...0x16f9f, 0x16fe0...0x16fe1, 0x16fe3...0x16fe3, 0x17000...0x187f7, 0x18800...0x18cd5, 0x18d00...0x18d08, 0x1b000...0x1b11e, 0x1b150...0x1b152, 0x1b164...0x1b167, 0x1b170...0x1b2fb, 0x1bc00...0x1bc6a, 0x1bc70...0x1bc7c, 0x1bc80...0x1bc88, 0x1bc90...0x1bc99, 0x1d400...0x1d454, 0x1d456...0x1d49c, 0x1d49e...0x1d49f, 0x1d4a2...0x1d4a2, 0x1d4a5...0x1d4a6, 0x1d4a9...0x1d4ac, 0x1d4ae...0x1d4b9, 0x1d4bb...0x1d4bb, 0x1d4bd...0x1d4c3, 0x1d4c5...0x1d505, 0x1d507...0x1d50a, 0x1d50d...0x1d514, 0x1d516...0x1d51c, 0x1d51e...0x1d539, 0x1d53b...0x1d53e, 0x1d540...0x1d544, 0x1d546...0x1d546, 0x1d54a...0x1d550, 0x1d552...0x1d6a5, 0x1d6a8...0x1d6c0, 0x1d6c2...0x1d6da, 0x1d6dc...0x1d6fa, 0x1d6fc...0x1d714, 0x1d716...0x1d734, 0x1d736...0x1d74e, 0x1d750...0x1d76e, 0x1d770...0x1d788, 0x1d78a...0x1d7a8, 0x1d7aa...0x1d7c2, 0x1d7c4...0x1d7cb, 0x1e100...0x1e12c, 0x1e137...0x1e13d, 0x1e14e...0x1e14e, 0x1e2c0...0x1e2eb, 0x1e800...0x1e8c4, 0x1e900...0x1e943, 0x1e94b...0x1e94b, 0x1ee00...0x1ee03, 0x1ee05...0x1ee1f, 0x1ee21...0x1ee22, 0x1ee24...0x1ee24, 0x1ee27...0x1ee27, 0x1ee29...0x1ee32, 0x1ee34...0x1ee37, 0x1ee39...0x1ee39, 0x1ee3b...0x1ee3b, 0x1ee42...0x1ee42, 0x1ee47...0x1ee47, 0x1ee49...0x1ee49, 0x1ee4b...0x1ee4b, 0x1ee4d...0x1ee4f, 0x1ee51...0x1ee52, 0x1ee54...0x1ee54, 0x1ee57...0x1ee57, 0x1ee59...0x1ee59, 0x1ee5b...0x1ee5b, 0x1ee5d...0x1ee5d, 0x1ee5f...0x1ee5f, 0x1ee61...0x1ee62, 0x1ee64...0x1ee64, 0x1ee67...0x1ee6a, 0x1ee6c...0x1ee72, 0x1ee74...0x1ee77, 0x1ee79...0x1ee7c, 0x1ee7e...0x1ee7e, 0x1ee80...0x1ee89, 0x1ee8b...0x1ee9b, 0x1eea1...0x1eea3, 0x1eea5...0x1eea9, 0x1eeab...0x1eebb, 0x20000...0x2a6dd, 0x2a700...0x2b734, 0x2b740...0x2b81d, 0x2b820...0x2cea1, 0x2ceb0...0x2ebe0, 0x2f800...0x2fa1d, 0x30000...0x3134a => true, + else => false, + }, + }; + } + + pub inline fn isIdentifierPart(codepoint: i32) bool { + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '0'...'9', '$', '_' => true, + else => switch (codepoint) { + 0x30...0x39, 0x41...0x5a, 0x5f...0x5f, 0x61...0x7a, 0xaa...0xaa, 0xb5...0xb5, 0xb7...0xb7, 0xba...0xba, 0xc0...0xd6, 0xd8...0xf6, 0xf8...0x2c1, 0x2c6...0x2d1, 0x2e0...0x2e4, 0x2ec...0x2ec, 0x2ee...0x2ee, 0x300...0x374, 0x376...0x377, 0x37a...0x37d, 0x37f...0x37f, 0x386...0x38a, 0x38c...0x38c, 0x38e...0x3a1, 0x3a3...0x3f5, 0x3f7...0x481, 0x483...0x487, 0x48a...0x52f, 0x531...0x556, 0x559...0x559, 0x560...0x588, 0x591...0x5bd, 0x5bf...0x5bf, 0x5c1...0x5c2, 0x5c4...0x5c5, 0x5c7...0x5c7, 0x5d0...0x5ea, 0x5ef...0x5f2, 0x610...0x61a, 0x620...0x669, 0x66e...0x6d3, 0x6d5...0x6dc, 0x6df...0x6e8, 0x6ea...0x6fc, 0x6ff...0x6ff, 0x710...0x74a, 0x74d...0x7b1, 0x7c0...0x7f5, 0x7fa...0x7fa, 0x7fd...0x7fd, 0x800...0x82d, 0x840...0x85b, 0x860...0x86a, 0x8a0...0x8b4, 0x8b6...0x8c7, 0x8d3...0x8e1, 0x8e3...0x963, 0x966...0x96f, 0x971...0x983, 0x985...0x98c, 0x98f...0x990, 0x993...0x9a8, 0x9aa...0x9b0, 0x9b2...0x9b2, 0x9b6...0x9b9, 0x9bc...0x9c4, 0x9c7...0x9c8, 0x9cb...0x9ce, 0x9d7...0x9d7, 0x9dc...0x9dd, 0x9df...0x9e3, 0x9e6...0x9f1, 0x9fc...0x9fc, 0x9fe...0x9fe, 0xa01...0xa03, 0xa05...0xa0a, 0xa0f...0xa10, 0xa13...0xa28, 0xa2a...0xa30, 0xa32...0xa33, 0xa35...0xa36, 0xa38...0xa39, 0xa3c...0xa3c, 0xa3e...0xa42, 0xa47...0xa48, 0xa4b...0xa4d, 0xa51...0xa51, 0xa59...0xa5c, 0xa5e...0xa5e, 0xa66...0xa75, 0xa81...0xa83, 0xa85...0xa8d, 0xa8f...0xa91, 0xa93...0xaa8, 0xaaa...0xab0, 0xab2...0xab3, 0xab5...0xab9, 0xabc...0xac5, 0xac7...0xac9, 0xacb...0xacd, 0xad0...0xad0, 0xae0...0xae3, 0xae6...0xaef, 0xaf9...0xaff, 0xb01...0xb03, 0xb05...0xb0c, 0xb0f...0xb10, 0xb13...0xb28, 0xb2a...0xb30, 0xb32...0xb33, 0xb35...0xb39, 0xb3c...0xb44, 0xb47...0xb48, 0xb4b...0xb4d, 0xb55...0xb57, 0xb5c...0xb5d, 0xb5f...0xb63, 0xb66...0xb6f, 0xb71...0xb71, 0xb82...0xb83, 0xb85...0xb8a, 0xb8e...0xb90, 0xb92...0xb95, 0xb99...0xb9a, 0xb9c...0xb9c, 0xb9e...0xb9f, 0xba3...0xba4, 0xba8...0xbaa, 0xbae...0xbb9, 0xbbe...0xbc2, 0xbc6...0xbc8, 0xbca...0xbcd, 0xbd0...0xbd0, 0xbd7...0xbd7, 0xbe6...0xbef, 0xc00...0xc0c, 0xc0e...0xc10, 0xc12...0xc28, 0xc2a...0xc39, 0xc3d...0xc44, 0xc46...0xc48, 0xc4a...0xc4d, 0xc55...0xc56, 0xc58...0xc5a, 0xc60...0xc63, 0xc66...0xc6f, 0xc80...0xc83, 0xc85...0xc8c, 0xc8e...0xc90, 0xc92...0xca8, 0xcaa...0xcb3, 0xcb5...0xcb9, 0xcbc...0xcc4, 0xcc6...0xcc8, 0xcca...0xccd, 0xcd5...0xcd6, 0xcde...0xcde, 0xce0...0xce3, 0xce6...0xcef, 0xcf1...0xcf2, 0xd00...0xd0c, 0xd0e...0xd10, 0xd12...0xd44, 0xd46...0xd48, 0xd4a...0xd4e, 0xd54...0xd57, 0xd5f...0xd63, 0xd66...0xd6f, 0xd7a...0xd7f, 0xd81...0xd83, 0xd85...0xd96, 0xd9a...0xdb1, 0xdb3...0xdbb, 0xdbd...0xdbd, 0xdc0...0xdc6, 0xdca...0xdca, 0xdcf...0xdd4, 0xdd6...0xdd6, 0xdd8...0xddf, 0xde6...0xdef, 0xdf2...0xdf3, 0xe01...0xe3a, 0xe40...0xe4e, 0xe50...0xe59, 0xe81...0xe82, 0xe84...0xe84, 0xe86...0xe8a, 0xe8c...0xea3, 0xea5...0xea5, 0xea7...0xebd, 0xec0...0xec4, 0xec6...0xec6, 0xec8...0xecd, 0xed0...0xed9, 0xedc...0xedf, 0xf00...0xf00, 0xf18...0xf19, 0xf20...0xf29, 0xf35...0xf35, 0xf37...0xf37, 0xf39...0xf39, 0xf3e...0xf47, 0xf49...0xf6c, 0xf71...0xf84, 0xf86...0xf97, 0xf99...0xfbc, 0xfc6...0xfc6, 0x1000...0x1049, 0x1050...0x109d, 0x10a0...0x10c5, 0x10c7...0x10c7, 0x10cd...0x10cd, 0x10d0...0x10fa, 0x10fc...0x1248, 0x124a...0x124d, 0x1250...0x1256, 0x1258...0x1258, 0x125a...0x125d, 0x1260...0x1288, 0x128a...0x128d, 0x1290...0x12b0, 0x12b2...0x12b5, 0x12b8...0x12be, 0x12c0...0x12c0, 0x12c2...0x12c5, 0x12c8...0x12d6, 0x12d8...0x1310, 0x1312...0x1315, 0x1318...0x135a, 0x135d...0x135f, 0x1369...0x1371, 0x1380...0x138f, 0x13a0...0x13f5, 0x13f8...0x13fd, 0x1401...0x166c, 0x166f...0x167f, 0x1681...0x169a, 0x16a0...0x16ea, 0x16ee...0x16f8, 0x1700...0x170c, 0x170e...0x1714, 0x1720...0x1734, 0x1740...0x1753, 0x1760...0x176c, 0x176e...0x1770, 0x1772...0x1773, 0x1780...0x17d3, 0x17d7...0x17d7, 0x17dc...0x17dd, 0x17e0...0x17e9, 0x180b...0x180d, 0x1810...0x1819, 0x1820...0x1878, 0x1880...0x18aa, 0x18b0...0x18f5, 0x1900...0x191e, 0x1920...0x192b, 0x1930...0x193b, 0x1946...0x196d, 0x1970...0x1974, 0x1980...0x19ab, 0x19b0...0x19c9, 0x19d0...0x19da, 0x1a00...0x1a1b, 0x1a20...0x1a5e, 0x1a60...0x1a7c, 0x1a7f...0x1a89, 0x1a90...0x1a99, 0x1aa7...0x1aa7, 0x1ab0...0x1abd, 0x1abf...0x1ac0, 0x1b00...0x1b4b, 0x1b50...0x1b59, 0x1b6b...0x1b73, 0x1b80...0x1bf3, 0x1c00...0x1c37, 0x1c40...0x1c49, 0x1c4d...0x1c7d, 0x1c80...0x1c88, 0x1c90...0x1cba, 0x1cbd...0x1cbf, 0x1cd0...0x1cd2, 0x1cd4...0x1cfa, 0x1d00...0x1df9, 0x1dfb...0x1f15, 0x1f18...0x1f1d, 0x1f20...0x1f45, 0x1f48...0x1f4d, 0x1f50...0x1f57, 0x1f59...0x1f59, 0x1f5b...0x1f5b, 0x1f5d...0x1f5d, 0x1f5f...0x1f7d, 0x1f80...0x1fb4, 0x1fb6...0x1fbc, 0x1fbe...0x1fbe, 0x1fc2...0x1fc4, 0x1fc6...0x1fcc, 0x1fd0...0x1fd3, 0x1fd6...0x1fdb, 0x1fe0...0x1fec, 0x1ff2...0x1ff4, 0x1ff6...0x1ffc, 0x203f...0x2040, 0x2054...0x2054, 0x2071...0x2071, 0x207f...0x207f, 0x2090...0x209c, 0x20d0...0x20dc, 0x20e1...0x20e1, 0x20e5...0x20f0, 0x2102...0x2102, 0x2107...0x2107, 0x210a...0x2113, 0x2115...0x2115, 0x2118...0x211d, 0x2124...0x2124, 0x2126...0x2126, 0x2128...0x2128, 0x212a...0x2139, 0x213c...0x213f, 0x2145...0x2149, 0x214e...0x214e, 0x2160...0x2188, 0x2c00...0x2c2e, 0x2c30...0x2c5e, 0x2c60...0x2ce4, 0x2ceb...0x2cf3, 0x2d00...0x2d25, 0x2d27...0x2d27, 0x2d2d...0x2d2d, 0x2d30...0x2d67, 0x2d6f...0x2d6f, 0x2d7f...0x2d96, 0x2da0...0x2da6, 0x2da8...0x2dae, 0x2db0...0x2db6, 0x2db8...0x2dbe, 0x2dc0...0x2dc6, 0x2dc8...0x2dce, 0x2dd0...0x2dd6, 0x2dd8...0x2dde, 0x2de0...0x2dff, 0x3005...0x3007, 0x3021...0x302f, 0x3031...0x3035, 0x3038...0x303c, 0x3041...0x3096, 0x3099...0x309f, 0x30a1...0x30ff, 0x3105...0x312f, 0x3131...0x318e, 0x31a0...0x31bf, 0x31f0...0x31ff, 0x3400...0x4dbf, 0x4e00...0x9ffc, 0xa000...0xa48c, 0xa4d0...0xa4fd, 0xa500...0xa60c, 0xa610...0xa62b, 0xa640...0xa66f, 0xa674...0xa67d, 0xa67f...0xa6f1, 0xa717...0xa71f, 0xa722...0xa788, 0xa78b...0xa7bf, 0xa7c2...0xa7ca, 0xa7f5...0xa827, 0xa82c...0xa82c, 0xa840...0xa873, 0xa880...0xa8c5, 0xa8d0...0xa8d9, 0xa8e0...0xa8f7, 0xa8fb...0xa8fb, 0xa8fd...0xa92d, 0xa930...0xa953, 0xa960...0xa97c, 0xa980...0xa9c0, 0xa9cf...0xa9d9, 0xa9e0...0xa9fe, 0xaa00...0xaa36, 0xaa40...0xaa4d, 0xaa50...0xaa59, 0xaa60...0xaa76, 0xaa7a...0xaac2, 0xaadb...0xaadd, 0xaae0...0xaaef, 0xaaf2...0xaaf6, 0xab01...0xab06, 0xab09...0xab0e, 0xab11...0xab16, 0xab20...0xab26, 0xab28...0xab2e, 0xab30...0xab5a, 0xab5c...0xab69, 0xab70...0xabea, 0xabec...0xabed, 0xabf0...0xabf9, 0xac00...0xd7a3, 0xd7b0...0xd7c6, 0xd7cb...0xd7fb, 0xf900...0xfa6d, 0xfa70...0xfad9, 0xfb00...0xfb06, 0xfb13...0xfb17, 0xfb1d...0xfb28, 0xfb2a...0xfb36, 0xfb38...0xfb3c, 0xfb3e...0xfb3e, 0xfb40...0xfb41, 0xfb43...0xfb44, 0xfb46...0xfbb1, 0xfbd3...0xfd3d, 0xfd50...0xfd8f, 0xfd92...0xfdc7, 0xfdf0...0xfdfb, 0xfe00...0xfe0f, 0xfe20...0xfe2f, 0xfe33...0xfe34, 0xfe4d...0xfe4f, 0xfe70...0xfe74, 0xfe76...0xfefc, 0xff10...0xff19, 0xff21...0xff3a, 0xff3f...0xff3f, 0xff41...0xff5a, 0xff65...0xffbe, 0xffc2...0xffc7, 0xffca...0xffcf, 0xffd2...0xffd7, 0xffda...0xffdc, 0x10000...0x1000b, 0x1000d...0x10026, 0x10028...0x1003a, 0x1003c...0x1003d, 0x1003f...0x1004d, 0x10050...0x1005d, 0x10080...0x100fa, 0x10140...0x10174, 0x101fd...0x101fd, 0x10280...0x1029c, 0x102a0...0x102d0, 0x102e0...0x102e0, 0x10300...0x1031f, 0x1032d...0x1034a, 0x10350...0x1037a, 0x10380...0x1039d, 0x103a0...0x103c3, 0x103c8...0x103cf, 0x103d1...0x103d5, 0x10400...0x1049d, 0x104a0...0x104a9, 0x104b0...0x104d3, 0x104d8...0x104fb, 0x10500...0x10527, 0x10530...0x10563, 0x10600...0x10736, 0x10740...0x10755, 0x10760...0x10767, 0x10800...0x10805, 0x10808...0x10808, 0x1080a...0x10835, 0x10837...0x10838, 0x1083c...0x1083c, 0x1083f...0x10855, 0x10860...0x10876, 0x10880...0x1089e, 0x108e0...0x108f2, 0x108f4...0x108f5, 0x10900...0x10915, 0x10920...0x10939, 0x10980...0x109b7, 0x109be...0x109bf, 0x10a00...0x10a03, 0x10a05...0x10a06, 0x10a0c...0x10a13, 0x10a15...0x10a17, 0x10a19...0x10a35, 0x10a38...0x10a3a, 0x10a3f...0x10a3f, 0x10a60...0x10a7c, 0x10a80...0x10a9c, 0x10ac0...0x10ac7, 0x10ac9...0x10ae6, 0x10b00...0x10b35, 0x10b40...0x10b55, 0x10b60...0x10b72, 0x10b80...0x10b91, 0x10c00...0x10c48, 0x10c80...0x10cb2, 0x10cc0...0x10cf2, 0x10d00...0x10d27, 0x10d30...0x10d39, 0x10e80...0x10ea9, 0x10eab...0x10eac, 0x10eb0...0x10eb1, 0x10f00...0x10f1c, 0x10f27...0x10f27, 0x10f30...0x10f50, 0x10fb0...0x10fc4, 0x10fe0...0x10ff6, 0x11000...0x11046, 0x11066...0x1106f, 0x1107f...0x110ba, 0x110d0...0x110e8, 0x110f0...0x110f9, 0x11100...0x11134, 0x11136...0x1113f, 0x11144...0x11147, 0x11150...0x11173, 0x11176...0x11176, 0x11180...0x111c4, 0x111c9...0x111cc, 0x111ce...0x111da, 0x111dc...0x111dc, 0x11200...0x11211, 0x11213...0x11237, 0x1123e...0x1123e, 0x11280...0x11286, 0x11288...0x11288, 0x1128a...0x1128d, 0x1128f...0x1129d, 0x1129f...0x112a8, 0x112b0...0x112ea, 0x112f0...0x112f9, 0x11300...0x11303, 0x11305...0x1130c, 0x1130f...0x11310, 0x11313...0x11328, 0x1132a...0x11330, 0x11332...0x11333, 0x11335...0x11339, 0x1133b...0x11344, 0x11347...0x11348, 0x1134b...0x1134d, 0x11350...0x11350, 0x11357...0x11357, 0x1135d...0x11363, 0x11366...0x1136c, 0x11370...0x11374, 0x11400...0x1144a, 0x11450...0x11459, 0x1145e...0x11461, 0x11480...0x114c5, 0x114c7...0x114c7, 0x114d0...0x114d9, 0x11580...0x115b5, 0x115b8...0x115c0, 0x115d8...0x115dd, 0x11600...0x11640, 0x11644...0x11644, 0x11650...0x11659, 0x11680...0x116b8, 0x116c0...0x116c9, 0x11700...0x1171a, 0x1171d...0x1172b, 0x11730...0x11739, 0x11800...0x1183a, 0x118a0...0x118e9, 0x118ff...0x11906, 0x11909...0x11909, 0x1190c...0x11913, 0x11915...0x11916, 0x11918...0x11935, 0x11937...0x11938, 0x1193b...0x11943, 0x11950...0x11959, 0x119a0...0x119a7, 0x119aa...0x119d7, 0x119da...0x119e1, 0x119e3...0x119e4, 0x11a00...0x11a3e, 0x11a47...0x11a47, 0x11a50...0x11a99, 0x11a9d...0x11a9d, 0x11ac0...0x11af8, 0x11c00...0x11c08, 0x11c0a...0x11c36, 0x11c38...0x11c40, 0x11c50...0x11c59, 0x11c72...0x11c8f, 0x11c92...0x11ca7, 0x11ca9...0x11cb6, 0x11d00...0x11d06, 0x11d08...0x11d09, 0x11d0b...0x11d36, 0x11d3a...0x11d3a, 0x11d3c...0x11d3d, 0x11d3f...0x11d47, 0x11d50...0x11d59, 0x11d60...0x11d65, 0x11d67...0x11d68, 0x11d6a...0x11d8e, 0x11d90...0x11d91, 0x11d93...0x11d98, 0x11da0...0x11da9, 0x11ee0...0x11ef6, 0x11fb0...0x11fb0, 0x12000...0x12399, 0x12400...0x1246e, 0x12480...0x12543, 0x13000...0x1342e, 0x14400...0x14646, 0x16800...0x16a38, 0x16a40...0x16a5e, 0x16a60...0x16a69, 0x16ad0...0x16aed, 0x16af0...0x16af4, 0x16b00...0x16b36, 0x16b40...0x16b43, 0x16b50...0x16b59, 0x16b63...0x16b77, 0x16b7d...0x16b8f, 0x16e40...0x16e7f, 0x16f00...0x16f4a, 0x16f4f...0x16f87, 0x16f8f...0x16f9f, 0x16fe0...0x16fe1, 0x16fe3...0x16fe4, 0x16ff0...0x16ff1, 0x17000...0x187f7, 0x18800...0x18cd5, 0x18d00...0x18d08, 0x1b000...0x1b11e, 0x1b150...0x1b152, 0x1b164...0x1b167, 0x1b170...0x1b2fb, 0x1bc00...0x1bc6a, 0x1bc70...0x1bc7c, 0x1bc80...0x1bc88, 0x1bc90...0x1bc99, 0x1bc9d...0x1bc9e, 0x1d165...0x1d169, 0x1d16d...0x1d172, 0x1d17b...0x1d182, 0x1d185...0x1d18b, 0x1d1aa...0x1d1ad, 0x1d242...0x1d244, 0x1d400...0x1d454, 0x1d456...0x1d49c, 0x1d49e...0x1d49f, 0x1d4a2...0x1d4a2, 0x1d4a5...0x1d4a6, 0x1d4a9...0x1d4ac, 0x1d4ae...0x1d4b9, 0x1d4bb...0x1d4bb, 0x1d4bd...0x1d4c3, 0x1d4c5...0x1d505, 0x1d507...0x1d50a, 0x1d50d...0x1d514, 0x1d516...0x1d51c, 0x1d51e...0x1d539, 0x1d53b...0x1d53e, 0x1d540...0x1d544, 0x1d546...0x1d546, 0x1d54a...0x1d550, 0x1d552...0x1d6a5, 0x1d6a8...0x1d6c0, 0x1d6c2...0x1d6da, 0x1d6dc...0x1d6fa, 0x1d6fc...0x1d714, 0x1d716...0x1d734, 0x1d736...0x1d74e, 0x1d750...0x1d76e, 0x1d770...0x1d788, 0x1d78a...0x1d7a8, 0x1d7aa...0x1d7c2, 0x1d7c4...0x1d7cb, 0x1d7ce...0x1d7ff, 0x1da00...0x1da36, 0x1da3b...0x1da6c, 0x1da75...0x1da75, 0x1da84...0x1da84, 0x1da9b...0x1da9f, 0x1daa1...0x1daaf, 0x1e000...0x1e006, 0x1e008...0x1e018, 0x1e01b...0x1e021, 0x1e023...0x1e024, 0x1e026...0x1e02a, 0x1e100...0x1e12c, 0x1e130...0x1e13d, 0x1e140...0x1e149, 0x1e14e...0x1e14e, 0x1e2c0...0x1e2f9, 0x1e800...0x1e8c4, 0x1e8d0...0x1e8d6, 0x1e900...0x1e94b, 0x1e950...0x1e959, 0x1ee00...0x1ee03, 0x1ee05...0x1ee1f, 0x1ee21...0x1ee22, 0x1ee24...0x1ee24, 0x1ee27...0x1ee27, 0x1ee29...0x1ee32, 0x1ee34...0x1ee37, 0x1ee39...0x1ee39, 0x1ee3b...0x1ee3b, 0x1ee42...0x1ee42, 0x1ee47...0x1ee47, 0x1ee49...0x1ee49, 0x1ee4b...0x1ee4b, 0x1ee4d...0x1ee4f, 0x1ee51...0x1ee52, 0x1ee54...0x1ee54, 0x1ee57...0x1ee57, 0x1ee59...0x1ee59, 0x1ee5b...0x1ee5b, 0x1ee5d...0x1ee5d, 0x1ee5f...0x1ee5f, 0x1ee61...0x1ee62, 0x1ee64...0x1ee64, 0x1ee67...0x1ee6a, 0x1ee6c...0x1ee72, 0x1ee74...0x1ee77, 0x1ee79...0x1ee7c, 0x1ee7e...0x1ee7e, 0x1ee80...0x1ee89, 0x1ee8b...0x1ee9b, 0x1eea1...0x1eea3, 0x1eea5...0x1eea9, 0x1eeab...0x1eebb, 0x1fbf0...0x1fbf9, 0x20000...0x2a6dd, 0x2a700...0x2b734, 0x2b740...0x2b81d, 0x2b820...0x2cea1, 0x2ceb0...0x2ebe0, 0x2f800...0x2fa1d, 0x30000...0x3134a, 0xe0100...0xe01ef => true, + else => false, + }, + }; + } +}; + +test "isIdentifier" { + Bitset.init(); + + const expect = std.testing.expect; + try expect(!Bitset.isIdentifierStart(0x2029)); + try expect(!Bitset.isIdentifierStart(0x2028)); + try expect(!Bitset.isIdentifier("\\u2028")); + try expect(!Bitset.isIdentifier("\\u2029")); + + try expect(!Bitset.isIdentifierPart(':')); + try expect(!Bitset.isIdentifier("javascript:")); + + try expect(Bitset.isIdentifier("javascript")); + + try expect(!Bitset.isIdentifier(":2")); + try expect(!Bitset.isIdentifier("2:")); + try expect(Bitset.isIdentifier("$")); + try expect(!Bitset.isIdentifier("$:")); + + try expect(Bitset.isIdentifier("ಠ_ಠ")); +} + +// ----- The benchmark ------ + +const std = @import("std"); + +const part_codepoints_slice: []const i32 = &start_codepoints; +const start_codepoints_slice: []const i32 = &part_codepoints; + +pub const HashTable = struct { + var starts: std.AutoHashMap(i32, void) = undefined; + var parts: std.AutoHashMap(i32, void) = undefined; + + pub fn isIdentifierStart(codepoint: i32) bool { + if (codepoint > 255) return starts.contains(codepoint); + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '$', '_' => true, + else => false, + }; + } + + pub fn isIdentifierPart(codepoint: i32) bool { + if (codepoint > 255) return parts.contains(codepoint); + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '0'...'9', '$', '_' => true, + else => false, + }; + } + + pub fn init(allocator: *std.mem.Allocator) !void { + starts = std.AutoHashMap(i32, void).init(allocator); + parts = std.AutoHashMap(i32, void).init(allocator); + + var i: i32 = 0; + var j: i32 = 0; + + while (i < start_codepoints.len) : (i += 2) { + j = start_codepoints[i]; + while (j <= start_codepoints[i + 1]) : (j += 1) { + try starts.put(j, void{}); + } + } + i = 0; + while (i < part_codepoints.len) : (i += 2) { + j = part_codepoints[i]; + while (j <= part_codepoints[i + 1]) : (j += 1) { + try parts.put(j, void{}); + } + } + } +}; + +pub const BinarySearch = struct { + + // "lookupInUnicodeMap" in TypeScript + // esbuild does something similar + fn search(comptime map: []const i32, code: i32) bool { + // Bail out quickly if it couldn't possibly be in the map. + if (code < map[0]) { + return false; + } + + // Perform binary search in one of the Unicode range maps + var lo: i32 = 0; + var hi: i32 = map.len; + var mid: i32 = undefined; + + while (lo + 1 < hi) { + mid = lo + (hi - lo) / 2; + // mid has to be even to catch a range's beginning + mid -= mid % 2; + if (map[mid] <= code and code <= map[mid + 1]) { + return true; + } + if (code < map[mid]) { + hi = mid; + } else { + lo = mid + 2; + } + } + + return false; + } + + // https://source.chromium.org/chromium/v8/v8.git/+/master:src/strings/char-predicates-inl.h;l=133 + pub fn isIdentifierStart(codepoint: i32) bool { + if (codepoint > 255) return search(start_codepoints_slice, codepoint); + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '$', '_' => true, + else => false, + }; + } + + pub fn isIdentifierPart(codepoint: i32) bool { + if (codepoint > 255) return search(part_codepoints_slice, codepoint); + return switch (codepoint) { + 'A'...'Z', 'a'...'z', '0'...'9', '$', '_' => true, + else => false, + }; + } +}; + +const unicode_text: []const u8 = + \\ + \\_a["" + "constructor"] = 133 /* ConstructorKeyword */, + \\_a.debugger = 87 /* DebuggerKeyword */, + \\_a.declare = 134 /* DeclareKeyword */, + \\_a.default = 88 /* DefaultKeyword */, + \\_a.delete = 89 /* DeleteKeyword */, + \\_a.do = 90 /* DoKeyword */, + \\_a.else = 91 /* ElseKeyword */, + \\_a.enum = 92 /* EnumKeyword */, + \\_a.export = 93 /* ExportKeyword */, + \\_a.extends = 94 /* ExtendsKeyword */, + \\_a.false = 95 /* FalseKeyword */, + \\_a.finally = 96 /* FinallyKeyword */, + \\_a.for = 97 /* ForKeyword */, + \\_a.from = 154 /* FromKeyword */, + \\_a.function = 98 /* FunctionKeyword */, + \\_a.get = 135 /* GetKeyword */, + \\_a.if = 99 /* IfKeyword */, + \\_a.implements = 117 /* ImplementsKeyword */, + \\_a.import = 100 /* ImportKeyword */, + \\_a.in = 101 /* InKeyword */, + \\_a.infer = 136 /* InferKeyword */, + \\_a.instanceof = 102 /* InstanceOfKeyword */, + \\_a.interface = 118 /* InterfaceKeyword */, + \\_a.intrinsic = 137 /* IntrinsicKeyword */, + \\_a.is = 138 /* IsKeyword */, + \\_a.keyof = 139 /* KeyOfKeyword */, + \\_a.let = 119 /* LetKeyword */, + \\_a.module = 140 /* ModuleKeyword */, + \\_a.namespace = 141 /* NamespaceKeyword */, + \\_a.never = 142 /* NeverKeyword */, + \\_a.new = 103 /* NewKeyword */, + \\_a.null = 104 /* NullKeyword */, + \\_a.number = 145 /* NumberKeyword */, + \\_a.object = 146 /* ObjectKeyword */, + \\_a.package = 120 /* PackageKeyword */, + \\_a.private = 121 /* PrivateKeyword */, + \\_a.protected = 122 /* ProtectedKeyword */, + \\_a.public = 123 /* PublicKeyword */, + \\_a.override = 157 /* OverrideKeyword */, + \\_a.readonly = 143 /* ReadonlyKeyword */, + \\_a.require = 144 /* RequireKeyword */, + \\_a.global = 155 /* GlobalKeyword */, + \\_a.return = 105 /* ReturnKeyword */, + \\_a.set = 147 /* SetKeyword */, + \\_a.static = 124 /* StaticKeyword */, + \\_a.string = 148 /* StringKeyword */, + \\_a.super = 106 /* SuperKeyword */, + \\_a.switch = 107 /* SwitchKeyword */, + \\_a.symbol = 149 /* SymbolKeyword */, + \\_a.this = 108 /* ThisKeyword */, + \\_a.throw = 109 /* ThrowKeyword */, + \\_a.true = 110 /* TrueKeyword */, + \\_a.try = 111 /* TryKeyword */, + \\_a.type = 150 /* TypeKeyword */, + \\_a.typeof = 112 /* TypeOfKeyword */, + \\_a.undefined = 151 /* UndefinedKeyword */, + \\_a.unique = 152 /* UniqueKeyword */, + \\_a.unknown = 153 /* UnknownKeyword */, + \\_a.var = 113 /* VarKeyword */, + \\_a.void = 114 /* VoidKeyword */, + \\_a.while = 115 /* WhileKeyword */, + \\_a.with = 116 /* WithKeyword */, + \\_a.yield = 125 /* YieldKeyword */, + \\_a.async = 130 /* AsyncKeyword */, + \\_a.await = 131 /* AwaitKeyword */, + \\_a.of = 158 /* OfKeyword */, + \\_a); + \\var textToKeyword = new ts.Map(ts.getEntries(ts.textToKeywordObj)); + \\var textToToken = new ts.Map(ts.getEntries(__assign(__assign({}, ts.textToKeywordObj), { "{": 18 /* OpenBraceToken */, "}": 19 /* CloseBraceToken */, "(": 20 /* OpenParenToken */, ")": 21 /* CloseParenToken */, "[": 22 /* OpenBracketToken */, "]": 23 /* CloseBracketToken */, ".": 24 /* DotToken */, "...": 25 /* DotDotDotToken */, ";": 26 /* SemicolonToken */, ",": 27 /* CommaToken */, "<": 29 /* LessThanToken */, ">": 31 /* GreaterThanToken */, "<=": 32 /* LessThanEqualsToken */, ">=": 33 /* GreaterThanEqualsToken */, "==": 34 /* EqualsEqualsToken */, "!=": 35 /* ExclamationEqualsToken */, "===": 36 /* EqualsEqualsEqualsToken */, "!==": 37 /* ExclamationEqualsEqualsToken */, "=>": 38 /* EqualsGreaterThanToken */, "+": 39 /* PlusToken */, "-": 40 /* MinusToken */, "**": 42 /* AsteriskAsteriskToken */, "*": 41 /* AsteriskToken */, "/": 43 /* SlashToken */, "%": 44 /* PercentToken */, "++": 45 /* PlusPlusToken */, "--": 46 /* MinusMinusToken */, "<<": 47 /* LessThanLessThanToken */, "</": 30 /* LessThanSlashToken */, ">>": 48 /* GreaterThanGreaterThanToken */, ">>>": 49 /* GreaterThanGreaterThanGreaterThanToken */, "&": 50 /* AmpersandToken */, "|": 51 /* BarToken */, "^": 52 /* CaretToken */, "!": 53 /* ExclamationToken */, "~": 54 /* TildeToken */, "&&": 55 /* AmpersandAmpersandToken */, "||": 56 /* BarBarToken */, "?": 57 /* QuestionToken */, "??": 60 /* QuestionQuestionToken */, "?.": 28 /* QuestionDotToken */, ":": 58 /* ColonToken */, "=": 63 /* EqualsToken */, "+=": 64 /* PlusEqualsToken */, "-=": 65 /* MinusEqualsToken */, "*=": 66 /* AsteriskEqualsToken */, "**=": 67 /* AsteriskAsteriskEqualsToken */, "/=": 68 /* SlashEqualsToken */, "%=": 69 /* PercentEqualsToken */, "<<=": 70 /* LessThanLessThanEqualsToken */, ">>=": 71 /* GreaterThanGreaterThanEqualsToken */, ">>>=": 72 /* GreaterThanGreaterThanGreaterThanEqualsToken */, "&=": 73 /* AmpersandEqualsToken */, "|=": 74 /* BarEqualsToken */, "^=": 78 /* CaretEqualsToken */, "||=": 75 /* BarBarEqualsToken */, "&&=": 76 /* AmpersandAmpersandEqualsToken */, "??=": 77 /* QuestionQuestionEqualsToken */, "@": 59 /* AtToken */, "#": 62 /* HashToken */, "`": 61 /* BacktickToken */ }))); + \\/* + \\As per ECMAScript Language Specification 3th Edition, Section 7.6: Identifiers + \\IdentifierStart :: + \\Can contain Unicode 3.0.0 categories: + \\Uppercase letter (Lu), + \\Lowercase letter (Ll), + \\Titlecase letter (Lt), + \\Modifier letter (Lm), + \\Other letter (Lo), or + \\Letter number (Nl). + \\IdentifierPart :: = + \\Can contain IdentifierStart + Unicode 3.0.0 categories: + \\Non-spacing mark (Mn), + \\Combining spacing mark (Mc), + \\Decimal number (Nd), or + \\Connector punctuation (Pc). + \\ + \\Codepoint ranges for ES3 Identifiers are extracted from the Unicode 3.0.0 specification at: + \\http://www.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.txt + \\*/ + \\var unicodeES3IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,]; + \\var unicodeES3IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,]; + \\/* + \\As per ECMAScript Language Specification 5th Edition, Section 7.6: ISyntaxToken Names and Identifiers + \\IdentifierStart :: + \\Can contain Unicode 6.2 categories: + \\Uppercase letter (Lu), + \\Lowercase letter (Ll), + \\Titlecase letter (Lt), + \\Modifier letter (Lm), + \\Other letter (Lo), or + \\Letter number (Nl). + \\IdentifierPart ::㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ + \\Can contain IdentifierStart + Unicode 6.2 categories: + \\Non-spacing mark (Mn), + \\Combining spacing mark (Mc), + \\Decimal number (Nd), + \\Connector punctuation (Pc), + \\<ZWNJ>, or + \\<ZWJ>. + \\ + \\Codepoint ranges for ES5 Identifiers are extracted from the Unicode 6.2 specification at: + \\http://www.unicode.org/Public/6.2.0/ucd/UnicodeData.txt + \\*/ + \\var unicodeES5IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,]; + \\var unicodeES5IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,]; + \\/** + \\* Generated by scripts/regenerate-unicode-identifier-parts.js on node v12.4.0 with unicode 12.1 + \\* based on http://www.unicode.org/reports/tr31/ and https://www.ecma-international.org/ecma-262/6.0/#sec-names-and-keywords + \\* unicodeESNextIdentifierSt💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 art corresponds to the ID_Start and Other_ID_Start property, and + \\* unicodeESNextIdentifierPart corresponds to ID_Continue, Other_ID_Continue, plus ID_Start and Other_ID_Start + \\*/ + \\var unicodeESNextIdentifierStart = [65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2208, 2228, 2230, 2237, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12443, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69376, 69404, 69415, 69415, 69424, 69445, 69600, 69622, 69635, 69687, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70751, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71680, 71723, 71840, 71903, 71935, 71935, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 123136, 123180, 123191, 123197, 123214, 123214, 123584, 123627, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101]; + \\var unicodeESNextIdentifierPart = [48, 57, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 183, 183, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2208, 2228, 2230, 2237, 2259, 2273, 2275, 2403, 2406, 2415, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2556, 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2809, 2815, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3168, 3171, 3174, 3183, 3200, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3328, 3331, 3333, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402, 3406, 3412, 3415, 3423, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4969, 4977, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6618, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6832, 6845, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7673, 7675, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42737, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43047, 43072, 43123, 43136, 43205, 43216, 43225, 43232, 43255, 43259, 43259, 43261, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43488, 43518, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66378, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66720, 66729, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108, 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68903, 68912, 68921, 69376, 69404, 69415, 69415, 69424, 69456, 69600, 69622, 69632, 69702, 69734, 69743, 69759, 69818, 69840, 69864, 69872, 69881, 69888, 69940, 69942, 69951, 69956, 69958, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70096, 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70206, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70384, 70393, 70400, 70403, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480, 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70656, 70730, 70736, 70745, 70750, 70751, 70784, 70853, 70855, 70855, 70864, 70873, 71040, 71093, 71096, 71104, 71128, 71133, 71168, 71232, 71236, 71236, 71248, 71257, 71296, 71352, 71360, 71369, 71424, 71450, 71453, 71467, 71472, 71481, 71680, 71738, 71840, 71913, 71935, 71935, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263, 72263, 72272, 72345, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72758, 72760, 72768, 72784, 72793, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971, 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73040, 73049, 73056, 73061, 73063, 73064, 73066, 73102, 73104, 73105, 73107, 73112, 73120, 73129, 73440, 73462, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92768, 92777, 92880, 92909, 92912, 92916, 92928, 92982, 92992, 92995, 93008, 93017, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123136, 123180, 123184, 123197, 123200, 123209, 123214, 123214, 123584, 123641, 124928, 125124, 125136, 125142, 125184, 125259, 125264, 125273, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 917760, 917999]; + \\/** + \\* Test for whether a single line comment with leading whitespace trimmed's text contains a directive. + \\*/ + \\var commentDirectiveRegExSingleLine = /^\/\/\/?\s*@(ts-expect-error|ts-ignore)/; + \\/** + \\* Test for whether a multi-line comment with leading whitespace trimmed's last line contains a directive. + \\*/ + \\var commentDirectiveRegExMultiLine = /^(?:\/|\*)*\s*@(ts-expect-error|ts-ignore)/; + \\ /** @deprecated Use `factory.updateTaggedTemplate` or the factory supplied by your transformation context instead. */ + \\ ts.updateTaggedTemplate = ts.Debug.deprecate(function updateTaggedTemplate(node, tag, typeArgumentsOrTemplate, template) { + \\ var typeArguments; + \\ if (template) { + \\ typeArguments = typeArgumentsOrTemplate; + \\ } + \\ else { + \\ template = typeArgumentsOrTemplate; + \\ } + \\ return ts.factory.updateTaggedTemplateExpression(node, tag, typeArguments, template); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.updateBinary` or the factory supplied by your transformation context instead. */ + \\ ts.updateBinary = ts.Debug.deprecate(function updateBinary(node, left, right, operator) { + \\ if (operator === void 0) { operator = node.operatorToken; } + \\ if (typeof operator === "number") { + \\ operator = operator === node.operatorToken.kind ? node.operatorToken : ts.factory.createToken(operator); + \\ } + \\ return ts.factory.updateBinaryExpression(node, left, operator, right); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createConditional` or the factory supplied by your transformation context instead. */ + \\ ts.createConditional = ts.Debug.deprecate(function createConditional(condition, questionTokenOrWhenTrue, whenTrueOrWhenFalse, colonToken, whenFalse) { + \\ return arguments.length === 5 ? ts.factory.createCondit 🤎💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 ionalExpression(condition, questionTokenOrWhenTrue, whenTrueOrWhenFalse, colonToken, whenFalse) : + \\ arguments.length === 3 ? ts.factory.createConditionalExpression(condition, ts.factory.createToken(57 /* QuestionToken */), questionTokenOrWhenTrue, ts.factory.createToken(58 /* ColonToken */), whenTrueOrWhenFalse) : + \\ ts.Debug.fail("Argument count mismatch"); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createYield` or the factory supplied by your transformation context instead. */ + \\ ts.createYield = ts.Debug.deprecate(function createYield(asteriskTokenOrExpression, expression) { + \\ var asteriskToken; + \\ if (expression) { + \\ asteriskToken = asteriskTokenOrExpression; + \\ } + \\ else { + \\ expression = asteriskTokenOrExpression; + \\ } + \\ return ts.factory.createYieldExpre 🤎💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 ssion(asteriskToken, expression); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createClassExpression` or the factory supplied by your transformation context instead. */ + \\ ts.createClassExpression = ts.Debug.deprecate(function createClassExpression(modifiers, name, typeParameters, heritageClauses, members) { + \\ return ts.factory.createClassExpression(/*decorators*/ undefined, modifiers, name, typeParameters, heritageClauses, members); + \\ }, factoryDeprecation); 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ + \\ /** @deprecated Use `factory.updateClassExpression` or the factory supplied by your transformation context instead. */ + \\ ts.updateClassExpression = ts.Debug.deprecate(function updateClassExpression(node, modifiers, name, typeParameters, heritageClauses, members) { + \\ return ts.factory.updateClassExpression(node, /*decorato 🤎💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 rs*/ undefined, modifiers, name, typeParameters, heritageClauses, members); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createPropertySignature` or the factory supplied by your transformation context instead. */ + \\ ts.createPropertySignature = ts.Debug.deprecate(function createPropertySignature(modifiers, name, questionToken, type, initializer) { + \\ var node = ts.factory.createPropertySignature(modifiers, name, questionToken, type); + \\ node.initializer = initializer; + \\ return node; + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.updatePropertySignature` or the factory supplied by your transformation context instead. */ + \\ ts.updatePropertySignature = ts.Debug.deprecate(function updatePropertySignature(node, modifiers, name, questionToken, type, initializer) { + \\ var updated = ts.factory.updatePropertySignature(node, modifiers, name, questionToken, type); + \\ if (node.initia 💛 💚 💙 💜 🖤 🤍 🤎 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 lizer !== initializer) { + \\ if (updated === node) { + \\ updated = ts 💚 💙 💜 🖤 🤍 🤎 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 .factory.cloneNode(node); + \\ } + \\ updated.ini ` 💛 💚 💙 💜 🖤 🤍 🤎 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 tializer = initializer; + \\ } + \\ return updated;⏏ ♀ 💚 💙 💜 🖤 🤍 🤎📢 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 ♂ ⚕ ♾️ + \\ }, factoryDeprecation 💛 💚 💙 💜 🖤 🤍🕞 💛⏏ ♀ ♂ ⚕ ♾️ + \\ /** @deprecated Use⏏ ♀ 💚 💙 💜 🖤 🤍 🤎📢 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 ♂ ⚕ ♾️ + \\ ts.createExpression ` 💛 💚 💙 💜 🖤 🤍 🤎💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 Wi 💛⏏ ♀ ♂ ⚕ ♾️ + \\ return ts.factory⏏ 💚 💙 💜 🖤 🤍 🤎 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 ♀ ♂ ⚕ ♾️ + \\ }, factoryDeprecation 💛⏏ ♀ ♂ ⚕ ♾️ + \\ /** @deprecated Use⏏ ♀ ♂ ⚕ ♾️ + \\ ts.updateExpressionWi 💛⏏ ♀ ♂ ⚕ ♾️ + \\ }, factoryDeprecation);👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ /** @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead. */👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ ts.createArrowFunction = ts.Debug.deprecate(function createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) { + \\ return arguments.length === 6 ? ts.factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) : + \\ arguments.length === 5 ? ts.factory.createA 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 rrowFunction(modifiers, typeParamete👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ }, factoryDeprecation); 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 + \\ /** @deprecated Use `factory.updateArrowFunction` o 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍 ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 r the factory supplied by your transformation context instead. */ + \\ ts.updateArrowFunction = ts.Debug.deprecate(functio 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 n updateArrowFunction(node, modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) { + \\ return arguments.length === 7 ? ts.factory.upda 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 teArrowFunction(node, modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) : + \\ arguments.length === 6 ? ts.factory.updateA 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 rrowFunction(node, modifiers, typeParameters, parameters, type, node.equalsGreaterThanToken, equalsGreaterThanTokenOrBody) : + \\ ts.Debug.fail("Argument count mismatch" 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 + \\ 💔 ❣️ 💕 💞 💓 + \\ 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 + \\💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 );👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽eDeclaration(name, exclamationTokenOrType, typeOrInitializer, initializer) { + \\ return arguments.length === 4 ? ts.factory.createVariableDeclaration(name, exclamationTokenOrType, typeOrInitializer, initializer) :👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ argu💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 ments.length >= 1 && arguments.length <= 3 ? ts.factory.createVariableDeclaration(name, /*exclamationToken*/ undefined, exclamationTokenOrType, typeOrInitializer) : + \\ ts.Debug.fail("Argument count mismatch");👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.updateVariableDeclaration` or the factory supplied by your transformation context instead. */👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ return arguments.length === 5 ? ts.factory.updateVariableDeclaration(node, name, exclamationTokenOrType, typeOrInitializer, initializer) : + \\ arguments.length === 4 ? ts.factory.updateVariableDeclaration(node, name, node.exclamationToken, exclamationTokenOrType, typeOrInitializer) :👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ ts.Debug.fail("Argument count mismatch"); + \\ }, factoryDeprecation); + \\ 😀 😃 😄 😁 😆 🤩 😅 😂 🤣 ☺️ 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 😥 🤤 😭 😓 😪 😴 🥱 🙄 🤨 🧐 🤔 🤫 🤭 🤥 😬 🤐 🤢 🤮 🤧 😷 🤒 🤕 😈 👿 👹 👺 💩 👻 💀 ☠️ 👽 👾 🤖 🎃 😺 😸 😹 😻 😼 😽 🙀 😿 😾 👐 🙌 👏 🙏 🤲 🤝 👍 👎 👊 ✊ 🤛 🤜 🤞 ✌️ 🤘 🤏 👌 👈 👉 👆 👇 ☝️ ✋ 🤚 🖐 🖖 👋 🤙 💪 🖕 🤟 ✍️ 🤳 💅 🖖 💄 💋 👄 👅 👂 🦻 👃 🦵 🦶 🦾 🦿 👣 👁 👀 🗣 👤 👥 👶 👦 👧 🧒 👨 👩 🧑 👱♀️ 👱 🧔 👴 👵 🧓 👲 👳♀️ 👳 🧕 👮♀️ 👮 👷♀️ 👷 💂♀️ 💂 🕵️♀️ 🕵️ 👩⚕️ 👨⚕️ 👩🌾 👨🌾 👩🍳 👨🍳 👩🎓 👨🎓 👩🎤 👨🎤 👩🏫 👨🏫 👩🏭 👨🏭 👩💻 👨💻 👩💼 👨💼 👩🔧 👨🔧 👩🔬 👨🔬 👩🎨 👨🎨 👩🚒 👨🚒 👩✈️ 👨✈️ 👩🚀 👨🚀 👩⚖️ 👨⚖️ 🤶 🎅 👸 🤴 👰 🤵 👼 🤰 🤱 🙇♀️ 🙇 💁 💁♂️ 🙅 🙅♂️ 🙆 🙆♂️ 🙋 🙋♂️ 🤦♀️ 🤦♂️ 🤷♀️ 🤷♂️ 🙎 🙎♂️ 🙍 🙍♂️ 💇 💇♂️ 💆 💆♂️ 🧖♀️ 🧖♂️ 🧏 🧏♂️ 🧏♀️ 🧙♀️ 🧙♂️ 🧛♀️ 🧛♂️ 🧟♀️ 🧟♂️ 🧚♀️ 🧚♂️ 🧜♀️ 🧜♂️ 🧝♀️ 🧝♂️ 🧞♀️ 🧞♂️ 🕴 💃 🕺 👯 👯♂️ 🚶♀️ 🚶 🏃♀️ 🏃 🧍 🧍♂️ 🧍♀️ 🧎 🧎♂️ 🧎♀️ 👨🦯 👩🦯 👨🦼 👩🦼 👨🦽 👩🦽 🧑🤝🧑 👫 👭 👬 💑 👩❤️👩 👨❤️👨 💏 👩❤️💋👩 👨❤️💋👨 👪 👨👩👧 👨👩👧👦 👨👩👦👦 👨👩👧👧 👩👩👦 👩👩👧 👩👩👧👦 👩👩👦👦 👩👩👧👧 👨👨👦 👨👨👧 👨👨👧👦 👨👨👦👦 👨👨👧👧 👩👦 👩👧 👩👧👦 👩👦👦 👩👧👧 👨👦 👨👧 👨👧👦 👨👦👦 👨👧👧 👚 👕 👖 👔 👗 👙 👘 👠 👡 👢 👞 👟 👒 🎩 🎓 👑 ⛑ 🎒 👝 👛 👜 💼 👓 🕶 🤿 🌂 ☂️ 🧣 🧤 🧥 🦺 🥻 🩱 🩲 🩳 🩰 🧦 🧢 ⛷ 🏂 🏋️♀️ 🏋️ 🤺 🤼♀️ 🤼♂️ 🤸♀️ 🤸♂️ ⛹️♀️ ⛹️ 🤾♀️ 🤾♂️ 🏌️♀️ 🏌️ 🏄♀️ 🏄 🏊♀️ 🏊 🤽♀️ 🤽♂️ 🚣♀️ 🚣 🏇 🚴♀️ 🚴 🚵♀️ 🚵 🤹♀️ 🤹♂️ 🧗♀️ 🧗♂️ 🧘♀️ 🧘♂️ 🥰 🥵 🥶 🥳 🥴 🥺 🦸 🦹 🧑🦰 🧑🦱 🧑🦳 🧑🦲 🧑⚕️ 🧑🎓 🧑🏫 🧑⚖️ 🧑🌾 🧑🍳 🧑🔧 🧑🏭 🧑💼 🧑🔬 🧑💻 🧑🎤 🧑🎨 🧑✈️ 🧑🚀 🧑🚒 🧑🦯 🧑🦼 🧑🦽 🦰 🦱 🦲 🦳 + \\ /** @deprecated Use `factory.createImportClause` or the factory supplied by your transformation context instead. */ + \\ ts.createImportClause = ts.Debug.deprecate(function createImportClause(name, namedBindings, isTypeOnly) {👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ return ts.factory.createImportClause(isTypeOnly, name, namedBindings); + \\ }, factoryDeprecation);👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽ry supplied by your transformation context instead. */ + \\ ts.updateImportClause = ts.Debug.deprecate(function updateImportClause(node, name, namedBindings, isTypeOnly) { + \\ return ts.factory.updateImportClause(node, isTypeOnly, name, namedBindings); + \\ }, factoryDeprecation);👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ /** @deprecated Use `factory.createExportDeclaration` or the factory supplied by your transformation context instead. */👨🏿🎤 👩🏿🏫 👨🏿🏫 👩🏿🏭 👨🏿🏭 👩🏿💻 👨🏿💻 👩🏿💼 👨🏿💼 👩🏿🔧 👨🏿🔧 👩🏿🔬 👨🏿🔬 👩🏿🎨 👨🏿🎨 👩🏿🚒 👨🏿🚒 👩🏿✈️ 👨🏿✈️ 👩🏿🚀 👨🏿🚀 👩🏿⚖️ 👨🏿⚖️ 🤶🏿 🎅🏿 👸🏿 🤴🏿 👰🏿 🤵🏿 👼🏿 🤰🏿 🙇🏿♀️ 🙇🏿 💁🏿 💁🏿♂️ 🙅🏿 🙅🏿♂️ 🙆🏿 🙆🏿♂️ 🙋🏿 🙋🏿♂️ 🤦🏿♀️ 🤦🏿♂️ 🤷🏿♀️ 🤷🏿♂️ 🙎🏿 🙎🏿♂️ 🙍🏿 🙍🏿♂️ 💇🏿 💇🏿♂️ 💆🏿 💆🏿♂️ 🕴🏿 💃🏿 🕺🏿 🚶🏿♀️ 🚶🏿 🏃🏿♀️ 🏃🏿 🏋🏿♀️ 🏋🏿 🤸🏿♀️ 🤸🏿♂️ ⛹🏿♀️ ⛹🏿 🤾🏿♀️ 🤾🏿♂️ 🏌🏿♀️ 🏌🏿 🏄🏿♀️ 🏄🏿 🏊🏿♀️ 🏊🏿 🤽🏿♀️ 🤽🏿♂️ 🚣🏿♀️ 🚣🏿 🏇🏿 🚴🏿♀️ 🚴🏿 🚵🏿♀️ 🚵🏿 🤹🏿♀️ 🤹🏿♂️ 🛀🏿 🧒🏿 🧑🏿 🧓🏿 🧕🏿 🧔🏿 🤱🏿 🧙🏿♀️ 🧙🏿♂️ 🧚🏿♀️ 🧚🏿♂️ 🧛🏿♀️ 🧛🏿♂️ 🧜🏿♀️ 🧜🏿♂️ 🧝🏿♀️ 🧝🏿♂️ 🧖🏿♀️ 🧖🏿♂️ 🧗🏿♀️ 🧗🏿♂️ 🧘🏿♀️ 🧘🏿♂️ 🤟🏿 🤲🏿 💏🏿 💑🏿 🤏🏿 🦻🏿 🧏🏿 🧏🏿♂️ 🧏🏿♀️ 🧍🏿 🧍🏿♂️ 🧍🏿♀️ 🧎🏿 🧎🏿♂️ 🧎🏿♀️ 👨🏿🦯 👩🏿🦯 👨🏿🦼 👩🏿🦼 👨🏿🦽 👩🏿🦽 🧑🏿🤝🧑🏿 🧑🏿🦰 🧑🏿🦱 🧑🏿🦳 🧑🏿🦲 🧑🏿⚕️ 🧑🏿🎓 🧑🏿🏫 🧑🏿⚖️ 🧑🏿🌾 🧑🏿🍳 🧑🏿🔧 🧑🏿🏭 🧑🏿💼 🧑🏿🔬 🧑🏿💻 🧑🏿🎤 🧑🏿🎨 🧑🏿✈️ 🧑🏿🚀 🧑🏿🚒 🧑🏿🦯 🧑🏿🦼 🧑🏿🦽 + \\ ts.createExportDeclaration = ts.Debug.deprecate(function createExportDeclaration(decorators, modifiers, exportClause, moduleSpecifier, isTypeOnly) { + \\ if (isTypeOnly === void 0) { isTypeOnly = false; } + \\ return ts.factory.createExportDeclaration(decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier);😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.updateExportDeclaration` or the factory supplied by your transformation context instead. */ + \\ ts.updateEx 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍portDeclaration = ts.Debug.deprecate(function updateExportDeclaration(node, decorators, modifiers, exportClause, moduleSpecifier, isTypeOnly) { + \\ return ts.factory.updateExportDeclaration(node, decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier); + \\ }, factory 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍Deprecation); + \\ /** @deprecated Use `factory.createJSDocParameterTag` or the factory supplied by your transformation context instead. */ + \\ ts.createJSDocPar 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍amTag = ts.Debug 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍.deprecate(function createJSDocParamTag(name, isBracketed, typeExpression, comment) { + \\ return ts.factory.createJSDocParameterTag(/*tagName*/ undefined, name, isBracketed, typeExpression, /*isNameFirst*/ false, comment ? ts.factory.createNodeArray([ts.factory.createJSDocText(comment)]) : undefivned); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createComma` or the factory supplied by your transformation context instead. */ + \\ ts.createComma = ts.Debug.deprecate(function createComma(left, right) { + \\ return ts.factory.createComma(left, right); + \\ 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍🐱🏍 }, factoryDeprecation); + \\ /** @deprecated 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍Use `factory.createLessThan` or the factory supplied by your transformation context instead. */ + \\ ts.createLessThan = ts.Debug.deprecate(function createLessThan(left, right) {😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, factoryDeprecation); + \\ /** @ 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍deprecated Use `factory.createAssignment` or the factory supplied by your transformation context instead. */😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ /** @deprecated Use `factory.createStrictEquality` or the factory supplied by your transformation context instead. */ + \\ ts.createStrictEquality = ts.Debug.dep 🐱👤 🐱🚀 🐱🐉 🐱💻 🐱🏍recate(function createStrictEquality(left, right) { + \\ return ts.factory.createStrictEquality(left, right);😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, factoryDeprecation); + \\ /** @deprecated 🐱🐉 🐱💻 🐱👤 🐱🚀Use `factory.createStrictInequality` or the factory supplied by your transformation context instead. */ + \\ ts.createStrictInequality = ts.Debug.deprecate(function createStrictInequality(left, right) { + \\ return ts.factory.createStrictInequality(left, right); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createAdd` or the factory supplied b😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ return ts.factory.createSubtract(left, right); + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createLogicalAnd` or the factory supplied by your transformation context instead. */ + \\ ts.createLogicalAnd = ts.Debug.deprecate(function createLogicalAnd(left, right) { + \\ return ts.factory.createLogicalAnd(left, right);😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, factoryDeprecation); + \\ /** @deprecated Use `factory.createLogicalOr` or the factory supplied by your transformation context instead. */ + \\ ts.createLogicalOr = ts.Debug.deprecate(function createLogicalOr(left, right) {😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ return ts.factory.createLogicalOr(left, right);😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, factoryDeprecation);😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢supplied by your transformation context instead. */ + \\ ts.createPostfixIncrement = ts.Debug.deprecate(function createPostfixIncrement(operand) {😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ return ts.factory.createPostfixIncrement(operand);😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, factoryDeprecation); + \\ /** @deprecated Use an appropriate `factory` method instead. */ + \\ ts.createNode = ts.Debug.deprecate(function createNode(kind, pos, end) { + \\ if (pos === void 0) { pos = 0; }😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢NodeFactory.createBaseSourceFileNode(kind) : + \\ kind === 79 /* Identifier */ ? ts.parseBaseNodeFactory.createBaseIdentifierNode(kind) : + \\ kind === 80 /* PrivateIdentifier */ ? ts.parseBaseNodeFactory.createBasePrivateIdentifierNode(kind) : + \\ !ts.isNodeKind(kind) ? ts.parseBaseNodeFactory.createBaseTokenNode(kind) :😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢a node ~for mutation~ with its `pos`, `end`, and `parent` set. + \\ * + \\ * NOTE: It is unsafe to change any properties of a `Node` that relate to its AST children, as those changes won't be + \\ * captured with respect to transformations. + \\ * + \\ * @deprecated Use an appropriate `factory.update...` method instead, use `setCommentRange` or `setSourceMapRange`, and avoid setting `parent`.😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ ts.setTextRange(clone, node); + \\ ts.setParent(clone, node.parent); + \\ return clone;😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 🤪 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 🤬 😶 😐 😑 😯 😦 😧 😮 😲 😵 🤯 😳 😱 😨 😰 😢 + \\ }, { since: "4.0", warnAfter: "4.1", message: "Use an appropriate `factory.update...` method instead, use `setCommentRange` or `setSourceMapRange`, and avoid setting `parent`." }); + \\ // #endregion Node Factory top-level exports + \\ // DEPRECATION: Renamed node tests + \\ // DEPRECATION PLAN:🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 + \\ // - soft: 4.0 + \\ // - warn: 4.1 + \\ // - error: TBD + \\ // #region Renamed node Tests + \\ /** @deprecated Use `isTypeAssertionExpression` instead. */ + \\ ts.isTypeAssertion = ts.Debug.deprecate(function isTypeAssertion(node) { + \\ return node.kind === 209 /* TypeAssertionExpression */; + \\ }, { + \\ since: "4.0", + \\ warnAfter: "4.1", + \\ message: "Use `isTypeAssertionExpression` instead." + \\ }); + \\ // #endregion + \\ // DEPRECATION: Renamed node tests + \\ // DEPRECATION PLAN: + \\ // - soft: 4.2 + \\ // - warn: 4.3 + \\ // - error: TBD + \\ // #region Renamed node Tests + \\ /** + \\ * @deprecated Use `isMemberName` instead. + \\ */ + \\ ts.isIdentifierOrPrivateIdentifier = ts.Debug.deprecate(function isIdentifierOrPrivateIdentifier(node) { + \\ return ts.isMemberName(node); + \\ }, { + \\ since: "4.2", + \\ warnAfter: "4.3", + \\ message: "Use `isMemberName` instead." + \\ }); + \\ // #endregion Renamed node Tests + \\})(ts || (ts = {})); +; +const ascii_text: []const u8 = + \\ + \\package js_lexer + \\ + \\// The lexer converts a source file to a stream of tokens. Unlike many + \\// compilers, esbuild does not run the lexer to completion before the parser is + \\// started. Instead, the lexer is called repeatedly by the parser as the parser + \\// parses the file. This is because many tokens are context-sensitive and need + \\// high-level information from the parser. Examples are regular expression + \\// literals and JSX elements. + \\// + \\// For efficiency, the text associated with textual tokens is stored in two + \\// separate ways depending on the token. Identifiers use UTF-8 encoding which + \\// allows them to be slices of the input file without allocating extra memory. + \\// Strings use UTF-16 encoding so they can represent unicode surrogates + \\// accurately. + \\ + \\import ( + \\"fmt" + \\"strconv" + \\"strings" + \\"unicode" + \\"unicode/utf8" + \\ + \\"github.com/evanw/esbuild/internal/js_ast" + \\"github.com/evanw/esbuild/internal/logger" + \\) + \\ + \\type T uint + \\ + \\// If you add a new token, remember to add it to "tokenToString" too + \\const ( + \\TEndOfFile T = iota + \\TSyntaxError + \\ + \\// "#!/usr/bin/env node" + \\THashbang + \\ + \\// Literals + \\TNoSubstitutionTemplateLiteral // Contents are in lexer.StringLiteral ([]uint16) + \\TNumericLiteral // Contents are in lexer.Number (float64) + \\TStringLiteral // Contents are in lexer.StringLiteral ([]uint16) + \\TBigIntegerLiteral // Contents are in lexer.Identifier (string) + \\ + \\// Pseudo-literals + \\TTemplateHead // Contents are in lexer.StringLiteral ([]uint16) + \\TTemplateMiddle // Contents are in lexer.StringLiteral ([]uint16) + \\TTemplateTail // Contents are in lexer.StringLiteral ([]uint16) + \\ + \\// Punctuation + \\TAmpersand + \\TAmpersandAmpersand + \\TAsterisk + \\TAsteriskAsterisk + \\TAt + \\TBar + \\TBarBar + \\TCaret + \\TCloseBrace + \\TCloseBracket + \\TCloseParen + \\TColon + \\TComma + \\TDot + \\TDotDotDot + \\TEqualsEquals + \\TEqualsEqualsEquals + \\TEqualsGreaterThan + \\TExclamation + \\TExclamationEquals + \\TExclamationEqualsEquals + \\TGreaterThan + \\TGreaterThanEquals + \\TGreaterThanGreaterThan + \\TGreaterThanGreaterThanGreaterThan + \\TLessThan + \\TLessThanEquals + \\TLessThanLessThan + \\TMinus + \\TMinusMinus + \\TOpenBrace + \\TOpenBracket + \\TOpenParen + \\TPercent + \\TPlus + \\TPlusPlus + \\TQuestion + \\TQuestionDot + \\TQuestionQuestion + \\TSemicolon + \\TSlash + \\TTilde + \\ + \\// Assignments (keep in sync with IsAssign() below) + \\TAmpersandAmpersandEquals + \\TAmpersandEquals + \\TAsteriskAsteriskEquals + \\TAsteriskEquals + \\TBarBarEquals + \\TBarEquals + \\TCaretEquals + \\TEquals + \\TGreaterThanGreaterThanEquals + \\TGreaterThanGreaterThanGreaterThanEquals + \\TLessThanLessThanEquals + \\TMinusEquals + \\TPercentEquals + \\TPlusEquals + \\TQuestionQuestionEquals + \\TSlashEquals + \\ + \\// Class-private fields and methods + \\TPrivateIdentifier + \\ + \\// Identifiers + \\TIdentifier // Contents are in lexer.Identifier (string) + \\TEscapedKeyword // A keyword that has been escaped as an identifer + \\ + \\// Reserved words + \\TBreak + \\TCase + \\TCatch + \\TClass + \\TConst + \\TContinue + \\TDebugger + \\TDefault + \\TDelete + \\TDo + \\TElse + \\TEnum + \\TExport + \\TExtends + \\TFalse + \\TFinally + \\TFor + \\TFunction + \\TIf + \\TImport + \\TIn + \\TInstanceof + \\TNew + \\TNull + \\TReturn + \\TSuper + \\TSwitch + \\TThis + \\TThrow + \\TTrue + \\TTry + \\TTypeof + \\TVar + \\TVoid + \\TWhile + \\TWith + \\) + \\ + \\func (t T) IsAssign() bool { + \\return t >= TAmpersandAmpersandEquals && t <= TSlashEquals + \\} + \\ + \\var Keywords = map[string]T{ + \\// Reserved words + \\"break": TBreak, + \\"case": TCase, + \\"catch": TCatch, + \\"class": TClass, + \\"const": TConst, + \\"continue": TContinue, + \\"debugger": TDebugger, + \\"default": TDefault, + \\"delete": TDelete, + \\"do": TDo, + \\"else": TElse, + \\"enum": TEnum, + \\"export": TExport, + \\"extends": TExtends, + \\"false": TFalse, + \\"finally": TFinally, + \\"for": TFor, + \\"function": TFunction, + \\"if": TIf, + \\"import": TImport, + \\"in": TIn, + \\"instanceof": TInstanceof, + \\"new": TNew, + \\"null": TNull, + \\"return": TReturn, + \\"super": TSuper, + \\"switch": TSwitch, + \\"this": TThis, + \\"throw": TThrow, + \\"true": TTrue, + \\"try": TTry, + \\"typeof": TTypeof, + \\"var": TVar, + \\"void": TVoid, + \\"while": TWhile, + \\"with": TWith, + \\} + \\ + \\var StrictModeReservedWords = map[string]bool{ + \\"implements": true, + \\"interface": true, + \\"let": true, + \\"package": true, + \\"private": true, + \\"protected": true, + \\"public": true, + \\"static": true, + \\"yield": true, + \\} + \\ + \\type json struct { + \\parse bool + \\allowComments bool + \\} + \\ + \\type Lexer struct { + \\log logger.Log + \\source logger.Source + \\tracker logger.LineColumnTracker + \\current int + \\start int + \\end int + \\ApproximateNewlineCount int + \\LegacyOctalLoc logger.Loc + \\AwaitKeywordLoc logger.Loc + \\FnOrArrowStartLoc logger.Loc + \\PreviousBackslashQuoteInJSX logger.Range + \\LegacyHTMLCommentRange logger.Range + \\Token T + \\HasNewlineBefore bool + \\HasPureCommentBefore bool + \\PreserveAllCommentsBefore bool + \\IsLegacyOctalLiteral bool + \\PrevTokenWasAwaitKeyword bool + \\CommentsToPreserveBefore []js_ast.Comment + \\AllOriginalComments []js_ast.Comment + \\codePoint rune + \\Identifier string + \\JSXFactoryPragmaComment logger.Span + \\JSXFragmentPragmaComment logger.Span + \\SourceMappingURL logger.Span + \\Number float64 + \\rescanCloseBraceAsTemplateToken bool + \\forGlobalName bool + \\json json + \\prevErrorLoc logger.Loc + \\ + \\// Escape sequences in string literals are decoded lazily because they are + \\// not interpreted inside tagged templates, and tagged templates can contain + \\// invalid escape sequences. If the decoded array is nil, the encoded value + \\// should be passed to "tryToDecodeEscapeSequences" first. + \\decodedStringLiteralOrNil []uint16 + \\encodedStringLiteralStart int + \\encodedStringLiteralText string + \\ + \\// The log is disabled during speculative scans that may backtrack + \\IsLogDisabled bool + \\} + \\ + \\type LexerPanic struct{} + \\ + \\func NewLexer(log logger.Log, source logger.Source) Lexer { + \\lexer := Lexer{ + \\log: log, + \\source: source, + \\tracker: logger.MakeLineColumnTracker(&source), + \\prevErrorLoc: logger.Loc{Start: -1}, + \\FnOrArrowStartLoc: logger.Loc{Start: -1}, + \\} + \\lexer.step() + \\lexer.Next() + \\return lexer + \\} + \\ + \\func NewLexerGlobalName(log logger.Log, source logger.Source) Lexer { + \\lexer := Lexer{ + \\log: log, + \\source: source, + \\tracker: logger.MakeLineColumnTracker(&source), + \\prevErrorLoc: logger.Loc{Start: -1}, + \\FnOrArrowStartLoc: logger.Loc{Start: -1}, + \\forGlobalName: true, + \\} + \\lexer.step() + \\lexer.Next() + \\return lexer + \\} + \\ + \\func NewLexerJSON(log logger.Log, source logger.Source, allowComments bool) Lexer { + \\lexer := Lexer{ + \\log: log, + \\source: source, + \\tracker: logger.MakeLineColumnTracker(&source), + \\prevErrorLoc: logger.Loc{Start: -1}, + \\FnOrArrowStartLoc: logger.Loc{Start: -1}, + \\json: json{ + \\parse: true, + \\allowComments: allowComments, + \\}, + \\} + \\lexer.step() + \\lexer.Next() + \\return lexer + \\} + \\ + \\func (lexer *Lexer) Loc() logger.Loc { + \\return logger.Loc{Start: int32(lexer.start)} + \\} + \\ + \\func (lexer *Lexer) Range() logger.Range { + \\return logger.Range{Loc: logger.Loc{Start: int32(lexer.start)}, Len: int32(lexer.end - lexer.start)} + \\} + \\ + \\func (lexer *Lexer) Raw() string { + \\return lexer.source.Contents[lexer.start:lexer.end] + \\} + \\ + \\func (lexer *Lexer) StringLiteral() []uint16 { + \\if lexer.decodedStringLiteralOrNil == nil { + \\// Lazily decode escape sequences if needed + \\if decoded, ok, end := lexer.tryToDecodeEscapeSequences(lexer.encodedStringLiteralStart, lexer.encodedStringLiteralText, true /* reportErrors */); !ok { + \\lexer.end = end + \\lexer.SyntaxError() + \\} else { + \\lexer.decodedStringLiteralOrNil = decoded + \\} + \\} + \\return lexer.decodedStringLiteralOrNil + \\} + \\ + \\func (lexer *Lexer) CookedAndRawTemplateContents() ([]uint16, string) { + \\var raw string + \\ + \\switch lexer.Token { + \\case TNoSubstitutionTemplateLiteral, TTemplateTail: + \\// "`x`" or "}x`" + \\raw = lexer.source.Contents[lexer.start+1 : lexer.end-1] + \\ + \\case TTemplateHead, TTemplateMiddle: + \\// "`x${" or "}x${" + \\raw = lexer.source.Contents[lexer.start+1 : lexer.end-2] + \\} + \\ + \\if strings.IndexByte(raw, '\r') != -1 { + \\// From the specification: + \\// + \\// 11.8.6.1 Static Semantics: TV and TRV + \\// + \\// TV excludes the code units of LineContinuation while TRV includes + \\// them. <CR><LF> and <CR> LineTerminatorSequences are normalized to + \\// <LF> for both TV and TRV. An explicit EscapeSequence is needed to + \\// include a <CR> or <CR><LF> sequence. + \\ + \\bytes := []byte(raw) + \\end := 0 + \\i := 0 + \\ + \\for i < len(bytes) { + \\c := bytes[i] + \\i++ + \\ + \\if c == '\r' { + \\// Convert '\r\n' into '\n' + \\if i < len(bytes) && bytes[i] == '\n' { + \\i++ + \\} + \\ + \\// Convert '\r' into '\n' + \\c = '\n' + \\} + \\ + \\bytes[end] = c + \\end++ + \\} + \\ + \\raw = string(bytes[:end]) + \\} + \\ + \\// This will return nil on failure, which will become "undefined" for the tag + \\cooked, _, _ := lexer.tryToDecodeEscapeSequences(lexer.start+1, raw, false /* reportErrors */) + \\return cooked, raw + \\} + \\ + \\func (lexer *Lexer) IsIdentifierOrKeyword() bool { + \\return lexer.Token >= TIdentifier + \\} + \\ + \\func (lexer *Lexer) IsContextualKeyword(text string) bool { + \\return lexer.Token == TIdentifier && lexer.Raw() == text + \\} + \\ + \\func (lexer *Lexer) ExpectContextualKeyword(text string) { + \\if !lexer.IsContextualKeyword(text) { + \\lexer.ExpectedString(fmt.Sprintf("%q", text)) + \\} + \\lexer.Next() + \\} + \\ + \\func (lexer *Lexer) SyntaxError() { + \\loc := logger.Loc{Start: int32(lexer.end)} + \\message := "Unexpected end of file" + \\if lexer.end < len(lexer.source.Contents) { + \\c, _ := utf8.DecodeRuneInString(lexer.source.Contents[lexer.end:]) + \\if c < 0x20 { + \\message = fmt.Sprintf("Syntax error \"\\x%02X\"", c) + \\} else if c >= 0x80 { + \\message = fmt.Sprintf("Syntax error \"\\u{%x}\"", c) + \\} else if c != '"' { + \\message = fmt.Sprintf("Syntax error \"%c\"", c) + \\} else { + \\message = "Syntax error '\"'" + \\} + \\} + \\lexer.addError(loc, message) + \\panic(LexerPanic{}) + \\} + \\ + \\func (lexer *Lexer) ExpectedString(text string) { + \\// Provide a friendly error message about "await" without "async" + \\if lexer.PrevTokenWasAwaitKeyword { + \\var notes []logger.MsgData + \\if lexer.FnOrArrowStartLoc.Start != -1 { + \\note := logger.RangeData(&lexer.tracker, logger.Range{Loc: lexer.FnOrArrowStartLoc}, + \\"Consider adding the \"async\" keyword here") + \\note.Location.Suggestion = "async" + \\notes = []logger.MsgData{note} + \\} + \\lexer.addRangeErrorWithNotes(RangeOfIdentifier(lexer.source, lexer.AwaitKeywordLoc), + \\"\"await\" can only be used inside an \"async\" function", + \\notes) + \\panic(LexerPanic{}) + \\} + \\ + \\found := fmt.Sprintf("%q", lexer.Raw()) + \\if lexer.start == len(lexer.source.Contents) { + \\found = "end of file" + \\} + \\lexer.addRangeError(lexer.Range(), fmt.Sprintf("Expected %s but found %s", text, found)) + \\panic(LexerPanic{}) + \\} + \\ + \\func (lexer *Lexer) Expected(token T) { + \\if text, ok := tokenToString[token]; ok { + \\lexer.ExpectedString(text) + \\} else { + \\lexer.Unexpected() + \\} + \\} + \\ + \\func (lexer *Lexer) Unexpected() { + \\found := fmt.Sprintf("%q", lexer.Raw()) + \\if lexer.start == len(lexer.source.Contents) { + \\found = "end of file" + \\} + \\lexer.addRangeError(lexer.Range(), fmt.Sprintf("Unexpected %s", found)) + \\panic(LexerPanic{}) + \\} + \\ + \\func (lexer *Lexer) Expect(token T) { + \\if lexer.Token != token { + \\lexer.Expected(token) + \\} + \\lexer.Next() + \\} + \\ + \\func (lexer *Lexer) ExpectOrInsertSemicolon() { + \\if lexer.Token == TSemicolon || (!lexer.HasNewlineBefore && + \\lexer.Token != TCloseBrace && lexer.Token != TEndOfFile) { + \\lexer.Expect(TSemicolon) + \\} + \\} + \\func (lexer *Lexer) ExpectLessThan(isInsideJSXElement bool) { + \\switch lexer.Token { + \\case TLessThan: + \\if isInsideJSXElement { + \\lexer.NextInsideJSXElement() + \\} else { + \\lexer.Next() + \\} + \\ + \\case TLessThanEquals: + \\lexer.Token = TEquals + \\lexer.start++ + \\lexer.maybeExpandEquals() + \\ + \\case TLessThanLessThan: + \\lexer.Token = TLessThan + \\lexer.start++ + \\ + \\case TLessThanLessThanEquals: + \\lexer.Token = TLessThanEquals + \\lexer.start++ + \\ + \\default: + \\lexer.Expected(TLessThan) + \\} + \\} + \\ + \\// This parses a single ">" token. If that is the first part of a longer token, + \\// this function splits off the first ">" and leaves the remainder of the + \\// current token as another, smaller token. For example, ">>=" becomes ">=". + \\func (lexer *Lexer) ExpectGreaterThan(isInsideJSXElement bool) { + \\switch lexer.Token { + \\case TGreaterThan: + \\if isInsideJSXElement { + \\lexer.NextInsideJSXElement() + \\} else { + \\lexer.Next() + \\} + \\ + \\case TGreaterThanEquals: + \\lexer.Token = TEquals + \\lexer.start++ + \\lexer.maybeExpandEquals() + \\ + \\case TGreaterThanGreaterThan: + \\lexer.Token = TGreaterThan + \\lexer.start++ + \\ + \\case TGreaterThanGreaterThanEquals: + \\lexer.Token = TGreaterThanEquals + \\lexer.start++ + \\ + \\case TGreaterThanGreaterThanGreaterThan: + \\lexer.Token = TGreaterThanGreaterThan + \\lexer.start++ + \\ + \\case TGreaterThanGreaterThanGreaterThanEquals: + \\lexer.Token = TGreaterThanGreaterThanEquals + \\lexer.start++ + \\ + \\default: + \\lexer.Expected(TGreaterThan) + \\} + \\} + \\ + \\func (lexer *Lexer) maybeExpandEquals() { + \\switch lexer.codePoint { + \\case '>': + \\// "=" + ">" = "=>" + \\lexer.Token = TEqualsGreaterThan + \\lexer.step() + \\ + \\case '=': + \\// "=" + "=" = "==" + \\lexer.Token = TEqualsEquals + \\lexer.step() + \\ + \\if lexer.Token == '=' { + \\// "=" + "==" = "===" + \\lexer.Token = TEqualsEqualsEquals + \\lexer.step() + \\} + \\} + \\} + \\ + \\func IsIdentifier(text string) bool { + \\if len(text) == 0 { + \\return false + \\} + \\for i, codePoint := range text { + \\if i == 0 { + \\if !IsIdentifierStart(codePoint) { + \\return false + \\} + \\} else { + \\if !IsIdentifierContinue(codePoint) { + \\return false + \\} + \\} + \\} + \\return true + \\} + \\ + \\func IsIdentifierES5AndESNext(text string) bool { + \\if len(text) == 0 { + \\return false + \\} + \\for i, codePoint := range text { + \\if i == 0 { + \\if !IsIdentifierStartES5AndESNext(codePoint) { + \\return false + \\} + \\} else { + \\if !IsIdentifierContinueES5AndESNext(codePoint) { + \\return false + \\} + \\} + \\} + \\return true + \\} + \\ + \\func ForceValidIdentifier(text string) string { + \\if IsIdentifier(text) { + \\return text + \\} + \\sb := strings.Builder{} + \\ + \\// Identifier start + \\c, width := utf8.DecodeRuneInString(text) + \\text = text[width:] + \\if IsIdentifierStart(c) { + \\sb.WriteRune(c) + \\} else { + \\sb.WriteRune('_') + \\} + \\ + \\// Identifier continue + \\for text != "" { + \\c, width := utf8.DecodeRuneInString(text) + \\text = text[width:] + \\if IsIdentifierContinue(c) { + \\sb.WriteRune(c) + \\} else { + \\sb.WriteRune('_') + \\} + \\} + \\ + \\return sb.String() + \\} + \\ + \\// This does "IsIdentifier(UTF16ToString(text))" without any allocations + \\func IsIdentifierUTF16(text []uint16) bool { + \\n := len(text) + \\if n == 0 { + \\return false + \\} + \\for i := 0; i < n; i++ { + \\isStart := i == 0 + \\r1 := rune(text[i]) + \\if r1 >= 0xD800 && r1 <= 0xDBFF && i+1 < n { + \\if r2 := rune(text[i+1]); r2 >= 0xDC00 && r2 <= 0xDFFF { + \\r1 = (r1 << 10) + r2 + (0x10000 - (0xD800 << 10) - 0xDC00) + \\i++ + \\} + \\} + \\if isStart { + \\if !IsIdentifierStart(r1) { + \\return false + \\} + \\} else { + \\if !IsIdentifierContinue(r1) { + \\return false + \\} + \\} + \\} + \\return true + \\} + \\ + \\// This does "IsIdentifierES5AndESNext(UTF16ToString(text))" without any allocations + \\func IsIdentifierES5AndESNextUTF16(text []uint16) bool { + \\n := len(text) + \\if n == 0 { + \\return false + \\} + \\for i := 0; i < n; i++ { + \\isStart := i == 0 + \\r1 := rune(text[i]) + \\if r1 >= 0xD800 && r1 <= 0xDBFF && i+1 < n { + \\if r2 := rune(text[i+1]); r2 >= 0xDC00 && r2 <= 0xDFFF { + \\r1 = (r1 << 10) + r2 + (0x10000 - (0xD800 << 10) - 0xDC00) + \\i++ + \\} + \\} + \\if isStart { + \\if !IsIdentifierStartES5AndESNext(r1) { + \\return false + \\} + \\} else { + \\if !IsIdentifierContinueES5AndESNext(r1) { + \\return false + \\} + \\} + \\} + \\return true + \\} + \\ + \\func IsIdentifierStart(codePoint rune) bool { + \\switch codePoint { + \\case '_', '$', + \\'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + \\'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + \\'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + \\'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z': + \\return true + \\} + \\ + \\// All ASCII identifier start code points are listed above + \\if codePoint < 0x7F { + \\return false + \\} + \\ + \\return unicode.Is(idStartES5OrESNext, codePoint) + \\} + \\ + \\func IsIdentifierContinue(codePoint rune) bool { + \\switch codePoint { + \\case '_', '$', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + \\'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + \\'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + \\'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + \\'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z': + \\return true + \\} + \\ + \\// All ASCII identifier start code points are listed above + \\if codePoint < 0x7F { + \\return false + \\} + \\ + \\// ZWNJ and ZWJ are allowed in identifiers + \\if codePoint == 0x200C || codePoint == 0x200D { + \\return true + \\} + \\ + \\return unicode.Is(idContinueES5OrESNext, codePoint) + \\} + \\ + \\func IsIdentifierStartES5AndESNext(codePoint rune) bool { + \\switch codePoint { + \\case '_', '$', + \\'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + \\'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + \\'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + \\'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z': + \\return true + \\} + \\ + \\// All ASCII identifier start code points are listed above + \\if codePoint < 0x7F { + \\return false + \\} + \\ + \\return unicode.Is(idStartES5AndESNext, codePoint) + \\} + \\ + \\func IsIdentifierContinueES5AndESNext(codePoint rune) bool { + \\switch codePoint { + \\case '_', '$', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + \\'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + \\'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + \\'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + \\'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z': + \\return true + \\} + \\ + \\// All ASCII identifier start code points are listed above + \\if codePoint < 0x7F { + \\return false + \\} + \\ + \\// ZWNJ and ZWJ are allowed in identifiers + \\if codePoint == 0x200C || codePoint == 0x200D { + \\return true + \\} + \\ + \\return unicode.Is(idContinueES5AndESNext, codePoint) + \\} + \\ + \\// See the "White Space Code Points" table in the ECMAScript standard + \\func IsWhitespace(codePoint rune) bool { + \\switch codePoint { + \\case + \\'\u0009', // character tabulation + \\'\u000B', // line tabulation + \\'\u000C', // form feed + \\'\u0020', // space + \\'\u00A0', // no-break space + \\ + \\// Unicode "Space_Separator" code points + \\'\u1680', // ogham space mark + \\'\u2000', // en quad + \\'\u2001', // em quad + \\'\u2002', // en space + \\'\u2003', // em space + \\'\u2004', // three-per-em space + \\'\u2005', // four-per-em space + \\'\u2006', // six-per-em space + \\'\u2007', // figure space + \\'\u2008', // punctuation space + \\'\u2009', // thin space + \\'\u200A', // hair space + \\'\u202F', // narrow no-break space + \\'\u205F', // medium mathematical space + \\'\u3000', // ideographic space + \\ + \\'\uFEFF': // zero width non-breaking space + \\return true + \\ + \\default: + \\return false + \\} + \\} + \\ + \\func RangeOfIdentifier(source logger.Source, loc logger.Loc) logger.Range { + \\text := source.Contents[loc.Start:] + \\if len(text) == 0 { + \\return logger.Range{Loc: loc, Len: 0} + \\} + \\ + \\i := 0 + \\c, _ := utf8.DecodeRuneInString(text[i:]) + \\ + \\// Handle private names + \\if c == '#' { + \\i++ + \\c, _ = utf8.DecodeRuneInString(text[i:]) + \\} + \\ + \\if IsIdentifierStart(c) || c == '\\' { + \\// Search for the end of the identifier + \\for i < len(text) { + \\c2, width2 := utf8.DecodeRuneInString(text[i:]) + \\if c2 == '\\' { + \\i += width2 + \\ + \\// Skip over bracketed unicode escapes such as "\u{10000}" + \\if i+2 < len(text) && text[i] == 'u' && text[i+1] == '{' { + \\i += 2 + \\for i < len(text) { + \\if text[i] == '}' { + \\i++ + \\break + \\} + \\i++ + \\} + \\} + \\} else if !IsIdentifierContinue(c2) { + \\return logger.Range{Loc: loc, Len: int32(i)} + \\} else { + \\i += width2 + \\} + \\} + \\} + \\ + \\// When minifying, this identifier may have originally been a string + \\return source.RangeOfString(loc) + \\} + \\ + \\func (lexer *Lexer) ExpectJSXElementChild(token T) { + \\if lexer.Token != token { + \\lexer.Expected(token) + \\} + \\lexer.NextJSXElementChild() + \\} + \\ + \\func (lexer *Lexer) NextJSXElementChild() { + \\lexer.HasNewlineBefore = false + \\originalStart := lexer.end + \\ + \\for { + \\lexer.start = lexer.end + \\lexer.Token = 0 + \\ + \\switch lexer.codePoint { + \\case -1: // This indicates the end of the file + \\lexer.Token = TEndOfFile + \\ + \\case '{': + \\lexer.step() + \\lexer.Token = TOpenBrace + \\ + \\case '<': + \\lexer.step() + \\lexer.Token = TLessThan + \\ + \\default: + \\needsFixing := false + \\ + \\stringLiteral: + \\for { + \\switch lexer.codePoint { + \\case -1: + \\// Reaching the end of the file without a closing element is an error + \\lexer.SyntaxError() + \\ + \\case '&', '\r', '\n', '\u2028', '\u2029': + \\// This needs fixing if it has an entity or if it's a multi-line string + \\needsFixing = true + \\lexer.step() + \\ + \\case '{', '<': + \\// Stop when the string ends + \\break stringLiteral + \\ + \\default: + \\// Non-ASCII strings need the slow path + \\if lexer.codePoint >= 0x80 { + \\needsFixing = true + \\} + \\lexer.step() + \\} + \\} + \\ + \\lexer.Token = TStringLiteral + \\text := lexer.source.Contents[originalStart:lexer.end] + \\ + \\if needsFixing { + \\// Slow path + \\lexer.decodedStringLiteralOrNil = fixWhitespaceAndDecodeJSXEntities(text) + \\ + \\// Skip this token if it turned out to be empty after trimming + \\if len(lexer.decodedStringLiteralOrNil) == 0 { + \\lexer.HasNewlineBefore = true + \\continue + \\} + \\} else { + \\// Fast path + \\n := len(text) + \\copy := make([]uint16, n) + \\for i := 0; i < n; i++ { + \\copy[i] = uint16(text[i]) + \\} + \\lexer.decodedStringLiteralOrNil = copy + \\} + \\} + \\ + \\break + \\} + \\} + \\ + \\func (lexer *Lexer) ExpectInsideJSXElement(token T) { + \\if lexer.Token != token { + \\lexer.Expected(token) + \\} + \\lexer.NextInsideJSXElement() + \\} + \\ + \\func (lexer *Lexer) NextInsideJSXElement() { + \\lexer.HasNewlineBefore = false + \\ + \\for { + \\lexer.start = lexer.end + \\lexer.Token = 0 + \\ + \\switch lexer.codePoint { + \\case -1: // This indicates the end of the file + \\lexer.Token = TEndOfFile + \\ + \\case '\r', '\n', '\u2028', '\u2029': + \\lexer.step() + \\lexer.HasNewlineBefore = true + \\continue + \\ + \\case '\t', ' ': + \\lexer.step() + \\continue + \\ + \\case '.': + \\lexer.step() + \\lexer.Token = TDot + \\ + \\case '=': + \\lexer.step() + \\lexer.Token = TEquals + \\ + \\case '{': + \\lexer.step() + \\lexer.Token = TOpenBrace + \\ + \\case '}': + \\lexer.step() + \\lexer.Token = TCloseBrace + \\ + \\case '<': + \\lexer.step() + \\lexer.Token = TLessThan + \\ + \\case '>': + \\lexer.step() + \\lexer.Token = TGreaterThan + \\ + \\case '/': + \\// '/' or '//' or '/* ... */' + \\lexer.step() + \\switch lexer.codePoint { + \\case '/': + \\singleLineComment: + \\for { + \\lexer.step() + \\switch lexer.codePoint { + \\case '\r', '\n', '\u2028', '\u2029': + \\break singleLineComment + \\ + \\case -1: // This indicates the end of the file + \\break singleLineComment + \\} + \\} + \\continue + \\ + \\case '*': + \\lexer.step() + \\startRange := lexer.Range() + \\multiLineComment: + \\for { + \\switch lexer.codePoint { + \\case '*': + \\lexer.step() + \\if lexer.codePoint == '/' { + \\lexer.step() + \\break multiLineComment + \\} + \\ + \\case '\r', '\n', '\u2028', '\u2029': + \\lexer.step() + \\lexer.HasNewlineBefore = true + \\ + \\case -1: // This indicates the end of the file + \\lexer.start = lexer.end + \\lexer.addErrorWithNotes(lexer.Loc(), "Expected \"*/\" to terminate multi-line comment", + \\[]logger.MsgData{logger.RangeData(&lexer.tracker, startRange, "The multi-line comment starts here")}) + \\panic(LexerPanic{}) + \\ + \\default: + \\lexer.step() + \\} + \\} + \\continue + \\ + \\default: + \\lexer.Token = TSlash + \\} + \\ + \\case '\'', '"': + \\var backslash logger.Range + \\quote := lexer.codePoint + \\needsDecode := false + \\lexer.step() + \\ + \\stringLiteral: + \\for { + \\switch lexer.codePoint { + \\case -1: // This indicates the end of the file + \\lexer.SyntaxError() + \\ + \\case '&': + \\needsDecode = true + \\lexer.step() + \\ + \\case '\\': + \\backslash = logger.Range{Loc: logger.Loc{Start: int32(lexer.end)}, Len: 1} + \\lexer.step() + \\continue + \\ + \\case quote: + \\if backslash.Len > 0 { + \\backslash.Len++ + \\lexer.PreviousBackslashQuoteInJSX = backslash + \\} + \\lexer.step() + \\break stringLiteral + \\ + \\default: + \\// Non-ASCII strings need the slow path + \\if lexer.codePoint >= 0x80 { + \\needsDecode = true + \\} + \\lexer.step() + \\} + \\backslash = logger.Range{} + \\} + \\ + \\lexer.Token = TStringLiteral + \\text := lexer.source.Contents[lexer.start+1 : lexer.end-1] + \\ + \\if needsDecode { + \\// Slow path + \\lexer.decodedStringLiteralOrNil = decodeJSXEntities([]uint16{}, text) + \\} else { + \\// Fast path + \\n := len(text) + \\copy := make([]uint16, n) + \\for i := 0; i < n; i++ { + \\copy[i] = uint16(text[i]) + \\} + \\lexer.decodedStringLiteralOrNil = copy + \\} + \\ + \\default: + \\// Check for unusual whitespace characters + \\if IsWhitespace(lexer.codePoint) { + \\lexer.step() + \\continue + \\} + \\ + \\if IsIdentifierStart(lexer.codePoint) { + \\lexer.step() + \\for IsIdentifierContinue(lexer.codePoint) || lexer.codePoint == '-' { + \\lexer.step() + \\} + \\ + \\// Parse JSX namespaces. These are not supported by React or TypeScript + \\// but someone using JSX syntax in more obscure ways may find a use for + \\// them. A namespaced name is just always turned into a string so you + \\// can't use this feature to reference JavaScript identifiers. + \\if lexer.codePoint == ':' { + \\lexer.step() + \\if IsIdentifierStart(lexer.codePoint) { + \\lexer.step() + \\for IsIdentifierContinue(lexer.codePoint) || lexer.codePoint == '-' { + \\lexer.step() + \\} + \\} else { + \\lexer.addError(logger.Loc{Start: lexer.Range().End()}, + \\fmt.Sprintf("Expected identifier after %q in namespaced JSX name", lexer.Raw())) + \\} + \\} + \\ + \\lexer.Identifier = lexer.Raw() + \\lexer.Token = TIdentifier + \\break + \\} + \\ + \\lexer.end = lexer.current + \\lexer.Token = TSyntaxError + \\} + \\ + \\return + \\} + \\} + \\ + \\func (lexer *Lexer) Next() { + \\lexer.HasNewlineBefore = lexer.end == 0 + \\lexer.HasPureCommentBefore = false + \\lexer.PrevTokenWasAwaitKeyword = false + \\lexer.CommentsToPreserveBefore = nil + \\ + \\for { + \\lexer.start = lexer.end + \\lexer.Token = 0 + \\ + \\switch lexer.codePoint { + \\case -1: // This indicates the end of the file + \\lexer.Token = TEndOfFile + \\ + \\case '#': + \\if lexer.start == 0 && strings.HasPrefix(lexer.source.Contents, "#!") { + \\// "#!/usr/bin/env node" + \\lexer.Token = THashbang + \\hashbang: + \\for { + \\lexer.step() + \\switch lexer.codePoint { + \\case '\r', '\n', '\u2028', '\u2029': + \\break hashbang + \\ + \\case -1: // This indicates the end of the file + \\break hashbang + \\} + \\} + \\lexer.Identifier = lexer.Raw() + \\} else { + \\// "#foo" + \\lexer.step() + \\} +; + +const repeat_count: usize = 1; +const loop_count: usize = 1000; + +pub fn main() anyerror!void { + try HashTable.init(std.heap.c_allocator); + Bitset.init(); + { + + // Ensure that the optimizer doesn't do something fancy with static memory addresses + var code = try std.heap.c_allocator.dupe(u8, unicode_text); + + var iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + var hash_table_count: usize = 0; + var jump_table_count: usize = 0; + var jump_table_elapsed: u64 = 0; + var hash_table_elapsed: u64 = 0; + var binary_search_elapsed: u64 = 0; + var binary_search_count: usize = 0; + var bitset_elapsed: u64 = 0; + var bitset_count: usize = 0; + + // change up the order these run in + var loop_i: usize = 0; + while (loop_i < loop_count) : (loop_i += 1) { + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + hash_table_count = 0; + while (iter.nextCodepoint()) |cp| { + hash_table_count += @as(usize, @boolToInt(HashTable.isIdentifierStart(cp) or HashTable.isIdentifierPart(cp))); + } + } + hash_table_elapsed += timer.read(); + } + + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + jump_table_count = 0; + while (iter.nextCodepoint()) |cp| { + jump_table_count += @as( + usize, + @boolToInt(JumpTable.isIdentifierStart(cp) or JumpTable.isIdentifierPart(cp)), + ); + } + } + jump_table_elapsed += timer.read(); + } + + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + binary_search_count = 0; + while (iter.nextCodepoint()) |cp| { + binary_search_count += @as( + usize, + @boolToInt( + BinarySearch.isIdentifierStart( + cp, + ) or BinarySearch.isIdentifierPart( + cp, + ), + ), + ); + } + } + binary_search_elapsed += timer.read(); + } + + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + bitset_count = 0; + while (iter.nextCodepoint()) |cp| { + bitset_count += @as( + usize, + @boolToInt( + Bitset.isIdentifierStart( + cp, + ) or Bitset.isIdentifierPart( + cp, + ), + ), + ); + } + } + bitset_elapsed += timer.read(); + } + } + + std.debug.print( + \\---- Unicode text ----- + \\ + \\Timings (sum of running {d} times each, lower is better): + \\ + \\ Binary Search : {d}ns + \\ Hash Table : {d}ns + \\ Switch statement : {d}ns + \\ Bitset : {d}ns + \\ + \\Match count (these should be the same): + \\ + \\ Binary Search : {d} + \\ Hash Table : {d} + \\ Switch statement : {d} + \\ Bitset : {d} + \\ + \\ + , + .{ + repeat_count * loop_count, + binary_search_elapsed, + hash_table_elapsed, + jump_table_elapsed, + bitset_elapsed, + + binary_search_count, + hash_table_count, + jump_table_count, + bitset_count, + }, + ); + } + + { + + // Ensure that the optimizer doesn't do something fancy with static memory addresses + var code = try std.heap.c_allocator.dupe(u8, ascii_text); + + var iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + var hash_table_count: usize = 0; + var jump_table_count: usize = 0; + var jump_table_elapsed: u64 = 0; + var hash_table_elapsed: u64 = 0; + var binary_search_elapsed: u64 = 0; + var binary_search_count: usize = 0; + var bitset_count: usize = 0; + var bitset_elapsed: u64 = 0; + + // change up the order these run in + var loop_i: usize = 0; + while (loop_i < loop_count) : (loop_i += 1) { + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + hash_table_count = 0; + while (iter.nextCodepoint()) |cp| { + hash_table_count += @as(usize, @boolToInt(HashTable.isIdentifierStart(cp) or HashTable.isIdentifierPart(cp))); + } + } + hash_table_elapsed += timer.read(); + } + + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + jump_table_count = 0; + while (iter.nextCodepoint()) |cp| { + jump_table_count += @as( + usize, + @boolToInt(JumpTable.isIdentifierStart(cp) or JumpTable.isIdentifierPart(cp)), + ); + } + } + jump_table_elapsed += timer.read(); + } + + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + binary_search_count = 0; + while (iter.nextCodepoint()) |cp| { + binary_search_count += @as( + usize, + @boolToInt( + BinarySearch.isIdentifierStart( + cp, + ) or BinarySearch.isIdentifierPart( + cp, + ), + ), + ); + } + } + binary_search_elapsed += timer.read(); + } + + { + var iteration_i: usize = 0; + var timer = try std.time.Timer.start(); + while (iteration_i < repeat_count) : (iteration_i += 1) { + @setEvalBranchQuota(99999); + iter = std.unicode.Utf8Iterator{ .bytes = code, .i = 0 }; + bitset_count = 0; + while (iter.nextCodepoint()) |cp| { + bitset_count += @as( + usize, + @boolToInt( + Bitset.isIdentifierStart( + cp, + ) or Bitset.isIdentifierPart( + cp, + ), + ), + ); + } + } + bitset_elapsed += timer.read(); + } + } + + { + iter = std.unicode.Utf8Iterator{ .bytes = ascii_text, .i = 0 }; + while (iter.nextCodepoint()) |cp| { + if (cp > 127) std.debug.panic("This is not ASCII at {d}", .{iter.i}); + } + } + + std.debug.print( + \\---- ASCII text ----- + \\ + \\Timings (sum of running {d} times each, lower is better): + \\ + \\ Binary Search : {d}ns + \\ Hash Table : {d}ns + \\ Switch statement : {d}ns + \\ Bitset : {d}ns + \\ + \\Match count (these should be the same): + \\ + \\ Binary Search : {d} + \\ Hash Table : {d} + \\ Switch statement : {d} + \\ Bitset : {d} + \\ + \\ + , + .{ + repeat_count * loop_count, + binary_search_elapsed, + hash_table_elapsed, + jump_table_elapsed, + bitset_elapsed, + + binary_search_count, + hash_table_count, + jump_table_count, + bitset_count, + }, + ); + } +} + +test "Print size of bitset" { + var err = std.io.getStdErr(); + try err.writer().print( + "Size is: {d} + {d}\n", + .{ @sizeOf(@TypeOf(Bitset.id_start)), @sizeOf(@TypeOf(Bitset.id_continue)) }, + ); +} diff --git a/src/js_lexer/unicode.zig b/src/js_lexer/unicode.zig index e142e2206..2331620f0 100644 --- a/src/js_lexer/unicode.zig +++ b/src/js_lexer/unicode.zig @@ -1,8 +1,6 @@ // This file was automatically generated by gen-unicode-table.js. Do not edit. const RangeTable = @import("./range_table.zig"); -const R16Range = RangeTable.R16Range; -const R32Range = RangeTable.R32Range; // ES5 || ESNext pub const id_start = RangeTable.init( @@ -1372,3 +1370,2735 @@ pub const id_continue = RangeTable.init( .{ 0xe0100, 0xe01ef }, }, ); + +pub const printable_id_start = RangeTable.init( + 117, + &[_]R16Range{ + .{ 0x41, 0x5a }, + .{ 0x61, 0x7a }, + .{ 0xaa, 0xaa }, + .{ 0xb5, 0xb5 }, + .{ 0xba, 0xba }, + .{ 0xc0, 0xd6 }, + .{ 0xd8, 0xf6 }, + .{ 0xf8, 0x2c1 }, + .{ 0x2c6, 0x2d1 }, + .{ 0x2e0, 0x2e4 }, + .{ 0x2ec, 0x2ec }, + .{ 0x2ee, 0x2ee }, + .{ 0x370, 0x374 }, + .{ 0x376, 0x377 }, + .{ 0x37a, 0x37d }, + .{ 0x37f, 0x37f }, + .{ 0x386, 0x386 }, + .{ 0x388, 0x38a }, + .{ 0x38c, 0x38c }, + .{ 0x38e, 0x3a1 }, + .{ 0x3a3, 0x3f5 }, + .{ 0x3f7, 0x481 }, + .{ 0x48a, 0x52f }, + .{ 0x531, 0x556 }, + .{ 0x559, 0x559 }, + .{ 0x560, 0x588 }, + .{ 0x5d0, 0x5ea }, + .{ 0x5ef, 0x5f2 }, + .{ 0x620, 0x64a }, + .{ 0x66e, 0x66f }, + .{ 0x671, 0x6d3 }, + .{ 0x6d5, 0x6d5 }, + .{ 0x6e5, 0x6e6 }, + .{ 0x6ee, 0x6ef }, + .{ 0x6fa, 0x6fc }, + .{ 0x6ff, 0x6ff }, + .{ 0x710, 0x710 }, + .{ 0x712, 0x72f }, + .{ 0x74d, 0x7a5 }, + .{ 0x7b1, 0x7b1 }, + .{ 0x7ca, 0x7ea }, + .{ 0x7f4, 0x7f5 }, + .{ 0x7fa, 0x7fa }, + .{ 0x800, 0x815 }, + .{ 0x81a, 0x81a }, + .{ 0x824, 0x824 }, + .{ 0x828, 0x828 }, + .{ 0x840, 0x858 }, + .{ 0x860, 0x86a }, + .{ 0x8a0, 0x8b4 }, + .{ 0x8b6, 0x8c7 }, + .{ 0x904, 0x939 }, + .{ 0x93d, 0x93d }, + .{ 0x950, 0x950 }, + .{ 0x958, 0x961 }, + .{ 0x971, 0x980 }, + .{ 0x985, 0x98c }, + .{ 0x98f, 0x990 }, + .{ 0x993, 0x9a8 }, + .{ 0x9aa, 0x9b0 }, + .{ 0x9b2, 0x9b2 }, + .{ 0x9b6, 0x9b9 }, + .{ 0x9bd, 0x9bd }, + .{ 0x9ce, 0x9ce }, + .{ 0x9dc, 0x9dd }, + .{ 0x9df, 0x9e1 }, + .{ 0x9f0, 0x9f1 }, + .{ 0x9fc, 0x9fc }, + .{ 0xa05, 0xa0a }, + .{ 0xa0f, 0xa10 }, + .{ 0xa13, 0xa28 }, + .{ 0xa2a, 0xa30 }, + .{ 0xa32, 0xa33 }, + .{ 0xa35, 0xa36 }, + .{ 0xa38, 0xa39 }, + .{ 0xa59, 0xa5c }, + .{ 0xa5e, 0xa5e }, + .{ 0xa72, 0xa74 }, + .{ 0xa85, 0xa8d }, + .{ 0xa8f, 0xa91 }, + .{ 0xa93, 0xaa8 }, + .{ 0xaaa, 0xab0 }, + .{ 0xab2, 0xab3 }, + .{ 0xab5, 0xab9 }, + .{ 0xabd, 0xabd }, + .{ 0xad0, 0xad0 }, + .{ 0xae0, 0xae1 }, + .{ 0xaf9, 0xaf9 }, + .{ 0xb05, 0xb0c }, + .{ 0xb0f, 0xb10 }, + .{ 0xb13, 0xb28 }, + .{ 0xb2a, 0xb30 }, + .{ 0xb32, 0xb33 }, + .{ 0xb35, 0xb39 }, + .{ 0xb3d, 0xb3d }, + .{ 0xb5c, 0xb5d }, + .{ 0xb5f, 0xb61 }, + .{ 0xb71, 0xb71 }, + .{ 0xb83, 0xb83 }, + .{ 0xb85, 0xb8a }, + .{ 0xb8e, 0xb90 }, + .{ 0xb92, 0xb95 }, + .{ 0xb99, 0xb9a }, + .{ 0xb9c, 0xb9c }, + .{ 0xb9e, 0xb9f }, + .{ 0xba3, 0xba4 }, + .{ 0xba8, 0xbaa }, + .{ 0xbae, 0xbb9 }, + .{ 0xbd0, 0xbd0 }, + .{ 0xc05, 0xc0c }, + .{ 0xc0e, 0xc10 }, + .{ 0xc12, 0xc28 }, + .{ 0xc2a, 0xc39 }, + .{ 0xc3d, 0xc3d }, + .{ 0xc58, 0xc5a }, + .{ 0xc60, 0xc61 }, + .{ 0xc80, 0xc80 }, + .{ 0xc85, 0xc8c }, + .{ 0xc8e, 0xc90 }, + .{ 0xc92, 0xca8 }, + .{ 0xcaa, 0xcb3 }, + .{ 0xcb5, 0xcb9 }, + .{ 0xcbd, 0xcbd }, + .{ 0xcde, 0xcde }, + .{ 0xce0, 0xce1 }, + .{ 0xcf1, 0xcf2 }, + .{ 0xd04, 0xd0c }, + .{ 0xd0e, 0xd10 }, + .{ 0xd12, 0xd3a }, + .{ 0xd3d, 0xd3d }, + .{ 0xd4e, 0xd4e }, + .{ 0xd54, 0xd56 }, + .{ 0xd5f, 0xd61 }, + .{ 0xd7a, 0xd7f }, + .{ 0xd85, 0xd96 }, + .{ 0xd9a, 0xdb1 }, + .{ 0xdb3, 0xdbb }, + .{ 0xdbd, 0xdbd }, + .{ 0xdc0, 0xdc6 }, + .{ 0xe01, 0xe30 }, + .{ 0xe32, 0xe33 }, + .{ 0xe40, 0xe46 }, + .{ 0xe81, 0xe82 }, + .{ 0xe84, 0xe84 }, + .{ 0xe86, 0xe8a }, + .{ 0xe8c, 0xea3 }, + .{ 0xea5, 0xea5 }, + .{ 0xea7, 0xeb0 }, + .{ 0xeb2, 0xeb3 }, + .{ 0xebd, 0xebd }, + .{ 0xec0, 0xec4 }, + .{ 0xec6, 0xec6 }, + .{ 0xedc, 0xedf }, + .{ 0xf00, 0xf00 }, + .{ 0xf40, 0xf47 }, + .{ 0xf49, 0xf6c }, + .{ 0xf88, 0xf8c }, + }, + &[_]R32Range{ + .{ 0x1000, 0x102a }, + .{ 0x103f, 0x103f }, + .{ 0x1050, 0x1055 }, + .{ 0x105a, 0x105d }, + .{ 0x1061, 0x1061 }, + .{ 0x1065, 0x1066 }, + .{ 0x106e, 0x1070 }, + .{ 0x1075, 0x1081 }, + .{ 0x108e, 0x108e }, + .{ 0x10a0, 0x10c5 }, + .{ 0x10c7, 0x10c7 }, + .{ 0x10cd, 0x10cd }, + .{ 0x10d0, 0x10fa }, + .{ 0x10fc, 0x1248 }, + .{ 0x124a, 0x124d }, + .{ 0x1250, 0x1256 }, + .{ 0x1258, 0x1258 }, + .{ 0x125a, 0x125d }, + .{ 0x1260, 0x1288 }, + .{ 0x128a, 0x128d }, + .{ 0x1290, 0x12b0 }, + .{ 0x12b2, 0x12b5 }, + .{ 0x12b8, 0x12be }, + .{ 0x12c0, 0x12c0 }, + .{ 0x12c2, 0x12c5 }, + .{ 0x12c8, 0x12d6 }, + .{ 0x12d8, 0x1310 }, + .{ 0x1312, 0x1315 }, + .{ 0x1318, 0x135a }, + .{ 0x1380, 0x138f }, + .{ 0x13a0, 0x13f5 }, + .{ 0x13f8, 0x13fd }, + .{ 0x1401, 0x166c }, + .{ 0x166f, 0x167f }, + .{ 0x1681, 0x169a }, + .{ 0x16a0, 0x16ea }, + .{ 0x16ee, 0x16f8 }, + .{ 0x1700, 0x170c }, + .{ 0x170e, 0x1711 }, + .{ 0x1720, 0x1731 }, + .{ 0x1740, 0x1751 }, + .{ 0x1760, 0x176c }, + .{ 0x176e, 0x1770 }, + .{ 0x1780, 0x17b3 }, + .{ 0x17d7, 0x17d7 }, + .{ 0x17dc, 0x17dc }, + .{ 0x1820, 0x1878 }, + .{ 0x1880, 0x18a8 }, + .{ 0x18aa, 0x18aa }, + .{ 0x18b0, 0x18f5 }, + .{ 0x1900, 0x191e }, + .{ 0x1950, 0x196d }, + .{ 0x1970, 0x1974 }, + .{ 0x1980, 0x19ab }, + .{ 0x19b0, 0x19c9 }, + .{ 0x1a00, 0x1a16 }, + .{ 0x1a20, 0x1a54 }, + .{ 0x1aa7, 0x1aa7 }, + .{ 0x1b05, 0x1b33 }, + .{ 0x1b45, 0x1b4b }, + .{ 0x1b83, 0x1ba0 }, + .{ 0x1bae, 0x1baf }, + .{ 0x1bba, 0x1be5 }, + .{ 0x1c00, 0x1c23 }, + .{ 0x1c4d, 0x1c4f }, + .{ 0x1c5a, 0x1c7d }, + .{ 0x1c80, 0x1c88 }, + .{ 0x1c90, 0x1cba }, + .{ 0x1cbd, 0x1cbf }, + .{ 0x1ce9, 0x1cec }, + .{ 0x1cee, 0x1cf3 }, + .{ 0x1cf5, 0x1cf6 }, + .{ 0x1cfa, 0x1cfa }, + .{ 0x1d00, 0x1dbf }, + .{ 0x1e00, 0x1f15 }, + .{ 0x1f18, 0x1f1d }, + .{ 0x1f20, 0x1f45 }, + .{ 0x1f48, 0x1f4d }, + .{ 0x1f50, 0x1f57 }, + .{ 0x1f59, 0x1f59 }, + .{ 0x1f5b, 0x1f5b }, + .{ 0x1f5d, 0x1f5d }, + .{ 0x1f5f, 0x1f7d }, + .{ 0x1f80, 0x1fb4 }, + .{ 0x1fb6, 0x1fbc }, + .{ 0x1fbe, 0x1fbe }, + .{ 0x1fc2, 0x1fc4 }, + .{ 0x1fc6, 0x1fcc }, + .{ 0x1fd0, 0x1fd3 }, + .{ 0x1fd6, 0x1fdb }, + .{ 0x1fe0, 0x1fec }, + .{ 0x1ff2, 0x1ff4 }, + .{ 0x1ff6, 0x1ffc }, + .{ 0x2071, 0x2071 }, + .{ 0x207f, 0x207f }, + .{ 0x2090, 0x209c }, + .{ 0x2102, 0x2102 }, + .{ 0x2107, 0x2107 }, + .{ 0x210a, 0x2113 }, + .{ 0x2115, 0x2115 }, + .{ 0x2118, 0x211d }, + .{ 0x2124, 0x2124 }, + .{ 0x2126, 0x2126 }, + .{ 0x2128, 0x2128 }, + .{ 0x212a, 0x2139 }, + .{ 0x213c, 0x213f }, + .{ 0x2145, 0x2149 }, + .{ 0x214e, 0x214e }, + .{ 0x2160, 0x2188 }, + .{ 0x2c00, 0x2c2e }, + .{ 0x2c30, 0x2c5e }, + .{ 0x2c60, 0x2ce4 }, + .{ 0x2ceb, 0x2cee }, + .{ 0x2cf2, 0x2cf3 }, + .{ 0x2d00, 0x2d25 }, + .{ 0x2d27, 0x2d27 }, + .{ 0x2d2d, 0x2d2d }, + .{ 0x2d30, 0x2d67 }, + .{ 0x2d6f, 0x2d6f }, + .{ 0x2d80, 0x2d96 }, + .{ 0x2da0, 0x2da6 }, + .{ 0x2da8, 0x2dae }, + .{ 0x2db0, 0x2db6 }, + .{ 0x2db8, 0x2dbe }, + .{ 0x2dc0, 0x2dc6 }, + .{ 0x2dc8, 0x2dce }, + .{ 0x2dd0, 0x2dd6 }, + .{ 0x2dd8, 0x2dde }, + .{ 0x3005, 0x3007 }, + .{ 0x3021, 0x3029 }, + .{ 0x3031, 0x3035 }, + .{ 0x3038, 0x303c }, + .{ 0x3041, 0x3096 }, + .{ 0x309b, 0x309f }, + .{ 0x30a1, 0x30fa }, + .{ 0x30fc, 0x30ff }, + .{ 0x3105, 0x312f }, + .{ 0x3131, 0x318e }, + .{ 0x31a0, 0x31bf }, + .{ 0x31f0, 0x31ff }, + .{ 0x3400, 0x4dbf }, + .{ 0x4e00, 0x9ffc }, + .{ 0xa000, 0xa48c }, + .{ 0xa4d0, 0xa4fd }, + .{ 0xa500, 0xa60c }, + .{ 0xa610, 0xa61f }, + .{ 0xa62a, 0xa62b }, + .{ 0xa640, 0xa66e }, + .{ 0xa67f, 0xa69d }, + .{ 0xa6a0, 0xa6ef }, + .{ 0xa717, 0xa71f }, + .{ 0xa722, 0xa788 }, + .{ 0xa78b, 0xa7bf }, + .{ 0xa7c2, 0xa7ca }, + .{ 0xa7f5, 0xa801 }, + .{ 0xa803, 0xa805 }, + .{ 0xa807, 0xa80a }, + .{ 0xa80c, 0xa822 }, + .{ 0xa840, 0xa873 }, + .{ 0xa882, 0xa8b3 }, + .{ 0xa8f2, 0xa8f7 }, + .{ 0xa8fb, 0xa8fb }, + .{ 0xa8fd, 0xa8fe }, + .{ 0xa90a, 0xa925 }, + .{ 0xa930, 0xa946 }, + .{ 0xa960, 0xa97c }, + .{ 0xa984, 0xa9b2 }, + .{ 0xa9cf, 0xa9cf }, + .{ 0xa9e0, 0xa9e4 }, + .{ 0xa9e6, 0xa9ef }, + .{ 0xa9fa, 0xa9fe }, + .{ 0xaa00, 0xaa28 }, + .{ 0xaa40, 0xaa42 }, + .{ 0xaa44, 0xaa4b }, + .{ 0xaa60, 0xaa76 }, + .{ 0xaa7a, 0xaa7a }, + .{ 0xaa7e, 0xaaaf }, + .{ 0xaab1, 0xaab1 }, + .{ 0xaab5, 0xaab6 }, + .{ 0xaab9, 0xaabd }, + .{ 0xaac0, 0xaac0 }, + .{ 0xaac2, 0xaac2 }, + .{ 0xaadb, 0xaadd }, + .{ 0xaae0, 0xaaea }, + .{ 0xaaf2, 0xaaf4 }, + .{ 0xab01, 0xab06 }, + .{ 0xab09, 0xab0e }, + .{ 0xab11, 0xab16 }, + .{ 0xab20, 0xab26 }, + .{ 0xab28, 0xab2e }, + .{ 0xab30, 0xab5a }, + .{ 0xab5c, 0xab69 }, + .{ 0xab70, 0xabe2 }, + .{ 0xac00, 0xd7a3 }, + .{ 0xd7b0, 0xd7c6 }, + .{ 0xd7cb, 0xd7fb }, + .{ 0xf900, 0xfa6d }, + .{ 0xfa70, 0xfad9 }, + .{ 0xfb00, 0xfb06 }, + .{ 0xfb13, 0xfb17 }, + .{ 0xfb1d, 0xfb1d }, + .{ 0xfb1f, 0xfb28 }, + .{ 0xfb2a, 0xfb36 }, + .{ 0xfb38, 0xfb3c }, + .{ 0xfb3e, 0xfb3e }, + .{ 0xfb40, 0xfb41 }, + .{ 0xfb43, 0xfb44 }, + .{ 0xfb46, 0xfbb1 }, + .{ 0xfbd3, 0xfd3d }, + .{ 0xfd50, 0xfd8f }, + .{ 0xfd92, 0xfdc7 }, + .{ 0xfdf0, 0xfdfb }, + .{ 0xfe70, 0xfe74 }, + .{ 0xfe76, 0xfefc }, + .{ 0xff21, 0xff3a }, + .{ 0xff41, 0xff5a }, + .{ 0xff66, 0xffbe }, + .{ 0xffc2, 0xffc7 }, + .{ 0xffca, 0xffcf }, + .{ 0xffd2, 0xffd7 }, + .{ 0xffda, 0xffdc }, + .{ 0x10000, 0x1000b }, + .{ 0x1000d, 0x10026 }, + .{ 0x10028, 0x1003a }, + .{ 0x1003c, 0x1003d }, + .{ 0x1003f, 0x1004d }, + .{ 0x10050, 0x1005d }, + .{ 0x10080, 0x100fa }, + .{ 0x10140, 0x10174 }, + .{ 0x10280, 0x1029c }, + .{ 0x102a0, 0x102d0 }, + .{ 0x10300, 0x1031f }, + .{ 0x1032d, 0x1034a }, + .{ 0x10350, 0x10375 }, + .{ 0x10380, 0x1039d }, + .{ 0x103a0, 0x103c3 }, + .{ 0x103c8, 0x103cf }, + .{ 0x103d1, 0x103d5 }, + .{ 0x10400, 0x1049d }, + .{ 0x104b0, 0x104d3 }, + .{ 0x104d8, 0x104fb }, + .{ 0x10500, 0x10527 }, + .{ 0x10530, 0x10563 }, + .{ 0x10600, 0x10736 }, + .{ 0x10740, 0x10755 }, + .{ 0x10760, 0x10767 }, + .{ 0x10800, 0x10805 }, + .{ 0x10808, 0x10808 }, + .{ 0x1080a, 0x10835 }, + .{ 0x10837, 0x10838 }, + .{ 0x1083c, 0x1083c }, + .{ 0x1083f, 0x10855 }, + .{ 0x10860, 0x10876 }, + .{ 0x10880, 0x1089e }, + .{ 0x108e0, 0x108f2 }, + .{ 0x108f4, 0x108f5 }, + .{ 0x10900, 0x10915 }, + .{ 0x10920, 0x10939 }, + .{ 0x10980, 0x109b7 }, + .{ 0x109be, 0x109bf }, + .{ 0x10a00, 0x10a00 }, + .{ 0x10a10, 0x10a13 }, + .{ 0x10a15, 0x10a17 }, + .{ 0x10a19, 0x10a35 }, + .{ 0x10a60, 0x10a7c }, + .{ 0x10a80, 0x10a9c }, + .{ 0x10ac0, 0x10ac7 }, + .{ 0x10ac9, 0x10ae4 }, + .{ 0x10b00, 0x10b35 }, + .{ 0x10b40, 0x10b55 }, + .{ 0x10b60, 0x10b72 }, + .{ 0x10b80, 0x10b91 }, + .{ 0x10c00, 0x10c48 }, + .{ 0x10c80, 0x10cb2 }, + .{ 0x10cc0, 0x10cf2 }, + .{ 0x10d00, 0x10d23 }, + .{ 0x10e80, 0x10ea9 }, + .{ 0x10eb0, 0x10eb1 }, + .{ 0x10f00, 0x10f1c }, + .{ 0x10f27, 0x10f27 }, + .{ 0x10f30, 0x10f45 }, + .{ 0x10fb0, 0x10fc4 }, + .{ 0x10fe0, 0x10ff6 }, + .{ 0x11003, 0x11037 }, + .{ 0x11083, 0x110af }, + .{ 0x110d0, 0x110e8 }, + .{ 0x11103, 0x11126 }, + .{ 0x11144, 0x11144 }, + .{ 0x11147, 0x11147 }, + .{ 0x11150, 0x11172 }, + .{ 0x11176, 0x11176 }, + .{ 0x11183, 0x111b2 }, + .{ 0x111c1, 0x111c4 }, + .{ 0x111da, 0x111da }, + .{ 0x111dc, 0x111dc }, + .{ 0x11200, 0x11211 }, + .{ 0x11213, 0x1122b }, + .{ 0x11280, 0x11286 }, + .{ 0x11288, 0x11288 }, + .{ 0x1128a, 0x1128d }, + .{ 0x1128f, 0x1129d }, + .{ 0x1129f, 0x112a8 }, + .{ 0x112b0, 0x112de }, + .{ 0x11305, 0x1130c }, + .{ 0x1130f, 0x11310 }, + .{ 0x11313, 0x11328 }, + .{ 0x1132a, 0x11330 }, + .{ 0x11332, 0x11333 }, + .{ 0x11335, 0x11339 }, + .{ 0x1133d, 0x1133d }, + .{ 0x11350, 0x11350 }, + .{ 0x1135d, 0x11361 }, + .{ 0x11400, 0x11434 }, + .{ 0x11447, 0x1144a }, + .{ 0x1145f, 0x11461 }, + .{ 0x11480, 0x114af }, + .{ 0x114c4, 0x114c5 }, + .{ 0x114c7, 0x114c7 }, + .{ 0x11580, 0x115ae }, + .{ 0x115d8, 0x115db }, + .{ 0x11600, 0x1162f }, + .{ 0x11644, 0x11644 }, + .{ 0x11680, 0x116aa }, + .{ 0x116b8, 0x116b8 }, + .{ 0x11700, 0x1171a }, + .{ 0x11800, 0x1182b }, + .{ 0x118a0, 0x118df }, + .{ 0x118ff, 0x11906 }, + .{ 0x11909, 0x11909 }, + .{ 0x1190c, 0x11913 }, + .{ 0x11915, 0x11916 }, + .{ 0x11918, 0x1192f }, + .{ 0x1193f, 0x1193f }, + .{ 0x11941, 0x11941 }, + .{ 0x119a0, 0x119a7 }, + .{ 0x119aa, 0x119d0 }, + .{ 0x119e1, 0x119e1 }, + .{ 0x119e3, 0x119e3 }, + .{ 0x11a00, 0x11a00 }, + .{ 0x11a0b, 0x11a32 }, + .{ 0x11a3a, 0x11a3a }, + .{ 0x11a50, 0x11a50 }, + .{ 0x11a5c, 0x11a89 }, + .{ 0x11a9d, 0x11a9d }, + .{ 0x11ac0, 0x11af8 }, + .{ 0x11c00, 0x11c08 }, + .{ 0x11c0a, 0x11c2e }, + .{ 0x11c40, 0x11c40 }, + .{ 0x11c72, 0x11c8f }, + .{ 0x11d00, 0x11d06 }, + .{ 0x11d08, 0x11d09 }, + .{ 0x11d0b, 0x11d30 }, + .{ 0x11d46, 0x11d46 }, + .{ 0x11d60, 0x11d65 }, + .{ 0x11d67, 0x11d68 }, + .{ 0x11d6a, 0x11d89 }, + .{ 0x11d98, 0x11d98 }, + .{ 0x11ee0, 0x11ef2 }, + .{ 0x11fb0, 0x11fb0 }, + .{ 0x12000, 0x12399 }, + .{ 0x12400, 0x1246e }, + .{ 0x12480, 0x12543 }, + .{ 0x13000, 0x1342e }, + .{ 0x14400, 0x14646 }, + .{ 0x16800, 0x16a38 }, + .{ 0x16a40, 0x16a5e }, + .{ 0x16ad0, 0x16aed }, + .{ 0x16b00, 0x16b2f }, + .{ 0x16b40, 0x16b43 }, + .{ 0x16b63, 0x16b77 }, + .{ 0x16b7d, 0x16b8f }, + .{ 0x16e40, 0x16e7f }, + .{ 0x16f00, 0x16f4a }, + .{ 0x16f50, 0x16f50 }, + .{ 0x16f93, 0x16f9f }, + .{ 0x16fe0, 0x16fe1 }, + .{ 0x16fe3, 0x16fe3 }, + .{ 0x17000, 0x187f7 }, + .{ 0x18800, 0x18cd5 }, + .{ 0x18d00, 0x18d08 }, + .{ 0x1b000, 0x1b11e }, + .{ 0x1b150, 0x1b152 }, + .{ 0x1b164, 0x1b167 }, + .{ 0x1b170, 0x1b2fb }, + .{ 0x1bc00, 0x1bc6a }, + .{ 0x1bc70, 0x1bc7c }, + .{ 0x1bc80, 0x1bc88 }, + .{ 0x1bc90, 0x1bc99 }, + .{ 0x1d400, 0x1d454 }, + .{ 0x1d456, 0x1d49c }, + .{ 0x1d49e, 0x1d49f }, + .{ 0x1d4a2, 0x1d4a2 }, + .{ 0x1d4a5, 0x1d4a6 }, + .{ 0x1d4a9, 0x1d4ac }, + .{ 0x1d4ae, 0x1d4b9 }, + .{ 0x1d4bb, 0x1d4bb }, + .{ 0x1d4bd, 0x1d4c3 }, + .{ 0x1d4c5, 0x1d505 }, + .{ 0x1d507, 0x1d50a }, + .{ 0x1d50d, 0x1d514 }, + .{ 0x1d516, 0x1d51c }, + .{ 0x1d51e, 0x1d539 }, + .{ 0x1d53b, 0x1d53e }, + .{ 0x1d540, 0x1d544 }, + .{ 0x1d546, 0x1d546 }, + .{ 0x1d54a, 0x1d550 }, + .{ 0x1d552, 0x1d6a5 }, + .{ 0x1d6a8, 0x1d6c0 }, + .{ 0x1d6c2, 0x1d6da }, + .{ 0x1d6dc, 0x1d6fa }, + .{ 0x1d6fc, 0x1d714 }, + .{ 0x1d716, 0x1d734 }, + .{ 0x1d736, 0x1d74e }, + .{ 0x1d750, 0x1d76e }, + .{ 0x1d770, 0x1d788 }, + .{ 0x1d78a, 0x1d7a8 }, + .{ 0x1d7aa, 0x1d7c2 }, + .{ 0x1d7c4, 0x1d7cb }, + .{ 0x1e100, 0x1e12c }, + .{ 0x1e137, 0x1e13d }, + .{ 0x1e14e, 0x1e14e }, + .{ 0x1e2c0, 0x1e2eb }, + .{ 0x1e800, 0x1e8c4 }, + .{ 0x1e900, 0x1e943 }, + .{ 0x1e94b, 0x1e94b }, + .{ 0x1ee00, 0x1ee03 }, + .{ 0x1ee05, 0x1ee1f }, + .{ 0x1ee21, 0x1ee22 }, + .{ 0x1ee24, 0x1ee24 }, + .{ 0x1ee27, 0x1ee27 }, + .{ 0x1ee29, 0x1ee32 }, + .{ 0x1ee34, 0x1ee37 }, + .{ 0x1ee39, 0x1ee39 }, + .{ 0x1ee3b, 0x1ee3b }, + .{ 0x1ee42, 0x1ee42 }, + .{ 0x1ee47, 0x1ee47 }, + .{ 0x1ee49, 0x1ee49 }, + .{ 0x1ee4b, 0x1ee4b }, + .{ 0x1ee4d, 0x1ee4f }, + .{ 0x1ee51, 0x1ee52 }, + .{ 0x1ee54, 0x1ee54 }, + .{ 0x1ee57, 0x1ee57 }, + .{ 0x1ee59, 0x1ee59 }, + .{ 0x1ee5b, 0x1ee5b }, + .{ 0x1ee5d, 0x1ee5d }, + .{ 0x1ee5f, 0x1ee5f }, + .{ 0x1ee61, 0x1ee62 }, + .{ 0x1ee64, 0x1ee64 }, + .{ 0x1ee67, 0x1ee6a }, + .{ 0x1ee6c, 0x1ee72 }, + .{ 0x1ee74, 0x1ee77 }, + .{ 0x1ee79, 0x1ee7c }, + .{ 0x1ee7e, 0x1ee7e }, + .{ 0x1ee80, 0x1ee89 }, + .{ 0x1ee8b, 0x1ee9b }, + .{ 0x1eea1, 0x1eea3 }, + .{ 0x1eea5, 0x1eea9 }, + .{ 0x1eeab, 0x1eebb }, + .{ 0x20000, 0x2a6dd }, + .{ 0x2a700, 0x2b734 }, + .{ 0x2b740, 0x2b81d }, + .{ 0x2b820, 0x2cea1 }, + .{ 0x2ceb0, 0x2ebe0 }, + .{ 0x2f800, 0x2fa1d }, + .{ 0x30000, 0x3134a }, + }, +); +pub const printable_id_continue = RangeTable.init( + 129, + &[_]R16Range{ + .{ 0x30, 0x39 }, + .{ 0x41, 0x5a }, + .{ 0x5f, 0x5f }, + .{ 0x61, 0x7a }, + .{ 0xaa, 0xaa }, + .{ 0xb5, 0xb5 }, + .{ 0xb7, 0xb7 }, + .{ 0xba, 0xba }, + .{ 0xc0, 0xd6 }, + .{ 0xd8, 0xf6 }, + .{ 0xf8, 0x2c1 }, + .{ 0x2c6, 0x2d1 }, + .{ 0x2e0, 0x2e4 }, + .{ 0x2ec, 0x2ec }, + .{ 0x2ee, 0x2ee }, + .{ 0x300, 0x374 }, + .{ 0x376, 0x377 }, + .{ 0x37a, 0x37d }, + .{ 0x37f, 0x37f }, + .{ 0x386, 0x38a }, + .{ 0x38c, 0x38c }, + .{ 0x38e, 0x3a1 }, + .{ 0x3a3, 0x3f5 }, + .{ 0x3f7, 0x481 }, + .{ 0x483, 0x487 }, + .{ 0x48a, 0x52f }, + .{ 0x531, 0x556 }, + .{ 0x559, 0x559 }, + .{ 0x560, 0x588 }, + .{ 0x591, 0x5bd }, + .{ 0x5bf, 0x5bf }, + .{ 0x5c1, 0x5c2 }, + .{ 0x5c4, 0x5c5 }, + .{ 0x5c7, 0x5c7 }, + .{ 0x5d0, 0x5ea }, + .{ 0x5ef, 0x5f2 }, + .{ 0x610, 0x61a }, + .{ 0x620, 0x669 }, + .{ 0x66e, 0x6d3 }, + .{ 0x6d5, 0x6dc }, + .{ 0x6df, 0x6e8 }, + .{ 0x6ea, 0x6fc }, + .{ 0x6ff, 0x6ff }, + .{ 0x710, 0x74a }, + .{ 0x74d, 0x7b1 }, + .{ 0x7c0, 0x7f5 }, + .{ 0x7fa, 0x7fa }, + .{ 0x7fd, 0x7fd }, + .{ 0x800, 0x82d }, + .{ 0x840, 0x85b }, + .{ 0x860, 0x86a }, + .{ 0x8a0, 0x8b4 }, + .{ 0x8b6, 0x8c7 }, + .{ 0x8d3, 0x8e1 }, + .{ 0x8e3, 0x963 }, + .{ 0x966, 0x96f }, + .{ 0x971, 0x983 }, + .{ 0x985, 0x98c }, + .{ 0x98f, 0x990 }, + .{ 0x993, 0x9a8 }, + .{ 0x9aa, 0x9b0 }, + .{ 0x9b2, 0x9b2 }, + .{ 0x9b6, 0x9b9 }, + .{ 0x9bc, 0x9c4 }, + .{ 0x9c7, 0x9c8 }, + .{ 0x9cb, 0x9ce }, + .{ 0x9d7, 0x9d7 }, + .{ 0x9dc, 0x9dd }, + .{ 0x9df, 0x9e3 }, + .{ 0x9e6, 0x9f1 }, + .{ 0x9fc, 0x9fc }, + .{ 0x9fe, 0x9fe }, + .{ 0xa01, 0xa03 }, + .{ 0xa05, 0xa0a }, + .{ 0xa0f, 0xa10 }, + .{ 0xa13, 0xa28 }, + .{ 0xa2a, 0xa30 }, + .{ 0xa32, 0xa33 }, + .{ 0xa35, 0xa36 }, + .{ 0xa38, 0xa39 }, + .{ 0xa3c, 0xa3c }, + .{ 0xa3e, 0xa42 }, + .{ 0xa47, 0xa48 }, + .{ 0xa4b, 0xa4d }, + .{ 0xa51, 0xa51 }, + .{ 0xa59, 0xa5c }, + .{ 0xa5e, 0xa5e }, + .{ 0xa66, 0xa75 }, + .{ 0xa81, 0xa83 }, + .{ 0xa85, 0xa8d }, + .{ 0xa8f, 0xa91 }, + .{ 0xa93, 0xaa8 }, + .{ 0xaaa, 0xab0 }, + .{ 0xab2, 0xab3 }, + .{ 0xab5, 0xab9 }, + .{ 0xabc, 0xac5 }, + .{ 0xac7, 0xac9 }, + .{ 0xacb, 0xacd }, + .{ 0xad0, 0xad0 }, + .{ 0xae0, 0xae3 }, + .{ 0xae6, 0xaef }, + .{ 0xaf9, 0xaff }, + .{ 0xb01, 0xb03 }, + .{ 0xb05, 0xb0c }, + .{ 0xb0f, 0xb10 }, + .{ 0xb13, 0xb28 }, + .{ 0xb2a, 0xb30 }, + .{ 0xb32, 0xb33 }, + .{ 0xb35, 0xb39 }, + .{ 0xb3c, 0xb44 }, + .{ 0xb47, 0xb48 }, + .{ 0xb4b, 0xb4d }, + .{ 0xb55, 0xb57 }, + .{ 0xb5c, 0xb5d }, + .{ 0xb5f, 0xb63 }, + .{ 0xb66, 0xb6f }, + .{ 0xb71, 0xb71 }, + .{ 0xb82, 0xb83 }, + .{ 0xb85, 0xb8a }, + .{ 0xb8e, 0xb90 }, + .{ 0xb92, 0xb95 }, + .{ 0xb99, 0xb9a }, + .{ 0xb9c, 0xb9c }, + .{ 0xb9e, 0xb9f }, + .{ 0xba3, 0xba4 }, + .{ 0xba8, 0xbaa }, + .{ 0xbae, 0xbb9 }, + .{ 0xbbe, 0xbc2 }, + .{ 0xbc6, 0xbc8 }, + .{ 0xbca, 0xbcd }, + .{ 0xbd0, 0xbd0 }, + .{ 0xbd7, 0xbd7 }, + .{ 0xbe6, 0xbef }, + .{ 0xc00, 0xc0c }, + .{ 0xc0e, 0xc10 }, + .{ 0xc12, 0xc28 }, + .{ 0xc2a, 0xc39 }, + .{ 0xc3d, 0xc44 }, + .{ 0xc46, 0xc48 }, + .{ 0xc4a, 0xc4d }, + .{ 0xc55, 0xc56 }, + .{ 0xc58, 0xc5a }, + .{ 0xc60, 0xc63 }, + .{ 0xc66, 0xc6f }, + .{ 0xc80, 0xc83 }, + .{ 0xc85, 0xc8c }, + .{ 0xc8e, 0xc90 }, + .{ 0xc92, 0xca8 }, + .{ 0xcaa, 0xcb3 }, + .{ 0xcb5, 0xcb9 }, + .{ 0xcbc, 0xcc4 }, + .{ 0xcc6, 0xcc8 }, + .{ 0xcca, 0xccd }, + .{ 0xcd5, 0xcd6 }, + .{ 0xcde, 0xcde }, + .{ 0xce0, 0xce3 }, + .{ 0xce6, 0xcef }, + .{ 0xcf1, 0xcf2 }, + .{ 0xd00, 0xd0c }, + .{ 0xd0e, 0xd10 }, + .{ 0xd12, 0xd44 }, + .{ 0xd46, 0xd48 }, + .{ 0xd4a, 0xd4e }, + .{ 0xd54, 0xd57 }, + .{ 0xd5f, 0xd63 }, + .{ 0xd66, 0xd6f }, + .{ 0xd7a, 0xd7f }, + .{ 0xd81, 0xd83 }, + .{ 0xd85, 0xd96 }, + .{ 0xd9a, 0xdb1 }, + .{ 0xdb3, 0xdbb }, + .{ 0xdbd, 0xdbd }, + .{ 0xdc0, 0xdc6 }, + .{ 0xdca, 0xdca }, + .{ 0xdcf, 0xdd4 }, + .{ 0xdd6, 0xdd6 }, + .{ 0xdd8, 0xddf }, + .{ 0xde6, 0xdef }, + .{ 0xdf2, 0xdf3 }, + .{ 0xe01, 0xe3a }, + .{ 0xe40, 0xe4e }, + .{ 0xe50, 0xe59 }, + .{ 0xe81, 0xe82 }, + .{ 0xe84, 0xe84 }, + .{ 0xe86, 0xe8a }, + .{ 0xe8c, 0xea3 }, + .{ 0xea5, 0xea5 }, + .{ 0xea7, 0xebd }, + .{ 0xec0, 0xec4 }, + .{ 0xec6, 0xec6 }, + .{ 0xec8, 0xecd }, + .{ 0xed0, 0xed9 }, + .{ 0xedc, 0xedf }, + .{ 0xf00, 0xf00 }, + .{ 0xf18, 0xf19 }, + .{ 0xf20, 0xf29 }, + .{ 0xf35, 0xf35 }, + .{ 0xf37, 0xf37 }, + .{ 0xf39, 0xf39 }, + .{ 0xf3e, 0xf47 }, + .{ 0xf49, 0xf6c }, + .{ 0xf71, 0xf84 }, + .{ 0xf86, 0xf97 }, + .{ 0xf99, 0xfbc }, + .{ 0xfc6, 0xfc6 }, + }, + &[_]R32Range{ + .{ 0x1000, 0x1049 }, + .{ 0x1050, 0x109d }, + .{ 0x10a0, 0x10c5 }, + .{ 0x10c7, 0x10c7 }, + .{ 0x10cd, 0x10cd }, + .{ 0x10d0, 0x10fa }, + .{ 0x10fc, 0x1248 }, + .{ 0x124a, 0x124d }, + .{ 0x1250, 0x1256 }, + .{ 0x1258, 0x1258 }, + .{ 0x125a, 0x125d }, + .{ 0x1260, 0x1288 }, + .{ 0x128a, 0x128d }, + .{ 0x1290, 0x12b0 }, + .{ 0x12b2, 0x12b5 }, + .{ 0x12b8, 0x12be }, + .{ 0x12c0, 0x12c0 }, + .{ 0x12c2, 0x12c5 }, + .{ 0x12c8, 0x12d6 }, + .{ 0x12d8, 0x1310 }, + .{ 0x1312, 0x1315 }, + .{ 0x1318, 0x135a }, + .{ 0x135d, 0x135f }, + .{ 0x1369, 0x1371 }, + .{ 0x1380, 0x138f }, + .{ 0x13a0, 0x13f5 }, + .{ 0x13f8, 0x13fd }, + .{ 0x1401, 0x166c }, + .{ 0x166f, 0x167f }, + .{ 0x1681, 0x169a }, + .{ 0x16a0, 0x16ea }, + .{ 0x16ee, 0x16f8 }, + .{ 0x1700, 0x170c }, + .{ 0x170e, 0x1714 }, + .{ 0x1720, 0x1734 }, + .{ 0x1740, 0x1753 }, + .{ 0x1760, 0x176c }, + .{ 0x176e, 0x1770 }, + .{ 0x1772, 0x1773 }, + .{ 0x1780, 0x17d3 }, + .{ 0x17d7, 0x17d7 }, + .{ 0x17dc, 0x17dd }, + .{ 0x17e0, 0x17e9 }, + .{ 0x180b, 0x180d }, + .{ 0x1810, 0x1819 }, + .{ 0x1820, 0x1878 }, + .{ 0x1880, 0x18aa }, + .{ 0x18b0, 0x18f5 }, + .{ 0x1900, 0x191e }, + .{ 0x1920, 0x192b }, + .{ 0x1930, 0x193b }, + .{ 0x1946, 0x196d }, + .{ 0x1970, 0x1974 }, + .{ 0x1980, 0x19ab }, + .{ 0x19b0, 0x19c9 }, + .{ 0x19d0, 0x19da }, + .{ 0x1a00, 0x1a1b }, + .{ 0x1a20, 0x1a5e }, + .{ 0x1a60, 0x1a7c }, + .{ 0x1a7f, 0x1a89 }, + .{ 0x1a90, 0x1a99 }, + .{ 0x1aa7, 0x1aa7 }, + .{ 0x1ab0, 0x1abd }, + .{ 0x1abf, 0x1ac0 }, + .{ 0x1b00, 0x1b4b }, + .{ 0x1b50, 0x1b59 }, + .{ 0x1b6b, 0x1b73 }, + .{ 0x1b80, 0x1bf3 }, + .{ 0x1c00, 0x1c37 }, + .{ 0x1c40, 0x1c49 }, + .{ 0x1c4d, 0x1c7d }, + .{ 0x1c80, 0x1c88 }, + .{ 0x1c90, 0x1cba }, + .{ 0x1cbd, 0x1cbf }, + .{ 0x1cd0, 0x1cd2 }, + .{ 0x1cd4, 0x1cfa }, + .{ 0x1d00, 0x1df9 }, + .{ 0x1dfb, 0x1f15 }, + .{ 0x1f18, 0x1f1d }, + .{ 0x1f20, 0x1f45 }, + .{ 0x1f48, 0x1f4d }, + .{ 0x1f50, 0x1f57 }, + .{ 0x1f59, 0x1f59 }, + .{ 0x1f5b, 0x1f5b }, + .{ 0x1f5d, 0x1f5d }, + .{ 0x1f5f, 0x1f7d }, + .{ 0x1f80, 0x1fb4 }, + .{ 0x1fb6, 0x1fbc }, + .{ 0x1fbe, 0x1fbe }, + .{ 0x1fc2, 0x1fc4 }, + .{ 0x1fc6, 0x1fcc }, + .{ 0x1fd0, 0x1fd3 }, + .{ 0x1fd6, 0x1fdb }, + .{ 0x1fe0, 0x1fec }, + .{ 0x1ff2, 0x1ff4 }, + .{ 0x1ff6, 0x1ffc }, + .{ 0x203f, 0x2040 }, + .{ 0x2054, 0x2054 }, + .{ 0x2071, 0x2071 }, + .{ 0x207f, 0x207f }, + .{ 0x2090, 0x209c }, + .{ 0x20d0, 0x20dc }, + .{ 0x20e1, 0x20e1 }, + .{ 0x20e5, 0x20f0 }, + .{ 0x2102, 0x2102 }, + .{ 0x2107, 0x2107 }, + .{ 0x210a, 0x2113 }, + .{ 0x2115, 0x2115 }, + .{ 0x2118, 0x211d }, + .{ 0x2124, 0x2124 }, + .{ 0x2126, 0x2126 }, + .{ 0x2128, 0x2128 }, + .{ 0x212a, 0x2139 }, + .{ 0x213c, 0x213f }, + .{ 0x2145, 0x2149 }, + .{ 0x214e, 0x214e }, + .{ 0x2160, 0x2188 }, + .{ 0x2c00, 0x2c2e }, + .{ 0x2c30, 0x2c5e }, + .{ 0x2c60, 0x2ce4 }, + .{ 0x2ceb, 0x2cf3 }, + .{ 0x2d00, 0x2d25 }, + .{ 0x2d27, 0x2d27 }, + .{ 0x2d2d, 0x2d2d }, + .{ 0x2d30, 0x2d67 }, + .{ 0x2d6f, 0x2d6f }, + .{ 0x2d7f, 0x2d96 }, + .{ 0x2da0, 0x2da6 }, + .{ 0x2da8, 0x2dae }, + .{ 0x2db0, 0x2db6 }, + .{ 0x2db8, 0x2dbe }, + .{ 0x2dc0, 0x2dc6 }, + .{ 0x2dc8, 0x2dce }, + .{ 0x2dd0, 0x2dd6 }, + .{ 0x2dd8, 0x2dde }, + .{ 0x2de0, 0x2dff }, + .{ 0x3005, 0x3007 }, + .{ 0x3021, 0x302f }, + .{ 0x3031, 0x3035 }, + .{ 0x3038, 0x303c }, + .{ 0x3041, 0x3096 }, + .{ 0x3099, 0x309f }, + .{ 0x30a1, 0x30fa }, + .{ 0x30fc, 0x30ff }, + .{ 0x3105, 0x312f }, + .{ 0x3131, 0x318e }, + .{ 0x31a0, 0x31bf }, + .{ 0x31f0, 0x31ff }, + .{ 0x3400, 0x4dbf }, + .{ 0x4e00, 0x9ffc }, + .{ 0xa000, 0xa48c }, + .{ 0xa4d0, 0xa4fd }, + .{ 0xa500, 0xa60c }, + .{ 0xa610, 0xa62b }, + .{ 0xa640, 0xa66f }, + .{ 0xa674, 0xa67d }, + .{ 0xa67f, 0xa6f1 }, + .{ 0xa717, 0xa71f }, + .{ 0xa722, 0xa788 }, + .{ 0xa78b, 0xa7bf }, + .{ 0xa7c2, 0xa7ca }, + .{ 0xa7f5, 0xa827 }, + .{ 0xa82c, 0xa82c }, + .{ 0xa840, 0xa873 }, + .{ 0xa880, 0xa8c5 }, + .{ 0xa8d0, 0xa8d9 }, + .{ 0xa8e0, 0xa8f7 }, + .{ 0xa8fb, 0xa8fb }, + .{ 0xa8fd, 0xa92d }, + .{ 0xa930, 0xa953 }, + .{ 0xa960, 0xa97c }, + .{ 0xa980, 0xa9c0 }, + .{ 0xa9cf, 0xa9d9 }, + .{ 0xa9e0, 0xa9fe }, + .{ 0xaa00, 0xaa36 }, + .{ 0xaa40, 0xaa4d }, + .{ 0xaa50, 0xaa59 }, + .{ 0xaa60, 0xaa76 }, + .{ 0xaa7a, 0xaac2 }, + .{ 0xaadb, 0xaadd }, + .{ 0xaae0, 0xaaef }, + .{ 0xaaf2, 0xaaf6 }, + .{ 0xab01, 0xab06 }, + .{ 0xab09, 0xab0e }, + .{ 0xab11, 0xab16 }, + .{ 0xab20, 0xab26 }, + .{ 0xab28, 0xab2e }, + .{ 0xab30, 0xab5a }, + .{ 0xab5c, 0xab69 }, + .{ 0xab70, 0xabea }, + .{ 0xabec, 0xabed }, + .{ 0xabf0, 0xabf9 }, + .{ 0xac00, 0xd7a3 }, + .{ 0xd7b0, 0xd7c6 }, + .{ 0xd7cb, 0xd7fb }, + .{ 0xf900, 0xfa6d }, + .{ 0xfa70, 0xfad9 }, + .{ 0xfb00, 0xfb06 }, + .{ 0xfb13, 0xfb17 }, + .{ 0xfb1d, 0xfb28 }, + .{ 0xfb2a, 0xfb36 }, + .{ 0xfb38, 0xfb3c }, + .{ 0xfb3e, 0xfb3e }, + .{ 0xfb40, 0xfb41 }, + .{ 0xfb43, 0xfb44 }, + .{ 0xfb46, 0xfbb1 }, + .{ 0xfbd3, 0xfd3d }, + .{ 0xfd50, 0xfd8f }, + .{ 0xfd92, 0xfdc7 }, + .{ 0xfdf0, 0xfdfb }, + .{ 0xfe00, 0xfe0f }, + .{ 0xfe20, 0xfe2f }, + .{ 0xfe33, 0xfe34 }, + .{ 0xfe4d, 0xfe4f }, + .{ 0xfe70, 0xfe74 }, + .{ 0xfe76, 0xfefc }, + .{ 0xff10, 0xff19 }, + .{ 0xff21, 0xff3a }, + .{ 0xff3f, 0xff3f }, + .{ 0xff41, 0xff5a }, + .{ 0xff66, 0xffbe }, + .{ 0xffc2, 0xffc7 }, + .{ 0xffca, 0xffcf }, + .{ 0xffd2, 0xffd7 }, + .{ 0xffda, 0xffdc }, + .{ 0x10000, 0x1000b }, + .{ 0x1000d, 0x10026 }, + .{ 0x10028, 0x1003a }, + .{ 0x1003c, 0x1003d }, + .{ 0x1003f, 0x1004d }, + .{ 0x10050, 0x1005d }, + .{ 0x10080, 0x100fa }, + .{ 0x10140, 0x10174 }, + .{ 0x101fd, 0x101fd }, + .{ 0x10280, 0x1029c }, + .{ 0x102a0, 0x102d0 }, + .{ 0x102e0, 0x102e0 }, + .{ 0x10300, 0x1031f }, + .{ 0x1032d, 0x1034a }, + .{ 0x10350, 0x1037a }, + .{ 0x10380, 0x1039d }, + .{ 0x103a0, 0x103c3 }, + .{ 0x103c8, 0x103cf }, + .{ 0x103d1, 0x103d5 }, + .{ 0x10400, 0x1049d }, + .{ 0x104a0, 0x104a9 }, + .{ 0x104b0, 0x104d3 }, + .{ 0x104d8, 0x104fb }, + .{ 0x10500, 0x10527 }, + .{ 0x10530, 0x10563 }, + .{ 0x10600, 0x10736 }, + .{ 0x10740, 0x10755 }, + .{ 0x10760, 0x10767 }, + .{ 0x10800, 0x10805 }, + .{ 0x10808, 0x10808 }, + .{ 0x1080a, 0x10835 }, + .{ 0x10837, 0x10838 }, + .{ 0x1083c, 0x1083c }, + .{ 0x1083f, 0x10855 }, + .{ 0x10860, 0x10876 }, + .{ 0x10880, 0x1089e }, + .{ 0x108e0, 0x108f2 }, + .{ 0x108f4, 0x108f5 }, + .{ 0x10900, 0x10915 }, + .{ 0x10920, 0x10939 }, + .{ 0x10980, 0x109b7 }, + .{ 0x109be, 0x109bf }, + .{ 0x10a00, 0x10a03 }, + .{ 0x10a05, 0x10a06 }, + .{ 0x10a0c, 0x10a13 }, + .{ 0x10a15, 0x10a17 }, + .{ 0x10a19, 0x10a35 }, + .{ 0x10a38, 0x10a3a }, + .{ 0x10a3f, 0x10a3f }, + .{ 0x10a60, 0x10a7c }, + .{ 0x10a80, 0x10a9c }, + .{ 0x10ac0, 0x10ac7 }, + .{ 0x10ac9, 0x10ae6 }, + .{ 0x10b00, 0x10b35 }, + .{ 0x10b40, 0x10b55 }, + .{ 0x10b60, 0x10b72 }, + .{ 0x10b80, 0x10b91 }, + .{ 0x10c00, 0x10c48 }, + .{ 0x10c80, 0x10cb2 }, + .{ 0x10cc0, 0x10cf2 }, + .{ 0x10d00, 0x10d27 }, + .{ 0x10d30, 0x10d39 }, + .{ 0x10e80, 0x10ea9 }, + .{ 0x10eab, 0x10eac }, + .{ 0x10eb0, 0x10eb1 }, + .{ 0x10f00, 0x10f1c }, + .{ 0x10f27, 0x10f27 }, + .{ 0x10f30, 0x10f50 }, + .{ 0x10fb0, 0x10fc4 }, + .{ 0x10fe0, 0x10ff6 }, + .{ 0x11000, 0x11046 }, + .{ 0x11066, 0x1106f }, + .{ 0x1107f, 0x110ba }, + .{ 0x110d0, 0x110e8 }, + .{ 0x110f0, 0x110f9 }, + .{ 0x11100, 0x11134 }, + .{ 0x11136, 0x1113f }, + .{ 0x11144, 0x11147 }, + .{ 0x11150, 0x11173 }, + .{ 0x11176, 0x11176 }, + .{ 0x11180, 0x111c4 }, + .{ 0x111c9, 0x111cc }, + .{ 0x111ce, 0x111da }, + .{ 0x111dc, 0x111dc }, + .{ 0x11200, 0x11211 }, + .{ 0x11213, 0x11237 }, + .{ 0x1123e, 0x1123e }, + .{ 0x11280, 0x11286 }, + .{ 0x11288, 0x11288 }, + .{ 0x1128a, 0x1128d }, + .{ 0x1128f, 0x1129d }, + .{ 0x1129f, 0x112a8 }, + .{ 0x112b0, 0x112ea }, + .{ 0x112f0, 0x112f9 }, + .{ 0x11300, 0x11303 }, + .{ 0x11305, 0x1130c }, + .{ 0x1130f, 0x11310 }, + .{ 0x11313, 0x11328 }, + .{ 0x1132a, 0x11330 }, + .{ 0x11332, 0x11333 }, + .{ 0x11335, 0x11339 }, + .{ 0x1133b, 0x11344 }, + .{ 0x11347, 0x11348 }, + .{ 0x1134b, 0x1134d }, + .{ 0x11350, 0x11350 }, + .{ 0x11357, 0x11357 }, + .{ 0x1135d, 0x11363 }, + .{ 0x11366, 0x1136c }, + .{ 0x11370, 0x11374 }, + .{ 0x11400, 0x1144a }, + .{ 0x11450, 0x11459 }, + .{ 0x1145e, 0x11461 }, + .{ 0x11480, 0x114c5 }, + .{ 0x114c7, 0x114c7 }, + .{ 0x114d0, 0x114d9 }, + .{ 0x11580, 0x115b5 }, + .{ 0x115b8, 0x115c0 }, + .{ 0x115d8, 0x115dd }, + .{ 0x11600, 0x11640 }, + .{ 0x11644, 0x11644 }, + .{ 0x11650, 0x11659 }, + .{ 0x11680, 0x116b8 }, + .{ 0x116c0, 0x116c9 }, + .{ 0x11700, 0x1171a }, + .{ 0x1171d, 0x1172b }, + .{ 0x11730, 0x11739 }, + .{ 0x11800, 0x1183a }, + .{ 0x118a0, 0x118e9 }, + .{ 0x118ff, 0x11906 }, + .{ 0x11909, 0x11909 }, + .{ 0x1190c, 0x11913 }, + .{ 0x11915, 0x11916 }, + .{ 0x11918, 0x11935 }, + .{ 0x11937, 0x11938 }, + .{ 0x1193b, 0x11943 }, + .{ 0x11950, 0x11959 }, + .{ 0x119a0, 0x119a7 }, + .{ 0x119aa, 0x119d7 }, + .{ 0x119da, 0x119e1 }, + .{ 0x119e3, 0x119e4 }, + .{ 0x11a00, 0x11a3e }, + .{ 0x11a47, 0x11a47 }, + .{ 0x11a50, 0x11a99 }, + .{ 0x11a9d, 0x11a9d }, + .{ 0x11ac0, 0x11af8 }, + .{ 0x11c00, 0x11c08 }, + .{ 0x11c0a, 0x11c36 }, + .{ 0x11c38, 0x11c40 }, + .{ 0x11c50, 0x11c59 }, + .{ 0x11c72, 0x11c8f }, + .{ 0x11c92, 0x11ca7 }, + .{ 0x11ca9, 0x11cb6 }, + .{ 0x11d00, 0x11d06 }, + .{ 0x11d08, 0x11d09 }, + .{ 0x11d0b, 0x11d36 }, + .{ 0x11d3a, 0x11d3a }, + .{ 0x11d3c, 0x11d3d }, + .{ 0x11d3f, 0x11d47 }, + .{ 0x11d50, 0x11d59 }, + .{ 0x11d60, 0x11d65 }, + .{ 0x11d67, 0x11d68 }, + .{ 0x11d6a, 0x11d8e }, + .{ 0x11d90, 0x11d91 }, + .{ 0x11d93, 0x11d98 }, + .{ 0x11da0, 0x11da9 }, + .{ 0x11ee0, 0x11ef6 }, + .{ 0x11fb0, 0x11fb0 }, + .{ 0x12000, 0x12399 }, + .{ 0x12400, 0x1246e }, + .{ 0x12480, 0x12543 }, + .{ 0x13000, 0x1342e }, + .{ 0x14400, 0x14646 }, + .{ 0x16800, 0x16a38 }, + .{ 0x16a40, 0x16a5e }, + .{ 0x16a60, 0x16a69 }, + .{ 0x16ad0, 0x16aed }, + .{ 0x16af0, 0x16af4 }, + .{ 0x16b00, 0x16b36 }, + .{ 0x16b40, 0x16b43 }, + .{ 0x16b50, 0x16b59 }, + .{ 0x16b63, 0x16b77 }, + .{ 0x16b7d, 0x16b8f }, + .{ 0x16e40, 0x16e7f }, + .{ 0x16f00, 0x16f4a }, + .{ 0x16f4f, 0x16f87 }, + .{ 0x16f8f, 0x16f9f }, + .{ 0x16fe0, 0x16fe1 }, + .{ 0x16fe3, 0x16fe4 }, + .{ 0x16ff0, 0x16ff1 }, + .{ 0x17000, 0x187f7 }, + .{ 0x18800, 0x18cd5 }, + .{ 0x18d00, 0x18d08 }, + .{ 0x1b000, 0x1b11e }, + .{ 0x1b150, 0x1b152 }, + .{ 0x1b164, 0x1b167 }, + .{ 0x1b170, 0x1b2fb }, + .{ 0x1bc00, 0x1bc6a }, + .{ 0x1bc70, 0x1bc7c }, + .{ 0x1bc80, 0x1bc88 }, + .{ 0x1bc90, 0x1bc99 }, + .{ 0x1bc9d, 0x1bc9e }, + .{ 0x1d165, 0x1d169 }, + .{ 0x1d16d, 0x1d172 }, + .{ 0x1d17b, 0x1d182 }, + .{ 0x1d185, 0x1d18b }, + .{ 0x1d1aa, 0x1d1ad }, + .{ 0x1d242, 0x1d244 }, + .{ 0x1d400, 0x1d454 }, + .{ 0x1d456, 0x1d49c }, + .{ 0x1d49e, 0x1d49f }, + .{ 0x1d4a2, 0x1d4a2 }, + .{ 0x1d4a5, 0x1d4a6 }, + .{ 0x1d4a9, 0x1d4ac }, + .{ 0x1d4ae, 0x1d4b9 }, + .{ 0x1d4bb, 0x1d4bb }, + .{ 0x1d4bd, 0x1d4c3 }, + .{ 0x1d4c5, 0x1d505 }, + .{ 0x1d507, 0x1d50a }, + .{ 0x1d50d, 0x1d514 }, + .{ 0x1d516, 0x1d51c }, + .{ 0x1d51e, 0x1d539 }, + .{ 0x1d53b, 0x1d53e }, + .{ 0x1d540, 0x1d544 }, + .{ 0x1d546, 0x1d546 }, + .{ 0x1d54a, 0x1d550 }, + .{ 0x1d552, 0x1d6a5 }, + .{ 0x1d6a8, 0x1d6c0 }, + .{ 0x1d6c2, 0x1d6da }, + .{ 0x1d6dc, 0x1d6fa }, + .{ 0x1d6fc, 0x1d714 }, + .{ 0x1d716, 0x1d734 }, + .{ 0x1d736, 0x1d74e }, + .{ 0x1d750, 0x1d76e }, + .{ 0x1d770, 0x1d788 }, + .{ 0x1d78a, 0x1d7a8 }, + .{ 0x1d7aa, 0x1d7c2 }, + .{ 0x1d7c4, 0x1d7cb }, + .{ 0x1d7ce, 0x1d7ff }, + .{ 0x1da00, 0x1da36 }, + .{ 0x1da3b, 0x1da6c }, + .{ 0x1da75, 0x1da75 }, + .{ 0x1da84, 0x1da84 }, + .{ 0x1da9b, 0x1da9f }, + .{ 0x1daa1, 0x1daaf }, + .{ 0x1e000, 0x1e006 }, + .{ 0x1e008, 0x1e018 }, + .{ 0x1e01b, 0x1e021 }, + .{ 0x1e023, 0x1e024 }, + .{ 0x1e026, 0x1e02a }, + .{ 0x1e100, 0x1e12c }, + .{ 0x1e130, 0x1e13d }, + .{ 0x1e140, 0x1e149 }, + .{ 0x1e14e, 0x1e14e }, + .{ 0x1e2c0, 0x1e2f9 }, + .{ 0x1e800, 0x1e8c4 }, + .{ 0x1e8d0, 0x1e8d6 }, + .{ 0x1e900, 0x1e94b }, + .{ 0x1e950, 0x1e959 }, + .{ 0x1ee00, 0x1ee03 }, + .{ 0x1ee05, 0x1ee1f }, + .{ 0x1ee21, 0x1ee22 }, + .{ 0x1ee24, 0x1ee24 }, + .{ 0x1ee27, 0x1ee27 }, + .{ 0x1ee29, 0x1ee32 }, + .{ 0x1ee34, 0x1ee37 }, + .{ 0x1ee39, 0x1ee39 }, + .{ 0x1ee3b, 0x1ee3b }, + .{ 0x1ee42, 0x1ee42 }, + .{ 0x1ee47, 0x1ee47 }, + .{ 0x1ee49, 0x1ee49 }, + .{ 0x1ee4b, 0x1ee4b }, + .{ 0x1ee4d, 0x1ee4f }, + .{ 0x1ee51, 0x1ee52 }, + .{ 0x1ee54, 0x1ee54 }, + .{ 0x1ee57, 0x1ee57 }, + .{ 0x1ee59, 0x1ee59 }, + .{ 0x1ee5b, 0x1ee5b }, + .{ 0x1ee5d, 0x1ee5d }, + .{ 0x1ee5f, 0x1ee5f }, + .{ 0x1ee61, 0x1ee62 }, + .{ 0x1ee64, 0x1ee64 }, + .{ 0x1ee67, 0x1ee6a }, + .{ 0x1ee6c, 0x1ee72 }, + .{ 0x1ee74, 0x1ee77 }, + .{ 0x1ee79, 0x1ee7c }, + .{ 0x1ee7e, 0x1ee7e }, + .{ 0x1ee80, 0x1ee89 }, + .{ 0x1ee8b, 0x1ee9b }, + .{ 0x1eea1, 0x1eea3 }, + .{ 0x1eea5, 0x1eea9 }, + .{ 0x1eeab, 0x1eebb }, + .{ 0x1fbf0, 0x1fbf9 }, + .{ 0x20000, 0x2a6dd }, + .{ 0x2a700, 0x2b734 }, + .{ 0x2b740, 0x2b81d }, + .{ 0x2b820, 0x2cea1 }, + .{ 0x2ceb0, 0x2ebe0 }, + .{ 0x2f800, 0x2fa1d }, + .{ 0x30000, 0x3134a }, + .{ 0xe0100, 0xe01ef }, + }, +); + +pub fn isIdentifierStart(comptime Codepoint: type, codepoint: Codepoint) bool { + return switch (codepoint) { + 0x41...0x5a, + 0x61...0x7a, + 0xaa...0xaa, + 0xb5...0xb5, + 0xba...0xba, + 0xc0...0xd6, + 0xd8...0xf6, + 0xf8...0x2c1, + 0x2c6...0x2d1, + 0x2e0...0x2e4, + 0x2ec...0x2ec, + 0x2ee...0x2ee, + 0x370...0x374, + 0x376...0x377, + 0x37a...0x37d, + 0x37f...0x37f, + 0x386...0x386, + 0x388...0x38a, + 0x38c...0x38c, + 0x38e...0x3a1, + 0x3a3...0x3f5, + 0x3f7...0x481, + 0x48a...0x52f, + 0x531...0x556, + 0x559...0x559, + 0x560...0x588, + 0x5d0...0x5ea, + 0x5ef...0x5f2, + 0x620...0x64a, + 0x66e...0x66f, + 0x671...0x6d3, + 0x6d5...0x6d5, + 0x6e5...0x6e6, + 0x6ee...0x6ef, + 0x6fa...0x6fc, + 0x6ff...0x6ff, + 0x710...0x710, + 0x712...0x72f, + 0x74d...0x7a5, + 0x7b1...0x7b1, + 0x7ca...0x7ea, + 0x7f4...0x7f5, + 0x7fa...0x7fa, + 0x800...0x815, + 0x81a...0x81a, + 0x824...0x824, + 0x828...0x828, + 0x840...0x858, + 0x860...0x86a, + 0x8a0...0x8b4, + 0x8b6...0x8c7, + 0x904...0x939, + 0x93d...0x93d, + 0x950...0x950, + 0x958...0x961, + 0x971...0x980, + 0x985...0x98c, + 0x98f...0x990, + 0x993...0x9a8, + 0x9aa...0x9b0, + 0x9b2...0x9b2, + 0x9b6...0x9b9, + 0x9bd...0x9bd, + 0x9ce...0x9ce, + 0x9dc...0x9dd, + 0x9df...0x9e1, + 0x9f0...0x9f1, + 0x9fc...0x9fc, + 0xa05...0xa0a, + 0xa0f...0xa10, + 0xa13...0xa28, + 0xa2a...0xa30, + 0xa32...0xa33, + 0xa35...0xa36, + 0xa38...0xa39, + 0xa59...0xa5c, + 0xa5e...0xa5e, + 0xa72...0xa74, + 0xa85...0xa8d, + 0xa8f...0xa91, + 0xa93...0xaa8, + 0xaaa...0xab0, + 0xab2...0xab3, + 0xab5...0xab9, + 0xabd...0xabd, + 0xad0...0xad0, + 0xae0...0xae1, + 0xaf9...0xaf9, + 0xb05...0xb0c, + 0xb0f...0xb10, + 0xb13...0xb28, + 0xb2a...0xb30, + 0xb32...0xb33, + 0xb35...0xb39, + 0xb3d...0xb3d, + 0xb5c...0xb5d, + 0xb5f...0xb61, + 0xb71...0xb71, + 0xb83...0xb83, + 0xb85...0xb8a, + 0xb8e...0xb90, + 0xb92...0xb95, + 0xb99...0xb9a, + 0xb9c...0xb9c, + 0xb9e...0xb9f, + 0xba3...0xba4, + 0xba8...0xbaa, + 0xbae...0xbb9, + 0xbd0...0xbd0, + 0xc05...0xc0c, + 0xc0e...0xc10, + 0xc12...0xc28, + 0xc2a...0xc39, + 0xc3d...0xc3d, + 0xc58...0xc5a, + 0xc60...0xc61, + 0xc80...0xc80, + 0xc85...0xc8c, + 0xc8e...0xc90, + 0xc92...0xca8, + 0xcaa...0xcb3, + 0xcb5...0xcb9, + 0xcbd...0xcbd, + 0xcde...0xcde, + 0xce0...0xce1, + 0xcf1...0xcf2, + 0xd04...0xd0c, + 0xd0e...0xd10, + 0xd12...0xd3a, + 0xd3d...0xd3d, + 0xd4e...0xd4e, + 0xd54...0xd56, + 0xd5f...0xd61, + 0xd7a...0xd7f, + 0xd85...0xd96, + 0xd9a...0xdb1, + 0xdb3...0xdbb, + 0xdbd...0xdbd, + 0xdc0...0xdc6, + 0xe01...0xe30, + 0xe32...0xe33, + 0xe40...0xe46, + 0xe81...0xe82, + 0xe84...0xe84, + 0xe86...0xe8a, + 0xe8c...0xea3, + 0xea5...0xea5, + 0xea7...0xeb0, + 0xeb2...0xeb3, + 0xebd...0xebd, + 0xec0...0xec4, + 0xec6...0xec6, + 0xedc...0xedf, + 0xf00...0xf00, + 0xf40...0xf47, + 0xf49...0xf6c, + 0xf88...0xf8c, + 0x1000...0x102a, + 0x103f...0x103f, + 0x1050...0x1055, + 0x105a...0x105d, + 0x1061...0x1061, + 0x1065...0x1066, + 0x106e...0x1070, + 0x1075...0x1081, + 0x108e...0x108e, + 0x10a0...0x10c5, + 0x10c7...0x10c7, + 0x10cd...0x10cd, + 0x10d0...0x10fa, + 0x10fc...0x1248, + 0x124a...0x124d, + 0x1250...0x1256, + 0x1258...0x1258, + 0x125a...0x125d, + 0x1260...0x1288, + 0x128a...0x128d, + 0x1290...0x12b0, + 0x12b2...0x12b5, + 0x12b8...0x12be, + 0x12c0...0x12c0, + 0x12c2...0x12c5, + 0x12c8...0x12d6, + 0x12d8...0x1310, + 0x1312...0x1315, + 0x1318...0x135a, + 0x1380...0x138f, + 0x13a0...0x13f5, + 0x13f8...0x13fd, + 0x1401...0x166c, + 0x166f...0x167f, + 0x1681...0x169a, + 0x16a0...0x16ea, + 0x16ee...0x16f8, + 0x1700...0x170c, + 0x170e...0x1711, + 0x1720...0x1731, + 0x1740...0x1751, + 0x1760...0x176c, + 0x176e...0x1770, + 0x1780...0x17b3, + 0x17d7...0x17d7, + 0x17dc...0x17dc, + 0x1820...0x1878, + 0x1880...0x18a8, + 0x18aa...0x18aa, + 0x18b0...0x18f5, + 0x1900...0x191e, + 0x1950...0x196d, + 0x1970...0x1974, + 0x1980...0x19ab, + 0x19b0...0x19c9, + 0x1a00...0x1a16, + 0x1a20...0x1a54, + 0x1aa7...0x1aa7, + 0x1b05...0x1b33, + 0x1b45...0x1b4b, + 0x1b83...0x1ba0, + 0x1bae...0x1baf, + 0x1bba...0x1be5, + 0x1c00...0x1c23, + 0x1c4d...0x1c4f, + 0x1c5a...0x1c7d, + 0x1c80...0x1c88, + 0x1c90...0x1cba, + 0x1cbd...0x1cbf, + 0x1ce9...0x1cec, + 0x1cee...0x1cf3, + 0x1cf5...0x1cf6, + 0x1cfa...0x1cfa, + 0x1d00...0x1dbf, + 0x1e00...0x1f15, + 0x1f18...0x1f1d, + 0x1f20...0x1f45, + 0x1f48...0x1f4d, + 0x1f50...0x1f57, + 0x1f59...0x1f59, + 0x1f5b...0x1f5b, + 0x1f5d...0x1f5d, + 0x1f5f...0x1f7d, + 0x1f80...0x1fb4, + 0x1fb6...0x1fbc, + 0x1fbe...0x1fbe, + 0x1fc2...0x1fc4, + 0x1fc6...0x1fcc, + 0x1fd0...0x1fd3, + 0x1fd6...0x1fdb, + 0x1fe0...0x1fec, + 0x1ff2...0x1ff4, + 0x1ff6...0x1ffc, + 0x2071...0x2071, + 0x207f...0x207f, + 0x2090...0x209c, + 0x2102...0x2102, + 0x2107...0x2107, + 0x210a...0x2113, + 0x2115...0x2115, + 0x2118...0x211d, + 0x2124...0x2124, + 0x2126...0x2126, + 0x2128...0x2128, + 0x212a...0x2139, + 0x213c...0x213f, + 0x2145...0x2149, + 0x214e...0x214e, + 0x2160...0x2188, + 0x2c00...0x2c2e, + 0x2c30...0x2c5e, + 0x2c60...0x2ce4, + 0x2ceb...0x2cee, + 0x2cf2...0x2cf3, + 0x2d00...0x2d25, + 0x2d27...0x2d27, + 0x2d2d...0x2d2d, + 0x2d30...0x2d67, + 0x2d6f...0x2d6f, + 0x2d80...0x2d96, + 0x2da0...0x2da6, + 0x2da8...0x2dae, + 0x2db0...0x2db6, + 0x2db8...0x2dbe, + 0x2dc0...0x2dc6, + 0x2dc8...0x2dce, + 0x2dd0...0x2dd6, + 0x2dd8...0x2dde, + 0x3005...0x3007, + 0x3021...0x3029, + 0x3031...0x3035, + 0x3038...0x303c, + 0x3041...0x3096, + 0x309b...0x309f, + 0x30a1...0x30fa, + 0x30fc...0x30ff, + 0x3105...0x312f, + 0x3131...0x318e, + 0x31a0...0x31bf, + 0x31f0...0x31ff, + 0x3400...0x4dbf, + 0x4e00...0x9ffc, + 0xa000...0xa48c, + 0xa4d0...0xa4fd, + 0xa500...0xa60c, + 0xa610...0xa61f, + 0xa62a...0xa62b, + 0xa640...0xa66e, + 0xa67f...0xa69d, + 0xa6a0...0xa6ef, + 0xa717...0xa71f, + 0xa722...0xa788, + 0xa78b...0xa7bf, + 0xa7c2...0xa7ca, + 0xa7f5...0xa801, + 0xa803...0xa805, + 0xa807...0xa80a, + 0xa80c...0xa822, + 0xa840...0xa873, + 0xa882...0xa8b3, + 0xa8f2...0xa8f7, + 0xa8fb...0xa8fb, + 0xa8fd...0xa8fe, + 0xa90a...0xa925, + 0xa930...0xa946, + 0xa960...0xa97c, + 0xa984...0xa9b2, + 0xa9cf...0xa9cf, + 0xa9e0...0xa9e4, + 0xa9e6...0xa9ef, + 0xa9fa...0xa9fe, + 0xaa00...0xaa28, + 0xaa40...0xaa42, + 0xaa44...0xaa4b, + 0xaa60...0xaa76, + 0xaa7a...0xaa7a, + 0xaa7e...0xaaaf, + 0xaab1...0xaab1, + 0xaab5...0xaab6, + 0xaab9...0xaabd, + 0xaac0...0xaac0, + 0xaac2...0xaac2, + 0xaadb...0xaadd, + 0xaae0...0xaaea, + 0xaaf2...0xaaf4, + 0xab01...0xab06, + 0xab09...0xab0e, + 0xab11...0xab16, + 0xab20...0xab26, + 0xab28...0xab2e, + 0xab30...0xab5a, + 0xab5c...0xab69, + 0xab70...0xabe2, + 0xac00...0xd7a3, + 0xd7b0...0xd7c6, + 0xd7cb...0xd7fb, + 0xf900...0xfa6d, + 0xfa70...0xfad9, + 0xfb00...0xfb06, + 0xfb13...0xfb17, + 0xfb1d...0xfb1d, + 0xfb1f...0xfb28, + 0xfb2a...0xfb36, + 0xfb38...0xfb3c, + 0xfb3e...0xfb3e, + 0xfb40...0xfb41, + 0xfb43...0xfb44, + 0xfb46...0xfbb1, + 0xfbd3...0xfd3d, + 0xfd50...0xfd8f, + 0xfd92...0xfdc7, + 0xfdf0...0xfdfb, + 0xfe70...0xfe74, + 0xfe76...0xfefc, + 0xff21...0xff3a, + 0xff41...0xff5a, + 0xff66...0xffbe, + 0xffc2...0xffc7, + 0xffca...0xffcf, + 0xffd2...0xffd7, + 0xffda...0xffdc, + 0x10000...0x1000b, + 0x1000d...0x10026, + 0x10028...0x1003a, + 0x1003c...0x1003d, + 0x1003f...0x1004d, + 0x10050...0x1005d, + 0x10080...0x100fa, + 0x10140...0x10174, + 0x10280...0x1029c, + 0x102a0...0x102d0, + 0x10300...0x1031f, + 0x1032d...0x1034a, + 0x10350...0x10375, + 0x10380...0x1039d, + 0x103a0...0x103c3, + 0x103c8...0x103cf, + 0x103d1...0x103d5, + 0x10400...0x1049d, + 0x104b0...0x104d3, + 0x104d8...0x104fb, + 0x10500...0x10527, + 0x10530...0x10563, + 0x10600...0x10736, + 0x10740...0x10755, + 0x10760...0x10767, + 0x10800...0x10805, + 0x10808...0x10808, + 0x1080a...0x10835, + 0x10837...0x10838, + 0x1083c...0x1083c, + 0x1083f...0x10855, + 0x10860...0x10876, + 0x10880...0x1089e, + 0x108e0...0x108f2, + 0x108f4...0x108f5, + 0x10900...0x10915, + 0x10920...0x10939, + 0x10980...0x109b7, + 0x109be...0x109bf, + 0x10a00...0x10a00, + 0x10a10...0x10a13, + 0x10a15...0x10a17, + 0x10a19...0x10a35, + 0x10a60...0x10a7c, + 0x10a80...0x10a9c, + 0x10ac0...0x10ac7, + 0x10ac9...0x10ae4, + 0x10b00...0x10b35, + 0x10b40...0x10b55, + 0x10b60...0x10b72, + 0x10b80...0x10b91, + 0x10c00...0x10c48, + 0x10c80...0x10cb2, + 0x10cc0...0x10cf2, + 0x10d00...0x10d23, + 0x10e80...0x10ea9, + 0x10eb0...0x10eb1, + 0x10f00...0x10f1c, + 0x10f27...0x10f27, + 0x10f30...0x10f45, + 0x10fb0...0x10fc4, + 0x10fe0...0x10ff6, + 0x11003...0x11037, + 0x11083...0x110af, + 0x110d0...0x110e8, + 0x11103...0x11126, + 0x11144...0x11144, + 0x11147...0x11147, + 0x11150...0x11172, + 0x11176...0x11176, + 0x11183...0x111b2, + 0x111c1...0x111c4, + 0x111da...0x111da, + 0x111dc...0x111dc, + 0x11200...0x11211, + 0x11213...0x1122b, + 0x11280...0x11286, + 0x11288...0x11288, + 0x1128a...0x1128d, + 0x1128f...0x1129d, + 0x1129f...0x112a8, + 0x112b0...0x112de, + 0x11305...0x1130c, + 0x1130f...0x11310, + 0x11313...0x11328, + 0x1132a...0x11330, + 0x11332...0x11333, + 0x11335...0x11339, + 0x1133d...0x1133d, + 0x11350...0x11350, + 0x1135d...0x11361, + 0x11400...0x11434, + 0x11447...0x1144a, + 0x1145f...0x11461, + 0x11480...0x114af, + 0x114c4...0x114c5, + 0x114c7...0x114c7, + 0x11580...0x115ae, + 0x115d8...0x115db, + 0x11600...0x1162f, + 0x11644...0x11644, + 0x11680...0x116aa, + 0x116b8...0x116b8, + 0x11700...0x1171a, + 0x11800...0x1182b, + 0x118a0...0x118df, + 0x118ff...0x11906, + 0x11909...0x11909, + 0x1190c...0x11913, + 0x11915...0x11916, + 0x11918...0x1192f, + 0x1193f...0x1193f, + 0x11941...0x11941, + 0x119a0...0x119a7, + 0x119aa...0x119d0, + 0x119e1...0x119e1, + 0x119e3...0x119e3, + 0x11a00...0x11a00, + 0x11a0b...0x11a32, + 0x11a3a...0x11a3a, + 0x11a50...0x11a50, + 0x11a5c...0x11a89, + 0x11a9d...0x11a9d, + 0x11ac0...0x11af8, + 0x11c00...0x11c08, + 0x11c0a...0x11c2e, + 0x11c40...0x11c40, + 0x11c72...0x11c8f, + 0x11d00...0x11d06, + 0x11d08...0x11d09, + 0x11d0b...0x11d30, + 0x11d46...0x11d46, + 0x11d60...0x11d65, + 0x11d67...0x11d68, + 0x11d6a...0x11d89, + 0x11d98...0x11d98, + 0x11ee0...0x11ef2, + 0x11fb0...0x11fb0, + 0x12000...0x12399, + 0x12400...0x1246e, + 0x12480...0x12543, + 0x13000...0x1342e, + 0x14400...0x14646, + 0x16800...0x16a38, + 0x16a40...0x16a5e, + 0x16ad0...0x16aed, + 0x16b00...0x16b2f, + 0x16b40...0x16b43, + 0x16b63...0x16b77, + 0x16b7d...0x16b8f, + 0x16e40...0x16e7f, + 0x16f00...0x16f4a, + 0x16f50...0x16f50, + 0x16f93...0x16f9f, + 0x16fe0...0x16fe1, + 0x16fe3...0x16fe3, + 0x17000...0x187f7, + 0x18800...0x18cd5, + 0x18d00...0x18d08, + 0x1b000...0x1b11e, + 0x1b150...0x1b152, + 0x1b164...0x1b167, + 0x1b170...0x1b2fb, + 0x1bc00...0x1bc6a, + 0x1bc70...0x1bc7c, + 0x1bc80...0x1bc88, + 0x1bc90...0x1bc99, + 0x1d400...0x1d454, + 0x1d456...0x1d49c, + 0x1d49e...0x1d49f, + 0x1d4a2...0x1d4a2, + 0x1d4a5...0x1d4a6, + 0x1d4a9...0x1d4ac, + 0x1d4ae...0x1d4b9, + 0x1d4bb...0x1d4bb, + 0x1d4bd...0x1d4c3, + 0x1d4c5...0x1d505, + 0x1d507...0x1d50a, + 0x1d50d...0x1d514, + 0x1d516...0x1d51c, + 0x1d51e...0x1d539, + 0x1d53b...0x1d53e, + 0x1d540...0x1d544, + 0x1d546...0x1d546, + 0x1d54a...0x1d550, + 0x1d552...0x1d6a5, + 0x1d6a8...0x1d6c0, + 0x1d6c2...0x1d6da, + 0x1d6dc...0x1d6fa, + 0x1d6fc...0x1d714, + 0x1d716...0x1d734, + 0x1d736...0x1d74e, + 0x1d750...0x1d76e, + 0x1d770...0x1d788, + 0x1d78a...0x1d7a8, + 0x1d7aa...0x1d7c2, + 0x1d7c4...0x1d7cb, + 0x1e100...0x1e12c, + 0x1e137...0x1e13d, + 0x1e14e...0x1e14e, + 0x1e2c0...0x1e2eb, + 0x1e800...0x1e8c4, + 0x1e900...0x1e943, + 0x1e94b...0x1e94b, + 0x1ee00...0x1ee03, + 0x1ee05...0x1ee1f, + 0x1ee21...0x1ee22, + 0x1ee24...0x1ee24, + 0x1ee27...0x1ee27, + 0x1ee29...0x1ee32, + 0x1ee34...0x1ee37, + 0x1ee39...0x1ee39, + 0x1ee3b...0x1ee3b, + 0x1ee42...0x1ee42, + 0x1ee47...0x1ee47, + 0x1ee49...0x1ee49, + 0x1ee4b...0x1ee4b, + 0x1ee4d...0x1ee4f, + 0x1ee51...0x1ee52, + 0x1ee54...0x1ee54, + 0x1ee57...0x1ee57, + 0x1ee59...0x1ee59, + 0x1ee5b...0x1ee5b, + 0x1ee5d...0x1ee5d, + 0x1ee5f...0x1ee5f, + 0x1ee61...0x1ee62, + 0x1ee64...0x1ee64, + 0x1ee67...0x1ee6a, + 0x1ee6c...0x1ee72, + 0x1ee74...0x1ee77, + 0x1ee79...0x1ee7c, + 0x1ee7e...0x1ee7e, + 0x1ee80...0x1ee89, + 0x1ee8b...0x1ee9b, + 0x1eea1...0x1eea3, + 0x1eea5...0x1eea9, + 0x1eeab...0x1eebb, + 0x20000...0x2a6dd, + 0x2a700...0x2b734, + 0x2b740...0x2b81d, + 0x2b820...0x2cea1, + 0x2ceb0...0x2ebe0, + 0x2f800...0x2fa1d, + 0x30000...0x3134a, + => true, + else => false, + }; +} + +pub fn isIdentifierContinue(comptime Codepoint: type, codepoint: Codepoint) bool { + return switch (codepoint) { + 0x30...0x39, + 0x41...0x5a, + 0x5f...0x5f, + 0x61...0x7a, + 0xaa...0xaa, + 0xb5...0xb5, + 0xb7...0xb7, + 0xba...0xba, + 0xc0...0xd6, + 0xd8...0xf6, + 0xf8...0x2c1, + 0x2c6...0x2d1, + 0x2e0...0x2e4, + 0x2ec...0x2ec, + 0x2ee...0x2ee, + 0x300...0x374, + 0x376...0x377, + 0x37a...0x37d, + 0x37f...0x37f, + 0x386...0x38a, + 0x38c...0x38c, + 0x38e...0x3a1, + 0x3a3...0x3f5, + 0x3f7...0x481, + 0x483...0x487, + 0x48a...0x52f, + 0x531...0x556, + 0x559...0x559, + 0x560...0x588, + 0x591...0x5bd, + 0x5bf...0x5bf, + 0x5c1...0x5c2, + 0x5c4...0x5c5, + 0x5c7...0x5c7, + 0x5d0...0x5ea, + 0x5ef...0x5f2, + 0x610...0x61a, + 0x620...0x669, + 0x66e...0x6d3, + 0x6d5...0x6dc, + 0x6df...0x6e8, + 0x6ea...0x6fc, + 0x6ff...0x6ff, + 0x710...0x74a, + 0x74d...0x7b1, + 0x7c0...0x7f5, + 0x7fa...0x7fa, + 0x7fd...0x7fd, + 0x800...0x82d, + 0x840...0x85b, + 0x860...0x86a, + 0x8a0...0x8b4, + 0x8b6...0x8c7, + 0x8d3...0x8e1, + 0x8e3...0x963, + 0x966...0x96f, + 0x971...0x983, + 0x985...0x98c, + 0x98f...0x990, + 0x993...0x9a8, + 0x9aa...0x9b0, + 0x9b2...0x9b2, + 0x9b6...0x9b9, + 0x9bc...0x9c4, + 0x9c7...0x9c8, + 0x9cb...0x9ce, + 0x9d7...0x9d7, + 0x9dc...0x9dd, + 0x9df...0x9e3, + 0x9e6...0x9f1, + 0x9fc...0x9fc, + 0x9fe...0x9fe, + 0xa01...0xa03, + 0xa05...0xa0a, + 0xa0f...0xa10, + 0xa13...0xa28, + 0xa2a...0xa30, + 0xa32...0xa33, + 0xa35...0xa36, + 0xa38...0xa39, + 0xa3c...0xa3c, + 0xa3e...0xa42, + 0xa47...0xa48, + 0xa4b...0xa4d, + 0xa51...0xa51, + 0xa59...0xa5c, + 0xa5e...0xa5e, + 0xa66...0xa75, + 0xa81...0xa83, + 0xa85...0xa8d, + 0xa8f...0xa91, + 0xa93...0xaa8, + 0xaaa...0xab0, + 0xab2...0xab3, + 0xab5...0xab9, + 0xabc...0xac5, + 0xac7...0xac9, + 0xacb...0xacd, + 0xad0...0xad0, + 0xae0...0xae3, + 0xae6...0xaef, + 0xaf9...0xaff, + 0xb01...0xb03, + 0xb05...0xb0c, + 0xb0f...0xb10, + 0xb13...0xb28, + 0xb2a...0xb30, + 0xb32...0xb33, + 0xb35...0xb39, + 0xb3c...0xb44, + 0xb47...0xb48, + 0xb4b...0xb4d, + 0xb55...0xb57, + 0xb5c...0xb5d, + 0xb5f...0xb63, + 0xb66...0xb6f, + 0xb71...0xb71, + 0xb82...0xb83, + 0xb85...0xb8a, + 0xb8e...0xb90, + 0xb92...0xb95, + 0xb99...0xb9a, + 0xb9c...0xb9c, + 0xb9e...0xb9f, + 0xba3...0xba4, + 0xba8...0xbaa, + 0xbae...0xbb9, + 0xbbe...0xbc2, + 0xbc6...0xbc8, + 0xbca...0xbcd, + 0xbd0...0xbd0, + 0xbd7...0xbd7, + 0xbe6...0xbef, + 0xc00...0xc0c, + 0xc0e...0xc10, + 0xc12...0xc28, + 0xc2a...0xc39, + 0xc3d...0xc44, + 0xc46...0xc48, + 0xc4a...0xc4d, + 0xc55...0xc56, + 0xc58...0xc5a, + 0xc60...0xc63, + 0xc66...0xc6f, + 0xc80...0xc83, + 0xc85...0xc8c, + 0xc8e...0xc90, + 0xc92...0xca8, + 0xcaa...0xcb3, + 0xcb5...0xcb9, + 0xcbc...0xcc4, + 0xcc6...0xcc8, + 0xcca...0xccd, + 0xcd5...0xcd6, + 0xcde...0xcde, + 0xce0...0xce3, + 0xce6...0xcef, + 0xcf1...0xcf2, + 0xd00...0xd0c, + 0xd0e...0xd10, + 0xd12...0xd44, + 0xd46...0xd48, + 0xd4a...0xd4e, + 0xd54...0xd57, + 0xd5f...0xd63, + 0xd66...0xd6f, + 0xd7a...0xd7f, + 0xd81...0xd83, + 0xd85...0xd96, + 0xd9a...0xdb1, + 0xdb3...0xdbb, + 0xdbd...0xdbd, + 0xdc0...0xdc6, + 0xdca...0xdca, + 0xdcf...0xdd4, + 0xdd6...0xdd6, + 0xdd8...0xddf, + 0xde6...0xdef, + 0xdf2...0xdf3, + 0xe01...0xe3a, + 0xe40...0xe4e, + 0xe50...0xe59, + 0xe81...0xe82, + 0xe84...0xe84, + 0xe86...0xe8a, + 0xe8c...0xea3, + 0xea5...0xea5, + 0xea7...0xebd, + 0xec0...0xec4, + 0xec6...0xec6, + 0xec8...0xecd, + 0xed0...0xed9, + 0xedc...0xedf, + 0xf00...0xf00, + 0xf18...0xf19, + 0xf20...0xf29, + 0xf35...0xf35, + 0xf37...0xf37, + 0xf39...0xf39, + 0xf3e...0xf47, + 0xf49...0xf6c, + 0xf71...0xf84, + 0xf86...0xf97, + 0xf99...0xfbc, + 0xfc6...0xfc6, + 0x1000...0x1049, + 0x1050...0x109d, + 0x10a0...0x10c5, + 0x10c7...0x10c7, + 0x10cd...0x10cd, + 0x10d0...0x10fa, + 0x10fc...0x1248, + 0x124a...0x124d, + 0x1250...0x1256, + 0x1258...0x1258, + 0x125a...0x125d, + 0x1260...0x1288, + 0x128a...0x128d, + 0x1290...0x12b0, + 0x12b2...0x12b5, + 0x12b8...0x12be, + 0x12c0...0x12c0, + 0x12c2...0x12c5, + 0x12c8...0x12d6, + 0x12d8...0x1310, + 0x1312...0x1315, + 0x1318...0x135a, + 0x135d...0x135f, + 0x1369...0x1371, + 0x1380...0x138f, + 0x13a0...0x13f5, + 0x13f8...0x13fd, + 0x1401...0x166c, + 0x166f...0x167f, + 0x1681...0x169a, + 0x16a0...0x16ea, + 0x16ee...0x16f8, + 0x1700...0x170c, + 0x170e...0x1714, + 0x1720...0x1734, + 0x1740...0x1753, + 0x1760...0x176c, + 0x176e...0x1770, + 0x1772...0x1773, + 0x1780...0x17d3, + 0x17d7...0x17d7, + 0x17dc...0x17dd, + 0x17e0...0x17e9, + 0x180b...0x180d, + 0x1810...0x1819, + 0x1820...0x1878, + 0x1880...0x18aa, + 0x18b0...0x18f5, + 0x1900...0x191e, + 0x1920...0x192b, + 0x1930...0x193b, + 0x1946...0x196d, + 0x1970...0x1974, + 0x1980...0x19ab, + 0x19b0...0x19c9, + 0x19d0...0x19da, + 0x1a00...0x1a1b, + 0x1a20...0x1a5e, + 0x1a60...0x1a7c, + 0x1a7f...0x1a89, + 0x1a90...0x1a99, + 0x1aa7...0x1aa7, + 0x1ab0...0x1abd, + 0x1abf...0x1ac0, + 0x1b00...0x1b4b, + 0x1b50...0x1b59, + 0x1b6b...0x1b73, + 0x1b80...0x1bf3, + 0x1c00...0x1c37, + 0x1c40...0x1c49, + 0x1c4d...0x1c7d, + 0x1c80...0x1c88, + 0x1c90...0x1cba, + 0x1cbd...0x1cbf, + 0x1cd0...0x1cd2, + 0x1cd4...0x1cfa, + 0x1d00...0x1df9, + 0x1dfb...0x1f15, + 0x1f18...0x1f1d, + 0x1f20...0x1f45, + 0x1f48...0x1f4d, + 0x1f50...0x1f57, + 0x1f59...0x1f59, + 0x1f5b...0x1f5b, + 0x1f5d...0x1f5d, + 0x1f5f...0x1f7d, + 0x1f80...0x1fb4, + 0x1fb6...0x1fbc, + 0x1fbe...0x1fbe, + 0x1fc2...0x1fc4, + 0x1fc6...0x1fcc, + 0x1fd0...0x1fd3, + 0x1fd6...0x1fdb, + 0x1fe0...0x1fec, + 0x1ff2...0x1ff4, + 0x1ff6...0x1ffc, + 0x203f...0x2040, + 0x2054...0x2054, + 0x2071...0x2071, + 0x207f...0x207f, + 0x2090...0x209c, + 0x20d0...0x20dc, + 0x20e1...0x20e1, + 0x20e5...0x20f0, + 0x2102...0x2102, + 0x2107...0x2107, + 0x210a...0x2113, + 0x2115...0x2115, + 0x2118...0x211d, + 0x2124...0x2124, + 0x2126...0x2126, + 0x2128...0x2128, + 0x212a...0x2139, + 0x213c...0x213f, + 0x2145...0x2149, + 0x214e...0x214e, + 0x2160...0x2188, + 0x2c00...0x2c2e, + 0x2c30...0x2c5e, + 0x2c60...0x2ce4, + 0x2ceb...0x2cf3, + 0x2d00...0x2d25, + 0x2d27...0x2d27, + 0x2d2d...0x2d2d, + 0x2d30...0x2d67, + 0x2d6f...0x2d6f, + 0x2d7f...0x2d96, + 0x2da0...0x2da6, + 0x2da8...0x2dae, + 0x2db0...0x2db6, + 0x2db8...0x2dbe, + 0x2dc0...0x2dc6, + 0x2dc8...0x2dce, + 0x2dd0...0x2dd6, + 0x2dd8...0x2dde, + 0x2de0...0x2dff, + 0x3005...0x3007, + 0x3021...0x302f, + 0x3031...0x3035, + 0x3038...0x303c, + 0x3041...0x3096, + 0x3099...0x309f, + 0x30a1...0x30ff, + 0x3105...0x312f, + 0x3131...0x318e, + 0x31a0...0x31bf, + 0x31f0...0x31ff, + 0x3400...0x4dbf, + 0x4e00...0x9ffc, + 0xa000...0xa48c, + 0xa4d0...0xa4fd, + 0xa500...0xa60c, + 0xa610...0xa62b, + 0xa640...0xa66f, + 0xa674...0xa67d, + 0xa67f...0xa6f1, + 0xa717...0xa71f, + 0xa722...0xa788, + 0xa78b...0xa7bf, + 0xa7c2...0xa7ca, + 0xa7f5...0xa827, + 0xa82c...0xa82c, + 0xa840...0xa873, + 0xa880...0xa8c5, + 0xa8d0...0xa8d9, + 0xa8e0...0xa8f7, + 0xa8fb...0xa8fb, + 0xa8fd...0xa92d, + 0xa930...0xa953, + 0xa960...0xa97c, + 0xa980...0xa9c0, + 0xa9cf...0xa9d9, + 0xa9e0...0xa9fe, + 0xaa00...0xaa36, + 0xaa40...0xaa4d, + 0xaa50...0xaa59, + 0xaa60...0xaa76, + 0xaa7a...0xaac2, + 0xaadb...0xaadd, + 0xaae0...0xaaef, + 0xaaf2...0xaaf6, + 0xab01...0xab06, + 0xab09...0xab0e, + 0xab11...0xab16, + 0xab20...0xab26, + 0xab28...0xab2e, + 0xab30...0xab5a, + 0xab5c...0xab69, + 0xab70...0xabea, + 0xabec...0xabed, + 0xabf0...0xabf9, + 0xac00...0xd7a3, + 0xd7b0...0xd7c6, + 0xd7cb...0xd7fb, + 0xf900...0xfa6d, + 0xfa70...0xfad9, + 0xfb00...0xfb06, + 0xfb13...0xfb17, + 0xfb1d...0xfb28, + 0xfb2a...0xfb36, + 0xfb38...0xfb3c, + 0xfb3e...0xfb3e, + 0xfb40...0xfb41, + 0xfb43...0xfb44, + 0xfb46...0xfbb1, + 0xfbd3...0xfd3d, + 0xfd50...0xfd8f, + 0xfd92...0xfdc7, + 0xfdf0...0xfdfb, + 0xfe00...0xfe0f, + 0xfe20...0xfe2f, + 0xfe33...0xfe34, + 0xfe4d...0xfe4f, + 0xfe70...0xfe74, + 0xfe76...0xfefc, + 0xff10...0xff19, + 0xff21...0xff3a, + 0xff3f...0xff3f, + 0xff41...0xff5a, + 0xff65...0xffbe, + 0xffc2...0xffc7, + 0xffca...0xffcf, + 0xffd2...0xffd7, + 0xffda...0xffdc, + 0x10000...0x1000b, + 0x1000d...0x10026, + 0x10028...0x1003a, + 0x1003c...0x1003d, + 0x1003f...0x1004d, + 0x10050...0x1005d, + 0x10080...0x100fa, + 0x10140...0x10174, + 0x101fd...0x101fd, + 0x10280...0x1029c, + 0x102a0...0x102d0, + 0x102e0...0x102e0, + 0x10300...0x1031f, + 0x1032d...0x1034a, + 0x10350...0x1037a, + 0x10380...0x1039d, + 0x103a0...0x103c3, + 0x103c8...0x103cf, + 0x103d1...0x103d5, + 0x10400...0x1049d, + 0x104a0...0x104a9, + 0x104b0...0x104d3, + 0x104d8...0x104fb, + 0x10500...0x10527, + 0x10530...0x10563, + 0x10600...0x10736, + 0x10740...0x10755, + 0x10760...0x10767, + 0x10800...0x10805, + 0x10808...0x10808, + 0x1080a...0x10835, + 0x10837...0x10838, + 0x1083c...0x1083c, + 0x1083f...0x10855, + 0x10860...0x10876, + 0x10880...0x1089e, + 0x108e0...0x108f2, + 0x108f4...0x108f5, + 0x10900...0x10915, + 0x10920...0x10939, + 0x10980...0x109b7, + 0x109be...0x109bf, + 0x10a00...0x10a03, + 0x10a05...0x10a06, + 0x10a0c...0x10a13, + 0x10a15...0x10a17, + 0x10a19...0x10a35, + 0x10a38...0x10a3a, + 0x10a3f...0x10a3f, + 0x10a60...0x10a7c, + 0x10a80...0x10a9c, + 0x10ac0...0x10ac7, + 0x10ac9...0x10ae6, + 0x10b00...0x10b35, + 0x10b40...0x10b55, + 0x10b60...0x10b72, + 0x10b80...0x10b91, + 0x10c00...0x10c48, + 0x10c80...0x10cb2, + 0x10cc0...0x10cf2, + 0x10d00...0x10d27, + 0x10d30...0x10d39, + 0x10e80...0x10ea9, + 0x10eab...0x10eac, + 0x10eb0...0x10eb1, + 0x10f00...0x10f1c, + 0x10f27...0x10f27, + 0x10f30...0x10f50, + 0x10fb0...0x10fc4, + 0x10fe0...0x10ff6, + 0x11000...0x11046, + 0x11066...0x1106f, + 0x1107f...0x110ba, + 0x110d0...0x110e8, + 0x110f0...0x110f9, + 0x11100...0x11134, + 0x11136...0x1113f, + 0x11144...0x11147, + 0x11150...0x11173, + 0x11176...0x11176, + 0x11180...0x111c4, + 0x111c9...0x111cc, + 0x111ce...0x111da, + 0x111dc...0x111dc, + 0x11200...0x11211, + 0x11213...0x11237, + 0x1123e...0x1123e, + 0x11280...0x11286, + 0x11288...0x11288, + 0x1128a...0x1128d, + 0x1128f...0x1129d, + 0x1129f...0x112a8, + 0x112b0...0x112ea, + 0x112f0...0x112f9, + 0x11300...0x11303, + 0x11305...0x1130c, + 0x1130f...0x11310, + 0x11313...0x11328, + 0x1132a...0x11330, + 0x11332...0x11333, + 0x11335...0x11339, + 0x1133b...0x11344, + 0x11347...0x11348, + 0x1134b...0x1134d, + 0x11350...0x11350, + 0x11357...0x11357, + 0x1135d...0x11363, + 0x11366...0x1136c, + 0x11370...0x11374, + 0x11400...0x1144a, + 0x11450...0x11459, + 0x1145e...0x11461, + 0x11480...0x114c5, + 0x114c7...0x114c7, + 0x114d0...0x114d9, + 0x11580...0x115b5, + 0x115b8...0x115c0, + 0x115d8...0x115dd, + 0x11600...0x11640, + 0x11644...0x11644, + 0x11650...0x11659, + 0x11680...0x116b8, + 0x116c0...0x116c9, + 0x11700...0x1171a, + 0x1171d...0x1172b, + 0x11730...0x11739, + 0x11800...0x1183a, + 0x118a0...0x118e9, + 0x118ff...0x11906, + 0x11909...0x11909, + 0x1190c...0x11913, + 0x11915...0x11916, + 0x11918...0x11935, + 0x11937...0x11938, + 0x1193b...0x11943, + 0x11950...0x11959, + 0x119a0...0x119a7, + 0x119aa...0x119d7, + 0x119da...0x119e1, + 0x119e3...0x119e4, + 0x11a00...0x11a3e, + 0x11a47...0x11a47, + 0x11a50...0x11a99, + 0x11a9d...0x11a9d, + 0x11ac0...0x11af8, + 0x11c00...0x11c08, + 0x11c0a...0x11c36, + 0x11c38...0x11c40, + 0x11c50...0x11c59, + 0x11c72...0x11c8f, + 0x11c92...0x11ca7, + 0x11ca9...0x11cb6, + 0x11d00...0x11d06, + 0x11d08...0x11d09, + 0x11d0b...0x11d36, + 0x11d3a...0x11d3a, + 0x11d3c...0x11d3d, + 0x11d3f...0x11d47, + 0x11d50...0x11d59, + 0x11d60...0x11d65, + 0x11d67...0x11d68, + 0x11d6a...0x11d8e, + 0x11d90...0x11d91, + 0x11d93...0x11d98, + 0x11da0...0x11da9, + 0x11ee0...0x11ef6, + 0x11fb0...0x11fb0, + 0x12000...0x12399, + 0x12400...0x1246e, + 0x12480...0x12543, + 0x13000...0x1342e, + 0x14400...0x14646, + 0x16800...0x16a38, + 0x16a40...0x16a5e, + 0x16a60...0x16a69, + 0x16ad0...0x16aed, + 0x16af0...0x16af4, + 0x16b00...0x16b36, + 0x16b40...0x16b43, + 0x16b50...0x16b59, + 0x16b63...0x16b77, + 0x16b7d...0x16b8f, + 0x16e40...0x16e7f, + 0x16f00...0x16f4a, + 0x16f4f...0x16f87, + 0x16f8f...0x16f9f, + 0x16fe0...0x16fe1, + 0x16fe3...0x16fe4, + 0x16ff0...0x16ff1, + 0x17000...0x187f7, + 0x18800...0x18cd5, + 0x18d00...0x18d08, + 0x1b000...0x1b11e, + 0x1b150...0x1b152, + 0x1b164...0x1b167, + 0x1b170...0x1b2fb, + 0x1bc00...0x1bc6a, + 0x1bc70...0x1bc7c, + 0x1bc80...0x1bc88, + 0x1bc90...0x1bc99, + 0x1bc9d...0x1bc9e, + 0x1d165...0x1d169, + 0x1d16d...0x1d172, + 0x1d17b...0x1d182, + 0x1d185...0x1d18b, + 0x1d1aa...0x1d1ad, + 0x1d242...0x1d244, + 0x1d400...0x1d454, + 0x1d456...0x1d49c, + 0x1d49e...0x1d49f, + 0x1d4a2...0x1d4a2, + 0x1d4a5...0x1d4a6, + 0x1d4a9...0x1d4ac, + 0x1d4ae...0x1d4b9, + 0x1d4bb...0x1d4bb, + 0x1d4bd...0x1d4c3, + 0x1d4c5...0x1d505, + 0x1d507...0x1d50a, + 0x1d50d...0x1d514, + 0x1d516...0x1d51c, + 0x1d51e...0x1d539, + 0x1d53b...0x1d53e, + 0x1d540...0x1d544, + 0x1d546...0x1d546, + 0x1d54a...0x1d550, + 0x1d552...0x1d6a5, + 0x1d6a8...0x1d6c0, + 0x1d6c2...0x1d6da, + 0x1d6dc...0x1d6fa, + 0x1d6fc...0x1d714, + 0x1d716...0x1d734, + 0x1d736...0x1d74e, + 0x1d750...0x1d76e, + 0x1d770...0x1d788, + 0x1d78a...0x1d7a8, + 0x1d7aa...0x1d7c2, + 0x1d7c4...0x1d7cb, + 0x1d7ce...0x1d7ff, + 0x1da00...0x1da36, + 0x1da3b...0x1da6c, + 0x1da75...0x1da75, + 0x1da84...0x1da84, + 0x1da9b...0x1da9f, + 0x1daa1...0x1daaf, + 0x1e000...0x1e006, + 0x1e008...0x1e018, + 0x1e01b...0x1e021, + 0x1e023...0x1e024, + 0x1e026...0x1e02a, + 0x1e100...0x1e12c, + 0x1e130...0x1e13d, + 0x1e140...0x1e149, + 0x1e14e...0x1e14e, + 0x1e2c0...0x1e2f9, + 0x1e800...0x1e8c4, + 0x1e8d0...0x1e8d6, + 0x1e900...0x1e94b, + 0x1e950...0x1e959, + 0x1ee00...0x1ee03, + 0x1ee05...0x1ee1f, + 0x1ee21...0x1ee22, + 0x1ee24...0x1ee24, + 0x1ee27...0x1ee27, + 0x1ee29...0x1ee32, + 0x1ee34...0x1ee37, + 0x1ee39...0x1ee39, + 0x1ee3b...0x1ee3b, + 0x1ee42...0x1ee42, + 0x1ee47...0x1ee47, + 0x1ee49...0x1ee49, + 0x1ee4b...0x1ee4b, + 0x1ee4d...0x1ee4f, + 0x1ee51...0x1ee52, + 0x1ee54...0x1ee54, + 0x1ee57...0x1ee57, + 0x1ee59...0x1ee59, + 0x1ee5b...0x1ee5b, + 0x1ee5d...0x1ee5d, + 0x1ee5f...0x1ee5f, + 0x1ee61...0x1ee62, + 0x1ee64...0x1ee64, + 0x1ee67...0x1ee6a, + 0x1ee6c...0x1ee72, + 0x1ee74...0x1ee77, + 0x1ee79...0x1ee7c, + 0x1ee7e...0x1ee7e, + 0x1ee80...0x1ee89, + 0x1ee8b...0x1ee9b, + 0x1eea1...0x1eea3, + 0x1eea5...0x1eea9, + 0x1eeab...0x1eebb, + 0x1fbf0...0x1fbf9, + 0x20000...0x2a6dd, + 0x2a700...0x2b734, + 0x2b740...0x2b81d, + 0x2b820...0x2cea1, + 0x2ceb0...0x2ebe0, + 0x2f800...0x2fa1d, + 0x30000...0x3134a, + 0xe0100...0xe01ef, + => true, + else => false, + }; +} |